Repository: cleverhans-lab/cleverhans Branch: master Commit: 574efc1d2f5c Files: 494 Total size: 9.3 MB Directory structure: gitextract_jw024m5z/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── cml_gpu_test.yaml │ └── workflows/ │ ├── style_type_check.yml │ ├── tests-pytorch.yml │ ├── tutorials-jax.yml │ ├── tutorials-pytorch.yml │ └── tutorials-tf2.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .pylintrc ├── .setup_vm_and_run_tests.sh ├── CODE_OF_CONDUCT.rst ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── assets/ │ └── logo.psd ├── cleverhans/ │ ├── __init__.py │ ├── devtools/ │ │ ├── LICENSE.txt │ │ ├── __init__.py │ │ ├── autopep8_all.py │ │ ├── checks.py │ │ ├── list_files.py │ │ ├── mocks.py │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ └── test_format.py │ │ └── version.py │ ├── experimental/ │ │ ├── README.md │ │ ├── __init__.py │ │ └── certification/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── certify.py │ │ ├── dual_formulation.py │ │ ├── nn.py │ │ ├── optimization.py │ │ ├── tests/ │ │ │ ├── dual_formulation_test.py │ │ │ ├── nn_test.py │ │ │ ├── optimization_test.py │ │ │ └── utils_test.py │ │ └── utils.py │ ├── generic/ │ │ ├── README.md │ │ └── __init__.py │ ├── jax/ │ │ ├── __init__.py │ │ ├── attacks/ │ │ │ ├── __init__.py │ │ │ ├── fast_gradient_method.py │ │ │ └── projected_gradient_descent.py │ │ └── utils.py │ ├── plot/ │ │ ├── __init__.py │ │ ├── image.py │ │ ├── pyplot_defaults.py │ │ ├── pyplot_image.py │ │ ├── save_pdf.py │ │ └── success_fail.py │ ├── tf2/ │ │ ├── __init__.py │ │ ├── attacks/ │ │ │ ├── __init__.py │ │ │ ├── basic_iterative_method.py │ │ │ ├── carlini_wagner_l2.py │ │ │ ├── fast_gradient_method.py │ │ │ ├── madry_et_al.py │ │ │ ├── momentum_iterative_method.py │ │ │ ├── projected_gradient_descent.py │ │ │ └── spsa.py │ │ └── utils.py │ ├── torch/ │ │ ├── __init__.py │ │ ├── attacks/ │ │ │ ├── __init__.py │ │ │ ├── carlini_wagner_l2.py │ │ │ ├── fast_gradient_method.py │ │ │ ├── hop_skip_jump_attack.py │ │ │ ├── noise.py │ │ │ ├── projected_gradient_descent.py │ │ │ ├── semantic.py │ │ │ ├── sparse_l1_descent.py │ │ │ └── spsa.py │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ ├── test_attacks.py │ │ │ └── test_utils.py │ │ └── utils.py │ └── utils.py ├── cleverhans_v3.1.0/ │ ├── CODE_OF_CONDUCT.rst │ ├── CONTRIBUTING.md │ ├── Dockerfile │ ├── LICENSE │ ├── README.md │ ├── assets/ │ │ └── logo.psd │ ├── cleverhans/ │ │ ├── __init__.py │ │ ├── attack_bundling.py │ │ ├── attacks/ │ │ │ ├── __init__.py │ │ │ ├── attack.py │ │ │ ├── basic_iterative_method.py │ │ │ ├── carlini_wagner_l2.py │ │ │ ├── deep_fool.py │ │ │ ├── elastic_net_method.py │ │ │ ├── fast_feature_adversaries.py │ │ │ ├── fast_gradient_method.py │ │ │ ├── hop_skip_jump_attack.py │ │ │ ├── lbfgs.py │ │ │ ├── madry_et_al.py │ │ │ ├── max_confidence.py │ │ │ ├── momentum_iterative_method.py │ │ │ ├── noise.py │ │ │ ├── projected_gradient_descent.py │ │ │ ├── saliency_map_method.py │ │ │ ├── semantic.py │ │ │ ├── sparse_l1_descent.py │ │ │ ├── spatial_transformation_method.py │ │ │ ├── spsa.py │ │ │ └── virtual_adversarial_method.py │ │ ├── attacks_tf.py │ │ ├── attacks_tfe.py │ │ ├── augmentation.py │ │ ├── canary.py │ │ ├── compat.py │ │ ├── confidence_report.py │ │ ├── dataset.py │ │ ├── devtools/ │ │ │ ├── LICENSE.txt │ │ │ ├── __init__.py │ │ │ ├── autopep8_all.py │ │ │ ├── checks.py │ │ │ ├── list_files.py │ │ │ ├── mocks.py │ │ │ ├── tests/ │ │ │ │ ├── __init__.py │ │ │ │ └── test_format.py │ │ │ └── version.py │ │ ├── evaluation.py │ │ ├── experimental/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ └── certification/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── certify.py │ │ │ ├── dual_formulation.py │ │ │ ├── nn.py │ │ │ ├── optimization.py │ │ │ ├── tests/ │ │ │ │ ├── dual_formulation_test.py │ │ │ │ ├── nn_test.py │ │ │ │ ├── optimization_test.py │ │ │ │ └── utils_test.py │ │ │ └── utils.py │ │ ├── initializers.py │ │ ├── loss.py │ │ ├── model.py │ │ ├── model_zoo/ │ │ │ ├── __init__.py │ │ │ ├── all_convolutional.py │ │ │ ├── basic_cnn.py │ │ │ ├── deep_k_nearest_neighbors/ │ │ │ │ ├── README.md │ │ │ │ ├── __init__.py │ │ │ │ └── dknn.py │ │ │ ├── madry_lab_challenges/ │ │ │ │ ├── __init__.py │ │ │ │ ├── cifar10_model.py │ │ │ │ └── make_cifar10_joblib.py │ │ │ └── soft_nearest_neighbor_loss/ │ │ │ ├── SNNL_regularized_model.py │ │ │ ├── SNNL_regularized_train.py │ │ │ └── __init__.py │ │ ├── picklable_model.py │ │ ├── plot/ │ │ │ ├── __init__.py │ │ │ ├── image.py │ │ │ ├── pyplot_defaults.py │ │ │ ├── pyplot_image.py │ │ │ ├── save_pdf.py │ │ │ └── success_fail.py │ │ ├── serial.py │ │ ├── train.py │ │ ├── utils.py │ │ ├── utils_keras.py │ │ ├── utils_mnist.py │ │ ├── utils_pytorch.py │ │ ├── utils_tf.py │ │ └── utils_tfe.py │ ├── cleverhans_tutorials/ │ │ ├── __init__.py │ │ ├── cifar10_tutorial_tf.py │ │ ├── evaluate_pickled_model.py │ │ ├── mnist_blackbox.py │ │ ├── mnist_tutorial_cw.py │ │ ├── mnist_tutorial_jsma.py │ │ ├── mnist_tutorial_keras.py │ │ ├── mnist_tutorial_keras_tf.py │ │ ├── mnist_tutorial_picklable.py │ │ ├── mnist_tutorial_pytorch.py │ │ ├── mnist_tutorial_tf.py │ │ ├── mnist_tutorial_tfe.py │ │ ├── tutorial_models.py │ │ └── tutorial_models_tfe.py │ ├── docs/ │ │ ├── .nojekyll │ │ ├── README.html │ │ ├── _modules/ │ │ │ ├── abc.html │ │ │ ├── cleverhans/ │ │ │ │ ├── attacks/ │ │ │ │ │ ├── attack.html │ │ │ │ │ ├── basic_iterative_method.html │ │ │ │ │ ├── carlini_wagner_l2.html │ │ │ │ │ ├── deep_fool.html │ │ │ │ │ ├── elastic_net_method.html │ │ │ │ │ ├── fast_feature_adversaries.html │ │ │ │ │ ├── fast_gradient_method.html │ │ │ │ │ ├── hop_skip_jump_attack.html │ │ │ │ │ ├── lbfgs.html │ │ │ │ │ ├── madry_et_al.html │ │ │ │ │ ├── max_confidence.html │ │ │ │ │ ├── momentum_iterative_method.html │ │ │ │ │ ├── noise.html │ │ │ │ │ ├── projected_gradient_descent.html │ │ │ │ │ ├── saliency_map_method.html │ │ │ │ │ ├── semantic.html │ │ │ │ │ ├── sparse_l1_descent.html │ │ │ │ │ ├── spatial_transformation_method.html │ │ │ │ │ ├── spsa.html │ │ │ │ │ └── virtual_adversarial_method.html │ │ │ │ ├── compat.html │ │ │ │ ├── model.html │ │ │ │ └── utils_tf.html │ │ │ └── index.html │ │ ├── _sources/ │ │ │ ├── README.md.txt │ │ │ ├── index.md.txt │ │ │ └── source/ │ │ │ ├── attacks.md.txt │ │ │ ├── devtools.md.txt │ │ │ ├── future.md.txt │ │ │ └── model.md.txt │ │ ├── _static/ │ │ │ ├── alabaster.css │ │ │ ├── basic.css │ │ │ ├── custom.css │ │ │ ├── doctools.js │ │ │ ├── documentation_options.js │ │ │ ├── jquery-3.5.1.js │ │ │ ├── jquery.js │ │ │ ├── language_data.js │ │ │ ├── pygments.css │ │ │ ├── searchtools.js │ │ │ ├── underscore-1.3.1.js │ │ │ └── underscore.js │ │ ├── genindex.html │ │ ├── index.html │ │ ├── objects.inv │ │ ├── py-modindex.html │ │ ├── search.html │ │ ├── searchindex.js │ │ └── source/ │ │ ├── attacks.html │ │ ├── devtools.html │ │ ├── future.html │ │ └── model.html │ ├── docsource/ │ │ ├── Makefile │ │ ├── README.md │ │ ├── _templates/ │ │ │ └── layout.html │ │ ├── conf.py │ │ ├── docs_requirements.txt │ │ ├── index.md │ │ └── source/ │ │ ├── attacks.md │ │ ├── devtools.md │ │ ├── future.md │ │ └── model.md │ ├── examples/ │ │ ├── README.md │ │ ├── RL-attack/ │ │ │ ├── README.md │ │ │ ├── enjoy-adv.py │ │ │ ├── model.py │ │ │ └── train.py │ │ ├── adversarial_asr/ │ │ │ ├── LibriSpeech/ │ │ │ │ └── LICENSE.TXT │ │ │ ├── README.md │ │ │ ├── generate_imperceptible_adv.py │ │ │ ├── generate_masking_threshold.py │ │ │ ├── generate_robust_adv.py │ │ │ ├── model/ │ │ │ │ ├── checkpoint │ │ │ │ ├── ckpt-00908156.index │ │ │ │ ├── ckpt-00908156.meta │ │ │ │ └── events.out.tfevents.1543301105.e33cfcb49883 │ │ │ ├── read_data.txt │ │ │ ├── room_simulator.py │ │ │ ├── test_imperceptible_adv.py │ │ │ ├── test_robust_adv.py │ │ │ ├── tool.py │ │ │ └── util/ │ │ │ ├── convert_name_format.sh │ │ │ └── read_data_full.txt │ │ ├── adversarial_patch/ │ │ │ ├── AdversarialPatch.ipynb │ │ │ └── README.md │ │ ├── facenet_adversarial_faces/ │ │ │ ├── README.md │ │ │ ├── facenet_fgsm.py │ │ │ └── set_loader.py │ │ ├── imagenet_featadvs/ │ │ │ └── model.py │ │ ├── madry_lab_challenges/ │ │ │ ├── LICENSE │ │ │ ├── README │ │ │ ├── cifar10/ │ │ │ │ └── attack_model.py │ │ │ └── mnist/ │ │ │ ├── attack_model.py │ │ │ └── madry_mnist_model.py │ │ ├── multigpu_advtrain/ │ │ │ ├── README.md │ │ │ ├── attacks_multigpu.py │ │ │ ├── evaluator.py │ │ │ ├── make_model.py │ │ │ ├── model.py │ │ │ ├── resnet_tf.py │ │ │ ├── run_multigpu.py │ │ │ ├── runner.py │ │ │ ├── test_attack_multigpu.py │ │ │ ├── test_run_multigpu.py │ │ │ ├── test_runner.py │ │ │ ├── trainer.py │ │ │ ├── utils.py │ │ │ ├── utils_cifar.py │ │ │ └── utils_svhn.py │ │ ├── nips17_adversarial_competition/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── dataset/ │ │ │ │ ├── README.md │ │ │ │ ├── dev_dataset.csv │ │ │ │ ├── download_images.py │ │ │ │ └── final_dataset.csv │ │ │ ├── dev_toolkit/ │ │ │ │ ├── .gitignore │ │ │ │ ├── README.md │ │ │ │ ├── download_data.sh │ │ │ │ ├── run_attacks_and_defenses.py │ │ │ │ ├── run_attacks_and_defenses.sh │ │ │ │ ├── sample_attacks/ │ │ │ │ │ ├── download_checkpoints.sh │ │ │ │ │ ├── fgsm/ │ │ │ │ │ │ ├── attack_fgsm.py │ │ │ │ │ │ ├── metadata.json │ │ │ │ │ │ └── run_attack.sh │ │ │ │ │ ├── noop/ │ │ │ │ │ │ ├── attack_noop.py │ │ │ │ │ │ ├── metadata.json │ │ │ │ │ │ └── run_attack.sh │ │ │ │ │ └── random_noise/ │ │ │ │ │ ├── attack_random_noise.py │ │ │ │ │ ├── metadata.json │ │ │ │ │ └── run_attack.sh │ │ │ │ ├── sample_defenses/ │ │ │ │ │ ├── adv_inception_v3/ │ │ │ │ │ │ ├── defense.py │ │ │ │ │ │ ├── metadata.json │ │ │ │ │ │ └── run_defense.sh │ │ │ │ │ ├── base_inception_model/ │ │ │ │ │ │ ├── defense.py │ │ │ │ │ │ ├── metadata.json │ │ │ │ │ │ └── run_defense.sh │ │ │ │ │ ├── download_checkpoints.sh │ │ │ │ │ └── ens_adv_inception_resnet_v2/ │ │ │ │ │ ├── defense.py │ │ │ │ │ ├── inception_resnet_v2.py │ │ │ │ │ ├── metadata.json │ │ │ │ │ └── run_defense.sh │ │ │ │ ├── sample_targeted_attacks/ │ │ │ │ │ ├── download_checkpoints.sh │ │ │ │ │ ├── iter_target_class/ │ │ │ │ │ │ ├── attack_iter_target_class.py │ │ │ │ │ │ ├── metadata.json │ │ │ │ │ │ └── run_attack.sh │ │ │ │ │ └── step_target_class/ │ │ │ │ │ ├── attack_step_target_class.py │ │ │ │ │ ├── metadata.json │ │ │ │ │ └── run_attack.sh │ │ │ │ └── validation_tool/ │ │ │ │ ├── README.md │ │ │ │ ├── submission_validator_lib.py │ │ │ │ └── validate_submission.py │ │ │ └── eval_infra/ │ │ │ ├── README.md │ │ │ ├── code/ │ │ │ │ ├── eval_lib/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── classification_results.py │ │ │ │ │ ├── cloud_client.py │ │ │ │ │ ├── dataset_helper.py │ │ │ │ │ ├── image_batches.py │ │ │ │ │ ├── submissions.py │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── classification_results_test.py │ │ │ │ │ │ ├── fake_cloud_client.py │ │ │ │ │ │ ├── fake_cloud_client_test.py │ │ │ │ │ │ ├── image_batches_test.py │ │ │ │ │ │ ├── submissions_test.py │ │ │ │ │ │ └── work_data_test.py │ │ │ │ │ └── work_data.py │ │ │ │ ├── master.py │ │ │ │ ├── run_worker_locally.sh │ │ │ │ ├── start_worker_in_tmux.sh │ │ │ │ └── worker.py │ │ │ ├── run_master.sh │ │ │ ├── scripts/ │ │ │ │ ├── config.sh │ │ │ │ ├── copy_baselines.sh │ │ │ │ ├── copy_dataset_to_vm.sh │ │ │ │ ├── copy_eval_infra_to_vm.sh │ │ │ │ ├── create_workers.sh │ │ │ │ ├── prepare_virtualenv.sh │ │ │ │ ├── scp_cloud_vm.sh │ │ │ │ └── start_workers.sh │ │ │ └── validation_tool/ │ │ │ ├── validate_and_copy_submissions.py │ │ │ └── validate_submission_lib.py │ │ ├── robust_vision_benchmark/ │ │ │ ├── README.md │ │ │ └── cleverhans_attack_example/ │ │ │ ├── Dockerfile │ │ │ ├── main.py │ │ │ ├── requirements.txt │ │ │ └── utils.py │ │ └── test_imagenet_attacks.py │ ├── scripts/ │ │ ├── compute_accuracy.py │ │ ├── make_confidence_report.py │ │ ├── make_confidence_report_bundle_examples.py │ │ ├── make_confidence_report_bundled.py │ │ ├── make_confidence_report_spsa.py │ │ ├── plot_success_fail_curve.py │ │ ├── print_report.py │ │ └── show_images.py │ ├── setup.py │ └── tests_tf/ │ ├── test_attack_bundling.py │ ├── test_attacks.py │ ├── test_attacks_tf.py │ ├── test_confidence_report.py │ ├── test_dataset.py │ ├── test_defenses.py │ ├── test_evaluation.py │ ├── test_mnist_blackbox.py │ ├── test_mnist_tutorial_cw.py │ ├── test_mnist_tutorial_jsma.py │ ├── test_mnist_tutorial_keras.py │ ├── test_mnist_tutorial_keras_tf.py │ ├── test_mnist_tutorial_tf.py │ ├── test_model.py │ ├── test_picklable_model.py │ ├── test_projected_gradient_descent.py │ ├── test_serial.py │ ├── test_utils.py │ ├── test_utils_keras.py │ └── test_utils_tf.py ├── defenses/ │ ├── README.md │ ├── generic/ │ │ ├── README.md │ │ └── __init__.py │ ├── jax/ │ │ └── README.md │ ├── tf2/ │ │ └── README.md │ └── torch/ │ ├── README.md │ └── audio/ │ └── input_tranformation/ │ └── resampling.py ├── docs/ │ ├── .nojekyll │ ├── README.html │ ├── _modules/ │ │ ├── abc.html │ │ ├── cleverhans/ │ │ │ ├── attacks/ │ │ │ │ ├── attack.html │ │ │ │ ├── basic_iterative_method.html │ │ │ │ ├── carlini_wagner_l2.html │ │ │ │ ├── deep_fool.html │ │ │ │ ├── elastic_net_method.html │ │ │ │ ├── fast_feature_adversaries.html │ │ │ │ ├── fast_gradient_method.html │ │ │ │ ├── hop_skip_jump_attack.html │ │ │ │ ├── lbfgs.html │ │ │ │ ├── madry_et_al.html │ │ │ │ ├── max_confidence.html │ │ │ │ ├── momentum_iterative_method.html │ │ │ │ ├── noise.html │ │ │ │ ├── projected_gradient_descent.html │ │ │ │ ├── saliency_map_method.html │ │ │ │ ├── semantic.html │ │ │ │ ├── sparse_l1_descent.html │ │ │ │ ├── spatial_transformation_method.html │ │ │ │ ├── spsa.html │ │ │ │ └── virtual_adversarial_method.html │ │ │ ├── compat.html │ │ │ ├── model.html │ │ │ └── utils_tf.html │ │ └── index.html │ ├── _sources/ │ │ ├── README.md.txt │ │ ├── index.md.txt │ │ └── source/ │ │ ├── attacks.md.txt │ │ ├── devtools.md.txt │ │ ├── future.md.txt │ │ └── model.md.txt │ ├── _static/ │ │ ├── alabaster.css │ │ ├── basic.css │ │ ├── custom.css │ │ ├── doctools.js │ │ ├── documentation_options.js │ │ ├── jquery-3.5.1.js │ │ ├── jquery.js │ │ ├── language_data.js │ │ ├── pygments.css │ │ ├── searchtools.js │ │ ├── underscore-1.3.1.js │ │ └── underscore.js │ ├── genindex.html │ ├── index.html │ ├── objects.inv │ ├── py-modindex.html │ ├── search.html │ ├── searchindex.js │ └── source/ │ ├── attacks.html │ ├── devtools.html │ ├── future.html │ └── model.html ├── docsource/ │ ├── Makefile │ ├── README.md │ ├── _templates/ │ │ └── layout.html │ ├── conf.py │ ├── docs_requirements.txt │ ├── index.md │ └── source/ │ ├── attacks.md │ ├── devtools.md │ ├── future.md │ └── model.md ├── examples/ │ └── README.md ├── requirements/ │ ├── requirements-dev.txt │ ├── requirements-gpu.txt │ ├── requirements-jax.txt │ ├── requirements-pytorch.txt │ ├── requirements-tf2.txt │ └── requirements.txt ├── setup.py └── tutorials/ ├── README.md ├── generic/ │ ├── README.md │ └── __init__.py ├── jax/ │ ├── __init__.py │ ├── datasets.py │ └── mnist_tutorial.py ├── tf2/ │ ├── __init__.py │ ├── cifar10_tutorial.py │ └── mnist_tutorial.py └── torch/ ├── __init__.py ├── cifar10_tutorial.py ├── datasets.py └── mnist_tutorial.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Report a bug in the CleverHans library --- ***The issue tracker should only be used to report bugs or feature requests. If you are looking for support from other library users, please ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans).*** **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **System configuration** - OS - Python version - TensorFlow version ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for the CleverHans library --- ***The issue tracker should only be used to report bugs or feature requests. If you are looking for support from other library users, please ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans).*** **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/cml_gpu_test.yaml ================================================ name: CML Single GPU Test on: [push] jobs: run: runs-on: [self-hosted,cml,gpu] steps: - uses: actions/checkout@v2 - name: cml_run env: repo_token: ${{ secrets.GITHUB_TOKEN }} run: | nvidia-smi python -m pip install --upgrade pip pip install -e "." pip install -r requirements/requirements.txt pip install -r requirements/requirements-pytorch.txt pip install -r requirements/requirements-jax.txt pip install -r requirements/requirements-tf2.txt pip install -r requirements/requirements-dev.txt pip install -r requirements/requirements-gpu.txt find tutorials/future/jax/ -name '*.py' | while read f do python $f if [ $? -ne 0 ] then exit 1 fi done find tutorials/future/torch/ -name '*.py' | while read f do python $f if [ $? -ne 0 ] then exit 1 fi done find tutorials/future/tf2/ -name '*.py' | while read f do python $f if [ $? -ne 0 ] then exit 1 fi done ================================================ FILE: .github/workflows/style_type_check.yml ================================================ name: Style and type checks on: push: paths: - 'cleverhans/**/*' - 'tutorials/**/*' pull_request: paths: - 'cleverhans/**/*' - 'tutorials/**/*' jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: [3.6] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e "." pip install -r requirements/requirements.txt pip install -r requirements/requirements-pytorch.txt pip install -r requirements/requirements-tf2.txt pip install -r requirements/requirements-jax.txt pip install -r requirements/requirements-dev.txt - name: Code reformat check run: | black --check cleverhans/ black --check tutorials/ # - name: flake8 linting check # run: | # flake8 cleverhans/ # flake8 tutorials/ # - name: Type check # run: | # mypy cleverhans/future/ ================================================ FILE: .github/workflows/tests-pytorch.yml ================================================ name: PyTorch Tests on: push: paths: - 'cleverhans/torch/**/*' pull_request: paths: - 'cleverhans/torch/**/*' jobs: run: runs-on: [self-hosted,cml,gpu] steps: - uses: actions/checkout@v2 - name: cml_run env: repo_token: ${{ secrets.GITHUB_TOKEN }} run: | python -m pip install --upgrade pip pip install -e "." pip install -r requirements/requirements.txt pip install -r requirements/requirements-pytorch.txt pip install -r requirements/requirements-dev.txt pip install -r requirements/requirements-gpu.txt pytest cleverhans/torch/tests ================================================ FILE: .github/workflows/tutorials-jax.yml ================================================ name: JAX Tutorials on: push: paths: - 'cleverhans/jax/**/*' - 'tutorials/jax/**/*' pull_request: paths: - 'cleverhans/jax/**/*' - 'tutorials/jax/**/*' jobs: run: runs-on: [self-hosted,cml,gpu] steps: - uses: actions/checkout@v2 - name: cml_run env: repo_token: ${{ secrets.GITHUB_TOKEN }} run: | python -m pip install --upgrade pip pip install -e "." pip install -r requirements/requirements.txt pip install -r requirements/requirements-jax.txt pip install -r requirements/requirements-dev.txt pip install -r requirements/requirements-gpu.txt find tutorials/jax/ -name '*.py' | while read f do python $f if [ $? -ne 0 ] then exit 1 fi done ================================================ FILE: .github/workflows/tutorials-pytorch.yml ================================================ name: PyTorch Tutorials on: push: paths: - 'cleverhans/torch/**/*' - 'tutorials/torch/**/*' pull_request: paths: - 'cleverhans/torch/**/*' - 'tutorials/torch/**/*' jobs: run: runs-on: [self-hosted,cml,gpu] steps: - uses: actions/checkout@v2 - name: cml_run env: repo_token: ${{ secrets.GITHUB_TOKEN }} run: | python -m pip install --upgrade pip pip install -e "." pip install -r requirements/requirements.txt pip install -r requirements/requirements-pytorch.txt pip install -r requirements/requirements-dev.txt pip install -r requirements/requirements-gpu.txt find tutorials/torch/ -name '*.py' | while read f do python $f if [ $? -ne 0 ] then exit 1 fi done ================================================ FILE: .github/workflows/tutorials-tf2.yml ================================================ name: TensorFlow 2 Tutorials on: push: paths: - 'cleverhans/tf2/**/*' - 'tutorials/tf2/**/*' pull_request: paths: - 'cleverhans/tf2/**/*' - 'tutorials/tf2/**/*' jobs: run: runs-on: [self-hosted,cml,gpu] steps: - uses: actions/checkout@v2 - name: cml_run env: repo_token: ${{ secrets.GITHUB_TOKEN }} run: | python -m pip install --upgrade pip pip install -e "." pip install -r requirements/requirements.txt pip install -r requirements/requirements-tf2.txt pip install -r requirements/requirements-dev.txt pip install -r requirements/requirements-gpu.txt find tutorials/tf2/ -name '*.py' | while read f do python $f if [ $? -ne 0 ] then exit 1 fi done ================================================ FILE: .gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .hypothesis/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docsource/_build/ # PyBuilder target/ # IPython Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # dotenv .env # virtualenv venv/ ENV/ # Spyder project settings .spyderproject # Rope project settings .ropeproject # PyCharm related .idea/ # Mac related .DS_Store ================================================ FILE: .pre-commit-config.yaml ================================================ repos: - repo: https://github.com/psf/black rev: 20.8b1 hooks: - id: black ================================================ FILE: .pylintrc ================================================ # Config file for pylint for CleverHans # Used by cleverhans.devtools [FORMAT] # TensorFlow 2 space style indent-string=' ' max-line-length=120 # pylint should print out the file path, line number, and ID code for the # messages it prints. This is partly so we can turn off the ID codes that # we do not actually want to enforce. msg-template='{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}' # ID codes to disable # E1130: has a bug. # The type of the output of softmax_cross_entropy_with_logits is weird # and pylint does not realize it is safe to negate it. # C0103: Complains about the variable name 'x' # W0613: Unused argument # This one is disabled because pylint does not implement it well. # In many cases we use all arguments via `locals()` and pylint does not # detect them as used. # E1101: pylint seems to have a bug. Says numpy.random has no member RandomState # R0913: Too many arguments # R0914: Too many local variables # W0223: doesn't allow subclass of an abstract base class to still be abstract # E0203: pylint seems to have a bug. Doesn't know self.x can be defined before # method call. # W0201: doesn't let any attributes be added outside __init__ # C1801: do not use len(s) to tell if s is empty # E1129: a check on context managers # This is disabled because it complains about "with sess.as_default". # pylint does not seem to believe that that is a real context manager. # C0325: unnecessary parens (sometimes we use them to be extra-explicit) # R1705: "unnecessary else after return" # We disable this one because it is annoying. It forbids # if a: # return b # else: # return c # The name "unnecessary else after return" seems misleading, and it would be # annoying and use more lines to rewrite everything as: # if a: # out = b # else: # out = c # return out # W0703: catching too general exception # W0101: unreachable code # We disable this one because it does not allow: # # class A(object): # def f(self): # raise NotImplementedError("Subclass must implement f") # return 0 # # W0101 complains that the `return 0` is never reached. # However, if we do not have the return statement, we get E1111 on lines # such as: # # x = a.f() # # because pylint sees no return statement in f. # We can't have both W0101 and E1111, and between them, it is better to # disable W0101 because dead code is less likely to be a bug than using a # null return value. Also, as of this writing, the only instance of W0101 is # an abstract method like in the example shown here, so we are not writing # any dead code by accident in practice. # # W0122: use of exec # R0912: too many branches # R0903: too few public methods # W0221: parameters differ from overridden method # W0212: protected access # R1703: simplifiable if statement # R0201: method could be a function # W0603: global statement # R0915: too many statements # R0902: too many attributes # C0200: consider using enumerate # W1201: logging not lazy # Disabled because it forbids things like # logging.info('#' * pad + msg + '#' * pad) # Doesn't seem useful to refactor this to # padded_msg = '#' * pad + msg + '#' * pad # logging.info(padded_msg) # or to refactor it to # logging.info('%s%s%s', pad, msg, pad) # The speedup of avoiding a string concatenation is presumably negligible # compared to most of the ML operations we do to generate log messages. # C0302: too many lines in module # W0511: forbids TODOs # R0911: too many return statements # E0401: cannot import module # R0205: this one is apparently asking us to drop python 2 support? # R1714: use x in [a,b] instead of x == a or x == b # R0801: duplicate code across files # (We have a lot of intentional duplication, like the tutorials) disable=C0103,W0613,E1101,R0913,R0914,W0223,E0203,W0201,C1801,E1129,C0325,R1705,W0622,W0703,W0101,W0122,R0912,R0903,W0221,W0212,R1703,R0201,W0603,R0915,R0902,C0200,W1201,C0302,W0511,R0911,E0401,R0205,R1714,R0801,E1130 [IMPORTS] # Explicitly specifying this helps pylint to behave more consistently across multiple platforms. # If not specified, the method used to install each library seems to change whether it is considered third party, etc. known-third-party=joblib,keras,numpy,PIL,six,tensorflow ================================================ FILE: .setup_vm_and_run_tests.sh ================================================ #!/bin/sh set -e # Run update once so apt-get will work at all sudo apt-get update # Install apt-add-repository sudo apt-get install -y software-properties-common # Add universe repository so python-pip is available sudo apt-add-repository universe # Run update again now that universe is a source apt-get update apt-get -y install curl apt-get install -y wget rm -rf /var/lib/apt/lists/* # code below is taken from http://conda.pydata.org/docs/travis.html # We do this conditionally because it saves us some downloading if the # version is the same. export CLOUD_BUILD_PYTHON_VERSION=2.7 if [[ "$CLOUD_BUILD_PYTHON_VERSION" == "2.7" ]]; then wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh; else wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh; fi bash miniconda.sh -b -p $HOME/miniconda export PATH="$HOME/miniconda/bin:$PATH" export TENSORFLOW_V="1.8.0" hash -r conda config --set always_yes yes --set changeps1 no conda update -q conda # Useful for debugging any issues with conda conda info -a conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy pyqt=4.11 matplotlib pandas h5py six mkl-service # Enable `conda activate` sudo ln -s /root/miniconda/etc/profile.d/conda.sh /etc/profile.d/conda.sh conda activate test-environment # install TensorFlow if [[ "$CLOUD_BUILD_PYTHON_VERSION" == "2.7" && "$TENSORFLOW_V" == "1.4.1" ]]; then pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.1-cp27-none-linux_x86_64.whl; elif [[ "$COULD_BUILD_PYTHON_VERSION" == "2.7" && "$TENSORFLOW_V" == "1.8.0" ]]; then pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.8.0-cp27-none-linux_x86_64.whl; elif [[ "$CLOUD_BUILD_PYTHON_VERSION" == "3.5" && "$TENSORFLOW_V" == "1.4.1" ]]; then pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.1-cp35-cp35m-linux_x86_64.whl; elif [[ "$CLOUD_BUILD_PYTHON_VERSION" == "3.5" && "$TENSORFLOW_V" == "1.8.0" ]]; then pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.8.0-cp35-cp35m-linux_x86_64.whl; fi time pip install -q -e ".[test]" PYTORCH=True if [[ "$PYTORCH" == True ]]; then pip install torch==0.4.0 torchvision==0.2.1 -q; fi # workaround for version incompatibility between the scipy version in conda # and the system-provided /usr/lib/x86_64-linux-gnu/libstdc++.so.6 # by installing a conda-provided libgcc and adding it to the load path conda install libgcc export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/travis/miniconda/envs/test-environment/lib # install serialization dependencies pip install joblib # install dependencies for adversarial competition eval infra tests pip install google-cloud==0.33.1 pip install Pillow # Style checks pip install pylint ================================================ FILE: CODE_OF_CONDUCT.rst ================================================ CleverHans is dedicated to providing a harassment-free experience for everyone, regardless of gender, gender identity and expression, sexual orientation, disability, physical appearance, body size, age, race, or religion. We do not tolerate harassment of participants in any form. This code of conduct applies to all CleverHans spaces (including Gist comments) both online and off. Anyone who violates this code of conduct may be sanctioned or expelled from these spaces at the discretion of the OpenAI / Pennsylvania State University team. We may add additional rules over time, which will be made clearly available to participants. Participants are responsible for knowing and abiding by these rules. ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to CleverHans First off, thank you for considering contributing to CleverHans. Following these guidelines helps to communicate that you respect the time of the researchers and developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. Adding new features, improving documentation, bug triaging, or writing tutorials are all examples of helpful contributions. Furthermore, if you are publishing a new attack or defense, we strongly encourage you to add it to CleverHans so that others may evaluate it fairly in their own work. To speed the code review process, we ask that: * New efforts and features be coordinated on the [discussion board](https://github.com/cleverhans-lab/cleverhans/discussions). * When making code contributions to CleverHans, you should follow the [`Black`](https://black.readthedocs.io/en/stable/index.html) coding style in your pull requests. * We do not accept pull requests that add git submodules because of [the problems that arise when maintaining git submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407) Bug fixes can be initiated through Github pull requests. ## Development setup Please follow the usual [git forking workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow) when contributing. ### Setting up Cleverhans on your machine Then create a new Conda or Virtualenv environment. Conda: ``` $ conda create --name cleverhans python=3.6 $ conda activate cleverhans ``` Virtualenv: ``` $ python3 -m venv /path/to/new/virtual/environment $ cd /path/to/new/virtual/environment $ source ./bin/activate ``` Then, after `cd`-ing into the `cleverhans` directory, install the Cleverhans library and all corresponding requirements into your newly created environment. ``` $ pip install -e "." $ pip install -r requirements/requirements.txt $ pip install -r requirements/requirements-pytorch.txt $ pip install -r requirements/requirements-jax.txt $ pip install -r requirements/requirements-tf2.txt $ pip install -r requirements/requirements-dev.txt ``` Optionally also install GPU dependencies for JAX (PyTorch and TF2 already come with GPU as part of their default package): ``` $ pip install -r requirements/requirements-gpu.txt ``` ### Add git pre-commit hooks Install our pre-commit hooks that ensure that your code is always formatted via `black` before committing. ``` $ pre-commit install ``` Note that we do have code style checks in place for every submitted PR and will reject PRs that do not meet these checks. By installing the pre-commit hooks, this will be taken care of automatically ================================================ FILE: Dockerfile ================================================ FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y python RUN apt-get install -y python-pip RUN pip install --upgrade pip COPY .setup_vm_and_run_tests.sh / RUN chmod +x /.setup_vm_and_run_tests.sh CMD ["/.setup_vm_and_run_tests.sh"] ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2019 Google Inc., OpenAI and Pennsylvania State University Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # CleverHans (latest release: v4.0.0) cleverhans logo This repository contains the source code for CleverHans, a Python library to benchmark machine learning systems' vulnerability to [adversarial examples](http://karpathy.github.io/2015/03/30/breaking-convnets/). You can learn more about such vulnerabilities on the accompanying [blog](http://cleverhans.io). The CleverHans library is under continual development, always welcoming [contributions](https://github.com/cleverhans-lab/cleverhans#contributing) of the latest attacks and defenses. In particular, we always welcome help towards resolving the [issues](https://github.com/cleverhans-lab/cleverhans/issues) currently open. Since v4.0.0, CleverHans supports 3 frameworks: JAX, PyTorch, and TF2. We are currently prioritizing implementing attacks in PyTorch, but we very much welcome contributions for all 3 frameworks. In versions v3.1.0 and prior, CleverHans supported TF1; the code for v3.1.0 can be found under `cleverhans_v3.1.0/` or by checking out a prior Github release. The library focuses on providing reference implementation of attacks against machine learning models to help with benchmarking models against adversarial examples. The directory structure is as follows: `cleverhans/` contain attack implementations, `tutorials/` contain scripts demonstrating the features of CleverHans, and `defenses/` contains defense implementations. Each framework has its own subdirectory within these folders, e.g. `cleverhans/jax`. ## Setting up CleverHans ### Dependencies This library uses [Jax](https://github.com/google/jax), [PyTorch](https://pytorch.org/) or [TensorFlow 2](https://www.tensorflow.org/) to accelerate graph computations performed by many machine learning models. Therefore, installing one of these libraries is a pre-requisite. ### Installation Once dependencies have been taken care of, you can install CleverHans using `pip` or by cloning this Github repository. #### `pip` installation If you are installing CleverHans using `pip`, run the following command: ``` pip install cleverhans ``` This will install the last version uploaded to [Pypi](https://pypi.org/project/cleverhans). If you'd instead like to install the bleeding edge version, use: ``` pip install git+https://github.com/cleverhans-lab/cleverhans.git#egg=cleverhans ``` #### Installation for development If you want to make an editable installation of CleverHans so that you can develop the library and contribute changes back, first fork the repository on GitHub and then clone your fork into a directory of your choice: ``` git clone https://github.com//cleverhans ``` You can then install the local package in "editable" mode in order to add it to your `PYTHONPATH`: ``` cd cleverhans pip install -e . ``` ### Currently supported setups Although CleverHans is likely to work on many other machine configurations, we currently test it with Python 3.6, Jax 0.2, PyTorch 1.7, and Tensorflow 2.4 on Ubuntu 18.04 LTS (Bionic Beaver). ## Getting support If you have a request for support, please ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans) rather than opening an issue in the GitHub tracker. The GitHub issue tracker should *only* be used to report bugs or make feature requests. ## Contributing Contributions are welcomed! To speed the code review process, we ask that: * New efforts and features be coordinated on the [discussion board](https://github.com/cleverhans-lab/cleverhans/discussions). * When making code contributions to CleverHans, you should follow the [`Black`](https://black.readthedocs.io/en/stable/index.html) coding style in your pull requests. * We do not accept pull requests that add git submodules because of [the problems that arise when maintaining git submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407). Bug fixes can be initiated through Github pull requests. ## Tutorials: `tutorials` directory To help you get started with the functionalities provided by this library, the `tutorials/` folder comes with the following tutorials: * **MNIST with FGSM and PGD** ([jax](tutorials/jax/mnist_tutorial.py), [tf2](tutorials/tf2/mnist_tutorial.py): this tutorial covers how to train an MNIST model and craft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572) and [projected gradient descent](https://arxiv.org/abs/1706.06083). * **CIFAR10 with FGSM and PGD** ([pytorch](tutorials/torch/cifar10_tutorial.py), [tf2](tutorials/tf2/cifar10_tutorial.py)): this tutorial covers how to train a CIFAR10 model and craft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572) and [projected gradient descent](https://arxiv.org/abs/1706.06083). NOTE: the tutorials are maintained carefully, in the sense that we use continuous integration to make sure they continue working. They are not considered part of the API and they can change at any time without warning. You should not write 3rd party code that imports the tutorials and expect that the interface will not break. Only the main library is subject to our six month interface deprecation warning rule. NOTE: please start a thread on the [discussion board](https://github.com/cleverhans-lab/cleverhans/discussions) before writing a new tutorial. Because each new tutorial involves a large amount of duplicated code relative to the existing tutorials, and because every line of code requires ongoing testing and maintenance indefinitely, we generally prefer not to add new tutorials. Each tutorial should showcase an extremely different way of using the library. Just calling a different attack, model, or dataset is not enough to justify maintaining a parallel tutorial. ## Examples : `examples` directory The `examples/` folder contains additional scripts to showcase different uses of the CleverHans library or get you started competing in different adversarial example contests. We do not offer nearly as much ongoing maintenance or support for this directory as the rest of the library, and if code in here gets broken we may just delete it without warning. Since we recently discontinued support for TF1, the `examples/` folder is currently empty, but you are welcome to submit your uses via a pull request :) Old examples for CleverHans v3.1.0 and prior can be found under `cleverhans_v3.1.0/examples/`. ## Reporting benchmarks When reporting benchmarks, please: * Use a versioned release of CleverHans. You can find a list of released versions [here](https://github.com/cleverhans-lab/cleverhans/releases). * Either use the latest version, or, if comparing to an earlier publication, use the same version as the earlier publication. * Report which attack method was used. * Report any configuration variables used to determine the behavior of the attack. For example, you might report "We benchmarked the robustness of our method to adversarial attack using v4.0.0 of CleverHans. On a test set modified by the `FastGradientMethod` with a max-norm `eps` of 0.3, we obtained a test set accuracy of 71.3%." ## Citing this work If you use CleverHans for academic research, you are highly encouraged (though not required) to cite the following [paper](https://arxiv.org/abs/1610.00768): ``` @article{papernot2018cleverhans, title={Technical Report on the CleverHans v2.1.0 Adversarial Examples Library}, author={Nicolas Papernot and Fartash Faghri and Nicholas Carlini and Ian Goodfellow and Reuben Feinman and Alexey Kurakin and Cihang Xie and Yash Sharma and Tom Brown and Aurko Roy and Alexander Matyasko and Vahid Behzadan and Karen Hambardzumyan and Zhishuai Zhang and Yi-Lin Juang and Zhi Li and Ryan Sheatsley and Abhibhav Garg and Jonathan Uesato and Willi Gierke and Yinpeng Dong and David Berthelot and Paul Hendricks and Jonas Rauber and Rujun Long}, journal={arXiv preprint arXiv:1610.00768}, year={2018} } ``` ## About the name The name CleverHans is a reference to a presentation by Bob Sturm titled “Clever Hans, Clever Algorithms: Are Your Machine Learnings Learning What You Think?" and the corresponding publication, ["A Simple Method to Determine if a Music Information Retrieval System is a 'Horse'."](http://ieeexplore.ieee.org/document/6847693/) Clever Hans was a horse that appeared to have learned to answer arithmetic questions, but had in fact only learned to read social cues that enabled him to give the correct answer. In controlled settings where he could not see people's faces or receive other feedback, he was unable to answer the same questions. The story of Clever Hans is a metaphor for machine learning systems that may achieve very high accuracy on a test set drawn from the same distribution as the training data, but that do not actually understand the underlying task and perform poorly on other inputs. ## Authors This library is collectively maintained by the [CleverHans Lab](https://cleverhans-lab.github.io/) at the University of Toronto. The current point of contact is Jonas Guan. It was previously maintained by Ian Goodfellow and Nicolas Papernot. The following authors contributed 100 lines or more (ordered according to the GitHub contributors page): * Ian Goodfellow (Google Brain) * Nicolas Papernot (Google Brain) * Nicholas Carlini (Google Brain) * Fartash Faghri (University of Toronto) * Tzu-Wei Sung (National Taiwan University) * Alexey Kurakin (Google Brain) * Reuben Feinman (New York University) * Shiyu Duan (University of Florida) * Phani Krishna (Video Analytics Lab) * David Berthelot (Google Brain) * Tom Brown (Google Brain) * Cihang Xie (Johns Hopkins) * Yash Sharma (The Cooper Union) * Aashish Kumar (HARMAN X) * Aurko Roy (Google Brain) * Alexander Matyasko (Nanyang Technological University) * Anshuman Suri (University of Virginia) * Yen-Chen Lin (MIT) * Vahid Behzadan (Kansas State) * Jonathan Uesato (DeepMind) * Florian Tramèr (Stanford University) * Haojie Yuan (University of Science & Technology of China) * Zhishuai Zhang (Johns Hopkins) * Karen Hambardzumyan (YerevaNN) * Jianbo Chen (UC Berkeley) * Catherine Olsson (Google Brain) * Aidan Gomez (University of Oxford) * Zhi Li (University of Toronto) * Yi-Lin Juang (NTUEE) * Pratyush Sahay (formerly HARMAN X) * Abhibhav Garg (IIT Delhi) * Aditi Raghunathan (Stanford University) * Yang Song (Stanford University) * Riccardo Volpi (Italian Institute of Technology) * Angus Galloway (University of Guelph) * Yinpeng Dong (Tsinghua University) * Willi Gierke (Hasso Plattner Institute) * Bruno López * Jonas Rauber (IMPRS) * Paul Hendricks (NVIDIA) * Ryan Sheatsley (Pennsylvania State University) * Rujun Long (0101.AI) * Bogdan Kulynych (EPFL) * Erfan Noury (UMBC) * Robert Wagner (Case Western Reserve University) * Erh-Chung Chen (National Tsing Hua University) * Joel Frank (Ruhr-University Bochum) ## Copyright Copyright 2021 - Google Inc., OpenAI, Pennsylvania State University, University of Toronto. ================================================ FILE: cleverhans/__init__.py ================================================ """The CleverHans adversarial example library""" from cleverhans.devtools.version import append_dev_version # If possible attach a hex digest to the version string to keep track of # changes in the development branch __version__ = append_dev_version("4.0.0") ================================================ FILE: cleverhans/devtools/LICENSE.txt ================================================ The devtools module is a derivative work from the devtools module of pylearn2. We reproduce the corresponding license here. Copyright (c) 2011--2014, Université de Montréal All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: cleverhans/devtools/__init__.py ================================================ ================================================ FILE: cleverhans/devtools/autopep8_all.py ================================================ """ Run this script to run autopep8 on everything in the library """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from cleverhans.devtools.list_files import list_files from cleverhans.utils import shell_call for f in list_files(".py"): command = ["autopep8", "-i", "--indent-size", "2", f] shell_call(command) ================================================ FILE: cleverhans/devtools/checks.py ================================================ """Functionality for building tests. We have to call this file "checks" and not anything with "test" as a substring or nosetests will execute it. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import time import unittest import numpy as np class CleverHansTest(unittest.TestCase): """TestCase with some extra features""" def setUp(self): self.test_start = time.time() # seed the randomness np.random.seed(1234) def tearDown(self): print(self.id(), "took", time.time() - self.test_start, "seconds") def assertClose(self, x, y, *args, **kwargs): """Assert that `x` and `y` have close to the same value""" # self.assertTrue(np.allclose(x, y)) doesn't give a useful message # on failure assert np.allclose(x, y, *args, **kwargs), (x, y) ================================================ FILE: cleverhans/devtools/list_files.py ================================================ """Code for listing files that belong to the library.""" import os import cleverhans def list_files(suffix=""): """ Returns a list of all files in CleverHans with the given suffix. Parameters ---------- suffix : str Returns ------- file_list : list A list of all files in CleverHans whose filepath ends with `suffix`. """ cleverhans_path = os.path.abspath(cleverhans.__path__[0]) # In some environments cleverhans_path does not point to a real directory. # In such case return empty list. if not os.path.isdir(cleverhans_path): return [] repo_path = os.path.abspath(os.path.join(cleverhans_path, os.pardir)) file_list = _list_files(cleverhans_path, suffix) extra_dirs = [ "cleverhans_tutorials", "examples", "scripts", "tests_tf", "tests_pytorch", ] for extra_dir in extra_dirs: extra_path = os.path.join(repo_path, extra_dir) if os.path.isdir(extra_path): extra_files = _list_files(extra_path, suffix) extra_files = [os.path.join(os.pardir, path) for path in extra_files] file_list = file_list + extra_files return file_list def _list_files(path, suffix=""): """ Returns a list of all files ending in `suffix` contained within `path`. Parameters ---------- path : str a filepath suffix : str Returns ------- l : list A list of all files ending in `suffix` contained within `path`. (If `path` is a file rather than a directory, it is considered to "contain" itself) """ if os.path.isdir(path): incomplete = os.listdir(path) complete = [os.path.join(path, entry) for entry in incomplete] lists = [_list_files(subpath, suffix) for subpath in complete] flattened = [] for one_list in lists: for elem in one_list: flattened.append(elem) return flattened else: assert os.path.exists(path), "couldn't find file '%s'" % path if path.endswith(suffix): return [path] return [] ================================================ FILE: cleverhans/devtools/mocks.py ================================================ """Utility functions for mocking up tests. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import copy import numpy as np from cleverhans.dataset import Dataset, np_utils def random_feed_dict(rng, placeholders): """ Returns random data to be used with `feed_dict`. :param rng: A numpy.random.RandomState instance :param placeholders: List of tensorflow placeholders :return: A dict mapping placeholders to random numpy values """ output = {} for placeholder in placeholders: if placeholder.dtype != "float32": raise NotImplementedError() value = rng.randn(*placeholder.shape).astype("float32") output[placeholder] = value return output class SimpleDataset(Dataset): """ A dataset containing random values. Values are uniformly distributed, either in [0, max_val] or [-1, max_val]. """ def __init__( self, dim=2, train_start=0, train_end=3, test_start=0, test_end=5, center=False, max_val=1.0, nb_classes=5, ): kwargs = copy.copy(locals()) del kwargs["self"] if "__class__" in kwargs: del kwargs["__class__"] super(SimpleDataset, self).__init__(kwargs) self.__dict__.update(kwargs) train_x_rng = np.random.RandomState([2018, 11, 9, 1]) # Even if train_start is not 0, we should still generate the first training examples from the rng. # This way the dataset looks like it is an array of deterministic data that we index using train_start. self.x_train = train_x_rng.uniform( -center * max_val, max_val, (train_end, dim) )[train_start:] # Use a second rng for the test set so that it also looks like an array of deterministic data that we # index into, unaffected by the number of training examples. test_x_rng = np.random.RandomState([2018, 11, 9, 2]) self.x_test = test_x_rng.uniform(-center * max_val, max_val, (test_end, dim))[ test_start: ] # Likewise, to keep the number of examples read from the rng affecting the values of the labels, we # must generate the labels from a different rng train_y_rng = np.random.RandomState([2018, 11, 9, 3]) self.y_train = train_y_rng.randint(low=0, high=nb_classes, size=(train_end, 1))[ train_start: ] test_y_rng = np.random.RandomState([2018, 11, 9, 4]) self.y_test = test_y_rng.randint(low=0, high=nb_classes, size=(test_end, 1))[ test_start: ] assert self.x_train.shape[0] == self.y_train.shape[0] assert self.x_test.shape[0] == self.y_test.shape[0] self.y_train = np_utils.to_categorical(self.y_train, nb_classes) self.y_test = np_utils.to_categorical(self.y_test, nb_classes) ================================================ FILE: cleverhans/devtools/tests/__init__.py ================================================ ================================================ FILE: cleverhans/devtools/tests/test_format.py ================================================ """ Unit tests for format checking """ from __future__ import print_function import os import subprocess import cleverhans from cleverhans.devtools.list_files import list_files from cleverhans.utils import shell_call # Enter a manual list of files that are allowed to violate PEP8 here whitelist_pep8 = [ # This file is broken but could be fixed "../examples/multigpu_advtrain/test_attack_multigpu.py" ] all_py_files = list_files(".py") def update_whitelist(): """Add files to the whitelist""" global whitelist_pep8 # We don't want to test RL-attack because it has so many dependencies # not used elsewhere, and pylint wants to import them all whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "RL-attack" in path ] ) # Similarly, we don't want to require robust_vision_benchmark installed whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "robust_vision_benchmark" in path ] ) # Similarly, we don't want to require that cloud be installed whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "cloud_client" in path ] ) # This example has more dependencies too whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "facenet_adversarial_faces" in path ] ) # This too whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "madry_lab_challenges" in path ] ) # This code is no longer compatible with new versions of cleverhans / scipy and will be removed soon whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "nips17_adversarial_competition" in path ] ) update_whitelist() whitelist_docstrings = [] def test_format_pep8(): """ Test if pep8 is respected. """ files_to_check = [] module_dir = cleverhans.__path__[0] for path in all_py_files: rel_path = os.path.relpath(path, module_dir) if rel_path in whitelist_pep8: continue else: files_to_check.append(path) repo_dir = os.path.join(module_dir, os.pardir) rcpath = os.path.join(repo_dir, ".pylintrc") assert os.path.exists(rcpath) # We must run pylint via the command line and subprocess because of # problems with the pylint module. # The documentation claims you can run it as a python module, but # the documentation is wrong: https://github.com/PyCQA/pylint/issues/1870 # If you run the version described in the linked issue, pylint # calls sys.exit once it is done, so it kills the test. # Running all files in one pylint command is important for 2 reasons: # 1) Correctness: pylint can detect issues that require access to multiple # files, such as cyclic imports # 2) Speed: pylint imports modules for deep analysis, so if you run # multiple subprocesses each needs to re-import tensorflow. # On Ian's laptop, pylint takes about 10s per file to run on the repo, # and there are about 90 files as of the writing of this comment. # Running pylint on all files simultaneously takes about 70s, so it # is a little better than a 10X speedup. # Running multiple jobs in parallel helps but far less than linearly. # On Ian's 4-core laptop, running 4 jobs drops the runtime from 70s # to 45s. # Some of the work is I/O, so it actually makes some sense to run # more jobs than cores. On Ian's 4-core laptop, running 8 jobs drops # the runtime to 40s. # There's a further complication though: I think each job needs to # redo imports, so the total amount of work to do increases with # the number of jobs. On Ian's laptop, using 64 jobs causes the # runtime to increase to 220s. There is not an obvious simple # formula like "use one job per CPU core" or "use way more jobs # than cores to saturate I/O". For now I'm hoping that 8 will be # a reasonable default: it gets good performance on my laptop, # and on machines with fewer than 4 cores there should still be # a benefit to not being blocked on I/O. try: shell_call(["pylint", "--rcfile", rcpath, "--jobs", "8"] + files_to_check) except subprocess.CalledProcessError as e: raise ValueError(e.output.decode("utf-8")) if __name__ == "__main__": test_format_pep8() ================================================ FILE: cleverhans/devtools/version.py ================================================ """ Utility functions for keeping track of the version of CleverHans. These functions provide a finer level of granularity than the manually specified version string attached to each release. """ import hashlib from cleverhans.devtools.list_files import list_files def dev_version(): """ Returns a hexdigest of all the python files in the module. """ md5_hash = hashlib.md5() py_files = sorted(list_files(suffix=".py")) if not py_files: return "" for filename in py_files: with open(filename, "rb") as fobj: content = fobj.read() md5_hash.update(content) return md5_hash.hexdigest() def append_dev_version(release_version): """ If dev version is not empty appends it to release_version. """ dev_version_value = dev_version() if dev_version_value: return release_version + "-" + dev_version_value else: return release_version ================================================ FILE: cleverhans/experimental/README.md ================================================ This directory contains experimental features of CleverHans, which are not integrated into the main API yet. ================================================ FILE: cleverhans/experimental/__init__.py ================================================ ================================================ FILE: cleverhans/experimental/certification/README.md ================================================ # Certification of adversarial robustness This code performs certification of adversarial robustness of given network on given example. Original author: [Aditi Raghunathan](https://github.com/RAditi) ## Dependencies TensorFlow 1.9.0 or higher (to have support of necessary [autograph](https://www.tensorflow.org/guide/autograph) features) ## Usage Example usage for two-layer network trained on MNIST: ```bash # Meaning of the arguments: # checkpoint - TensorFlow checkpoint of the model parameters # model_json - JSON file which describes the model (see below) # test_input - numpy file with input to certify # true_class - true class of the input # adv_class - adversarial class for which we're checking certificate, # -1 means that all adversarial classes will be checked # epsilon - maximum size of adversarial perturbation # init_nu and small_eig_num_steps - optimization parameters python cleverhans/experimental/certification/certify.py \ --checkpoint "${MODEL_DIR}/model.ckpt" \ --model_json "${MODEL_DIR}/model.json" \ --test_input "${INPUTS_DIR}/image.npy" \ --true_class 4 \ --adv_class 5 \ --epsilon 0.2 \ --init_nu 100.0 \ --small_eig_num_steps 100 ``` JSON file which accompany checkpoint and describes layers of the network: ```json [ { "weight_var": "Model/layer0/logits/kernel", "bias_var": "Model/layer0/logits/bias", "type": "ff_relu", "is_transpose": true }, { "weight_var": "Model/logits/kernel", "bias_var": "Model/logits/bias", "type": "ff", "is_transpose": true } ] ``` ================================================ FILE: cleverhans/experimental/certification/__init__.py ================================================ ================================================ FILE: cleverhans/experimental/certification/certify.py ================================================ """Code for running the certification problem.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import time import numpy as np import tensorflow as tf from cleverhans.experimental.certification import dual_formulation from cleverhans.experimental.certification import nn from cleverhans.experimental.certification import optimization from cleverhans.experimental.certification import utils flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_string( "checkpoint", None, "Path of checkpoint with trained model to verify" ) flags.DEFINE_string("model_json", None, "Path of json file with model description") flags.DEFINE_string( "init_dual_file", None, "Path of numpy file with dual variables to initialize" ) flags.DEFINE_string("test_input", None, "Path of numpy file with test input to certify") flags.DEFINE_integer("true_class", 0, "True class of the test input") flags.DEFINE_integer( "adv_class", -1, "target class of adversarial example; all classes if -1" ) flags.DEFINE_float("input_minval", -1, "Minimum value of valid input") flags.DEFINE_float("input_maxval", 1, "Maximum value of valid input") flags.DEFINE_float("epsilon", 0.2, "Size of perturbation") # Nu might need tuning based on the network flags.DEFINE_float("init_nu", 300.0, "Initialization of nu variable.") flags.DEFINE_float("init_penalty", 100.0, "Initial penalty") flags.DEFINE_integer( "small_eig_num_steps", 500, "Number of eigen value steps in intermediate iterations" ) flags.DEFINE_integer( "large_eig_num_steps", 5000, "Number of eigen value steps in each outer iteration" ) flags.DEFINE_integer("inner_num_steps", 600, "Number of steps to run in inner loop") flags.DEFINE_float("outer_num_steps", 10, "Number of steps to run in outer loop") flags.DEFINE_float("beta", 2, "Multiplicative factor to increase penalty by") flags.DEFINE_float( "smoothness_parameter", 0.001, "Smoothness parameter if using eigen decomposition" ) flags.DEFINE_float( "eig_learning_rate", 0.001, "Learning rate for computing min eigen value" ) flags.DEFINE_string("optimizer", "adam", "Optimizer to use for entire optimization") flags.DEFINE_float("init_learning_rate", 0.1, "Initial learning rate") flags.DEFINE_float("learning_rate_decay", 0.1, "Decay of learning rate") flags.DEFINE_float( "momentum_parameter", 0.9, "Momentum parameter if using momentum optimizer" ) flags.DEFINE_integer("print_stats_steps", 50, "Number of steps to print stats after") flags.DEFINE_string("stats_folder", None, "Folder to save stats of the iterations") flags.DEFINE_integer( "projection_steps", 200, "Number of steps to compute projection after" ) flags.DEFINE_integer("num_classes", 10, "Total number of classes") flags.DEFINE_enum( "verbosity", "INFO", ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], "Logging verbosity level.", ) flags.DEFINE_string( "eig_type", "LZS", "Method to compute eigenvalues (TF, SCIPY, or LZS), LZS" ) flags.DEFINE_integer( "lanczos_steps", 20, "Number of steps to perform in Lanczos method." ) flags.DEFINE_integer("num_rows", 28, "Number of rows in image") flags.DEFINE_integer("num_columns", 28, "Number of columns in image") flags.DEFINE_integer("num_channels", 1, "Number of channels in image") MIN_LANCZOS_ITER = 5 def main(_): # pylint: disable=missing-docstring tf.logging.set_verbosity(FLAGS.verbosity) start_time = time.time() # Initialize neural network based on config files input_shape = [FLAGS.num_rows, FLAGS.num_columns, FLAGS.num_channels] nn_params = nn.load_network_from_checkpoint( FLAGS.checkpoint, FLAGS.model_json, input_shape ) tf.logging.info("Loaded neural network with size of layers: %s", nn_params.sizes) tf.logging.info( "Loaded neural network with input shapes: %s", nn_params.input_shapes ) tf.logging.info( "Loaded neural network with output shapes: %s", nn_params.output_shapes ) dual_var = utils.initialize_dual( nn_params, FLAGS.init_dual_file, init_nu=FLAGS.init_nu ) # Reading test input and reshaping with tf.gfile.Open(FLAGS.test_input) as f: test_input = np.load(f) test_input = np.reshape(test_input, [np.size(test_input), 1]) if FLAGS.adv_class == -1: start_class = 0 end_class = FLAGS.num_classes else: start_class = FLAGS.adv_class end_class = FLAGS.adv_class + 1 for adv_class in range(start_class, end_class): tf.logging.info("Running certification for adversarial class %d", adv_class) if adv_class == FLAGS.true_class: continue optimization_params = { "init_penalty": FLAGS.init_penalty, "large_eig_num_steps": FLAGS.large_eig_num_steps, "small_eig_num_steps": FLAGS.small_eig_num_steps, "inner_num_steps": FLAGS.inner_num_steps, "outer_num_steps": FLAGS.outer_num_steps, "beta": FLAGS.beta, "smoothness_parameter": FLAGS.smoothness_parameter, "eig_learning_rate": FLAGS.eig_learning_rate, "optimizer": FLAGS.optimizer, "init_learning_rate": FLAGS.init_learning_rate, "learning_rate_decay": FLAGS.learning_rate_decay, "momentum_parameter": FLAGS.momentum_parameter, "print_stats_steps": FLAGS.print_stats_steps, "stats_folder": FLAGS.stats_folder, "projection_steps": FLAGS.projection_steps, "eig_type": FLAGS.eig_type, "has_conv": nn_params.has_conv, "lanczos_steps": FLAGS.lanczos_steps, } lzs_params = {"min_iter": MIN_LANCZOS_ITER, "max_iter": FLAGS.lanczos_steps} with tf.Session() as sess: dual = dual_formulation.DualFormulation( sess, dual_var, nn_params, test_input, FLAGS.true_class, adv_class, FLAGS.input_minval, FLAGS.input_maxval, FLAGS.epsilon, lzs_params, ) optimization_object = optimization.Optimization( dual, sess, optimization_params ) is_cert_found = optimization_object.run_optimization() if not is_cert_found: print("Example could not be verified") exit() print("Example successfully verified") print("Elapsed time: " + str(time.time() - start_time)) if __name__ == "__main__": tf.app.run(main) ================================================ FILE: cleverhans/experimental/certification/dual_formulation.py ================================================ """Code with dual formulation for certification problem.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from scipy.sparse.linalg import eigs, LinearOperator import tensorflow as tf from tensorflow.contrib import autograph import numpy as np from cleverhans.experimental.certification import utils flags = tf.app.flags FLAGS = flags.FLAGS # Tolerance value for eigenvalue computation TOL = 1e-5 # Binary search constants MAX_BINARY_SEARCH_ITER = 10 NU_UPDATE_CONSTANT = 1.3 # Bound on lowest value of certificate to check for numerical errors LOWER_CERT_BOUND = -5.0 DEFAULT_LZS_PARAMS = {"min_iter": 5, "max_iter": 50} class DualFormulation(object): """DualFormulation is a class that creates the dual objective function and access to matrix vector products for the matrix that is constrained to be Positive semidefinite """ def __init__( self, sess, dual_var, neural_net_param_object, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, lzs_params=None, project_dual=True, ): """Initializes dual formulation class. Args: sess: Tensorflow session dual_var: dictionary of dual variables containing a) lambda_pos b) lambda_neg, c) lambda_quad, d) lambda_lu neural_net_param_object: NeuralNetParam object created for the network under consideration test_input: clean example to certify around true_class: the class label of the test input adv_class: the label that the adversary tried to perturb input to input_minval: minimum value of valid input range input_maxval: maximum value of valid input range epsilon: Size of the perturbation (scaled for [0, 1] input) lzs_params: Parameters for Lanczos algorithm (dictionary) in the form: { 'min_iter': 5 'max_iter': 50 } project_dual: Whether we should create a projected dual object """ self.sess = sess self.nn_params = neural_net_param_object self.test_input = tf.convert_to_tensor(test_input, dtype=tf.float32) self.true_class = true_class self.adv_class = adv_class self.input_minval = tf.convert_to_tensor(input_minval, dtype=tf.float32) self.input_maxval = tf.convert_to_tensor(input_maxval, dtype=tf.float32) self.epsilon = tf.convert_to_tensor(epsilon, dtype=tf.float32) self.lzs_params = lzs_params or DEFAULT_LZS_PARAMS.copy() self.final_linear = ( self.nn_params.final_weights[adv_class, :] - self.nn_params.final_weights[true_class, :] ) self.final_linear = tf.reshape( self.final_linear, shape=[tf.size(self.final_linear), 1] ) self.final_constant = ( self.nn_params.final_bias[adv_class] - self.nn_params.final_bias[true_class] ) self.lanczos_dtype = tf.float64 self.nn_dtype = tf.float32 # Computing lower and upper bounds # Note that lower and upper are of size nn_params.num_hidden_layers + 1 self.lower = [] self.upper = [] # Also computing pre activation lower and upper bounds # to compute always-off and always-on units self.pre_lower = [] self.pre_upper = [] # Initializing at the input layer with \ell_\infty constraints self.lower.append(tf.maximum(self.test_input - self.epsilon, self.input_minval)) self.upper.append(tf.minimum(self.test_input + self.epsilon, self.input_maxval)) self.pre_lower.append(self.lower[0]) self.pre_upper.append(self.upper[0]) for i in range(0, self.nn_params.num_hidden_layers): lo_plus_up = self.nn_params.forward_pass(self.lower[i] + self.upper[i], i) lo_minus_up = self.nn_params.forward_pass( self.lower[i] - self.upper[i], i, is_abs=True ) up_minus_lo = self.nn_params.forward_pass( self.upper[i] - self.lower[i], i, is_abs=True ) current_lower = 0.5 * (lo_plus_up + lo_minus_up) + self.nn_params.biases[i] current_upper = 0.5 * (lo_plus_up + up_minus_lo) + self.nn_params.biases[i] self.pre_lower.append(current_lower) self.pre_upper.append(current_upper) self.lower.append(tf.nn.relu(current_lower)) self.upper.append(tf.nn.relu(current_upper)) # Run lower and upper because they don't change self.pre_lower = self.sess.run(self.pre_lower) self.pre_upper = self.sess.run(self.pre_upper) self.lower = self.sess.run(self.lower) self.upper = self.sess.run(self.upper) # Using the preactivation lower and upper bounds # to compute the linear regions self.positive_indices = [] self.negative_indices = [] self.switch_indices = [] for i in range(0, self.nn_params.num_hidden_layers + 1): # Positive index = 1 if the ReLU is always "on" self.positive_indices.append( np.asarray(self.pre_lower[i] >= 0, dtype=np.float32) ) # Negative index = 1 if the ReLU is always off self.negative_indices.append( np.asarray(self.pre_upper[i] <= 0, dtype=np.float32) ) # Switch index = 1 if the ReLU could be either on or off self.switch_indices.append( np.asarray( np.multiply(self.pre_lower[i], self.pre_upper[i]) < 0, dtype=np.float32, ) ) # Computing the optimization terms self.lambda_pos = [x for x in dual_var["lambda_pos"]] self.lambda_neg = [x for x in dual_var["lambda_neg"]] self.lambda_quad = [x for x in dual_var["lambda_quad"]] self.lambda_lu = [x for x in dual_var["lambda_lu"]] self.nu = dual_var["nu"] self.vector_g = None self.scalar_f = None self.matrix_h = None self.matrix_m = None self.matrix_m_dimension = 1 + np.sum(self.nn_params.sizes) # The primal vector in the SDP can be thought of as [layer_1, layer_2..] # In this concatenated version, dual_index[i] that marks the start # of layer_i # This is useful while computing implicit products with matrix H self.dual_index = [0] for i in range(self.nn_params.num_hidden_layers + 1): self.dual_index.append(self.dual_index[-1] + self.nn_params.sizes[i]) # Construct objectives, matrices, and certificate self.set_differentiable_objective() if not self.nn_params.has_conv: self.get_full_psd_matrix() # Setup Lanczos functionality for compute certificate self.construct_lanczos_params() # Create projected dual object if project_dual: self.projected_dual = self.create_projected_dual() def create_projected_dual(self): """Function to create variables for the projected dual object. Function that projects the input dual variables onto the feasible set. Returns: projected_dual: Feasible dual solution corresponding to current dual """ # TODO: consider whether we can use shallow copy of the lists without # using tf.identity projected_nu = tf.placeholder(tf.float32, shape=[]) min_eig_h = tf.placeholder(tf.float32, shape=[]) projected_lambda_pos = [tf.identity(x) for x in self.lambda_pos] projected_lambda_neg = [tf.identity(x) for x in self.lambda_neg] projected_lambda_quad = [tf.identity(x) for x in self.lambda_quad] projected_lambda_lu = [tf.identity(x) for x in self.lambda_lu] for i in range(self.nn_params.num_hidden_layers + 1): # Making H PSD projected_lambda_lu[i] = ( self.lambda_lu[i] + 0.5 * tf.maximum(-min_eig_h, 0) + TOL ) # Adjusting the value of \lambda_neg to make change in g small projected_lambda_neg[i] = self.lambda_neg[i] + tf.multiply( (self.lower[i] + self.upper[i]), (self.lambda_lu[i] - projected_lambda_lu[i]), ) projected_lambda_neg[i] = tf.multiply( self.negative_indices[i], projected_lambda_neg[i] ) + tf.multiply( self.switch_indices[i], tf.maximum(projected_lambda_neg[i], 0) ) projected_dual_var = { "lambda_pos": projected_lambda_pos, "lambda_neg": projected_lambda_neg, "lambda_lu": projected_lambda_lu, "lambda_quad": projected_lambda_quad, "nu": projected_nu, } projected_dual_object = DualFormulation( self.sess, projected_dual_var, self.nn_params, self.test_input, self.true_class, self.adv_class, self.input_minval, self.input_maxval, self.epsilon, self.lzs_params, project_dual=False, ) projected_dual_object.min_eig_val_h = min_eig_h return projected_dual_object def construct_lanczos_params(self): """Computes matrices T and V using the Lanczos algorithm. Args: k: number of iterations and dimensionality of the tridiagonal matrix Returns: eig_vec: eigen vector corresponding to min eigenvalue """ # Using autograph to automatically handle # the control flow of minimum_eigen_vector self.min_eigen_vec = autograph.to_graph(utils.tf_lanczos_smallest_eigval) def _m_vector_prod_fn(x): return self.get_psd_product(x, dtype=self.lanczos_dtype) def _h_vector_prod_fn(x): return self.get_h_product(x, dtype=self.lanczos_dtype) # Construct nodes for computing eigenvalue of M self.m_min_vec_estimate = np.zeros( shape=(self.matrix_m_dimension, 1), dtype=np.float64 ) zeros_m = tf.zeros(shape=(self.matrix_m_dimension, 1), dtype=tf.float64) self.m_min_vec_ph = tf.placeholder_with_default( input=zeros_m, shape=(self.matrix_m_dimension, 1), name="m_min_vec_ph" ) self.m_min_eig, self.m_min_vec = self.min_eigen_vec( _m_vector_prod_fn, self.matrix_m_dimension, self.m_min_vec_ph, self.lzs_params["max_iter"], dtype=self.lanczos_dtype, ) self.m_min_eig = tf.cast(self.m_min_eig, self.nn_dtype) self.m_min_vec = tf.cast(self.m_min_vec, self.nn_dtype) self.h_min_vec_estimate = np.zeros( shape=(self.matrix_m_dimension - 1, 1), dtype=np.float64 ) zeros_h = tf.zeros(shape=(self.matrix_m_dimension - 1, 1), dtype=tf.float64) self.h_min_vec_ph = tf.placeholder_with_default( input=zeros_h, shape=(self.matrix_m_dimension - 1, 1), name="h_min_vec_ph" ) self.h_min_eig, self.h_min_vec = self.min_eigen_vec( _h_vector_prod_fn, self.matrix_m_dimension - 1, self.h_min_vec_ph, self.lzs_params["max_iter"], dtype=self.lanczos_dtype, ) self.h_min_eig = tf.cast(self.h_min_eig, self.nn_dtype) self.h_min_vec = tf.cast(self.h_min_vec, self.nn_dtype) def set_differentiable_objective(self): """Function that constructs minimization objective from dual variables.""" # Checking if graphs are already created if self.vector_g is not None: return # Computing the scalar term bias_sum = 0 for i in range(0, self.nn_params.num_hidden_layers): bias_sum = bias_sum + tf.reduce_sum( tf.multiply(self.nn_params.biases[i], self.lambda_pos[i + 1]) ) lu_sum = 0 for i in range(0, self.nn_params.num_hidden_layers + 1): lu_sum = lu_sum + tf.reduce_sum( tf.multiply( tf.multiply(self.lower[i], self.upper[i]), self.lambda_lu[i] ) ) self.scalar_f = -bias_sum - lu_sum + self.final_constant # Computing the vector term g_rows = [] for i in range(0, self.nn_params.num_hidden_layers): if i > 0: current_row = ( self.lambda_neg[i] + self.lambda_pos[i] - self.nn_params.forward_pass( self.lambda_pos[i + 1], i, is_transpose=True ) + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i]) + tf.multiply(self.lambda_quad[i], self.nn_params.biases[i - 1]) ) else: current_row = -self.nn_params.forward_pass( self.lambda_pos[i + 1], i, is_transpose=True ) + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i]) g_rows.append(current_row) # Term for final linear term g_rows.append( ( self.lambda_pos[self.nn_params.num_hidden_layers] + self.lambda_neg[self.nn_params.num_hidden_layers] + self.final_linear + tf.multiply( ( self.lower[self.nn_params.num_hidden_layers] + self.upper[self.nn_params.num_hidden_layers] ), self.lambda_lu[self.nn_params.num_hidden_layers], ) + tf.multiply( self.lambda_quad[self.nn_params.num_hidden_layers], self.nn_params.biases[self.nn_params.num_hidden_layers - 1], ) ) ) self.vector_g = tf.concat(g_rows, axis=0) self.unconstrained_objective = self.scalar_f + 0.5 * self.nu def get_h_product(self, vector, dtype=None): """Function that provides matrix product interface with PSD matrix. Args: vector: the vector to be multiplied with matrix H Returns: result_product: Matrix product of H and vector """ # Computing the product of matrix_h with beta (input vector) # At first layer, h is simply diagonal if dtype is None: dtype = self.nn_dtype beta = tf.cast(vector, self.nn_dtype) h_beta_rows = [] for i in range(self.nn_params.num_hidden_layers): # Split beta of this block into [gamma, delta] gamma = beta[self.dual_index[i] : self.dual_index[i + 1]] delta = beta[self.dual_index[i + 1] : self.dual_index[i + 2]] # Expanding the product with diagonal matrices if i == 0: h_beta_rows.append( tf.multiply(2 * self.lambda_lu[i], gamma) - self.nn_params.forward_pass( tf.multiply(self.lambda_quad[i + 1], delta), i, is_transpose=True, ) ) else: h_beta_rows[i] = ( h_beta_rows[i] + tf.multiply(self.lambda_quad[i] + self.lambda_lu[i], gamma) - self.nn_params.forward_pass( tf.multiply(self.lambda_quad[i + 1], delta), i, is_transpose=True, ) ) new_row = tf.multiply( self.lambda_quad[i + 1] + self.lambda_lu[i + 1], delta ) - tf.multiply( self.lambda_quad[i + 1], self.nn_params.forward_pass(gamma, i) ) h_beta_rows.append(new_row) # Last boundary case h_beta_rows[self.nn_params.num_hidden_layers] = h_beta_rows[ self.nn_params.num_hidden_layers ] + tf.multiply( ( self.lambda_quad[self.nn_params.num_hidden_layers] + self.lambda_lu[self.nn_params.num_hidden_layers] ), delta, ) h_beta = tf.concat(h_beta_rows, axis=0) return tf.cast(h_beta, dtype) def get_psd_product(self, vector, dtype=None): """Function that provides matrix product interface with PSD matrix. Args: vector: the vector to be multiplied with matrix M Returns: result_product: Matrix product of M and vector """ # For convenience, think of x as [\alpha, \beta] if dtype is None: dtype = self.nn_dtype vector = tf.cast(vector, self.nn_dtype) alpha = tf.reshape(vector[0], shape=[1, 1]) beta = vector[1:] # Computing the product of matrix_h with beta part of vector # At first layer, h is simply diagonal h_beta = self.get_h_product(beta) # Constructing final result using vector_g result = tf.concat( [ alpha * self.nu + tf.reduce_sum(tf.multiply(beta, self.vector_g)), tf.multiply(alpha, self.vector_g) + h_beta, ], axis=0, ) return tf.cast(result, dtype) def get_full_psd_matrix(self): """Function that returns the tf graph corresponding to the entire matrix M. Returns: matrix_h: unrolled version of tf matrix corresponding to H matrix_m: unrolled tf matrix corresponding to M """ if self.matrix_m is not None: return self.matrix_h, self.matrix_m # Computing the matrix term h_columns = [] for i in range(self.nn_params.num_hidden_layers + 1): current_col_elems = [] for j in range(i): current_col_elems.append( tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]]) ) # For the first layer, there is no relu constraint if i == 0: current_col_elems.append(utils.diag(self.lambda_lu[i])) else: current_col_elems.append( utils.diag(self.lambda_lu[i] + self.lambda_quad[i]) ) if i < self.nn_params.num_hidden_layers: current_col_elems.append( tf.matmul( utils.diag(-1 * self.lambda_quad[i + 1]), self.nn_params.weights[i], ) ) for j in range(i + 2, self.nn_params.num_hidden_layers + 1): current_col_elems.append( tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]]) ) current_column = tf.concat(current_col_elems, 0) h_columns.append(current_column) self.matrix_h = tf.concat(h_columns, 1) self.matrix_h = self.matrix_h + tf.transpose(self.matrix_h) self.matrix_m = tf.concat( [ tf.concat( [tf.reshape(self.nu, (1, 1)), tf.transpose(self.vector_g)], axis=1 ), tf.concat([self.vector_g, self.matrix_h], axis=1), ], axis=0, ) return self.matrix_h, self.matrix_m def make_m_psd(self, original_nu, feed_dictionary): """Run binary search to find a value for nu that makes M PSD Args: original_nu: starting value of nu to do binary search on feed_dictionary: dictionary of updated lambda variables to feed into M Returns: new_nu: new value of nu """ feed_dict = feed_dictionary.copy() _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict) lower_nu = original_nu upper_nu = original_nu num_iter = 0 # Find an upper bound on nu while min_eig_val_m - TOL < 0 and num_iter < (MAX_BINARY_SEARCH_ITER / 2): num_iter += 1 upper_nu *= NU_UPDATE_CONSTANT feed_dict.update({self.nu: upper_nu}) _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict) final_nu = upper_nu # Perform binary search to find best value of nu while lower_nu <= upper_nu and num_iter < MAX_BINARY_SEARCH_ITER: num_iter += 1 mid_nu = (lower_nu + upper_nu) / 2 feed_dict.update({self.nu: mid_nu}) _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict) if min_eig_val_m - TOL < 0: lower_nu = mid_nu else: upper_nu = mid_nu final_nu = upper_nu return final_nu def get_lanczos_eig(self, compute_m=True, feed_dict=None): """Computes the min eigen value and corresponding vector of matrix M or H using the Lanczos algorithm. Args: compute_m: boolean to determine whether we should compute eig val/vec for M or for H. True for M; False for H. feed_dict: dictionary mapping from TF placeholders to values (optional) Returns: min_eig_vec: Corresponding eigen vector to min eig val eig_val: Minimum eigen value """ if compute_m: min_eig, min_vec = self.sess.run( [self.m_min_eig, self.m_min_vec], feed_dict=feed_dict ) else: min_eig, min_vec = self.sess.run( [self.h_min_eig, self.h_min_vec], feed_dict=feed_dict ) return min_vec, min_eig def compute_certificate(self, current_step, feed_dictionary): """Function to compute the certificate based either current value or dual variables loaded from dual folder""" feed_dict = feed_dictionary.copy() nu = feed_dict[self.nu] second_term = self.make_m_psd(nu, feed_dict) tf.logging.info("Nu after modifying: " + str(second_term)) feed_dict.update({self.nu: second_term}) computed_certificate = self.sess.run( self.unconstrained_objective, feed_dict=feed_dict ) tf.logging.info( "Inner step: %d, current value of certificate: %f", current_step, computed_certificate, ) # Sometimes due to either overflow or instability in inverses, # the returned certificate is large and negative -- keeping a check if LOWER_CERT_BOUND < computed_certificate < 0: _, min_eig_val_m = self.get_lanczos_eig(feed_dict=feed_dict) tf.logging.info("min eig val from lanczos: " + str(min_eig_val_m)) input_vector_m = tf.placeholder( tf.float32, shape=(self.matrix_m_dimension, 1) ) output_vector_m = self.get_psd_product(input_vector_m) def np_vector_prod_fn_m(np_vector): np_vector = np.reshape(np_vector, [-1, 1]) feed_dict.update({input_vector_m: np_vector}) output_np_vector = self.sess.run(output_vector_m, feed_dict=feed_dict) return output_np_vector linear_operator_m = LinearOperator( (self.matrix_m_dimension, self.matrix_m_dimension), matvec=np_vector_prod_fn_m, ) # Performing shift invert scipy operation when eig val estimate is available min_eig_val_m_scipy, _ = eigs(linear_operator_m, k=1, which="SR", tol=TOL) tf.logging.info("min eig val m from scipy: " + str(min_eig_val_m_scipy)) if min_eig_val_m - TOL > 0: tf.logging.info("Found certificate of robustness!") return True return False ================================================ FILE: cleverhans/experimental/certification/nn.py ================================================ """This file defines the neural network class, where a network is reinitialized from configuration files. The class also has a forward propagation method. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import json import numpy as np import tensorflow as tf class NeuralNetwork(object): """NeuralNetwork is a class that interfaces the verification code with the neural net parameters (weights). """ def __init__( self, net_weights, net_biases, net_layer_types, input_shape=None, cnn_params=None, ): """Function to initialize NeuralNetParams class. Args: net_weights: list of numpy matrices of weights of each layer [convention: x[i+1] = W[i] x[i] net_biases: list of numpy arrays of biases of each layer net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv' or 'ff_conv_relu'] 'ff': Simple feedforward layer with no activations 'ff_relu': Simple feedforward layer with ReLU activations 'ff_conv': Convolution layer with no activation 'ff_conv_relu': Convolution layer with ReLU activation input_shape: [num_rows, num_columns, num_channels] at the input layer cnn_params: list of dictionaries containing stride and padding for each layer Raises: ValueError: the input lists of net params are not of the same length """ if (len(net_weights) != len(net_biases)) or len(net_biases) != len( net_layer_types ): raise ValueError("Inputs of net params are not of same length ....") if net_layer_types[len(net_layer_types) - 1] != "ff": raise ValueError("Final layer is not linear") self.num_hidden_layers = len(net_weights) - 1 self.weights = [] self.biases = [] self.layer_types = [] self.sizes = [] self.input_shapes = [] self.output_shapes = [] self.has_conv = False if input_shape is not None: current_num_rows = input_shape[0] current_num_columns = input_shape[1] current_num_channels = input_shape[2] self.cnn_params = cnn_params # Setting the sizes of the layers of the network # sizes[i] contains the size of x_i for i in range(self.num_hidden_layers): shape = np.shape(net_weights[i]) self.weights.append(tf.convert_to_tensor(net_weights[i], dtype=tf.float32)) self.layer_types.append(net_layer_types[i]) if self.layer_types[i] in {"ff", "ff_relu"}: self.sizes.append(int(shape[1])) # For feedforward networks, no unraveling the bias terms small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32) self.biases.append(tf.reshape(small_bias, [-1, 1])) # Assumes that x^{i+1} = W_i x^i self.input_shapes.append([int(shape[1]), 1]) self.output_shapes.append([int(shape[0]), 1]) # Convolution type else: self.has_conv = True num_filters = shape[3] self.input_shapes.append( [1, current_num_rows, current_num_columns, current_num_channels] ) self.sizes.append( current_num_rows * current_num_columns * current_num_channels ) current_num_channels = num_filters # For propagating across multiple conv layers if self.cnn_params[i]["padding"] == "SAME": current_num_rows = int( current_num_rows / self.cnn_params[i]["stride"] ) current_num_columns = int( current_num_columns / self.cnn_params[i]["stride"] ) self.output_shapes.append( [1, current_num_rows, current_num_columns, current_num_channels] ) # For conv networks, unraveling the bias terms small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32) large_bias = tf.tile( tf.reshape(small_bias, [-1, 1]), [current_num_rows * current_num_columns, 1], ) self.biases.append(large_bias) # Last layer shape: always ff if self.has_conv: final_dim = int(np.shape(net_weights[self.num_hidden_layers])[1]) self.input_shapes.append([final_dim, 1]) else: final_dim = int(np.shape(net_weights[self.num_hidden_layers - 1])[0]) self.sizes.append(final_dim) self.final_weights = tf.convert_to_tensor( net_weights[self.num_hidden_layers], dtype=tf.float32 ) self.final_bias = tf.convert_to_tensor( net_biases[self.num_hidden_layers], dtype=tf.float32 ) def forward_pass(self, vector, layer_index, is_transpose=False, is_abs=False): """Performs forward pass through the layer weights at layer_index. Args: vector: vector that has to be passed through in forward pass layer_index: index of the layer is_transpose: whether the weights of the layer have to be transposed is_abs: whether to take the absolute value of the weights Returns: tensor that corresponds to the forward pass through the layer Raises: ValueError: if the layer_index is negative or more than num hidden layers """ if layer_index < 0 or layer_index > self.num_hidden_layers: raise ValueError("Invalid layer index") layer_type = self.layer_types[layer_index] weight = self.weights[layer_index] if is_abs: weight = tf.abs(weight) if is_transpose: vector = tf.reshape(vector, self.output_shapes[layer_index]) else: vector = tf.reshape(vector, self.input_shapes[layer_index]) if layer_type in {"ff", "ff_relu"}: if is_transpose: weight = tf.transpose(weight) return_vector = tf.matmul(weight, vector) elif layer_type in {"conv", "conv_relu"}: if is_transpose: return_vector = tf.nn.conv2d_transpose( vector, weight, output_shape=self.input_shapes[layer_index], strides=[ 1, self.cnn_params[layer_index]["stride"], self.cnn_params[layer_index]["stride"], 1, ], padding=self.cnn_params[layer_index]["padding"], ) else: return_vector = tf.nn.conv2d( vector, weight, strides=[ 1, self.cnn_params[layer_index]["stride"], self.cnn_params[layer_index]["stride"], 1, ], padding=self.cnn_params[layer_index]["padding"], ) else: raise NotImplementedError("Unsupported layer type: {0}".format(layer_type)) if is_transpose: return tf.reshape(return_vector, (self.sizes[layer_index], 1)) return tf.reshape(return_vector, (self.sizes[layer_index + 1], 1)) def load_network_from_checkpoint(checkpoint, model_json, input_shape=None): """Function to read the weights from checkpoint based on json description. Args: checkpoint: tensorflow checkpoint with trained model to verify model_json: path of json file with model description of the network list of dictionary items for each layer containing 'type', 'weight_var', 'bias_var' and 'is_transpose' 'type'is one of {'ff', 'ff_relu' or 'conv'}; 'weight_var' is the name of tf variable for weights of layer i; 'bias_var' is the name of tf variable for bias of layer i; 'is_transpose' is set to True if the weights have to be transposed as per convention Note that last layer is always feedforward net_weights: list of numpy matrices of weights of each layer convention: x[i+1] = W[i] x[i] net_biases: list of numpy arrays of biases of each layer net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv' or 'ff_conv_relu'] 'ff': Simple feedforward layer with no activations 'ff_relu': Simple feedforward layer with ReLU activations 'ff_conv': Convolution layer with no activation 'ff_conv_relu': Convolution layer with ReLU activation Raises: ValueError: If layer_types are invalid or variable names not found in checkpoint """ # Load checkpoint reader = tf.train.load_checkpoint(checkpoint) variable_map = reader.get_variable_to_shape_map() checkpoint_variable_names = variable_map.keys() # Parse JSON file for names with tf.gfile.Open(model_json) as f: list_model_var = json.load(f) net_layer_types = [] net_weights = [] net_biases = [] cnn_params = [] # Checking validity of the input and adding to list for layer_model_var in list_model_var: if layer_model_var["type"] not in {"ff", "ff_relu", "conv"}: raise ValueError("Invalid layer type in description") if ( layer_model_var["weight_var"] not in checkpoint_variable_names or layer_model_var["bias_var"] not in checkpoint_variable_names ): raise ValueError("Variable names not found in checkpoint") net_layer_types.append(layer_model_var["type"]) layer_weight = reader.get_tensor(layer_model_var["weight_var"]) layer_bias = reader.get_tensor(layer_model_var["bias_var"]) # TODO(aditirag): is there a way to automatically check when to transpose # We want weights W such that x^{i+1} = W^i x^i + b^i # Can think of a hack involving matching shapes but if shapes are equal # it can be ambiguous if layer_model_var["type"] in {"ff", "ff_relu"}: layer_weight = np.transpose(layer_weight) cnn_params.append(None) if layer_model_var["type"] in {"conv"}: if "stride" not in layer_model_var or "padding" not in layer_model_var: raise ValueError("Please define stride and padding for conv layers.") cnn_params.append( { "stride": layer_model_var["stride"], "padding": layer_model_var["padding"], } ) net_weights.append(layer_weight) net_biases.append(np.reshape(layer_bias, (np.size(layer_bias), 1))) return NeuralNetwork( net_weights, net_biases, net_layer_types, input_shape, cnn_params ) ================================================ FILE: cleverhans/experimental/certification/optimization.py ================================================ """Code for setting up the optimization problem for certification.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import json import os import numpy as np from scipy.sparse.linalg import eigs, LinearOperator import tensorflow as tf from tensorflow.contrib import autograph from cleverhans.experimental.certification import utils UPDATE_PARAM_CONSTANT = -0.1 # Tolerance value for eigenvalue computation TOL = 1e-5 class Optimization(object): """Class that sets up and runs the optimization of dual_formulation""" def __init__(self, dual_formulation_object, sess, optimization_params): """Initialize the class variables. Args: dual_formulation_object: Instance of DualFormulation that contains the dual variables and objective sess: tf session to be used to run optimization_params: Dictionary with the following eig_num_iter - Number of iterations to run for computing minimum eigen value eig_learning_rate - Learning rate for minimum eigen value iterations init_smooth - Starting value of the smoothness parameter (typically around 0.001) smooth_decay - The factor by which to decay after every outer loop epoch optimizer - one of gd, adam, momentum or adagrad eig_type - The method to compute eigenvalues (TF or SCIPY) """ self.sess = sess self.dual_object = dual_formulation_object self.params = optimization_params self.penalty_placeholder = tf.placeholder(tf.float32, shape=[]) # The dimensionality of matrix M is the sum of sizes of all layers + 1 # The + 1 comes due to a row and column of M representing the linear terms self.eig_init_vec_placeholder = tf.placeholder( tf.float32, shape=[1 + self.dual_object.dual_index[-1], 1] ) self.smooth_placeholder = tf.placeholder(tf.float32, shape=[]) self.eig_num_iter_placeholder = tf.placeholder(tf.int32, shape=[]) self.current_eig_val_estimate = None # Create graph for optimization self.prepare_for_optimization() def tf_min_eig_vec(self): """Function for min eigen vector using tf's full eigen decomposition.""" # Full eigen decomposition requires the explicit psd matrix M _, matrix_m = self.dual_object.get_full_psd_matrix() [eig_vals, eig_vectors] = tf.self_adjoint_eig(matrix_m) index = tf.argmin(eig_vals) return tf.reshape(eig_vectors[:, index], shape=[eig_vectors.shape[0].value, 1]) def tf_smooth_eig_vec(self): """Function that returns smoothed version of min eigen vector.""" _, matrix_m = self.dual_object.get_full_psd_matrix() # Easier to think in terms of max so negating the matrix [eig_vals, eig_vectors] = tf.self_adjoint_eig(-matrix_m) exp_eig_vals = tf.exp(tf.divide(eig_vals, self.smooth_placeholder)) scaling_factor = tf.reduce_sum(exp_eig_vals) # Multiplying each eig vector by exponential of corresponding eig value # Scaling factor normalizes the vector to be unit norm eig_vec_smooth = tf.divide( tf.matmul(eig_vectors, tf.diag(tf.sqrt(exp_eig_vals))), tf.sqrt(scaling_factor), ) return tf.reshape( tf.reduce_sum(eig_vec_smooth, axis=1), shape=[eig_vec_smooth.shape[0].value, 1], ) def get_min_eig_vec_proxy(self, use_tf_eig=False): """Computes the min eigen value and corresponding vector of matrix M. Args: use_tf_eig: Whether to use tf's default full eigen decomposition Returns: eig_vec: Minimum absolute eigen value eig_val: Corresponding eigen vector """ if use_tf_eig: # If smoothness parameter is too small, essentially no smoothing # Just output the eigen vector corresponding to min return tf.cond( self.smooth_placeholder < 1e-8, self.tf_min_eig_vec, self.tf_smooth_eig_vec, ) # Using autograph to automatically handle # the control flow of minimum_eigen_vector min_eigen_tf = autograph.to_graph(utils.minimum_eigen_vector) def _vector_prod_fn(x): return self.dual_object.get_psd_product(x) estimated_eigen_vector = min_eigen_tf( x=self.eig_init_vec_placeholder, num_steps=self.eig_num_iter_placeholder, learning_rate=self.params["eig_learning_rate"], vector_prod_fn=_vector_prod_fn, ) return estimated_eigen_vector def get_scipy_eig_vec(self): """Computes scipy estimate of min eigenvalue for matrix M. Returns: eig_vec: Minimum absolute eigen value eig_val: Corresponding eigen vector """ if not self.params["has_conv"]: matrix_m = self.sess.run(self.dual_object.matrix_m) min_eig_vec_val, estimated_eigen_vector = eigs( matrix_m, k=1, which="SR", tol=1e-4 ) min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1]) return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val else: dim = self.dual_object.matrix_m_dimension input_vector = tf.placeholder(tf.float32, shape=(dim, 1)) output_vector = self.dual_object.get_psd_product(input_vector) def np_vector_prod_fn(np_vector): np_vector = np.reshape(np_vector, [-1, 1]) output_np_vector = self.sess.run( output_vector, feed_dict={input_vector: np_vector} ) return output_np_vector linear_operator = LinearOperator((dim, dim), matvec=np_vector_prod_fn) # Performing shift invert scipy operation when eig val estimate is available min_eig_vec_val, estimated_eigen_vector = eigs( linear_operator, k=1, which="SR", tol=1e-4 ) min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1]) return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val def prepare_for_optimization(self): """Create tensorflow op for running one step of descent.""" if self.params["eig_type"] == "TF": self.eig_vec_estimate = self.get_min_eig_vec_proxy() elif self.params["eig_type"] == "LZS": self.eig_vec_estimate = self.dual_object.m_min_vec else: self.eig_vec_estimate = tf.placeholder( tf.float32, shape=(self.dual_object.matrix_m_dimension, 1) ) self.stopped_eig_vec_estimate = tf.stop_gradient(self.eig_vec_estimate) # Eig value is v^\top M v, where v is eigen vector self.eig_val_estimate = tf.matmul( tf.transpose(self.stopped_eig_vec_estimate), self.dual_object.get_psd_product(self.stopped_eig_vec_estimate), ) # Penalizing negative of min eigen value because we want min eig value # to be positive self.total_objective = ( self.dual_object.unconstrained_objective + 0.5 * tf.square( tf.maximum(-self.penalty_placeholder * self.eig_val_estimate, 0) ) ) global_step = tf.Variable(0, trainable=False) # Set up learning rate as a placeholder self.learning_rate = tf.placeholder(tf.float32, shape=[]) # Set up the optimizer if self.params["optimizer"] == "adam": self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate) elif self.params["optimizer"] == "adagrad": self.optimizer = tf.train.AdagradOptimizer(learning_rate=self.learning_rate) elif self.params["optimizer"] == "momentum": self.optimizer = tf.train.MomentumOptimizer( learning_rate=self.learning_rate, momentum=self.params["momentum_parameter"], use_nesterov=True, ) else: self.optimizer = tf.train.GradientDescentOptimizer( learning_rate=self.learning_rate ) # Write out the projection step self.train_step = self.optimizer.minimize( self.total_objective, global_step=global_step ) self.sess.run(tf.global_variables_initializer()) # Projecting the dual variables proj_ops = [] for i in range(self.dual_object.nn_params.num_hidden_layers + 1): # Lambda_pos is non negative for switch indices, # Unconstrained for positive indices # Zero for negative indices proj_ops.append( self.dual_object.lambda_pos[i].assign( tf.multiply( self.dual_object.positive_indices[i], self.dual_object.lambda_pos[i], ) + tf.multiply( self.dual_object.switch_indices[i], tf.nn.relu(self.dual_object.lambda_pos[i]), ) ) ) proj_ops.append( self.dual_object.lambda_neg[i].assign( tf.multiply( self.dual_object.negative_indices[i], self.dual_object.lambda_neg[i], ) + tf.multiply( self.dual_object.switch_indices[i], tf.nn.relu(self.dual_object.lambda_neg[i]), ) ) ) # Lambda_quad is only non zero and positive for switch proj_ops.append( self.dual_object.lambda_quad[i].assign( tf.multiply( self.dual_object.switch_indices[i], tf.nn.relu(self.dual_object.lambda_quad[i]), ) ) ) # Lambda_lu is always non negative proj_ops.append( self.dual_object.lambda_lu[i].assign( tf.nn.relu(self.dual_object.lambda_lu[i]) ) ) self.proj_step = tf.group(proj_ops) # Create folder for saving stats if the folder is not None if self.params.get("stats_folder") and not tf.gfile.IsDirectory( self.params["stats_folder"] ): tf.gfile.MkDir(self.params["stats_folder"]) def run_one_step( self, eig_init_vec_val, eig_num_iter_val, smooth_val, penalty_val, learning_rate_val, ): """Run one step of gradient descent for optimization. Args: eig_init_vec_val: Start value for eigen value computations eig_num_iter_val: Number of iterations to run for eigen computations smooth_val: Value of smoothness parameter penalty_val: Value of penalty for the current step learning_rate_val: Value of learning rate Returns: found_cert: True is negative certificate is found, False otherwise """ # Running step step_feed_dict = { self.eig_init_vec_placeholder: eig_init_vec_val, self.eig_num_iter_placeholder: eig_num_iter_val, self.smooth_placeholder: smooth_val, self.penalty_placeholder: penalty_val, self.learning_rate: learning_rate_val, } if self.params["eig_type"] == "SCIPY": current_eig_vector, self.current_eig_val_estimate = self.get_scipy_eig_vec() step_feed_dict.update({self.eig_vec_estimate: current_eig_vector}) elif self.params["eig_type"] == "LZS": step_feed_dict.update( {self.dual_object.m_min_vec_ph: self.dual_object.m_min_vec_estimate} ) self.sess.run(self.train_step, feed_dict=step_feed_dict) [ _, self.dual_object.m_min_vec_estimate, self.current_eig_val_estimate, ] = self.sess.run( [self.proj_step, self.eig_vec_estimate, self.eig_val_estimate], feed_dict=step_feed_dict, ) if self.current_step % self.params["print_stats_steps"] == 0: [ self.current_total_objective, self.current_unconstrained_objective, self.dual_object.m_min_vec_estimate, self.current_eig_val_estimate, self.current_nu, ] = self.sess.run( [ self.total_objective, self.dual_object.unconstrained_objective, self.eig_vec_estimate, self.eig_val_estimate, self.dual_object.nu, ], feed_dict=step_feed_dict, ) stats = { "total_objective": float(self.current_total_objective), "unconstrained_objective": float(self.current_unconstrained_objective), "min_eig_val_estimate": float(self.current_eig_val_estimate), } tf.logging.info( "Current inner step: %d, optimization stats: %s", self.current_step, stats, ) if self.params["stats_folder"] is not None: stats = json.dumps(stats) filename = os.path.join( self.params["stats_folder"], str(self.current_step) + ".json" ) with tf.gfile.Open(filename) as file_f: file_f.write(stats) # Project onto feasible set of dual variables if ( self.current_step % self.params["projection_steps"] == 0 and self.current_unconstrained_objective < 0 ): nu = self.sess.run(self.dual_object.nu) dual_feed_dict = { self.dual_object.h_min_vec_ph: self.dual_object.h_min_vec_estimate } _, min_eig_val_h_lz = self.dual_object.get_lanczos_eig( compute_m=False, feed_dict=dual_feed_dict ) projected_dual_feed_dict = { self.dual_object.projected_dual.nu: nu, self.dual_object.projected_dual.min_eig_val_h: min_eig_val_h_lz, } if self.dual_object.projected_dual.compute_certificate( self.current_step, projected_dual_feed_dict ): return True return False def run_optimization(self): """Run the optimization, call run_one_step with suitable placeholders. Returns: True if certificate is found False otherwise """ penalty_val = self.params["init_penalty"] # Don't use smoothing initially - very inaccurate for large dimension self.smooth_on = False smooth_val = 0 learning_rate_val = self.params["init_learning_rate"] self.current_outer_step = 1 while self.current_outer_step <= self.params["outer_num_steps"]: tf.logging.info( "Running outer step %d with penalty %f", self.current_outer_step, penalty_val, ) # Running inner loop of optimization with current_smooth_val, # current_penalty as smoothness parameters and penalty respectively self.current_step = 0 # Run first step with random eig initialization and large number of steps found_cert = self.run_one_step( self.dual_object.m_min_vec_estimate, self.params["large_eig_num_steps"], smooth_val, penalty_val, learning_rate_val, ) if found_cert: return True while self.current_step < self.params["inner_num_steps"]: self.current_step = self.current_step + 1 found_cert = self.run_one_step( self.dual_object.m_min_vec_estimate, self.params["small_eig_num_steps"], smooth_val, penalty_val, learning_rate_val, ) if found_cert: return True # Update penalty only if it looks like current objective is optimizes if self.current_total_objective < UPDATE_PARAM_CONSTANT: penalty_val = penalty_val * self.params["beta"] learning_rate_val = ( learning_rate_val * self.params["learning_rate_decay"] ) else: # To get more accurate gradient estimate self.params["small_eig_num_steps"] = ( 1.5 * self.params["small_eig_num_steps"] ) # If eigen values seem small enough, turn on smoothing # useful only when performing full eigen decomposition if np.abs(self.current_eig_val_estimate) < 0.01: smooth_val = self.params["smoothness_parameter"] self.current_outer_step = self.current_outer_step + 1 return False ================================================ FILE: cleverhans/experimental/certification/tests/dual_formulation_test.py ================================================ """Tests for cleverhans.experimental.certification.dual_formulation.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import unittest import numpy as np import tensorflow as tf from cleverhans.experimental.certification import dual_formulation from cleverhans.experimental.certification import nn class DualFormulationTest(unittest.TestCase): def test_init(self): # Function to test initialization of dual formulation class. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) self.assertIsNotNone(dual_formulation_object) def test_set_differentiable_objective(self): # Function to test the function that sets the differentiable objective. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) dual_formulation_object.set_differentiable_objective() self.assertEqual(dual_formulation_object.scalar_f.shape.as_list(), [1]) self.assertEqual( dual_formulation_object.unconstrained_objective.shape.as_list(), [1, 1] ) self.assertEqual(dual_formulation_object.vector_g.shape.as_list(), [5, 1]) def test_get_full_psd_matrix(self): # Function to test product with PSD matrix. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) matrix_h, matrix_m = dual_formulation_object.get_full_psd_matrix() self.assertEqual(matrix_h.shape.as_list(), [5, 5]) self.assertEqual(matrix_m.shape.as_list(), [6, 6]) def test_get_psd_product(self): # Function to test implicit product with PSD matrix. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) _, matrix_m = dual_formulation_object.get_full_psd_matrix() # Testing if the values match six_dim_tensor = tf.random_uniform(shape=(6, 1), dtype=tf.float32) implicit_product = dual_formulation_object.get_psd_product(six_dim_tensor) explicit_product = tf.matmul(matrix_m, six_dim_tensor) [implicit_product_value, explicit_product_value] = sess.run( [implicit_product, explicit_product] ) self.assertEqual( np.shape(implicit_product_value), np.shape(explicit_product_value) ) self.assertLess( np.max(np.abs(implicit_product_value - explicit_product_value)), 1e-5 ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans/experimental/certification/tests/nn_test.py ================================================ """Tests for cleverhans.experimental.certification.nn.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import unittest import numpy as np import tensorflow as tf from cleverhans.experimental.certification import nn class NeuralNetworkTest(unittest.TestCase): def test_init(self): # Function to test initialization of NeuralNetParams object. # Valid params net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) self.assertIsNotNone(nn_params1) # Invalid params : list length net_biases = [0] with self.assertRaises(ValueError): nn.NeuralNetwork(net_weights, net_biases, net_layer_types) # Invalid params: layer types with self.assertRaises(ValueError): net_layer_types = ["ff_relu", "ff_relu"] nn.NeuralNetwork(net_weights, net_biases, net_layer_types) def test_forward_pass(self): # Function to test forward pass of nn_params. net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) input_vector = tf.random_uniform(shape=(2, 1), dtype=tf.float32) output_vector = nn_params.forward_pass(input_vector, 0) self.assertEqual(output_vector.shape.as_list(), [3, 1]) output_vector_2 = nn_params.forward_pass(input_vector, 0, is_abs=True) self.assertEqual(output_vector_2.shape.as_list(), [3, 1]) input_vector_trans = tf.random_uniform(shape=(3, 1), dtype=tf.float32) output_vector_3 = nn_params.forward_pass( input_vector_trans, 0, is_transpose=True ) self.assertEqual(output_vector_3.shape.as_list(), [2, 1]) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans/experimental/certification/tests/optimization_test.py ================================================ """Tests for cleverhans.experimental.certification.optimization.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf from cleverhans.experimental.certification import dual_formulation from cleverhans.experimental.certification import nn from cleverhans.experimental.certification import optimization class OptimizationTest(tf.test.TestCase): # pylint: disable=missing-docstring def prepare_dual_object(self): # Function to prepare dual object to be used for testing optimization. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 # Creating dual variables to use for optimization lambda_pos = [ tf.get_variable( "lambda_pos0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_pos1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] lambda_neg = [ tf.get_variable( "lambda_neg0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_neg1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] lambda_quad = [ tf.get_variable( "lambda_quad0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_quad1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] lambda_lu = [ tf.get_variable( "lambda_lu0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_lu1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] nu = tf.reshape( tf.get_variable("nu", initializer=200.0, dtype=tf.float32), shape=(1, 1) ) dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } sess = tf.Session() dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) return sess, dual_formulation_object def test_init(self): """ Function to test initialization of OptimizationTest. """ sess, dual_formulation_object = self.prepare_dual_object() dual_formulation_object.set_differentiable_objective() sess.run(tf.global_variables_initializer()) optimization_params = { "init_learning_rate": 0.1, "learning_rate_decay": 0.9, "eig_num_iter": 10, "eig_learning_rate": 0.01, "init_smooth": 0.5, "smooth_decay": 0.9, "inner_num_steps": 10, "optimizer": "adam", "momentum_parameter": 0.9, "eig_type": "TF", } optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) self.assertIsNotNone(optimization_object) def test_get_min_eig_vec_proxy(self): """ Function test computing min eigen value using matrix vector products.""" sess, dual_formulation_object = self.prepare_dual_object() _, matrix_m = dual_formulation_object.get_full_psd_matrix() optimization_params = { "init_learning_rate": 0.1, "learning_rate_decay": 0.9, "eig_num_iter": 2000, "eig_learning_rate": 0.01, "init_smooth": 0.0, "smooth_decay": 0.9, "inner_num_steps": 10, "optimizer": "adam", "momentum_parameter": 0.9, "eig_type": "TF", } sess.run(tf.global_variables_initializer()) optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) eig_vec = optimization_object.get_min_eig_vec_proxy() tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True) self.assertIsNotNone(eig_vec) # Running the graphs and checking that minimum eigen value is correct # ** No smoothing tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run( [tf_eig_vec, eig_vec, matrix_m], feed_dict={ optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1), optimization_object.eig_num_iter_placeholder: 2000, optimization_object.smooth_placeholder: 0.0, }, ) # Eigen value corresponding to v is v^\top M v eig_val = np.matmul( np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val) ) tf_eig_val = np.matmul( np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val) ) [np_eig_values, _] = np.linalg.eig(matrix_m_val) self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5) self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-5) # Running the graphs and checking that minimum eigen value is correct # **Smoothing optimization_params["init_smooth"] = 0.0001 optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) eig_vec = optimization_object.get_min_eig_vec_proxy() tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True) tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run( [tf_eig_vec, eig_vec, matrix_m], feed_dict={ optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1), optimization_object.smooth_placeholder: 0.1, optimization_object.eig_num_iter_placeholder: 2000, }, ) # Eigen value corresponding to v is v^\top M v eig_val = np.matmul( np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val) ) tf_eig_val = np.matmul( np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val) ) [np_eig_values, _] = np.linalg.eig(matrix_m_val) self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5) # In general, smoothed version can be far off self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-1) def test_optimization(self): """Function to test optimization.""" sess, dual_formulation_object = self.prepare_dual_object() optimization_params = { "init_penalty": 10000, "large_eig_num_steps": 1000, "small_eig_num_steps": 500, "inner_num_steps": 10, "outer_num_steps": 2, "beta": 2, "smoothness_parameter": 0.001, "eig_learning_rate": 0.01, "optimizer": "adam", "init_learning_rate": 0.1, "learning_rate_decay": 0.9, "momentum_parameter": 0.9, "print_stats_steps": 1, "stats_folder": None, "projection_steps": 200, "eig_type": "TF", } sess.run(tf.global_variables_initializer()) optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) is_cert_found = optimization_object.run_optimization() self.assertFalse(is_cert_found) if __name__ == "__main__": tf.test.main() ================================================ FILE: cleverhans/experimental/certification/tests/utils_test.py ================================================ """Tests for cleverhans.experimental.certification.utils.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np from scipy.sparse.linalg import eigs import tensorflow as tf from tensorflow.contrib import autograph from cleverhans.experimental.certification import utils MATRIX_DIMENTION = 100 NUM_LZS_ITERATIONS = 100 NUM_RANDOM_MATRICES = 10 class UtilsTest(tf.test.TestCase): def test_minimum_eigen_vector(self): matrix = np.array([[1.0, 2.0], [2.0, 5.0]], dtype=np.float32) initial_vec = np.array([[1.0], [-1.0]], dtype=np.float32) def _vector_prod_fn(x): return tf.matmul(matrix, x) min_eigen_fn = autograph.to_graph(utils.minimum_eigen_vector) x = tf.placeholder(tf.float32, shape=(2, 1)) min_eig_vec = min_eigen_fn(x, 10, 0.1, _vector_prod_fn) with self.test_session() as sess: v = sess.run(min_eig_vec, feed_dict={x: initial_vec}) if v.flatten()[0] < 0: v = -v np.testing.assert_almost_equal(v, [[0.9239], [-0.3827]], decimal=4) def test_tf_lanczos_smallest_eigval(self): tf_num_iter = tf.placeholder(dtype=tf.int32, shape=()) tf_matrix = tf.placeholder(dtype=tf.float32) def _vector_prod_fn(x): return tf.matmul(tf_matrix, tf.reshape(x, [-1, 1])) min_eigen_fn = autograph.to_graph(utils.tf_lanczos_smallest_eigval) init_vec_ph = tf.placeholder(shape=(MATRIX_DIMENTION, 1), dtype=tf.float32) tf_eigval, tf_eigvec = min_eigen_fn( _vector_prod_fn, MATRIX_DIMENTION, init_vec_ph, tf_num_iter, dtype=tf.float32, ) eigvec = np.zeros((MATRIX_DIMENTION, 1), dtype=np.float32) with self.test_session() as sess: # run this test for a few random matrices for _ in range(NUM_RANDOM_MATRICES): matrix = np.random.random((MATRIX_DIMENTION, MATRIX_DIMENTION)) matrix = matrix + matrix.T # symmetrizing matrix eigval, eigvec = sess.run( [tf_eigval, tf_eigvec], feed_dict={ tf_num_iter: NUM_LZS_ITERATIONS, tf_matrix: matrix, init_vec_ph: eigvec, }, ) scipy_min_eigval, scipy_min_eigvec = eigs(matrix, k=1, which="SR") scipy_min_eigval = np.real(scipy_min_eigval) scipy_min_eigvec = np.real(scipy_min_eigvec) scipy_min_eigvec = scipy_min_eigvec / np.linalg.norm(scipy_min_eigvec) np.testing.assert_almost_equal(eigval, scipy_min_eigval, decimal=3) np.testing.assert_almost_equal(np.linalg.norm(eigvec), 1.0, decimal=3) abs_dot_prod = abs(np.dot(eigvec.flatten(), scipy_min_eigvec.flatten())) np.testing.assert_almost_equal(abs_dot_prod, 1.0, decimal=3) if __name__ == "__main__": tf.test.main() ================================================ FILE: cleverhans/experimental/certification/utils.py ================================================ """File containing some simple helper functions.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf def diag(diag_elements): """Function to create tensorflow diagonal matrix with input diagonal entries. Args: diag_elements: tensor with diagonal elements Returns: tf matrix with diagonal entries as diag_elements """ return tf.diag(tf.reshape(diag_elements, [-1])) def initialize_dual( neural_net_params_object, init_dual_file=None, random_init_variance=0.01, init_nu=200.0, ): """Function to initialize the dual variables of the class. Args: neural_net_params_object: Object with the neural net weights, biases and types init_dual_file: Path to file containing dual variables, if the path is empty, perform random initialization Expects numpy dictionary with lambda_pos_0, lambda_pos_1, .. lambda_neg_0, lambda_neg_1, .. lambda_quad_0, lambda_quad_1, .. lambda_lu_0, lambda_lu_1, .. random_init_variance: variance for random initialization init_nu: Value to initialize nu variable with Returns: dual_var: dual variables initialized appropriately. """ lambda_pos = [] lambda_neg = [] lambda_quad = [] lambda_lu = [] if init_dual_file is None: for i in range(0, neural_net_params_object.num_hidden_layers + 1): initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_pos.append( tf.get_variable( "lambda_pos_" + str(i), initializer=initializer, dtype=tf.float32 ) ) initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_neg.append( tf.get_variable( "lambda_neg_" + str(i), initializer=initializer, dtype=tf.float32 ) ) initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_quad.append( tf.get_variable( "lambda_quad_" + str(i), initializer=initializer, dtype=tf.float32 ) ) initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_lu.append( tf.get_variable( "lambda_lu_" + str(i), initializer=initializer, dtype=tf.float32 ) ) nu = tf.get_variable("nu", initializer=init_nu) else: # Loading from file dual_var_init_val = np.load(init_dual_file).item() for i in range(0, neural_net_params_object.num_hidden_layers + 1): lambda_pos.append( tf.get_variable( "lambda_pos_" + str(i), initializer=dual_var_init_val["lambda_pos"][i], dtype=tf.float32, ) ) lambda_neg.append( tf.get_variable( "lambda_neg_" + str(i), initializer=dual_var_init_val["lambda_neg"][i], dtype=tf.float32, ) ) lambda_quad.append( tf.get_variable( "lambda_quad_" + str(i), initializer=dual_var_init_val["lambda_quad"][i], dtype=tf.float32, ) ) lambda_lu.append( tf.get_variable( "lambda_lu_" + str(i), initializer=dual_var_init_val["lambda_lu"][i], dtype=tf.float32, ) ) nu = tf.get_variable("nu", initializer=1.0 * dual_var_init_val["nu"]) dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } return dual_var def eig_one_step(current_vector, learning_rate, vector_prod_fn): """Function that performs one step of gd (variant) for min eigen value. Args: current_vector: current estimate of the eigen vector with minimum eigen value. learning_rate: learning rate. vector_prod_fn: function which returns product H*x, where H is a matrix for which we computing eigenvector. Returns: updated vector after one step """ grad = 2 * vector_prod_fn(current_vector) # Current objective = (1/2)*v^T (2*M*v); v = current_vector # grad = 2*M*v current_objective = tf.reshape( tf.matmul(tf.transpose(current_vector), grad) / 2.0, shape=() ) # Project the gradient into the tangent space of the constraint region. # This way we do not waste time taking steps that try to change the # norm of current_vector grad = grad - current_vector * tf.matmul(tf.transpose(current_vector), grad) grad_norm = tf.norm(grad) grad_norm_sq = tf.square(grad_norm) # Computing normalized gradient of unit norm norm_grad = grad / grad_norm # Computing directional second derivative (dsd) # dsd = 2*g^T M g, where g is normalized gradient directional_second_derivative = tf.reshape( 2 * tf.matmul(tf.transpose(norm_grad), vector_prod_fn(norm_grad)), shape=() ) # Computing grad^\top M grad [useful to compute step size later] # Just a rescaling of the directional_second_derivative (which uses # normalized gradient grad_m_grad = directional_second_derivative * grad_norm_sq / 2 # Directional_second_derivative/2 = objective when vector is norm_grad # If this is smaller than current objective, simply return that if directional_second_derivative / 2.0 < current_objective: return norm_grad # If curvature is positive, jump to the bottom of the bowl if directional_second_derivative > 0.0: step = -1.0 * grad_norm / directional_second_derivative else: # If the gradient is very small, do not move if grad_norm_sq <= 1e-16: step = 0.0 else: # Make a heuristic guess of the step size step = -2.0 * tf.reduce_sum(current_vector * grad) / grad_norm_sq # Computing gain using the gradient and second derivative gain = -( 2 * tf.reduce_sum(current_vector * grad) + (step * step) * grad_m_grad ) # Fall back to pre-determined learning rate if no gain if gain < 0.0: step = -learning_rate * grad_norm current_vector = current_vector + step * norm_grad return tf.nn.l2_normalize(current_vector) def minimum_eigen_vector(x, num_steps, learning_rate, vector_prod_fn): """Computes eigenvector which corresponds to minimum eigenvalue. Args: x: initial value of eigenvector. num_steps: number of optimization steps. learning_rate: learning rate. vector_prod_fn: function which takes x and returns product H*x. Returns: approximate value of eigenvector. This function finds approximate value of eigenvector of matrix H which corresponds to smallest (by absolute value) eigenvalue of H. It works by solving optimization problem x^{T}*H*x -> min. """ x = tf.nn.l2_normalize(x) for _ in range(num_steps): x = eig_one_step(x, learning_rate, vector_prod_fn) return x def tf_lanczos_smallest_eigval( vector_prod_fn, matrix_dim, initial_vector, num_iter=1000, max_iter=1000, collapse_tol=1e-9, dtype=tf.float32, ): """Computes smallest eigenvector and eigenvalue using Lanczos in pure TF. This function computes smallest eigenvector and eigenvalue of the matrix which is implicitly specified by `vector_prod_fn`. `vector_prod_fn` is a function which takes `x` and returns a product of matrix in consideration and `x`. Computation is done using Lanczos algorithm, see https://en.wikipedia.org/wiki/Lanczos_algorithm#The_algorithm Args: vector_prod_fn: function which takes a vector as an input and returns matrix vector product. matrix_dim: dimentionality of the matrix. initial_vector: guess vector to start the algorithm with num_iter: user-defined number of iterations for the algorithm max_iter: maximum number of iterations. collapse_tol: tolerance to determine collapse of the Krylov subspace dtype: type of data Returns: tuple of (eigenvalue, eigenvector) of smallest eigenvalue and corresponding eigenvector. """ # alpha will store diagonal elements alpha = tf.TensorArray(dtype, size=1, dynamic_size=True, element_shape=()) # beta will store off diagonal elements beta = tf.TensorArray(dtype, size=0, dynamic_size=True, element_shape=()) # q will store Krylov space basis q_vectors = tf.TensorArray( dtype, size=1, dynamic_size=True, element_shape=(matrix_dim, 1) ) # If start vector is all zeros, make it a random normal vector and run for max_iter if tf.norm(initial_vector) < collapse_tol: initial_vector = tf.random_normal(shape=(matrix_dim, 1), dtype=dtype) num_iter = max_iter w = initial_vector / tf.norm(initial_vector) # Iteration 0 of Lanczos q_vectors = q_vectors.write(0, w) w_ = vector_prod_fn(w) cur_alpha = tf.reduce_sum(w_ * w) alpha = alpha.write(0, cur_alpha) w_ = w_ - tf.scalar_mul(cur_alpha, w) w_prev = w w = w_ # Subsequent iterations of Lanczos for i in tf.range(1, num_iter): cur_beta = tf.norm(w) if cur_beta < collapse_tol: # return early if Krylov subspace collapsed break # cur_beta is larger than collapse_tol, # so division will return finite result. w = w / cur_beta w_ = vector_prod_fn(w) cur_alpha = tf.reduce_sum(w_ * w) q_vectors = q_vectors.write(i, w) alpha = alpha.write(i, cur_alpha) beta = beta.write(i - 1, cur_beta) w_ = w_ - tf.scalar_mul(cur_alpha, w) - tf.scalar_mul(cur_beta, w_prev) w_prev = w w = w_ alpha = alpha.stack() beta = beta.stack() q_vectors = tf.reshape(q_vectors.stack(), (-1, matrix_dim)) offdiag_submatrix = tf.linalg.diag(beta) tridiag_matrix = ( tf.linalg.diag(alpha) + tf.pad(offdiag_submatrix, [[0, 1], [1, 0]]) + tf.pad(offdiag_submatrix, [[1, 0], [0, 1]]) ) eigvals, eigvecs = tf.linalg.eigh(tridiag_matrix) smallest_eigval = eigvals[0] smallest_eigvec = tf.matmul(tf.reshape(eigvecs[:, 0], (1, -1)), q_vectors) smallest_eigvec = smallest_eigvec / tf.norm(smallest_eigvec) smallest_eigvec = tf.reshape(smallest_eigvec, (matrix_dim, 1)) return smallest_eigval, smallest_eigvec ================================================ FILE: cleverhans/generic/README.md ================================================ # Generic Code (framework independent) This folder contains code that is framework independent (for example, it uses the numpy library only or can handle support for all major deep learning libraries). ================================================ FILE: cleverhans/generic/__init__.py ================================================ ================================================ FILE: cleverhans/jax/__init__.py ================================================ ================================================ FILE: cleverhans/jax/attacks/__init__.py ================================================ from cleverhans.jax.attacks.projected_gradient_descent import projected_gradient_descent ================================================ FILE: cleverhans/jax/attacks/fast_gradient_method.py ================================================ import jax.numpy as np from jax import grad, vmap from jax.nn import log_softmax as logsoftmax from cleverhans.jax.utils import one_hot def fast_gradient_method( model_fn, x, eps, norm, clip_min=None, clip_max=None, y=None, targeted=False ): """ JAX implementation of the Fast Gradient Method. :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf or 2. :param clip_min: (optional) float. Minimum float value for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param y: (optional) Tensor with one-hot true labels. If targeted is true, then provide the target one-hot label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. This argument does not have to be a binary one-hot label (e.g., [0, 1, 0, 0]), it can be floating points values that sum up to 1 (e.g., [0.05, 0.85, 0.05, 0.05]). :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ if norm not in [np.inf, 2]: raise ValueError("Norm order must be either np.inf or 2.") if y is None: # Using model predictions as ground truth to avoid label leaking x_labels = np.argmax(model_fn(x), 1) y = one_hot(x_labels, 10) def loss_adv(image, label): pred = model_fn(image[None]) loss = -np.sum(logsoftmax(pred) * label) if targeted: loss = -loss return loss grads_fn = vmap(grad(loss_adv), in_axes=(0, 0), out_axes=0) grads = grads_fn(x, y) axis = list(range(1, len(grads.shape))) avoid_zero_div = 1e-12 if norm == np.inf: perturbation = eps * np.sign(grads) elif norm == 1: raise NotImplementedError("L_1 norm has not been implemented yet.") elif norm == 2: square = np.maximum( avoid_zero_div, np.sum(np.square(grads), axis=axis, keepdims=True) ) perturbation = grads / np.sqrt(square) adv_x = x + perturbation # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = np.clip(adv_x, a_min=clip_min, a_max=clip_max) return adv_x ================================================ FILE: cleverhans/jax/attacks/projected_gradient_descent.py ================================================ import jax.numpy as np from cleverhans.jax.attacks.fast_gradient_method import fast_gradient_method from cleverhans.jax.utils import clip_eta, one_hot def projected_gradient_descent( model_fn, x, eps, eps_iter, nb_iter, norm, clip_min=None, clip_max=None, y=None, targeted=False, rand_init=None, rand_minmax=0.3, ): """ This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572. :param eps_iter: step size for each attack iteration :param nb_iter: Number of attack iterations. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf or 2. :param clip_min: (optional) float. Minimum float value for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ assert eps_iter <= eps, (eps_iter, eps) if norm == 1: raise NotImplementedError( "It's not clear that FGM is a good inner loop" " step for PGD when norm=1, because norm=1 FGM " " changes only one pixel at a time. We need " " to rigorously test a strong norm=1 PGD " "before enabling this feature." ) if norm not in [np.inf, 2]: raise ValueError("Norm order must be either np.inf or 2.") # Initialize loop variables if rand_init: rand_minmax = eps eta = np.random.uniform(x.shape, -rand_minmax, rand_minmax) else: eta = np.zeros_like(x) # Clip eta eta = clip_eta(eta, norm, eps) adv_x = x + eta if clip_min is not None or clip_max is not None: adv_x = np.clip(adv_x, a_min=clip_min, a_max=clip_max) if y is None: # Using model predictions as ground truth to avoid label leaking x_labels = np.argmax(model_fn(x), 1) y = one_hot(x_labels, 10) for _ in range(nb_iter): adv_x = fast_gradient_method( model_fn, adv_x, eps_iter, norm, clip_min=clip_min, clip_max=clip_max, y=y, targeted=targeted, ) # Clipping perturbation eta to norm norm ball eta = adv_x - x eta = clip_eta(eta, norm, eps) adv_x = x + eta # Redo the clipping. # FGM already did it, but subtracting and re-adding eta can add some # small numerical error. if clip_min is not None or clip_max is not None: adv_x = np.clip(adv_x, a_min=clip_min, a_max=clip_max) return adv_x ================================================ FILE: cleverhans/jax/utils.py ================================================ import jax.numpy as np def one_hot(x, k, dtype=np.float32): """Create a one-hot encoding of x of size k.""" return np.array(x[:, None] == np.arange(k), dtype) def partial_flatten(x): """Flatten all but the first dimension of an ndarray.""" return np.reshape(x, (x.shape[0], -1)) def clip_eta(eta, norm, eps): """ Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param norm: Order of the norm (mimics Numpy). Possible values: np.inf or 2. :param eps: Epsilon, bound of the perturbation. """ # Clipping perturbation eta to self.norm norm ball if norm not in [np.inf, 2]: raise ValueError("norm must be np.inf or 2.") axis = list(range(1, len(eta.shape))) avoid_zero_div = 1e-12 if norm == np.inf: eta = np.clip(eta, a_min=-eps, a_max=eps) elif norm == 2: # avoid_zero_div must go inside sqrt to avoid a divide by zero in the gradient through this operation norm = np.sqrt( np.maximum(avoid_zero_div, np.sum(np.square(eta), axis=axis, keepdims=True)) ) # We must *clip* to within the norm ball, not *normalize* onto the surface of the ball factor = np.minimum(1.0, np.divide(eps, norm)) eta = eta * factor return eta ================================================ FILE: cleverhans/plot/__init__.py ================================================ """ Plotting and visualization """ ================================================ FILE: cleverhans/plot/image.py ================================================ """ Functionality for displaying or saving images. """ from tempfile import mkstemp import os import platform import numpy as np from PIL import Image from cleverhans.utils import shell_call def show(ndarray, min_val=None, max_val=None): """ Display an image. :param ndarray: The image as an ndarray :param min_val: The minimum pixel value in the image format :param max_val: The maximum pixel valie in the image format If min_val and max_val are not specified, attempts to infer whether the image is in any of the common ranges: [0, 1], [-1, 1], [0, 255] This can be ambiguous, so it is better to specify if known. """ # Create a temporary file with the suffix '.png'. fd, path = mkstemp(suffix=".png") os.close(fd) save(path, ndarray, min_val, max_val) shell_call(VIEWER_COMMAND + [path]) def save(path, ndarray, min_val=None, max_val=None): """ Save an image, represented as an ndarray, to the filesystem :param path: string, filepath :param ndarray: The image as an ndarray :param min_val: The minimum pixel value in the image format :param max_val: The maximum pixel valie in the image format If min_val and max_val are not specified, attempts to infer whether the image is in any of the common ranges: [0, 1], [-1, 1], [0, 255] This can be ambiguous, so it is better to specify if known. """ as_pil(ndarray, min_val, max_val).save(path) def as_pil(ndarray, min_val=None, max_val=None): """ Converts an ndarray to a PIL image. :param ndarray: The numpy ndarray to convert :param min_val: The minimum pixel value in the image format :param max_val: The maximum pixel valie in the image format If min_val and max_val are not specified, attempts to infer whether the image is in any of the common ranges: [0, 1], [-1, 1], [0, 255] This can be ambiguous, so it is better to specify if known. """ assert isinstance(ndarray, np.ndarray) # rows x cols for grayscale image # rows x cols x channels for color assert ndarray.ndim in [2, 3] if ndarray.ndim == 3: channels = ndarray.shape[2] # grayscale or RGB assert channels in [1, 3] actual_min = ndarray.min() actual_max = ndarray.max() if min_val is not None: assert actual_min >= min_val assert actual_max <= max_val if np.issubdtype(ndarray.dtype, np.floating): if min_val is None: if actual_min < -1.0: raise ValueError("Unrecognized range") if actual_min < 0: min_val = -1.0 else: min_val = 0.0 if max_val is None: if actual_max > 255.0: raise ValueError("Unrecognized range") if actual_max > 1.0: max_val = 255.0 else: max_val = 1.0 ndarray = ndarray - min_val value_range = max_val - min_val ndarray *= 255.0 / value_range ndarray = np.cast["uint8"](ndarray) elif "int" in str(ndarray.dtype): if min_val is not None: assert min_val == 0 else: assert actual_min >= 0.0 if max_val is not None: assert max_val == 255 else: assert actual_max <= 255.0 else: raise ValueError("Unrecognized dtype") out = Image.fromarray(ndarray) return out def make_grid(image_batch): """ Turns a batch of images into one big image. :param image_batch: ndarray, shape (batch_size, rows, cols, channels) :returns : a big image containing all `batch_size` images in a grid """ m, ir, ic, ch = image_batch.shape pad = 3 padded = np.zeros((m, ir + pad * 2, ic + pad * 2, ch)) padded[:, pad:-pad, pad:-pad, :] = image_batch m, ir, ic, ch = padded.shape pr = int(np.sqrt(m)) pc = int(np.ceil(float(m) / pr)) extra_m = pr * pc assert extra_m > m padded = np.concatenate((padded, np.zeros((extra_m - m, ir, ic, ch))), axis=0) row_content = np.split(padded, pr) row_content = [np.split(content, pc) for content in row_content] rows = [np.concatenate(content, axis=2) for content in row_content] grid = np.concatenate(rows, axis=1) assert grid.shape[0] == 1, grid.shape grid = grid[0] return grid if platform.system() == "Darwin": VIEWER_COMMAND = ["open", "-a", "Preview"] else: VIEWER_COMMAND = ["eog", "--new-instance"] ================================================ FILE: cleverhans/plot/pyplot_defaults.py ================================================ """Defaults for pyplot Import this file to set some default parameters for pyplot. These are designed to make the plot look good in the context of a LaTeX document. If you have installed the Computer Modern fonts ( ftp://canopus.iacp.dvo.ru/pub/Font/cm_unicode/cm-unicode-0.6.3a-otf.tar.gz ) these defaults will use them, so that text in your pyplot figures will match text in the rest of your document. If you do not have those fonts installed, pyplot commands will still work. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import matplotlib from matplotlib import pyplot matplotlib.rcParams["text.latex.preamble"] = r"\usepackage{bm}" matplotlib.rcParams["text.usetex"] = True pyplot.rcParams["pdf.fonttype"] = 42 pyplot.rcParams["font.family"] = "serif" pyplot.rcParams["font.serif"] = "CMU Serif" pyplot.rcParams["font.size"] = 8 # Note: if you get an error, delete fontList.cache ================================================ FILE: cleverhans/plot/pyplot_image.py ================================================ """ Functionality for showing images in pyplot. See also cleverhans.plot.image for loading/saving image files, showing images in 3rd party viewers, etc. """ import numpy as np from six.moves import range def pair_visual(original, adversarial, figure=None): """ This function displays two images: the original and the adversarial sample :param original: the original input :param adversarial: the input after perturbations have been applied :param figure: if we've already displayed images, use the same plot :return: the matplot figure to reuse for future samples """ import matplotlib.pyplot as plt # Squeeze the image to remove single-dimensional entries from array shape original = np.squeeze(original) adversarial = np.squeeze(adversarial) # Ensure our inputs are of proper shape assert len(original.shape) == 2 or len(original.shape) == 3 # To avoid creating figures per input sample, reuse the sample plot if figure is None: plt.ion() figure = plt.figure() figure.canvas.set_window_title("Cleverhans: Pair Visualization") # Add the images to the plot perturbations = adversarial - original for index, image in enumerate((original, perturbations, adversarial)): figure.add_subplot(1, 3, index + 1) plt.axis("off") # If the image is 2D, then we have 1 color channel if len(image.shape) == 2: plt.imshow(image, cmap="gray") else: plt.imshow(image) # Give the plot some time to update plt.pause(0.01) # Draw the plot and return plt.show() return figure def grid_visual(data): """ This function displays a grid of images to show full misclassification :param data: grid data of the form; [nb_classes : nb_classes : img_rows : img_cols : nb_channels] :return: if necessary, the matplot figure to reuse """ import matplotlib.pyplot as plt # Ensure interactive mode is disabled and initialize our graph plt.ioff() figure = plt.figure() figure.canvas.set_window_title("Cleverhans: Grid Visualization") # Add the images to the plot num_cols = data.shape[0] num_rows = data.shape[1] num_channels = data.shape[4] for y in range(num_rows): for x in range(num_cols): figure.add_subplot(num_rows, num_cols, (x + 1) + (y * num_cols)) plt.axis("off") if num_channels == 1: plt.imshow(data[x, y, :, :, 0], cmap="gray") else: plt.imshow(data[x, y, :, :, :]) # Draw the plot and return plt.show() return figure def get_logits_over_interval( sess, model, x_data, fgsm_params, min_epsilon=-10.0, max_epsilon=10.0, num_points=21 ): """Get logits when the input is perturbed in an interval in adv direction. Args: sess: Tf session model: Model for which we wish to get logits. x_data: Numpy array corresponding to single data. point of shape [height, width, channels]. fgsm_params: Parameters for generating adversarial examples. min_epsilon: Minimum value of epsilon over the interval. max_epsilon: Maximum value of epsilon over the interval. num_points: Number of points used to interpolate. Returns: Numpy array containing logits. Raises: ValueError if min_epsilon is larger than max_epsilon. """ # Get the height, width and number of channels height = x_data.shape[0] width = x_data.shape[1] channels = x_data.shape[2] x_data = np.expand_dims(x_data, axis=0) import tensorflow as tf from cleverhans.attacks import FastGradientMethod # Define the data placeholder x = tf.placeholder(dtype=tf.float32, shape=[1, height, width, channels], name="x") # Define adv_x fgsm = FastGradientMethod(model, sess=sess) adv_x = fgsm.generate(x, **fgsm_params) if min_epsilon > max_epsilon: raise ValueError("Minimum epsilon is less than maximum epsilon") eta = tf.nn.l2_normalize(adv_x - x, dim=0) epsilon = tf.reshape( tf.lin_space(float(min_epsilon), float(max_epsilon), num_points), (num_points, 1, 1, 1), ) lin_batch = x + epsilon * eta logits = model.get_logits(lin_batch) with sess.as_default(): log_prob_adv_array = sess.run(logits, feed_dict={x: x_data}) return log_prob_adv_array def linear_extrapolation_plot( log_prob_adv_array, y, file_name, min_epsilon=-10, max_epsilon=10, num_points=21 ): """Generate linear extrapolation plot. Args: log_prob_adv_array: Numpy array containing log probabilities y: Tf placeholder for the labels file_name: Plot filename min_epsilon: Minimum value of epsilon over the interval max_epsilon: Maximum value of epsilon over the interval num_points: Number of points used to interpolate """ import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt figure = plt.figure() figure.canvas.set_window_title("Cleverhans: Linear Extrapolation Plot") correct_idx = np.argmax(y, axis=0) fig = plt.figure() plt.xlabel("Epsilon") plt.ylabel("Logits") x_axis = np.linspace(min_epsilon, max_epsilon, num_points) plt.xlim(min_epsilon - 1, max_epsilon + 1) for i in range(y.shape[0]): if i == correct_idx: ls = "-" linewidth = 5 else: ls = "--" linewidth = 2 plt.plot( x_axis, log_prob_adv_array[:, i], ls=ls, linewidth=linewidth, label="{}".format(i), ) plt.legend(loc="best", fontsize=14) plt.show() fig.savefig(file_name) plt.clf() return figure ================================================ FILE: cleverhans/plot/save_pdf.py ================================================ """ The save_pdf function. """ from matplotlib.backends.backend_pdf import PdfPages from matplotlib import pyplot def save_pdf(path): """ Saves a pdf of the current matplotlib figure. :param path: str, filepath to save to """ pp = PdfPages(path) pp.savefig(pyplot.gcf()) pp.close() ================================================ FILE: cleverhans/plot/success_fail.py ================================================ """Functions for plotting succes-failure curves Reference: https://openreview.net/forum?id=H1g0piA9tQ """ import warnings import numpy as np from matplotlib import pyplot from cleverhans.serial import load from cleverhans.utils import safe_zip LINEWIDTH = 2 DEFAULT_SUCCESS_NAME = "clean" # This must be a tuple or it is not safe to use as a param default DEFAULT_FAIL_NAMES = ("mc", "bundled") def plot_report_from_path( path, success_name=DEFAULT_SUCCESS_NAME, fail_names=DEFAULT_FAIL_NAMES, label=None, is_max_confidence=True, linewidth=LINEWIDTH, plot_upper_bound=True, ): """ Plots a success-fail curve from a confidence report stored on disk, :param path: string filepath for the stored report. (Should be the output of make_confidence_report*.py) :param success_name: The name (confidence report key) of the data that should be used to measure success rate :param fail_names: A list of names (confidence report keys) of the data that should be used to measure failure rate. *Only one of these keys will be plotted*. Each key will be tried in order until one is found in the report. This is to support both the output of `make_confidence_report` and `make_confidence_report_bundled`. :param label: Optional string. Name to use for this curve in the legend. :param is_max_confidence: bool. If True, when measuring the failure rate, treat the data as the output of a maximum confidence attack procedure. This means that the attack is optimal (assuming the underlying optimizer is good enough, *which is probably false*, so interpret the plot accordingly) for thresholds >= .5 but for lower thresholds the observed failure rate is a lower bound on the true worst failure rate and the observed coverage is an upper bound (assuming good enough optimization) on the true failure rate. The plot thus draws the threshold >= .5 portion of the curve with a solid line and the upper and lower bounds with a dashed line. See https://openreview.net/forum?id=H1g0piA9tQ for details. If False, the attack procedure is regarded as an ad hoc way of obtaining a loose lower bound, and thus the whole curve is drawn with dashed lines. :param linewidth: thickness of the line to draw :param plot_upper_bound: include upper bound on error rate in plot """ report = load(path) plot_report( report, success_name, fail_names, label, is_max_confidence, linewidth, plot_upper_bound, ) def plot_report( report, success_name, fail_names, label=None, is_max_confidence=True, linewidth=LINEWIDTH, plot_upper_bound=True, ): """ Plot a success fail curve from a confidence report :param report: A confidence report (the type of object saved by make_confidence_report.py) :param success_name: see plot_report_from_path :param fail_names: see plot_report_from_path :param label: see plot_report_from_path :param is_max_confidence: see plot_report_from_path :param linewidth: see plot_report_from_path """ ( fail_optimal, success_optimal, fail_lower_bound, fail_upper_bound, success_bounded, ) = make_curve(report, success_name, fail_names) assert len(fail_lower_bound) == len(fail_upper_bound) fail_optimal = np.array(fail_optimal) fail_lower_bound = np.array(fail_lower_bound) fail_upper_bound = np.array(fail_upper_bound) if is_max_confidence: (p,) = pyplot.plot( fail_optimal, success_optimal, label=label, linewidth=linewidth ) color = p.get_color() pyplot.plot(fail_lower_bound, success_bounded, "--", color=color) if plot_upper_bound: pyplot.plot(fail_upper_bound, success_bounded, "--", color=color) else: # If the attack was not MaxConfidence, then this whole curve is just # a loose lower bound all_fail = np.concatenate((fail_optimal, fail_lower_bound), axis=0) pyplot.plot( all_fail, success_optimal + success_bounded, "--", label=label, linewidth=linewidth, ) pyplot.xlabel("Failure rate on adversarial examples") pyplot.ylabel("Success rate on clean examples") gap = fail_upper_bound - fail_lower_bound if gap.size > 0: assert gap.min() >= 0.0 print("Max gap: ", gap.max()) def make_curve(report, success_name, fail_names): """ Make a success-failure curve. :param report: A confidence report (the type of object saved by make_confidence_report.py) :param success_name: see plot_report_from_path :param fail_names: see plot_report_from_path :returns: fail_optimal: list of failure rates on adversarial data for the optimal (t >= .5) part of the curve. Each entry corresponds to a different threshold. Thresholds are chosen to make the smoothest possible curve from the available data, e.g. one threshold between each unique confidence value observed in the data. To make sure that linear interpolation between points in the curve never overestimates the failure rate for a specific success rate, the curve also includes extra points that increment the failure rate prior to any point that increments the success rate, so the curve moves up and to the right in a series of backwards "L" shapes rather than moving up and to the right along diagonal lines. For large datasets these maximally pessimistic points will usually not be visible and the curve will appear smooth. success_optimal: list of success rates on clean data on the optimal part of the curve. Matches up with `fail_optimal`. fail_lower_bound: list of observed failure rates on the t < .5 portion of the curve where MaxConfidence is not optimal. fail_upper_bound: list of upper bounds (assuming good enough optimization, so not a true upper bound) on the failure rates on the t < .5 portion of the curve where MaxConfidence is not optimal. Matches up with `fail_lower_bound`. success_bounded: success rates on the non-optimal part of the curve. Matches up with `fail_lower_bound` and `fail_upper_bound`. """ success_results = report[success_name] fail_name = None # pacify pylint found = False for fail_name in fail_names: if fail_name in report: found = True break if not found: raise ValueError( fail_name + " not in report." "Available keys: " + str(report.keys()) ) fail_results = report[fail_name] # "good" means drawn from the distribution where we measure success rate. # "bad" means drawn from the distribution where we measure failure rate. # From here on out we use those terms, to avoid confusion between examples # that actually failed and examples that were drawn from the distribution # where we measured failure rate. old_all_probs_version = False if isinstance(success_results, dict): # This dictionary key lookup will trigger a deprecation warning if `success_results` is not the old dictionary # style of report, so we don't want to do a dictionary lookup unless we really are using the old version. old_all_probs_version = "all_probs" in success_results if old_all_probs_version: warnings.warn( "The 'all_probs' key is included only to support " " old files from a private development codebase. " "Support for this key can be dropped at any time " " without warning." ) good_probs = success_results["all_probs"] bad_probs = fail_results["all_probs"] bad_corrects = fail_results["correctness_mask"] good_corrects = success_results["correctness_mask"] else: if isinstance(success_results, dict): # Still using dict, but using newer key names warnings.warn( "Support for dictionary confidence reports is deprecated. Switch to using the classes in " "cleverhans.confidence_report. Support for old dictionary-style reports may be removed " "on or after 2019-07-19." ) good_probs = success_results["confidence"] bad_probs = fail_results["confidence"] good_corrects = success_results["correctness"] bad_corrects = fail_results["correctness"] else: # current version good_probs = success_results.confidence bad_probs = fail_results.confidence good_corrects = success_results.correctness bad_corrects = fail_results.correctness good_triplets = [ (prob, correct, True) for prob, correct in safe_zip(good_probs, good_corrects) ] bad_triplets = [ (prob, correct, False) for prob, correct in safe_zip(bad_probs, bad_corrects) ] total_good = len(good_triplets) total_bad = len(bad_triplets) if total_good != 10000: warnings.warn( "Not using full test set? Found " + str(total_good) + " examples for measuring success rate" ) if total_bad != 10000: warnings.warn("Not using full test set for adversarial examples?") all_triplets = good_triplets + bad_triplets all_triplets = sorted(all_triplets, key=lambda x: -x[0]) # Start with the case for threshold t = 1. # Examples are covered only if prob > t (strict inequality) # So initially nothing is covered good_covered_and_correct = 0 bad_covered_and_incorrect = 0 # Number of examples that are bad, incorrect, and covered by # a t >= 0.5, or that were merely covered by a t < 0.5 failure_opportunities = 0 next_idx = 0 fail_optimal = [] success_optimal = [] fail_upper_bound = [] fail_lower_bound = [] success_bounded = [] bounded = False # NOTE: the loop always exits via an internal break statement. # Copied the termination condition to the while statement for ease # of reading. while next_idx < len(all_triplets): gs = float(good_covered_and_correct) / total_good bf = float(bad_covered_and_incorrect) / total_bad # Add results for current threshold to the list if not bounded: # Sometimes when there are big jumps the failure rate it makes # artifacts in the plot, where there's a long linear track. # This implies the real success-fail curve is linear when # actually it just isn't sampled by the data. # To avoid implying that the model reaches a higher success # rate than it actually does, we avoid these plotting artifacts # by introducing extra points that make the graph move horizontally # to the right first, then vertically. if len(fail_optimal) > 0: prev_bf = fail_optimal[-1] prev_gs = success_optimal[-1] if gs > prev_gs and bf > prev_bf: fail_optimal.append(bf) success_optimal.append(prev_gs) success_optimal.append(gs) fail_optimal.append(bf) else: success_bounded.append(gs) fail_lower_bound.append(bf) fail_upper_bound.append(float(failure_opportunities) / total_bad) if next_idx == len(all_triplets): break # next_prob_to_include is not quite the same thing as the threshold. # The threshold is infinitesimally smaller than this value. next_prob_to_include = all_triplets[next_idx][0] # Process all ties while next_prob_to_include == all_triplets[next_idx][0]: _prob, correct, is_good = all_triplets[next_idx] if is_good: good_covered_and_correct += correct else: if next_prob_to_include <= 0.5: failure_opportunities += 1 else: failure_opportunities += 1 - correct bad_covered_and_incorrect += 1 - correct next_idx += 1 if next_idx == len(all_triplets): break if next_prob_to_include <= 0.5: bounded = True out = ( fail_optimal, success_optimal, fail_lower_bound, fail_upper_bound, success_bounded, ) return out ================================================ FILE: cleverhans/tf2/__init__.py ================================================ ================================================ FILE: cleverhans/tf2/attacks/__init__.py ================================================ ================================================ FILE: cleverhans/tf2/attacks/basic_iterative_method.py ================================================ """ The BasicIterativeMethod attack. """ from cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent def basic_iterative_method( model_fn, x, eps, eps_iter, nb_iter, norm, clip_min=None, clip_max=None, y=None, targeted=False, rand_init=None, rand_minmax=0.3, sanity_checks=True, ): """ The BasicIterativeMethod attack. """ return projected_gradient_descent( model_fn, x, eps, eps_iter, nb_iter, norm, clip_min=clip_min, clip_max=clip_max, y=y, targeted=targeted, rand_init=False, rand_minmax=rand_minmax, sanity_checks=sanity_checks, ) ================================================ FILE: cleverhans/tf2/attacks/carlini_wagner_l2.py ================================================ """The CarliniWagnerL2 attack. """ import numpy as np import tensorflow as tf from cleverhans.tf2.utils import get_or_guess_labels, set_with_mask def carlini_wagner_l2(model_fn, x, **kwargs): """ This is the function interface for the Carlini-Wagner-L2 attack. For more details on the attack and the parameters see the corresponding class. """ return CarliniWagnerL2(model_fn, **kwargs).attack(x) class CarliniWagnerL2Exception(Exception): pass class CarliniWagnerL2(object): def __init__( self, model_fn, y=None, targeted=False, batch_size=128, clip_min=0.0, clip_max=1.0, binary_search_steps=5, max_iterations=1_000, abort_early=True, confidence=0.0, initial_const=1e-2, learning_rate=5e-3, ): """ This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644 At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others. :param model_fn: a callable that takes an input tensor and returns the model logits. :param y: (optional) Tensor with target labels. :param targeted: (optional) Targeted attack? :param batch_size (optional): Number of attacks to run simultaneously. :param clip_min: (optional) float. Minimum float values for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param binary_search_steps (optional): The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations (optional): The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early (optional): If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param confidence (optional): Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param initial_const (optional): The initial tradeoff-constant used to tune the relative importance of the size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param learning_rate (optional): The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. """ self.model_fn = model_fn self.batch_size = batch_size self.y = y self.targeted = y is not None self.clip_min = clip_min self.clip_max = clip_max self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.learning_rate = learning_rate self.confidence = confidence self.initial_const = initial_const # the optimizer self.optimizer = tf.keras.optimizers.Adam(self.learning_rate) super(CarliniWagnerL2, self).__init__() def attack(self, x): """ Returns adversarial examples for the tensor. :param x: input tensor. :return: a numpy tensor with the adversarial example. """ adv_ex = np.zeros_like(x) for i in range(0, len(x), self.batch_size): adv_ex[i : i + self.batch_size] = self._attack( x[i : i + self.batch_size] ).numpy() return adv_ex def _attack(self, x): if self.clip_min is not None: if not np.all(tf.math.greater_equal(x, self.clip_min)): raise CarliniWagnerL2Exception( f"The input is smaller than the minimum value of {self.clip_min}r" ) if self.clip_max is not None: if not np.all(tf.math.less_equal(x, self.clip_max)): raise CarliniWagnerL2Exception( f"The input is greater than the maximum value of {self.clip_max}!" ) # cast to tensor if provided as numpy array original_x = tf.cast(x, tf.float32) shape = original_x.shape y, _ = get_or_guess_labels( self.model_fn, original_x, y=self.y, targeted=self.targeted ) if not y.shape.as_list()[0] == original_x.shape.as_list()[0]: raise CarliniWagnerL2Exception("x and y do not have the same shape!") # re-scale x to [0, 1] x = original_x x = (x - self.clip_min) / (self.clip_max - self.clip_min) x = tf.clip_by_value(x, 0.0, 1.0) # scale to [-1, 1] x = (x * 2.0) - 1.0 # convert tonh-space x = tf.atanh(x * 0.999999) # parameters for the binary search lower_bound = tf.zeros(shape[:1]) upper_bound = tf.ones(shape[:1]) * 1e10 const = tf.ones(shape) * self.initial_const # placeholder variables for best values best_l2 = tf.fill(shape[:1], 1e10) best_score = tf.fill(shape[:1], -1) best_score = tf.cast(best_score, tf.int32) best_attack = original_x # convience function for comparing compare_fn = tf.equal if self.targeted else tf.not_equal # the perturbation modifier = tf.Variable(tf.zeros(shape, dtype=x.dtype), trainable=True) for outer_step in range(self.binary_search_steps): # at each iteration reset variable state modifier.assign(tf.zeros(shape, dtype=x.dtype)) for var in self.optimizer.variables(): var.assign(tf.zeros(var.shape, dtype=var.dtype)) # variables to keep track in the inner loop current_best_l2 = tf.fill(shape[:1], 1e10) current_best_score = tf.fill(shape[:1], -1) current_best_score = tf.cast(current_best_score, tf.int32) # The last iteration (if we run many steps) repeat the search once. if ( self.binary_search_steps >= 10 and outer_step == self.binary_search_steps - 1 ): const = upper_bound # early stopping criteria prev = None for iteration in range(self.max_iterations): x_new, loss, preds, l2_dist = self.attack_step(x, y, modifier, const) # check if we made progress, abort otherwise if ( self.abort_early and iteration % ((self.max_iterations // 10) or 1) == 0 ): if prev is not None and loss > prev * 0.9999: break prev = loss lab = tf.argmax(y, axis=1) pred_with_conf = ( preds - self.confidence if self.targeted else preds + self.confidence ) pred_with_conf = tf.argmax(pred_with_conf, axis=1) pred = tf.argmax(preds, axis=1) pred = tf.cast(pred, tf.int32) # compute a binary mask of the tensors we want to assign mask = tf.math.logical_and( tf.less(l2_dist, current_best_l2), compare_fn(pred_with_conf, lab) ) # all entries which evaluate to True get reassigned current_best_l2 = set_with_mask(current_best_l2, l2_dist, mask) current_best_score = set_with_mask(current_best_score, pred, mask) # if the l2 distance is better than the one found before # and if the example is a correct example (with regards to the labels) mask = tf.math.logical_and( tf.less(l2_dist, best_l2), compare_fn(pred_with_conf, lab) ) best_l2 = set_with_mask(best_l2, l2_dist, mask) best_score = set_with_mask(best_score, pred, mask) # mask is of shape [batch_size]; best_attack is [batch_size, image_size] # need to expand mask = tf.reshape(mask, [-1, 1, 1, 1]) mask = tf.tile(mask, [1, *best_attack.shape[1:]]) best_attack = set_with_mask(best_attack, x_new, mask) # adjust binary search parameters lab = tf.argmax(y, axis=1) lab = tf.cast(lab, tf.int32) # we first compute the mask for the upper bound upper_mask = tf.math.logical_and( compare_fn(best_score, lab), tf.not_equal(best_score, -1), ) upper_bound = set_with_mask( upper_bound, tf.math.minimum(upper_bound, const), upper_mask ) # based on this mask compute const mask const_mask = tf.math.logical_and( upper_mask, tf.less(upper_bound, 1e9), ) const = set_with_mask(const, (lower_bound + upper_bound) / 2.0, const_mask) # else case is the negation of the inital mask lower_mask = tf.math.logical_not(upper_mask) lower_bound = set_with_mask( lower_bound, tf.math.maximum(lower_bound, const), lower_mask ) const_mask = tf.math.logical_and( lower_mask, tf.less(upper_bound, 1e9), ) const = set_with_mask(const, (lower_bound + upper_bound) / 2, const_mask) const_mask = tf.math.logical_not(const_mask) const = set_with_mask(const, const * 10, const_mask) return best_attack def attack_step(self, x, y, modifier, const): x_new, grads, loss, preds, l2_dist = self.gradient(x, y, modifier, const) self.optimizer.apply_gradients([(grads, modifier)]) return x_new, loss, preds, l2_dist @tf.function def gradient(self, x, y, modifier, const): # compute the actual attack with tf.GradientTape() as tape: adv_image = modifier + x x_new = clip_tanh(adv_image, clip_min=self.clip_min, clip_max=self.clip_max) preds = self.model_fn(x_new) loss, l2_dist = loss_fn( x=x, x_new=x_new, y_true=y, y_pred=preds, confidence=self.confidence, const=const, targeted=self.targeted, clip_min=self.clip_min, clip_max=self.clip_max, ) grads = tape.gradient(loss, adv_image) return x_new, grads, loss, preds, l2_dist def l2(x, y): # technically squarred l2 return tf.reduce_sum(tf.square(x - y), list(range(1, len(x.shape)))) def loss_fn( x, x_new, y_true, y_pred, confidence, const=0, targeted=False, clip_min=0, clip_max=1, ): other = clip_tanh(x, clip_min=clip_min, clip_max=clip_max) l2_dist = l2(x_new, other) real = tf.reduce_sum(y_true * y_pred, 1) other = tf.reduce_max((1.0 - y_true) * y_pred - y_true * 10_000, 1) if targeted: # if targeted, optimize for making the other class most likely loss_1 = tf.maximum(0.0, other - real + confidence) else: # if untargeted, optimize for making this class least likely. loss_1 = tf.maximum(0.0, real - other + confidence) # sum up losses loss_2 = tf.reduce_sum(l2_dist) loss_1 = tf.reduce_sum(const * loss_1) loss = loss_1 + loss_2 return loss, l2_dist def clip_tanh(x, clip_min, clip_max): return ((tf.tanh(x) + 1) / 2) * (clip_max - clip_min) + clip_min ================================================ FILE: cleverhans/tf2/attacks/fast_gradient_method.py ================================================ """The Fast Gradient Method attack.""" import numpy as np import tensorflow as tf from cleverhans.tf2.utils import optimize_linear, compute_gradient def fast_gradient_method( model_fn, x, eps, norm, loss_fn=None, clip_min=None, clip_max=None, y=None, targeted=False, sanity_checks=False, ): """ Tensorflow 2.0 implementation of the Fast Gradient Method. :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: (optional) callable. Loss function that takes (labels, logits) as arguments and returns loss. default function is 'tf.nn.sparse_softmax_cross_entropy_with_logits' :param clip_min: (optional) float. Minimum float value for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial example """ if norm not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if loss_fn is None: loss_fn = tf.nn.sparse_softmax_cross_entropy_with_logits asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(tf.math.greater_equal(x, clip_min)) if clip_max is not None: asserts.append(tf.math.less_equal(x, clip_max)) # cast to tensor if provided as numpy array x = tf.cast(x, tf.float32) if y is None: # Using model predictions as ground truth to avoid label leaking y = tf.argmax(model_fn(x), 1) grad = compute_gradient(model_fn, loss_fn, x, y, targeted) optimal_perturbation = optimize_linear(grad, eps, norm) # Add perturbation to original example to obtain adversarial example adv_x = x + optimal_perturbation # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: assert np.all(asserts) return adv_x ================================================ FILE: cleverhans/tf2/attacks/madry_et_al.py ================================================ """ The MadryEtAl attack """ from cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent def madry_et_al( model_fn, x, eps, eps_iter, nb_iter, norm, clip_min=None, clip_max=None, y=None, targeted=False, rand_minmax=0.3, sanity_checks=True, ): """ The attack from Madry et al 2017 """ return projected_gradient_descent( model_fn, x, eps, eps_iter, nb_iter, norm, clip_min=clip_min, clip_max=clip_max, y=y, targeted=targeted, rand_init=True, rand_minmax=rand_minmax, sanity_checks=sanity_checks, ) ================================================ FILE: cleverhans/tf2/attacks/momentum_iterative_method.py ================================================ """The MomentumIterativeMethod attack.""" import numpy as np import tensorflow as tf from cleverhans.tf2.utils import optimize_linear, compute_gradient from cleverhans.tf2.utils import clip_eta def momentum_iterative_method( model_fn, x, eps=0.3, eps_iter=0.06, nb_iter=10, norm=np.inf, clip_min=None, clip_max=None, y=None, targeted=False, decay_factor=1.0, sanity_checks=True, ): """ Tensorflow 2.0 implementation of Momentum Iterative Method (Dong et al. 2017). This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks and Targeted Adversarial Attacks. The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1710.06081.pdf :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param norm: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param decay_factor: (optional) Decay factor for the momentum term. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial example """ if norm == 1: raise NotImplementedError( "This attack hasn't been tested for norm=1." "It's not clear that FGM makes a good inner " "loop step for iterative optimization since " "it updates just one coordinate at a time." ) # Check if order of the norm is acceptable given current implementation if norm not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(tf.math.greater_equal(x, clip_min)) if clip_max is not None: asserts.append(tf.math.less_equal(x, clip_max)) if y is None: # Using model predictions as ground truth to avoid label leaking y = tf.argmax(model_fn(x), 1) # Initialize loop variables momentum = tf.zeros_like(x) adv_x = x i = 0 while i < nb_iter: # Define gradient of loss wrt input grad = compute_gradient(model_fn, loss_fn, adv_x, y, targeted) # Normalize current gradient and add it to the accumulated gradient red_ind = list(range(1, len(grad.shape))) avoid_zero_div = tf.cast(1e-12, grad.dtype) grad = grad / tf.math.maximum( avoid_zero_div, tf.math.reduce_mean(tf.math.abs(grad), red_ind, keepdims=True), ) momentum = decay_factor * momentum + grad optimal_perturbation = optimize_linear(momentum, eps_iter, norm) # Update and clip adversarial example in current iteration adv_x = adv_x + optimal_perturbation adv_x = x + clip_eta(adv_x - x, norm, eps) if clip_min is not None and clip_max is not None: adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) i += 1 if sanity_checks: assert np.all(asserts) return adv_x def loss_fn(labels, logits): """ Added softmax cross entropy loss for MIM as in the original MI-FGSM paper. """ return tf.nn.sparse_softmax_cross_entropy_with_logits(labels, logits, name=None) ================================================ FILE: cleverhans/tf2/attacks/projected_gradient_descent.py ================================================ """The Projected Gradient Descent attack.""" import numpy as np import tensorflow as tf from cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method from cleverhans.tf2.utils import clip_eta, random_lp_vector def projected_gradient_descent( model_fn, x, eps, eps_iter, nb_iter, norm, loss_fn=None, clip_min=None, clip_max=None, y=None, targeted=False, rand_init=None, rand_minmax=None, sanity_checks=False, ): """ This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572. :param eps_iter: step size for each attack iteration :param nb_iter: Number of attack iterations. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: (optional) callable. loss function that takes (labels, logits) as arguments and returns loss. default function is 'tf.nn.sparse_softmax_cross_entropy_with_logits' :param clip_min: (optional) float. Minimum float value for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param rand_init: (optional) float. Start the gradient descent from a point chosen uniformly at random in the norm ball of radius rand_init_eps :param rand_minmax: (optional) float. Size of the norm ball from which the initial starting point is chosen. Defaults to eps :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial example """ assert eps_iter <= eps, (eps_iter, eps) if norm == 1: raise NotImplementedError( "It's not clear that FGM is a good inner loop" " step for PGD when norm=1, because norm=1 FGM " " changes only one pixel at a time. We need " " to rigorously test a strong norm=1 PGD " "before enabling this feature." ) if norm not in [np.inf, 2]: raise ValueError("Norm order must be either np.inf or 2.") if loss_fn is None: loss_fn = tf.nn.sparse_softmax_cross_entropy_with_logits asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(tf.math.greater_equal(x, clip_min)) if clip_max is not None: asserts.append(tf.math.less_equal(x, clip_max)) # Initialize loop variables if rand_minmax is None: rand_minmax = eps if rand_init: eta = random_lp_vector( tf.shape(x), norm, tf.cast(rand_minmax, x.dtype), dtype=x.dtype ) else: eta = tf.zeros_like(x) # Clip eta eta = clip_eta(eta, norm, eps) adv_x = x + eta if clip_min is not None or clip_max is not None: adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) if y is None: # Using model predictions as ground truth to avoid label leaking y = tf.argmax(model_fn(x), 1) i = 0 while i < nb_iter: adv_x = fast_gradient_method( model_fn, adv_x, eps_iter, norm, loss_fn, clip_min=clip_min, clip_max=clip_max, y=y, targeted=targeted, ) # Clipping perturbation eta to norm norm ball eta = adv_x - x eta = clip_eta(eta, norm, eps) adv_x = x + eta # Redo the clipping. # FGM already did it, but subtracting and re-adding eta can add some # small numerical error. if clip_min is not None or clip_max is not None: adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) i += 1 asserts.append(eps_iter <= eps) if norm == np.inf and clip_min is not None: # TODO necessary to cast to x.dtype? asserts.append(eps + clip_min <= clip_max) if sanity_checks: assert np.all(asserts) return adv_x ================================================ FILE: cleverhans/tf2/attacks/spsa.py ================================================ # pylint: disable=missing-docstring import tensorflow as tf tf_dtype = tf.as_dtype("float32") def spsa( model_fn, x, y, eps, nb_iter, clip_min=None, clip_max=None, targeted=False, early_stop_loss_threshold=None, learning_rate=0.01, delta=0.01, spsa_samples=128, spsa_iters=1, is_debug=False, ): """Tensorflow 2.0 implementation of SPSA. This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions. :param model_fn: A callable that takes an input tensor and returns the model logits. :param x: Input tensor. :param y: Tensor with true labels. If targeted is true, then provide the target label. :param eps: The size of the maximum perturbation, measured in the L-infinity norm. :param nb_iter: The number of optimization steps. :param clip_min: If specified, the minimum input value. :param clip_max: If specified, the maximum input value. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param early_stop_loss_threshold: A float or None. If specified, the attack will end as soon as the loss is below `early_stop_loss_threshold`. :param learning_rate: Learning rate of ADAM optimizer. :param delta: Perturbation size used for SPSA approximation. :param spsa_samples: Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is `spsa_samples * spsa_iters` :param spsa_iters: Number of model evaluations before performing an update, where each evaluation is on `spsa_samples` different inputs. :param is_debug: If True, print the adversarial loss after each update. """ if x.get_shape().as_list()[0] != 1: raise ValueError("For SPSA, input tensor x must have batch_size of 1.") optimizer = SPSAAdam( lr=learning_rate, delta=delta, num_samples=spsa_samples, num_iters=spsa_iters ) def loss_fn(x, label): """ Margin logit loss, with correct sign for targeted vs untargeted loss. """ logits = model_fn(x) loss_multiplier = 1 if targeted else -1 return loss_multiplier * margin_logit_loss( logits, label, nb_classes=logits.get_shape()[-1] ) adv_x = projected_optimization( loss_fn, x, y, eps, nb_iter, optimizer, clip_min, clip_max, early_stop_loss_threshold, is_debug=is_debug, ) return adv_x class SPSAAdam(tf.optimizers.Adam): """Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666. Gradients estimates are computed using Simultaneous Perturbation Stochastic Approximation (SPSA), combined with the ADAM update rule (https://arxiv.org/abs/1412.6980). """ def __init__( self, lr=0.01, delta=0.01, num_samples=128, num_iters=1, compare_to_analytic_grad=False, ): super(SPSAAdam, self).__init__(lr=lr) assert num_samples % 2 == 0, "number of samples must be even" self._delta = delta self._num_samples = num_samples // 2 # Since we mirror +/- delta later self._num_iters = num_iters self._compare_to_analytic_grad = compare_to_analytic_grad def _get_delta(self, x, delta): x_shape = x.get_shape().as_list() delta_x = delta * tf.sign( tf.random.uniform( [self._num_samples] + x_shape[1:], minval=-1.0, maxval=1.0, dtype=tf_dtype, ) ) return delta_x def _compute_gradients(self, loss_fn, x): """Compute a new value of `x` to minimize `loss_fn` using SPSA. Args: loss_fn: a callable that takes `x`, a batch of images, and returns a batch of loss values. `x` will be optimized to minimize `loss_fn(x)`. x: A list of Tensors, the values to be updated. This is analogous to the `var_list` argument in standard TF Optimizer. Returns: new_x: A list of Tensors, the same length as `x`, which are updated new_optim_state: A dict, with the same structure as `optim_state`, which have been updated. """ # Assumes `x` is a list, containing a [1, H, W, C] image.If static batch dimension is None, # tf.reshape to batch size 1 so that static shape can be inferred. assert len(x) == 1 static_x_shape = x[0].get_shape().as_list() if static_x_shape[0] is None: x[0] = tf.reshape(x[0], [1] + static_x_shape[1:]) assert x[0].get_shape().as_list()[0] == 1 x = x[0] x_shape = x.get_shape().as_list() def body(i, grad_array): delta = self._delta delta_x = self._get_delta(x, delta) delta_x = tf.concat([delta_x, -delta_x], axis=0) loss_vals = tf.reshape( loss_fn(x + delta_x), [2 * self._num_samples] + [1] * (len(x_shape) - 1) ) avg_grad = tf.reduce_mean(loss_vals * delta_x, axis=0) / delta avg_grad = tf.expand_dims(avg_grad, axis=0) new_grad_array = grad_array.write(i, avg_grad) return i + 1, new_grad_array def cond(i, _): return i < self._num_iters _, all_grads = tf.while_loop( cond, body, loop_vars=[0, tf.TensorArray(size=self._num_iters, dtype=tf_dtype)], back_prop=False, parallel_iterations=1, ) avg_grad = tf.reduce_sum(all_grads.stack(), axis=0) return [avg_grad] def _apply_gradients(self, grads, x, optim_state): """Given a gradient, make one optimization step. :param grads: list of tensors, same length as `x`, containing the corresponding gradients :param x: list of tensors to update :param optim_state: dict Returns: new_x: list of tensors, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ new_x = [None] * len(x) new_optim_state = { "t": optim_state["t"] + 1.0, "m": [None] * len(x), "u": [None] * len(x), } t = new_optim_state["t"] for i in range(len(x)): g = grads[i] m_old = optim_state["m"][i] u_old = optim_state["u"][i] new_optim_state["m"][i] = self.beta_1 * m_old + (1.0 - self.beta_1) * g new_optim_state["u"][i] = self.beta_2 * u_old + (1.0 - self.beta_2) * g * g m_hat = new_optim_state["m"][i] / (1.0 - tf.pow(self.beta_1, t)) u_hat = new_optim_state["u"][i] / (1.0 - tf.pow(self.beta_2, t)) new_x[i] = x[i] - self.lr * m_hat / (tf.sqrt(u_hat) + self.epsilon) return new_x, new_optim_state def init_state(self, x): """Initialize t, m, and u""" optim_state = { "t": 0.0, "m": [tf.zeros_like(v) for v in x], "u": [tf.zeros_like(v) for v in x], } return optim_state def minimize(self, loss_fn, x, optim_state): """Analogous to tf.Optimizer.minimize :param loss_fn: tf Tensor, representing the loss to minimize :param x: list of Tensor, analogous to tf.Optimizer's var_list :param optim_state: A possibly nested dict, containing any optimizer state. Returns: new_x: list of Tensor, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ grads = self._compute_gradients(loss_fn, x) return self._apply_gradients(grads, x, optim_state) def margin_logit_loss(model_logits, label, nb_classes=10): """Computes difference between logit for `label` and next highest logit. The loss is high when `label` is unlikely (targeted by default). This follows the same interface as `loss_fn` for projected_optimization, i.e. it returns a batch of loss values. """ if "int" in str(label.dtype): logit_mask = tf.one_hot(label, depth=nb_classes, axis=-1) else: logit_mask = label if "int" in str(logit_mask.dtype): logit_mask = tf.cast(logit_mask, dtype=tf.float32) try: label_logits = tf.reduce_sum(logit_mask * model_logits, axis=-1) except TypeError: raise TypeError( "Could not take row-wise dot product between logit mask, of dtype " + str(logit_mask.dtype) + " and model_logits, of dtype " + str(model_logits.dtype) ) logits_with_target_label_neg_inf = model_logits - logit_mask * 99999 highest_nonlabel_logits = tf.reduce_max(logits_with_target_label_neg_inf, axis=-1) loss = highest_nonlabel_logits - label_logits return loss def _project_perturbation( perturbation, epsilon, input_image, clip_min=None, clip_max=None ): """ Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into hypercube such that the resulting adversarial example is between clip_min and clip_max, if applicable. """ if clip_min is None or clip_max is None: raise NotImplementedError( "_project_perturbation currently has clipping hard-coded in." ) # Ensure inputs are in the correct range with tf.control_dependencies( [ tf.debugging.assert_less_equal( input_image, tf.cast(clip_max, input_image.dtype) ), tf.debugging.assert_greater_equal( input_image, tf.cast(clip_min, input_image.dtype) ), ] ): clipped_perturbation = tf.clip_by_value(perturbation, -epsilon, epsilon) new_image = tf.clip_by_value( input_image + clipped_perturbation, clip_min, clip_max ) return new_image - input_image def projected_optimization( loss_fn, input_image, label, epsilon, num_steps, optimizer, clip_min=None, clip_max=None, early_stop_loss_threshold=None, project_perturbation=_project_perturbation, is_debug=False, ): """ Generic projected optimization, generalized to work with approximate gradients. Used for e.g. the SPSA attack. Args: :param loss_fn: A callable which takes `input_image` and `label` as arguments, and returns a batch of loss values. :param input_image: Tensor, a batch of images :param label: Tensor, a batch of labels :param epsilon: float, the L-infinity norm of the maximum allowable perturbation :param num_steps: int, the number of steps of gradient descent :param optimizer: A `SPSAAdam` object :param clip_min: float, minimum pixel value :param clip_max: float, maximum pixel value :param project_perturbation: A function, which will be used to enforce some constraint. It should have the same signature as `_project_perturbation`. :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below `early_stop_loss_threshold`. Enabling this option can have several different effects: - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned. This increases the attack success rate, because without early stopping the optimizer can accidentally bounce back to a point where the attack fails. - Early stopping can make the attack run faster because it may run for fewer steps. - Early stopping can make the attack run slower because the loss must be calculated at each step. The loss is not calculated as part of the normal SPSA optimization procedure. For most reasonable choices of hyperparameters, early stopping makes the attack much faster because it decreases the number of steps dramatically. :param is_debug: A bool. If True, print debug info for attack progress. Returns: adversarial version of `input_image`, with L-infinity difference less than epsilon, which tries to minimize loss_fn. Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper function which you can use to write your own attack methods. The method uses a tf.while_loop to optimize a loss function in a single sess.run() call. """ assert num_steps is not None if is_debug: with tf.device("/cpu:0"): tf.print("Starting PGD attack with epsilon: %s" % epsilon) init_perturbation = tf.random.uniform( tf.shape(input_image), minval=tf.cast(-epsilon, input_image.dtype), maxval=tf.cast(epsilon, input_image.dtype), dtype=input_image.dtype, ) init_perturbation = project_perturbation( init_perturbation, epsilon, input_image, clip_min=clip_min, clip_max=clip_max ) init_optim_state = optimizer.init_state([init_perturbation]) def loop_body(i, perturbation, flat_optim_state): """Update perturbation to input image.""" optim_state = tf.nest.pack_sequence_as( structure=init_optim_state, flat_sequence=flat_optim_state ) def wrapped_loss_fn(x): return loss_fn(input_image + x, label) new_perturbation_list, new_optim_state = optimizer.minimize( wrapped_loss_fn, [perturbation], optim_state ) projected_perturbation = project_perturbation( new_perturbation_list[0], epsilon, input_image, clip_min=clip_min, clip_max=clip_max, ) # Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we # must explicitly check whether the value is None. early_stop = early_stop_loss_threshold is not None compute_loss = is_debug or early_stop # Don't waste time building the loss graph if we're not going to use it if compute_loss: # NOTE: this step is not actually redundant with the optimizer step. # SPSA calculates the loss at randomly perturbed points but doesn't calculate the loss at the current point. loss = tf.reduce_mean(wrapped_loss_fn(projected_perturbation), axis=0) if is_debug: with tf.device("/cpu:0"): tf.print(loss, "Total batch loss") if early_stop: i = tf.cond( tf.less(loss, early_stop_loss_threshold), lambda: float(num_steps), lambda: i, ) return i + 1, projected_perturbation, tf.nest.flatten(new_optim_state) def cond(i, *_): return tf.less(i, num_steps) flat_init_optim_state = tf.nest.flatten(init_optim_state) _, final_perturbation, _ = tf.while_loop( cond, loop_body, loop_vars=(tf.constant(0.0), init_perturbation, flat_init_optim_state), parallel_iterations=1, back_prop=False, maximum_iterations=num_steps, ) if project_perturbation is _project_perturbation: # TODO: this assert looks totally wrong. # Not bothering to fix it now because it's only an assert. # 1) Multiplying by 1.1 gives a huge margin of error. This should probably take the difference # and allow a tolerance of 1e-6 or something like that. # 2) I think it should probably check the *absolute value* of final_perturbation perturbation_max = epsilon * 1.1 check_diff = tf.debugging.assert_less_equal( final_perturbation, tf.cast(perturbation_max, final_perturbation.dtype), message="final_perturbation must change no pixel by more than %s" % perturbation_max, ) else: # TODO: let caller pass in a check_diff function as well as # project_perturbation check_diff = tf.no_op() if clip_min is None or clip_max is None: raise NotImplementedError("This function only supports clipping for now") check_range = [ tf.debugging.assert_less_equal( input_image, tf.cast(clip_max, input_image.dtype) ), tf.debugging.assert_greater_equal( input_image, tf.cast(clip_min, input_image.dtype) ), ] with tf.control_dependencies([check_diff] + check_range): adversarial_image = input_image + final_perturbation return tf.stop_gradient(adversarial_image) ================================================ FILE: cleverhans/tf2/utils.py ================================================ import numpy as np import tensorflow as tf def clip_eta(eta, norm, eps): """ Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param norm: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, bound of the perturbation. """ # Clipping perturbation eta to self.norm norm ball if norm not in [np.inf, 1, 2]: raise ValueError("norm must be np.inf, 1, or 2.") axis = list(range(1, len(eta.get_shape()))) avoid_zero_div = 1e-12 if norm == np.inf: eta = tf.clip_by_value(eta, -eps, eps) else: if norm == 1: raise NotImplementedError("") # This is not the correct way to project on the L1 norm ball: # norm = tf.maximum(avoid_zero_div, reduce_sum(tf.abs(eta), reduc_ind, keepdims=True)) elif norm == 2: # avoid_zero_div must go inside sqrt to avoid a divide by zero in the gradient through this operation norm = tf.sqrt( tf.maximum( avoid_zero_div, tf.reduce_sum(tf.square(eta), axis, keepdims=True) ) ) # We must *clip* to within the norm ball, not *normalize* onto the surface of the ball factor = tf.minimum(1.0, tf.math.divide(eps, norm)) eta = eta * factor return eta def random_exponential(shape, rate=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the exponential distribution, which is not included in core TensorFlow. shape: shape of the sampled tensor. :rate: (optional) rate parameter of the exponential distribution, defaults to 1.0. :dtype: (optional) data type of the sempled tensor, defaults to tf.float32. :seed: (optional) custom seed to be used for sampling. """ return tf.random.gamma(shape, alpha=1, beta=1.0 / rate, dtype=dtype, seed=seed) def random_laplace(shape, loc=0.0, scale=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the Laplace distribution, which is not included in core TensorFlow. :shape: shape of the sampled tensor. :loc: (optional) mean of the laplace distribution, defaults to 0.0. :scale: (optional) scale parameter of the laplace diustribution, defaults to 1.0. :dtype: (optional) data type of the sempled tensor, defaults to tf.float32. :seed: (optional) custom seed to be used for sampling. """ z1 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed) z2 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed) return z1 - z2 + loc def random_lp_vector(shape, ord, eps, dtype=tf.float32, seed=None): """ Helper function to generate uniformly random vectors from a norm ball of radius epsilon. :param shape: Output shape of the random sample. The shape is expected to be of the form `(n, d1, d2, ..., dn)` where `n` is the number of i.i.d. samples that will be drawn from a norm ball of dimension `d1*d1*...*dn`. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, radius of the norm ball. :param dtype: (optional) type of the tensor. :param seed: (optional) integer. """ if ord not in [np.inf, 1, 2]: raise ValueError("ord must be np.inf, 1, or 2.") if ord == np.inf: r = tf.random.uniform(shape, -eps, eps, dtype=dtype, seed=seed) else: # For ord=1 and ord=2, we use the generic technique from # (Calafiore et al. 1998) to sample uniformly from a norm ball. # Paper link (Calafiore et al. 1998): # https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&tag=1 # We first sample from the surface of the norm ball, and then scale by # a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable # and `d` is the dimension of the ball. In high dimensions, this is roughly # equivalent to sampling from the surface of the ball. dim = tf.reduce_prod(shape[1:]) if ord == 1: x = random_laplace( (shape[0], dim), loc=1.0, scale=1.0, dtype=dtype, seed=seed ) norm = tf.reduce_sum(tf.abs(x), axis=-1, keepdims=True) elif ord == 2: x = tf.random.normal((shape[0], dim), dtype=dtype, seed=seed) norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=-1, keepdims=True)) else: raise ValueError("ord must be np.inf, 1, or 2.") w = tf.pow( tf.random.uniform((shape[0], 1), dtype=dtype, seed=seed), 1.0 / tf.cast(dim, dtype), ) r = eps * tf.reshape(w * x / norm, shape) return r def get_or_guess_labels(model_fn, x, y=None, targeted=False): """ Helper function to get the label to use in generating an adversarial example for x. If 'y' is not None, then use these labels. If 'targeted' is True, then assume it's a targeted attack and y must be set. Otherwise, use the model's prediction as the label and perform an untargeted attack :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. """ if targeted is True and y is None: raise ValueError("Must provide y for a targeted attack!") preds = model_fn(x) nb_classes = preds.shape[-1] # labels set by the user if y is not None: # inefficient when y is a tensor, but this function only get called once y = np.asarray(y) if len(y.shape) == 1: # the user provided categorical encoding y = tf.one_hot(y, nb_classes) y = tf.cast(y, x.dtype) return y, nb_classes # must be an untargeted attack labels = tf.cast( tf.equal(tf.reduce_max(preds, axis=1, keepdims=True), preds), x.dtype ) return labels, nb_classes def set_with_mask(x, x_other, mask): """Helper function which returns a tensor similar to x with all the values of x replaced by x_other where the mask evaluates to true. """ mask = tf.cast(mask, x.dtype) ones = tf.ones_like(mask, dtype=x.dtype) return x_other * mask + x * (ones - mask) # Due to performance reasons, this function is wrapped inside of tf.function decorator. # Not using the decorator here, or letting the user wrap the attack in tf.function is way # slower on Tensorflow 2.0.0-alpha0. @tf.function def compute_gradient(model_fn, loss_fn, x, y, targeted): """ Computes the gradient of the loss with respect to the input tensor. :param model_fn: a callable that takes an input tensor and returns the model logits. :param loss_fn: loss function that takes (labels, logits) as arguments and returns loss. :param x: input tensor :param y: Tensor with true labels. If targeted is true, then provide the target label. :param targeted: bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: A tensor containing the gradient of the loss with respect to the input tensor. """ with tf.GradientTape() as g: g.watch(x) # Compute loss loss = loss_fn(labels=y, logits=model_fn(x)) if ( targeted ): # attack is targeted, minimize loss of target label rather than maximize loss of correct label loss = -loss # Define gradient of loss wrt input grad = g.gradient(loss, x) return grad def optimize_linear(grad, eps, norm=np.inf): """ Solves for the optimal input to a linear function under a norm constraint. Optimal_perturbation = argmax_{eta, ||eta||_{norm} < eps} dot(eta, grad) :param grad: tf tensor containing a batch of gradients :param eps: float scalar specifying size of constraint region :param norm: int specifying order of norm :returns: tf tensor containing optimal perturbation """ # Convert the iterator returned by `range` into a list. axis = list(range(1, len(grad.get_shape()))) avoid_zero_div = 1e-12 if norm == np.inf: # Take sign of gradient optimal_perturbation = tf.sign(grad) # The following line should not change the numerical results. It applies only because # `optimal_perturbation` is the output of a `sign` op, which has zero derivative anyway. # It should not be applied for the other norms, where the perturbation has a non-zero derivative. optimal_perturbation = tf.stop_gradient(optimal_perturbation) elif norm == 1: abs_grad = tf.abs(grad) sign = tf.sign(grad) max_abs_grad = tf.reduce_max(abs_grad, axis, keepdims=True) tied_for_max = tf.dtypes.cast( tf.equal(abs_grad, max_abs_grad), dtype=tf.float32 ) num_ties = tf.reduce_sum(tied_for_max, axis, keepdims=True) optimal_perturbation = sign * tied_for_max / num_ties elif norm == 2: square = tf.maximum( avoid_zero_div, tf.reduce_sum(tf.square(grad), axis, keepdims=True) ) optimal_perturbation = grad / tf.sqrt(square) else: raise NotImplementedError( "Only L-inf, L1 and L2 norms are currently implemented." ) # Scale perturbation to be the solution for the norm=eps rather than norm=1 problem scaled_perturbation = tf.multiply(eps, optimal_perturbation) return scaled_perturbation ================================================ FILE: cleverhans/torch/__init__.py ================================================ ================================================ FILE: cleverhans/torch/attacks/__init__.py ================================================ # pylint: disable=missing-docstring ================================================ FILE: cleverhans/torch/attacks/carlini_wagner_l2.py ================================================ """The CarliniWagnerL2 attack.""" import torch INF = float("inf") def carlini_wagner_l2( model_fn, x, n_classes, y=None, targeted=False, lr=5e-3, confidence=0, clip_min=0, clip_max=1, initial_const=1e-2, binary_search_steps=5, max_iterations=1000, ): """ This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644 At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others. :param model_fn: a callable that takes an input tensor and returns the model logits. The logits should be a tensor of shape (n_examples, n_classes). :param x: input tensor of shape (n_examples, ...), where ... can be any arbitrary dimension that is compatible with model_fn. :param n_classes: the number of classes. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). If provide y, it should be a 1D tensor of shape (n_examples, ). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param lr: (optional) float. The learning rate for the attack algorithm. Default is 5e-3. :param confidence: (optional) float. Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. Default is 0. :param clip_min: (optional) float. Minimum float value for adversarial example components. Default is 0. :param clip_max: (optional) float. Maximum float value for adversarial example components. Default is 1. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. Default is 1e-2. :param binary_search_steps: (optional) int. The number of times we perform binary search to find the optimal tradeoff-constant between norm of the perturbation and confidence of the classification. Default is 5. :param max_iterations: (optional) int. The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. Default is 1000. """ def compare(pred, label, is_logits=False): """ A helper function to compare prediction against a label. Returns true if the attack is considered successful. :param pred: can be either a 1D tensor of logits or a predicted class (int). :param label: int. A label to compare against. :param is_logits: (optional) bool. If True, treat pred as an array of logits. Default is False. """ # Convert logits to predicted class if necessary if is_logits: pred_copy = pred.clone().detach() pred_copy[label] += -confidence if targeted else confidence pred = torch.argmax(pred_copy) return pred == label if targeted else pred != label if y is None: # Using model predictions as ground truth to avoid label leaking pred = model_fn(x) y = torch.argmax(pred, 1) # Initialize some values needed for binary search on const lower_bound = [0.0] * len(x) upper_bound = [1e10] * len(x) const = x.new_ones(len(x), 1) * initial_const o_bestl2 = [INF] * len(x) o_bestscore = [-1.0] * len(x) x = torch.clamp(x, clip_min, clip_max) ox = x.clone().detach() # save the original x o_bestattack = x.clone().detach() # Map images into the tanh-space x = (x - clip_min) / (clip_max - clip_min) x = torch.clamp(x, 0, 1) x = x * 2 - 1 x = torch.arctanh(x * 0.999999) # Prepare some variables modifier = torch.zeros_like(x, requires_grad=True) y_onehot = torch.nn.functional.one_hot(y, n_classes).to(torch.float) # Define loss functions and optimizer f_fn = lambda real, other, targeted: torch.max( ((other - real) if targeted else (real - other)) + confidence, torch.tensor(0.0).to(real.device), ) l2dist_fn = lambda x, y: torch.pow(x - y, 2).sum(list(range(len(x.size())))[1:]) optimizer = torch.optim.Adam([modifier], lr=lr) # Outer loop performing binary search on const for outer_step in range(binary_search_steps): # Initialize some values needed for the inner loop bestl2 = [INF] * len(x) bestscore = [-1.0] * len(x) # Inner loop performing attack iterations for i in range(max_iterations): # One attack step new_x = (torch.tanh(modifier + x) + 1) / 2 new_x = new_x * (clip_max - clip_min) + clip_min logits = model_fn(new_x) real = torch.sum(y_onehot * logits, 1) other, _ = torch.max((1 - y_onehot) * logits - y_onehot * 1e4, 1) optimizer.zero_grad() f = f_fn(real, other, targeted) l2 = l2dist_fn(new_x, ox) loss = (const * f + l2).sum() loss.backward() optimizer.step() # Update best results for n, (l2_n, logits_n, new_x_n) in enumerate(zip(l2, logits, new_x)): y_n = y[n] succeeded = compare(logits_n, y_n, is_logits=True) if l2_n < o_bestl2[n] and succeeded: pred_n = torch.argmax(logits_n) o_bestl2[n] = l2_n o_bestscore[n] = pred_n o_bestattack[n] = new_x_n # l2_n < o_bestl2[n] implies l2_n < bestl2[n] so we modify inner loop variables too bestl2[n] = l2_n bestscore[n] = pred_n elif l2_n < bestl2[n] and succeeded: bestl2[n] = l2_n bestscore[n] = torch.argmax(logits_n) # Binary search step for n in range(len(x)): y_n = y[n] if compare(bestscore[n], y_n) and bestscore[n] != -1: # Success, divide const by two upper_bound[n] = min(upper_bound[n], const[n]) if upper_bound[n] < 1e9: const[n] = (lower_bound[n] + upper_bound[n]) / 2 else: # Failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[n] = max(lower_bound[n], const[n]) if upper_bound[n] < 1e9: const[n] = (lower_bound[n] + upper_bound[n]) / 2 else: const[n] *= 10 return o_bestattack.detach() if __name__ == "__main__": x = torch.clamp(torch.randn(5, 10), 0, 1) y = torch.randint(0, 9, (5,)) model_fn = lambda x: x # targeted new_x = carlini_wagner_l2(model_fn, x, 10, targeted=True, y=y) new_pred = model_fn(new_x) new_pred = torch.argmax(new_pred, 1) # untargeted new_x_untargeted = carlini_wagner_l2(model_fn, x, 10, targeted=False, y=y) new_pred_untargeted = model_fn(new_x_untargeted) new_pred_untargeted = torch.argmax(new_pred_untargeted, 1) ================================================ FILE: cleverhans/torch/attacks/fast_gradient_method.py ================================================ """The Fast Gradient Method attack.""" import numpy as np import torch from cleverhans.torch.utils import optimize_linear def fast_gradient_method( model_fn, x, eps, norm, clip_min=None, clip_max=None, y=None, targeted=False, sanity_checks=False, ): """ PyTorch implementation of the Fast Gradient Method. :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param clip_min: (optional) float. Minimum float value for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial example """ if norm not in [np.inf, 1, 2]: raise ValueError( "Norm order must be either np.inf, 1, or 2, got {} instead.".format(norm) ) if eps < 0: raise ValueError( "eps must be greater than or equal to 0, got {} instead".format(eps) ) if eps == 0: return x if clip_min is not None and clip_max is not None: if clip_min > clip_max: raise ValueError( "clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}".format( clip_min, clip_max ) ) asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: assert_ge = torch.all( torch.ge(x, torch.tensor(clip_min, device=x.device, dtype=x.dtype)) ) asserts.append(assert_ge) if clip_max is not None: assert_le = torch.all( torch.le(x, torch.tensor(clip_max, device=x.device, dtype=x.dtype)) ) asserts.append(assert_le) # x needs to be a leaf variable, of floating point type and have requires_grad being True for # its grad to be computed and stored properly in a backward call x = x.clone().detach().to(torch.float).requires_grad_(True) if y is None: # Using model predictions as ground truth to avoid label leaking _, y = torch.max(model_fn(x), 1) # Compute loss loss_fn = torch.nn.CrossEntropyLoss() loss = loss_fn(model_fn(x), y) # If attack is targeted, minimize loss of target label rather than maximize loss of correct label if targeted: loss = -loss # Define gradient of loss wrt input loss.backward() optimal_perturbation = optimize_linear(x.grad, eps, norm) # Add perturbation to original example to obtain adversarial example adv_x = x + optimal_perturbation # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): if clip_min is None or clip_max is None: raise ValueError( "One of clip_min and clip_max is None but we don't currently support one-sided clipping" ) adv_x = torch.clamp(adv_x, clip_min, clip_max) if sanity_checks: assert np.all(asserts) return adv_x ================================================ FILE: cleverhans/torch/attacks/hop_skip_jump_attack.py ================================================ """ Boundary Attack++ """ import numpy as np import torch def hop_skip_jump_attack( model_fn, x, norm, y_target=None, image_target=None, initial_num_evals=100, max_num_evals=10000, stepsize_search="geometric_progression", num_iterations=64, gamma=1.0, constraint=2, batch_size=128, verbose=True, clip_min=0, clip_max=1, ): """ PyTorch implementation of HopSkipJumpAttack. HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright. It is a decision-based attack that requires access to output labels of a model alone. Paper link: https://arxiv.org/abs/1904.02144 At a high level, this attack is an iterative attack composed of three steps: Binary search to approach the boundary; gradient estimation; stepsize search. HopSkipJumpAttack requires fewer model queries than Boundary Attack which was based on rejective sampling. :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor with n samples. :param norm: The distance to optimize. Possible values: 2 or np.inf. :param y_target: A tensor of shape (n, nb_classes) for target labels. Required for targeted attack. :param image_target: A tensor of shape (n, **image shape) for initial target images. Required for targeted attack. :param initial_num_evals: initial number of evaluations for gradient estimation. :param max_num_evals: maximum number of evaluations for gradient estimation. :param stepsize_search: How to search for stepsize; choices are 'geometric_progression', 'grid_search'. 'geometric progression' initializes the stepsize by ||x_t - x||_p / sqrt(iteration), and keep decreasing by half until reaching the target side of the boundary. 'grid_search' chooses the optimal epsilon over a grid, in the scale of ||x_t - x||_p. :param num_iterations: The number of iterations. :param gamma: The binary search threshold theta is gamma / d^{3/2} for l2 attack and gamma / d^2 for linf attack. :param batch_size: batch_size for model prediction. :param verbose: (boolean) Whether distance at each step is printed. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ shape = (1,) + x.shape[1:] if y_target is not None: assert image_target is not None, "Require a target image for targeted attack." if clip_min is not None and clip_max is not None: if clip_min > clip_max: raise ValueError( "clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}".format( clip_min, clip_max ) ) d = int(np.prod(shape)) if constraint == 2: theta = gamma / (np.sqrt(d) * d) else: theta = gamma / (d * d) def hsja(sample, target_label, target_image): if target_label is None: _, original_label = torch.max(model_fn(sample), 1) def decision_function(images): """ Decision function output 1 on the desired side of the boundary, 0 otherwise. """ images = torch.clamp(images, clip_min, clip_max) prob = [] for i in range(0, len(images), batch_size): batch = images[i : i + batch_size] prob_i = model_fn(batch) prob.append(prob_i) prob = torch.cat(prob, dim=0) if target_label is None: return torch.max(prob, dim=1)[1] != original_label else: return torch.max(prob, dim=1)[1] == target_label # Initialize. if target_image is None: perturbed = initialize(decision_function, sample, shape, clip_min, clip_max) else: perturbed = target_image.to(sample.device) # Project the initialization to the boundary. perturbed, dist_post_update = binary_search_batch( sample, perturbed, decision_function, shape, constraint, theta ) dist = compute_distance(perturbed, sample, constraint) for j in np.arange(num_iterations): current_iteration = j + 1 # Choose delta. delta = select_delta( dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint, ) # Choose number of evaluations. num_evals = int(min([initial_num_evals * np.sqrt(j + 1), max_num_evals])) # approximate gradient. gradf = approximate_gradient( decision_function, perturbed, num_evals, delta, constraint, shape[1:], clip_min, clip_max, ) if constraint == np.inf: update = torch.sign(gradf) else: update = gradf # search step size. if stepsize_search == "geometric_progression": # find step size. epsilon = geometric_progression_for_stepsize( perturbed, update, dist, decision_function, current_iteration ) # Update the sample. perturbed = torch.clamp( perturbed + epsilon * update, clip_min, clip_max ) # Binary search to return to the boundary. perturbed, dist_post_update = binary_search_batch( sample, perturbed, decision_function, shape, constraint, theta ) elif stepsize_search == "grid_search": # Grid search for stepsize. epsilons = ( torch.from_numpy(np.logspace(-4, 0, num=20, endpoint=True)) .to(perturbed.device) .float() * dist ) perturbeds = ( perturbed + epsilons.view((20,) + (1,) * (len(shape) - 1)) * update ) perturbeds = torch.clamp(perturbeds, clip_min, clip_max) idx_perturbed = decision_function(perturbeds) if torch.sum(idx_perturbed) > 0: # Select the perturbation that yields the minimum distance # after binary search. perturbed, dist_post_update = binary_search_batch( sample, perturbeds[idx_perturbed], decision_function, shape, constraint, theta, ) # compute new distance. dist = compute_distance(perturbed, sample, constraint) if verbose: print( "iteration: {:d}, {:s} distance {:.4E}".format( j + 1, str(constraint), dist ) ) return perturbed # Perform attack on one instance at a time adv_x = [] for i, x_ in enumerate(x): x_ = x_.unsqueeze(0) if y_target is not None: # targeted attack that requires target label and image. pert = hsja(x_, y_target[i], image_target[i]) else: if image_target is not None: pert = hsja(x_, None, image_target[i]) else: # untargeted attack without an initialized image. pert = hsja(x_, None, None) adv_x.append(pert) return torch.cat(adv_x, 0) def compute_distance(x_ori, x_pert, constraint=2): """ Compute the distance between two images. """ if constraint == 2: dist = torch.norm(x_ori - x_pert, p=2) elif constraint == np.inf: dist = torch.max(torch.abs(x_ori - x_pert)) return dist def approximate_gradient( decision_function, sample, num_evals, delta, constraint, shape, clip_min, clip_max ): """ Gradient direction estimation """ # Generate random vectors. noise_shape = [num_evals] + list(shape) if constraint == 2: rv = torch.randn(noise_shape) elif constraint == np.inf: rv = -1 + torch.rand(noise_shape) * 2 axis = tuple(range(1, 1 + len(shape))) rv = rv / torch.sqrt(torch.sum(rv ** 2, dim=axis, keepdim=True)) perturbed = sample + delta * rv.to(sample.device) perturbed = torch.clamp(perturbed, clip_min, clip_max) rv = (perturbed - sample) / delta # query the model. decisions = decision_function(perturbed).float() fval = 2.0 * decisions.view((decisions.shape[0],) + (1,) * len(shape)) - 1.0 # Baseline subtraction (when fval differs) fval_mean = torch.mean(fval) if fval_mean == 1.0: # label changes. gradf = torch.mean(rv, dim=0) elif fval_mean == -1.0: # label not change. gradf = -torch.mean(rv, dim=0) else: fval = fval - fval_mean gradf = torch.mean(fval * rv, dim=0) # Get the gradient direction. gradf = gradf / torch.norm(gradf, p=2) return gradf def project(original_image, perturbed_images, alphas, shape, constraint): """ Projection onto given l2 / linf balls in a batch. """ alphas = alphas.view((alphas.shape[0],) + (1,) * (len(shape) - 1)) if constraint == 2: projected = (1 - alphas) * original_image + alphas * perturbed_images elif constraint == np.inf: projected = torch.clamp( perturbed_images, original_image - alphas, original_image + alphas ) return projected def binary_search_batch( original_image, perturbed_images, decision_function, shape, constraint, theta ): """ Binary search to approach the boundary. """ # Compute distance between each of perturbed image and original image. dists_post_update = torch.stack( [ compute_distance(original_image, perturbed_image, constraint) for perturbed_image in perturbed_images ] ) # Choose upper thresholds in binary searchs based on constraint. if constraint == np.inf: highs = dists_post_update # Stopping criteria. thresholds = torch.min(dists_post_update * theta, theta) else: highs = torch.ones(len(perturbed_images)).to(original_image.device) thresholds = theta lows = torch.zeros(len(perturbed_images)).to(original_image.device) while torch.max((highs - lows) / thresholds) > 1: # projection to mids. mids = (highs + lows) / 2.0 mid_images = project(original_image, perturbed_images, mids, shape, constraint) # Update highs and lows based on model decisions. decisions = decision_function(mid_images) lows = torch.where(decisions == 0, mids, lows) highs = torch.where(decisions == 1, mids, highs) out_images = project(original_image, perturbed_images, highs, shape, constraint) # Compute distance of the output image to select the best choice. # (only used when stepsize_search is grid_search.) dists = torch.stack( [ compute_distance(original_image, out_image, constraint) for out_image in out_images ] ) _, idx = torch.min(dists, 0) dist = dists_post_update[idx] out_image = out_images[idx].unsqueeze(0) return out_image, dist def initialize(decision_function, sample, shape, clip_min, clip_max): """ Efficient Implementation of BlendedUniformNoiseAttack in Foolbox. """ success = 0 num_evals = 0 # Find a misclassified random noise. while True: random_noise = clip_min + torch.rand(shape).to(sample.device) * ( clip_max - clip_min ) success = decision_function(random_noise)[0] if success: break num_evals += 1 message = ( "Initialization failed! Try to use a misclassified image as `target_image`" ) assert num_evals < 1e4, message # Binary search to minimize l2 distance to original image. low = 0.0 high = 1.0 while high - low > 0.001: mid = (high + low) / 2.0 blended = (1 - mid) * sample + mid * random_noise success = decision_function(blended)[0] if success: high = mid else: low = mid initialization = (1 - high) * sample + high * random_noise return initialization def geometric_progression_for_stepsize( x, update, dist, decision_function, current_iteration ): """Geometric progression to search for stepsize. Keep decreasing stepsize by half until reaching the desired side of the boundary. """ epsilon = dist / np.sqrt(current_iteration) while True: updated = x + epsilon * update success = decision_function(updated)[0] if success: break else: epsilon = epsilon / 2.0 return epsilon def select_delta( dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint ): """ Choose the delta at the scale of distance between x and perturbed sample. """ if current_iteration == 1: delta = 0.1 * (clip_max - clip_min) else: if constraint == 2: delta = np.sqrt(d) * theta * dist_post_update elif constraint == np.inf: delta = d * theta * dist_post_update return delta ================================================ FILE: cleverhans/torch/attacks/noise.py ================================================ """ The Noise Attack """ import numpy as np import torch def noise(x, eps=0.3, order=np.inf, clip_min=None, clip_max=None): """ A weak attack that just picks a random point in the attacker's action space. When combined with an attack bundling function, this can be used to implement random search. References: https://arxiv.org/abs/1802.00420 recommends random search to help identify gradient masking https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part of an attack building recipe combining many different optimizers to yield a strong optimizer. Args: :param x: the input tensor :param eps: (optional float) maximum distortion of adversarial example compared to original input. :param norm: (optional) Order of the norm. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ if order != np.inf: raise NotImplementedError(norm) eta = torch.FloatTensor(*x.shape).to(x.device).uniform_(-eps, eps) adv_x = x + eta if clip_min is not None or clip_max is not None: assert clip_min is not None and clip_max is not None adv_x = torch.clamp(adv_x, min=clip_min, max=clip_max) return adv_x ================================================ FILE: cleverhans/torch/attacks/projected_gradient_descent.py ================================================ """The Projected Gradient Descent attack.""" import numpy as np import torch from cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method from cleverhans.torch.utils import clip_eta def projected_gradient_descent( model_fn, x, eps, eps_iter, nb_iter, norm, clip_min=None, clip_max=None, y=None, targeted=False, rand_init=True, rand_minmax=None, sanity_checks=True, ): """ This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to False. or the Madry et al. (2017) method if rand_init is set to True. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572. :param eps_iter: step size for each attack iteration :param nb_iter: Number of attack iterations. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param clip_min: (optional) float. Minimum float value for adversarial example components. :param clip_max: (optional) float. Maximum float value for adversarial example components. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param rand_init: (optional) bool. Whether to start the attack from a randomly perturbed x. :param rand_minmax: (optional) bool. Support of the continuous uniform distribution from which the random perturbation on x was drawn. Effective only when rand_init is True. Default equals to eps. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial example """ if norm == 1: raise NotImplementedError( "It's not clear that FGM is a good inner loop" " step for PGD when norm=1, because norm=1 FGM " " changes only one pixel at a time. We need " " to rigorously test a strong norm=1 PGD " "before enabling this feature." ) if norm not in [np.inf, 2]: raise ValueError("Norm order must be either np.inf or 2.") if eps < 0: raise ValueError( "eps must be greater than or equal to 0, got {} instead".format(eps) ) if eps == 0: return x if eps_iter < 0: raise ValueError( "eps_iter must be greater than or equal to 0, got {} instead".format( eps_iter ) ) if eps_iter == 0: return x assert eps_iter <= eps, (eps_iter, eps) if clip_min is not None and clip_max is not None: if clip_min > clip_max: raise ValueError( "clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}".format( clip_min, clip_max ) ) asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: assert_ge = torch.all( torch.ge(x, torch.tensor(clip_min, device=x.device, dtype=x.dtype)) ) asserts.append(assert_ge) if clip_max is not None: assert_le = torch.all( torch.le(x, torch.tensor(clip_max, device=x.device, dtype=x.dtype)) ) asserts.append(assert_le) # Initialize loop variables if rand_init: if rand_minmax is None: rand_minmax = eps eta = torch.zeros_like(x).uniform_(-rand_minmax, rand_minmax) else: eta = torch.zeros_like(x) # Clip eta eta = clip_eta(eta, norm, eps) adv_x = x + eta if clip_min is not None or clip_max is not None: adv_x = torch.clamp(adv_x, clip_min, clip_max) if y is None: # Using model predictions as ground truth to avoid label leaking _, y = torch.max(model_fn(x), 1) i = 0 while i < nb_iter: adv_x = fast_gradient_method( model_fn, adv_x, eps_iter, norm, clip_min=clip_min, clip_max=clip_max, y=y, targeted=targeted, ) # Clipping perturbation eta to norm norm ball eta = adv_x - x eta = clip_eta(eta, norm, eps) adv_x = x + eta # Redo the clipping. # FGM already did it, but subtracting and re-adding eta can add some # small numerical error. if clip_min is not None or clip_max is not None: adv_x = torch.clamp(adv_x, clip_min, clip_max) i += 1 asserts.append(eps_iter <= eps) if norm == np.inf and clip_min is not None: # TODO necessary to cast clip_min and clip_max to x.dtype? asserts.append(eps + clip_min <= clip_max) if sanity_checks: assert np.all(asserts) return adv_x ================================================ FILE: cleverhans/torch/attacks/semantic.py ================================================ """ Semantic adversarial Examples """ def semantic(x, center=True, max_val=1.0): """ Semantic adversarial examples. https://arxiv.org/abs/1703.06857 Note: data must either be centered (so that the negative image can be made by simple negation) or must be in the interval of [-1, 1] Arguments --------- center : bool If true, assumes data has 0 mean so the negative image is just negation. If false, assumes data is in interval [0, max_val] max_val : float Maximum value allowed in the input data. """ if center: return x * -1 return max_val - x ================================================ FILE: cleverhans/torch/attacks/sparse_l1_descent.py ================================================ """The SparseL1Descent attack.""" import numpy as np import torch from cleverhans.torch.utils import zero_out_clipped_grads def sparse_l1_descent( model_fn, x, eps=10.0, eps_iter=1.0, nb_iter=20, y=None, targeted=False, clip_min=None, clip_max=None, rand_init=False, clip_grad=False, grad_sparsity=99, sanity_checks=True, ): """ This class implements a variant of Projected Gradient Descent for the l1-norm (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2 cases covered by the ProjectedGradientDescent class, because the steepest descent direction for the l1-norm is too sparse (it updates a single coordinate in the adversarial perturbation in each step). This attack has an additional parameter that controls the sparsity of the update step. For moderately sparse update steps, the attack vastly outperforms Projected Steepest Descent and is competitive with other attacks targeted at the l1-norm such as the ElasticNetMethod attack (which is much more computationally expensive). Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf :param model_fn: a callable that takes an input tensor and returns the model logits. :param x: input tensor. :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param grad_sparsity (optional) Relative sparsity of the gradient update step, in percent. Only gradient values larger than this percentile are retained. This parameter can be a scalar, or a tensor of the same length as the input batch dimension. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial examples """ if clip_grad and (clip_min is None or clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") # The grad_sparsity argument governs the sparsity of the gradient # update. It indicates the percentile value above which gradient entries # are retained. It can be specified as a scalar or as a 1-dimensional # tensor of the same size as the input's batch dimension. if isinstance(grad_sparsity, int) or isinstance(grad_sparsity, float): if not 0 < grad_sparsity < 100: raise ValueError("grad_sparsity should be in (0, 100)") else: grad_sparsity = torch.tensor(grad_sparsity) if len(grad_sparsity.shape) > 1: raise ValueError("grad_sparsity should either be a scalar or a tensor") grad_sparsity = grad_sparsity.to(x.device) if grad_sparsity.shape[0] != x.shape[0]: raise ValueError( "grad_sparsity should have same length as input if it is a tensor" ) asserts = [] # eps_iter should be at most eps asserts.append(eps_iter <= eps) # If a data range was specified, check that the input was in that range if clip_min is not None: assert_ge = torch.all( torch.ge(x, torch.tensor(clip_min, device=x.device, dtype=x.dtype)) ) asserts.append(assert_ge) if clip_max is not None: assert_le = torch.all( torch.le(x, torch.tensor(clip_max, device=x.device, dtype=x.dtype)) ) asserts.append(assert_le) if sanity_checks: assert np.all(asserts) # Initialize loop variables if rand_init: dist = torch.distributions.laplace.Laplace( torch.tensor([1.0]), torch.tensor([1.0]) ) dim = torch.prod(torch.tensor(x.shape[1:])) eta = dist.sample([x.shape[0], dim]).squeeze(-1).to(x.device) norm = torch.sum(torch.abs(eta), axis=-1, keepdim=True) w = torch.pow( torch.rand(x.shape[0], 1, device=x.device), torch.tensor(1.0 / dim) ) eta = torch.reshape(eps * (w * eta / norm), x.shape) else: eta = torch.zeros_like(x) # Clip eta adv_x = x.clone().detach().requires_grad_(True) eta = eta.renorm(p=1, dim=0, maxnorm=eps) adv_x = adv_x + eta if clip_min is not None or clip_max is not None: adv_x = torch.clamp(x, clip_min, clip_max) if y is None: y = torch.argmax(model_fn(x), 1) criterion = torch.nn.CrossEntropyLoss(reduction="none") for i in range(nb_iter): adv_x = adv_x.clone().detach().to(torch.float).requires_grad_(True) logits = model_fn(adv_x) # Compute loss loss = criterion(logits, y) if targeted: loss = -loss # Define gradient of loss wrt input (grad,) = torch.autograd.grad(loss.mean(), [adv_x]) if clip_grad: grad = zero_out_clipped_grads(grad, adv_x, clip_min, clip_max) grad_view = grad.view(grad.shape[0], -1) abs_grad = torch.abs(grad_view) if isinstance(grad_sparsity, int) or isinstance(grad_sparsity, float): k = int(grad_sparsity / 100.0 * abs_grad.shape[1]) percentile_value, _ = torch.kthvalue(abs_grad, k, keepdim=True) else: k = (grad_sparsity / 100.0 * abs_grad.shape[1]).long() percentile_value, _ = torch.sort(abs_grad, dim=1) percentile_value = percentile_value.gather(1, k.view(-1, 1)) percentile_value = percentile_value.repeat(1, grad_view.shape[1]) tied_for_max = torch.ge(abs_grad, percentile_value).int().float() num_ties = torch.sum(tied_for_max, dim=1, keepdim=True) optimal_perturbation = (torch.sign(grad_view) * tied_for_max) / num_ties optimal_perturbation = optimal_perturbation.view(grad.shape) # Add perturbation to original example to obtain adversarial example adv_x = adv_x + optimal_perturbation * eps_iter # If clipping is needed, reset all values outside of [clip_min, clip_max] if clip_min is not None or clip_max is not None: adv_x = torch.clamp(adv_x, clip_min, clip_max) # Clipping perturbation eta to the l1-ball eta = adv_x - x eta = eta.renorm(p=1, dim=0, maxnorm=eps) adv_x = x + eta # Redo the clipping. # Subtracting and re-adding eta can add some small numerical error. if clip_min is not None or clip_max is not None: adv_x = torch.clamp(adv_x, clip_min, clip_max) return adv_x.detach() ================================================ FILE: cleverhans/torch/attacks/spsa.py ================================================ """The SPSA attack.""" import numpy as np import torch from torch import optim from cleverhans.torch.utils import clip_eta def spsa( model_fn, x, eps, nb_iter, norm=np.inf, clip_min=-np.inf, clip_max=np.inf, y=None, targeted=False, early_stop_loss_threshold=None, learning_rate=0.01, delta=0.01, spsa_samples=128, spsa_iters=1, is_debug=False, sanity_checks=True, ): """ This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions. :param model_fn: A callable that takes an input tensor and returns the model logits. :param x: Input tensor. :param eps: The size of the maximum perturbation, measured in the L-infinity norm. :param nb_iter: The number of optimization steps. :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param clip_min: If specified, the minimum input value. :param clip_max: If specified, the maximum input value. :param y: (optional) Tensor with true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :param early_stop_loss_threshold: A float or None. If specified, the attack will end as soon as the loss is below `early_stop_loss_threshold`. :param learning_rate: Learning rate of ADAM optimizer. :param delta: Perturbation size used for SPSA approximation. :param spsa_samples: Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is `spsa_samples * spsa_iters` :param spsa_iters: Number of model evaluations before performing an update, where each evaluation is on `spsa_samples` different inputs. :param is_debug: If True, print the adversarial loss after each update. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) :return: a tensor for the adversarial example """ if y is not None and len(x) != len(y): raise ValueError( "number of inputs {} is different from number of labels {}".format( len(x), len(y) ) ) if y is None: y = torch.argmax(model_fn(x), dim=1) # The rest of the function doesn't support batches of size greater than 1, # so if the batch is bigger we split it up. if len(x) != 1: adv_x = [] for x_single, y_single in zip(x, y): adv_x_single = spsa( model_fn=model_fn, x=x_single.unsqueeze(0), eps=eps, nb_iter=nb_iter, norm=norm, clip_min=clip_min, clip_max=clip_max, y=y_single.unsqueeze(0), targeted=targeted, early_stop_loss_threshold=early_stop_loss_threshold, learning_rate=learning_rate, delta=delta, spsa_samples=spsa_samples, spsa_iters=spsa_iters, is_debug=is_debug, sanity_checks=sanity_checks, ) adv_x.append(adv_x_single) return torch.cat(adv_x) if eps < 0: raise ValueError( "eps must be greater than or equal to 0, got {} instead".format(eps) ) if eps == 0: return x if clip_min is not None and clip_max is not None: if clip_min > clip_max: raise ValueError( "clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}".format( clip_min, clip_max ) ) asserts = [] # If a data range was specified, check that the input was in that range asserts.append(torch.all(x >= clip_min)) asserts.append(torch.all(x <= clip_max)) if is_debug: print("Starting SPSA attack with eps = {}".format(eps)) perturbation = (torch.rand_like(x) * 2 - 1) * eps _project_perturbation(perturbation, norm, eps, x, clip_min, clip_max) optimizer = optim.Adam([perturbation], lr=learning_rate) for i in range(nb_iter): def loss_fn(pert): """ Margin logit loss, with correct sign for targeted vs untargeted loss. """ logits = model_fn(x + pert) loss_multiplier = 1 if targeted else -1 return loss_multiplier * _margin_logit_loss(logits, y.expand(len(pert))) spsa_grad = _compute_spsa_gradient( loss_fn, x, delta=delta, samples=spsa_samples, iters=spsa_iters ) perturbation.grad = spsa_grad optimizer.step() _project_perturbation(perturbation, norm, eps, x, clip_min, clip_max) loss = loss_fn(perturbation).item() if is_debug: print("Iteration {}: loss = {}".format(i, loss)) if early_stop_loss_threshold is not None and loss < early_stop_loss_threshold: break adv_x = torch.clamp((x + perturbation).detach(), clip_min, clip_max) if norm == np.inf: asserts.append(torch.all(torch.abs(adv_x - x) <= eps + 1e-6)) else: asserts.append( torch.all( torch.abs( torch.renorm(adv_x - x, p=norm, dim=0, maxnorm=eps) - (adv_x - x) ) < 1e-6 ) ) asserts.append(torch.all(adv_x >= clip_min)) asserts.append(torch.all(adv_x <= clip_max)) if sanity_checks: assert np.all(asserts) return adv_x def _project_perturbation( perturbation, norm, epsilon, input_image, clip_min=-np.inf, clip_max=np.inf ): """ Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into hypercube such that the resulting adversarial example is between clip_min and clip_max, if applicable. This is an in-place operation. """ clipped_perturbation = clip_eta(perturbation, norm, epsilon) new_image = torch.clamp(input_image + clipped_perturbation, clip_min, clip_max) perturbation.add_((new_image - input_image) - perturbation) def _compute_spsa_gradient(loss_fn, x, delta, samples, iters): """ Approximately compute the gradient of `loss_fn` at `x` using SPSA with the given parameters. The gradient is approximated by evaluating `iters` batches of `samples` size each. """ assert len(x) == 1 num_dims = len(x.size()) x_batch = x.expand(samples, *([-1] * (num_dims - 1))) grad_list = [] for i in range(iters): delta_x = delta * torch.sign(torch.rand_like(x_batch) - 0.5) delta_x = torch.cat([delta_x, -delta_x]) with torch.no_grad(): loss_vals = loss_fn(x + delta_x) while len(loss_vals.size()) < num_dims: loss_vals = loss_vals.unsqueeze(-1) avg_grad = ( torch.mean(loss_vals * torch.sign(delta_x), dim=0, keepdim=True) / delta ) grad_list.append(avg_grad) return torch.mean(torch.cat(grad_list), dim=0, keepdim=True) def _margin_logit_loss(logits, labels): """ Computes difference between logits for `labels` and next highest logits. The loss is high when `label` is unlikely (targeted by default). """ correct_logits = logits.gather(1, labels[:, None]).squeeze(1) logit_indices = torch.arange( logits.size()[1], dtype=labels.dtype, device=labels.device, )[None, :].expand(labels.size()[0], -1) incorrect_logits = torch.where( logit_indices == labels[:, None], torch.full_like(logits, float("-inf")), logits, ) max_incorrect_logits, _ = torch.max(incorrect_logits, 1) return max_incorrect_logits - correct_logits ================================================ FILE: cleverhans/torch/tests/__init__.py ================================================ ================================================ FILE: cleverhans/torch/tests/test_attacks.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import numpy as np from nose.plugins.skip import SkipTest import torch from cleverhans.devtools.checks import CleverHansTest from cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method from cleverhans.torch.attacks.projected_gradient_descent import ( projected_gradient_descent, ) from cleverhans.torch.attacks.carlini_wagner_l2 import carlini_wagner_l2 from cleverhans.torch.attacks.spsa import spsa from cleverhans.torch.attacks.hop_skip_jump_attack import hop_skip_jump_attack from cleverhans.torch.attacks.sparse_l1_descent import sparse_l1_descent class TrivialModel(torch.nn.Module): def __init__(self): super(TrivialModel, self).__init__() self.w1 = torch.tensor([[1.0, -1]]) def forward(self, x, **kwargs): return torch.matmul(x, self.w1) class SimpleModel(torch.nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.w1 = torch.tensor([[1.5, 0.3], [-2, 0.3]]) self.w2 = torch.tensor([[-2.4, 1.2], [0.5, -2.3]]) def forward(self, x): x = torch.matmul(x, self.w1) x = torch.sigmoid(x) x = torch.matmul(x, self.w2) return x class DummyModel(torch.nn.Module): def __init__(self, n_features): super(DummyModel, self).__init__() self.model = torch.nn.Sequential( torch.nn.Linear(n_features, 60), torch.nn.ReLU(), torch.nn.Linear(60, 10), ) def forward(self, x): x = x.view(x.shape[0], -1) return self.model(x) class CommonAttackProperties(CleverHansTest): def setUp(self): super(CommonAttackProperties, self).setUp() self.model = SimpleModel() self.trivial_model = TrivialModel() self.x = torch.randn(100, 2) self.normalized_x = torch.rand(100, 2) # truncated between [0, 1) self.trivial_x = torch.randn(100, 1) self.trivial_normalized_x = torch.rand(100, 1) # truncated between [0, 1) self.y_target = torch.randint(low=0, high=2, size=(100,)) self.ord_list = [1, 2, np.inf] def help_adv_examples_success_rate(self, model, x, rate=0.5, **kwargs): x_adv = self.attack(model_fn=model, x=x, **kwargs) _, ori_label = model(x).max(1) _, adv_label = model(x_adv).max(1) adv_acc = adv_label.eq(ori_label).sum().to(torch.float) / x.size(0) self.assertLess(adv_acc, rate) def help_targeted_adv_examples_success_rate(self, model, x, rate=0.7, **kwargs): x_adv = self.attack( model_fn=model, x=x, y=self.y_target, targeted=True, **kwargs ) _, adv_label = model(x_adv).max(1) adv_success = adv_label.eq(self.y_target).sum().to(torch.float) / x.size(0) self.assertGreater(adv_success, rate) class TestFastGradientMethod(CommonAttackProperties): def setUp(self): super(TestFastGradientMethod, self).setUp() self.attack = fast_gradient_method self.eps_list = [0, 0.1, 0.3, 1.0, 3] self.attack_param = {"eps": 0.5, "clip_min": -5, "clip_max": 5} def test_invalid_input(self): x = torch.tensor([[-2.0, 3.0]]) for norm in self.ord_list: self.assertRaises( AssertionError, self.attack, model_fn=self.model, x=x, eps=0.1, norm=norm, clip_min=-1.0, clip_max=1.0, sanity_checks=True, ) def test_invalid_eps(self): for norm in self.ord_list: self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=-0.1, norm=norm, ) def test_eps_equals_zero(self): for norm in self.ord_list: self.assertClose( self.attack(model_fn=self.model, x=self.x, eps=0, norm=norm), self.x ) def test_eps(self): # test if the attack respects the norm constraint # NOTE this has been tested with the optimize_linear function in # test_utils, so duplicate tests are not needed here. # Although, if ever switch the engine of the FGM method to some # function other than optimize_linear. This test should be added. raise SkipTest() def test_clips(self): clip_min = -1.0 clip_max = 1.0 for norm in self.ord_list: x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=0.3, norm=norm, clip_min=clip_min, clip_max=clip_max, ) self.assertTrue(torch.all(x_adv <= clip_max)) self.assertTrue(torch.all(x_adv >= clip_min)) def test_invalid_clips(self): clip_min = 0.5 clip_max = -0.5 for norm in self.ord_list: self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=0.1, norm=norm, clip_min=clip_min, clip_max=clip_max, ) def test_adv_example_success_rate_linf(self): # use normalized_x to make sure the same eps gives uniformly high attack # success rate across randomized tests self.help_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param ) def test_targeted_adv_example_success_rate_linf(self): self.help_targeted_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param ) def test_adv_example_success_rate_l1(self): self.help_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=1, **self.attack_param ) def test_targeted_adv_example_success_rate_l1(self): self.help_targeted_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=1, **self.attack_param ) def test_adv_example_success_rate_l2(self): self.help_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=2, **self.attack_param ) def test_targeted_adv_example_success_rate_l2(self): self.help_targeted_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=2, **self.attack_param ) class TestProjectedGradientMethod(CommonAttackProperties): def setUp(self): super(TestProjectedGradientMethod, self).setUp() self.attack = projected_gradient_descent self.attack_param = { "eps": 0.5, "clip_min": -5, "clip_max": 5, "eps_iter": 0.05, "nb_iter": 20, } def test_invalid_input(self): x = torch.tensor([[-2.0, 3.0]]) for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=x, eps=0.1, nb_iter=1, eps_iter=0.05, norm=norm, clip_min=-1.0, clip_max=1.0, sanity_checks=True, ) else: self.assertRaises( AssertionError, self.attack, model_fn=self.model, x=x, eps=0.1, nb_iter=1, eps_iter=0.05, norm=norm, clip_min=-1.0, clip_max=1.0, sanity_checks=True, ) def test_invalid_eps(self): for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=self.x, eps=-0.1, norm=norm, nb_iter=1, eps_iter=0.01, ) else: self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=-0.1, norm=norm, nb_iter=1, eps_iter=0.01, ) def test_invalid_eps_iter(self): for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=self.x, eps=0.1, norm=norm, nb_iter=1, eps_iter=-0.01, ) else: self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=0.1, norm=norm, nb_iter=1, eps_iter=-0.01, ) def test_eps_equals_zero(self): for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=self.x, eps=0, norm=norm, nb_iter=10, eps_iter=0.01, ) else: self.assertClose( self.attack( model_fn=self.model, x=self.x, eps=0, norm=norm, nb_iter=10, eps_iter=0.01, ), self.x, ) def test_eps_iter_equals_zero(self): for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=self.x, eps=0.5, norm=norm, nb_iter=10, eps_iter=0, ) else: self.assertClose( self.attack( model_fn=self.model, x=self.x, eps=0.5, norm=norm, nb_iter=10, eps_iter=0, ), self.x, ) def test_invalid_clips(self): clip_min = 0.5 clip_max = -0.5 for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=self.x, eps=0.1, norm=norm, clip_min=clip_min, clip_max=clip_max, nb_iter=10, eps_iter=0.01, ) else: self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=0.1, norm=norm, clip_min=clip_min, clip_max=clip_max, nb_iter=10, eps_iter=0.01, ) def test_adv_example_success_rate_linf(self): # use normalized_x to make sure the same eps gives uniformly high attack # success rate across randomized tests self.help_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param ) def test_targeted_adv_example_success_rate_linf(self): self.help_targeted_adv_examples_success_rate( x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param ) def test_adv_example_success_rate_l1(self): self.assertRaises( NotImplementedError, self.help_adv_examples_success_rate, model=self.model, x=self.normalized_x, norm=1, **self.attack_param ) # TODO uncomment the actual test below after we have implemented the L1 attack # self.help_adv_examples_success_rate(x=self.normalized_x, # model=self.model, norm=1, **self.attack_param) def test_targeted_adv_example_success_rate_l1(self): self.assertRaises( NotImplementedError, self.help_targeted_adv_examples_success_rate, x=self.normalized_x, model=self.model, norm=1, **self.attack_param ) # TODO uncomment the actual test below after we have implemented the L1 attack # self.help_targeted_adv_examples_success_rate(x=self.normalized_x, # model=self.model, norm=1, **self.attack_param) def test_adv_example_success_rate_l2(self): self.help_adv_examples_success_rate( model=self.model, x=self.normalized_x, norm=2, **self.attack_param ) def test_targeted_adv_example_success_rate_l2(self): self.help_targeted_adv_examples_success_rate( model=self.model, x=self.normalized_x, norm=2, **self.attack_param ) def test_do_not_reach_lp_boundary(self): for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, self.attack, model_fn=self.model, x=self.normalized_x, eps=0.5, nb_iter=10, norm=norm, eps_iter=0.01, ) continue else: x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=0.5, nb_iter=10, norm=norm, eps_iter=0.01, ) if norm == np.inf: delta, _ = torch.abs(x_adv - self.normalized_x).max(dim=1) elif norm == 1: delta = torch.abs(x_adv - self.normalized_x).sum(dim=1) elif norm == 2: delta = torch.pow(x_adv - self.normalized_x, 2).sum(dim=1).pow(0.5) diff = torch.max(0.5 - delta) self.assertTrue(diff > 0.25) def test_attack_strength(self): x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=1.0, eps_iter=0.05, norm=np.inf, clip_min=0.5, clip_max=0.7, nb_iter=5, sanity_checks=False, ) _, ori_label = self.model(self.normalized_x).max(1) _, adv_label = self.model(x_adv).max(1) adv_acc = adv_label.eq(ori_label).sum().to( torch.float ) / self.normalized_x.size(0) self.assertLess(adv_acc, 0.1) def test_eps(self): # test if the attack respects the norm constraint # NOTE clip_eta makes sure that at each step, adv_x respects the eps # norm constraint. Therefore, this is essentially a test on clip_eta, # which is implemented in a separate test_clip_eta raise SkipTest() def test_clip_eta(self): # NOTE: this has been tested with test_clip_eta in test_utils raise SkipTest() def test_clips(self): clip_min = -1.0 clip_max = 1.0 for norm in self.ord_list: if norm == 1: self.assertRaises( NotImplementedError, model_fn=self.model, x=self.normalized_x, eps=0.3, eps_iter=0.03, norm=norm, nb_iter=10, clip_min=clip_min, clip_max=clip_max, ) continue else: x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=0.3, eps_iter=0.03, norm=norm, nb_iter=10, clip_min=clip_min, clip_max=clip_max, ) self.assertTrue(torch.all(x_adv <= clip_max)) self.assertTrue(torch.all(x_adv >= clip_min)) def test_attack_does_not_cache_graph_computation_for_nb_iter(self): # TODO not sure what the original test does in tests_tf/test_attacks pass def test_multiple_initial_random_step(self): _, ori_label = self.model(self.normalized_x).max(1) new_label_multi = ori_label.clone().detach() for _ in range(10): x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=0.5, eps_iter=0.05, norm=np.inf, clip_min=0.5, clip_max=0.7, nb_iter=2, sanity_checks=False, ) _, new_label = self.model(x_adv).max(1) # examples for which we have not found adversarial examples i = ori_label.eq(new_label_multi) new_label_multi[i] = new_label[i] failed_attack = ori_label.eq(new_label_multi).sum().to( torch.float ) / self.normalized_x.size(0) self.assertLess(failed_attack, 0.5) class TestCarliniWagnerL2(CommonAttackProperties): def setUp(self): super(TestCarliniWagnerL2, self).setUp() self.attack = carlini_wagner_l2 self.attack_param = { "n_classes": 2, "max_iterations": 100, "binary_search_steps": 3, "initial_const": 1, } def test_adv_example_success_rate(self): self.help_adv_examples_success_rate( model=self.model, x=self.normalized_x, rate=0.1, clip_min=-5, clip_max=5, **self.attack_param ) def test_targeted_adv_example_success_rate(self): self.help_targeted_adv_examples_success_rate( model=self.model, x=self.normalized_x, rate=0.9, clip_min=-5, clip_max=5, **self.attack_param ) def test_adv_examples_clipped_successfully(self): x_adv = self.attack( model_fn=self.model, x=self.normalized_x, clip_min=-0.2, clip_max=0.3, **self.attack_param ) self.assertGreater(torch.min(x_adv), -0.201) self.assertLess(torch.max(x_adv), 0.301) def test_high_confidence_adv_example(self): from copy import copy attack_param_copy = copy(self.attack_param) attack_param_copy["binary_search_steps"] = 2 x = self.trivial_normalized_x - 0.5 _, y = self.trivial_model(x).max(1) for confidence in [0, 2.3]: x_adv = self.attack( model_fn=self.trivial_model, x=x, lr=1e-2, clip_min=-10, clip_max=10, confidence=confidence, **attack_param_copy ) logits = self.trivial_model(x_adv) target = logits[range(len(logits)), 1 - y] other = logits[range(len(logits)), y] self.assertClose(confidence, torch.min(target - other).detach(), atol=1e-1) self.assertTrue( torch.argmax(logits, 1).eq(y).sum().to(torch.float) / len(logits) == 0 ) def test_high_confidence_targeted_adv_example(self): from copy import copy attack_param_copy = copy(self.attack_param) attack_param_copy["binary_search_steps"] = 2 for confidence in [0, 2.3]: x_adv = self.attack( model_fn=self.trivial_model, x=self.trivial_normalized_x - 0.5, lr=1e-2, clip_min=-10, clip_max=10, targeted=True, y=self.y_target, confidence=confidence, **attack_param_copy ) logits = self.trivial_model(x_adv) target = logits[range(len(logits)), self.y_target] other = logits[range(len(logits)), 1 - self.y_target] self.assertClose(confidence, torch.min(target - other).detach(), atol=1e-1) self.assertGreater( torch.argmax(logits, 1).eq(self.y_target).sum().to(torch.float) / len(logits), 0.9, ) class TestSPSA(CommonAttackProperties): def setUp(self): super(TestSPSA, self).setUp() self.attack = spsa self.attack_param = { "eps": 0.5, "clip_min": -5, "clip_max": 5, "nb_iter": 50, "model": self.model, "x": self.normalized_x, } def test_invalid_input(self): x = torch.tensor([[-20.0, 30.0]]) self.assertRaises( AssertionError, self.attack, model_fn=self.model, x=x, eps=0.1, nb_iter=1, clip_min=-1.0, clip_max=1.0, sanity_checks=True, ) def test_invalid_eps(self): self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=-0.1, nb_iter=1 ) def test_eps_equals_zero(self): self.assertClose( self.attack(model_fn=self.model, x=self.x, eps=0, nb_iter=10), self.x ) def test_invalid_clips(self): self.assertRaises( ValueError, self.attack, model_fn=self.model, x=self.x, eps=0.1, clip_min=0.5, clip_max=-0.5, nb_iter=10, ) def test_adv_example_success_rate_linf(self): # use normalized_x to make sure the same eps gives uniformly high attack # success rate across randomized tests self.help_adv_examples_success_rate(**self.attack_param) def test_targeted_adv_example_success_rate_linf(self): self.help_targeted_adv_examples_success_rate(**self.attack_param) def test_adv_example_success_rate_l1(self): self.assertRaises( NotImplementedError, self.help_adv_examples_success_rate, norm=1, **self.attack_param ) # TODO uncomment the actual test below after we have implemented the L1 attack # self.help_adv_examples_success_rate( # norm=1, **self.attack_param) def test_targeted_adv_example_success_rate_l1(self): self.assertRaises( NotImplementedError, self.help_targeted_adv_examples_success_rate, norm=1, **self.attack_param ) # TODO uncomment the actual test below after we have implemented the L1 attack # self.help_targeted_adv_examples_success_rate( # norm=1, **self.attack_param) def test_adv_example_success_rate_l2(self): self.help_adv_examples_success_rate(norm=2, **self.attack_param) def test_targeted_adv_example_success_rate_l2(self): self.help_targeted_adv_examples_success_rate(norm=2, **self.attack_param) def test_attack_strength(self): x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=1.0, clip_min=0.5, clip_max=0.7, nb_iter=20, sanity_checks=False, ) _, ori_label = self.model(self.normalized_x).max(1) _, adv_label = self.model(x_adv).max(1) adv_acc = adv_label.eq(ori_label).sum().to( torch.float ) / self.normalized_x.size(0) self.assertLess(adv_acc, 0.1) def test_eps(self): x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=0.5, nb_iter=10 ) delta, _ = torch.abs(x_adv - self.normalized_x).max(dim=1) self.assertTrue(torch.all(delta <= 0.5 + 1e-6)) def test_clips(self): clip_min = -1.0 clip_max = 1.0 x_adv = self.attack( model_fn=self.model, x=self.normalized_x, eps=0.3, nb_iter=10, clip_min=clip_min, clip_max=clip_max, ) self.assertTrue(torch.all(x_adv <= clip_max)) self.assertTrue(torch.all(x_adv >= clip_min)) class TestHopSkipJumpAttack(CommonAttackProperties): def setUp(self): super(TestHopSkipJumpAttack, self).setUp() self.attack = hop_skip_jump_attack def test_generate_np_untargeted_l2(self): x_val = torch.rand(50, 2) bapp_params = { "norm": 2, "stepsize_search": "geometric_progression", "num_iterations": 10, "verbose": True, } x_adv = self.attack(model_fn=self.model, x=x_val, **bapp_params) _, ori_label = self.model(x_val).max(1) _, adv_label = self.model(x_adv).max(1) adv_acc = adv_label.eq(ori_label).sum().to(torch.float) / x_val.size(0) self.assertLess(adv_acc, 0.1) def test_generate_untargeted_linf(self): x_val = torch.rand(50, 2) bapp_params = { "norm": np.inf, "stepsize_search": "grid_search", "num_iterations": 10, "verbose": True, } x_adv = self.attack(model_fn=self.model, x=x_val, **bapp_params) _, ori_label = self.model(x_val).max(1) _, adv_label = self.model(x_adv).max(1) adv_acc = adv_label.eq(ori_label).sum().to(torch.float) / x_val.size(0) self.assertLess(adv_acc, 0.1) def test_generate_np_targeted_linf(self): x_val = torch.rand(200, 2) _, ori_label = self.model(x_val).max(1) x_val_pos = x_val[ori_label == 1] x_val_neg = x_val[ori_label == 0] x_val_under_attack = torch.cat((x_val_pos[:25], x_val_neg[:25]), dim=0) y_target = torch.cat( [torch.zeros(25, dtype=torch.int64), torch.ones(25, dtype=torch.int64)] ) image_target = torch.cat((x_val_neg[25:50], x_val_pos[25:50]), dim=0) bapp_params = { "norm": np.inf, "stepsize_search": "geometric_progression", "num_iterations": 10, "verbose": True, "y_target": y_target, "image_target": image_target, } x_adv = self.attack(model_fn=self.model, x=x_val_under_attack, **bapp_params) _, new_labs = self.model(x_adv).max(1) adv_acc = new_labs.eq(y_target).sum().to(torch.float) / y_target.size(0) self.assertGreater(adv_acc, 0.9) def test_generate_targeted_l2(self): # Create data in numpy arrays. x_val = torch.rand(200, 2) _, ori_label = self.model(x_val).max(1) x_val_pos = x_val[ori_label == 1] x_val_neg = x_val[ori_label == 0] x_val_under_attack = torch.cat((x_val_pos[:25], x_val_neg[:25]), dim=0) y_target = torch.cat( [torch.zeros(25, dtype=torch.int64), torch.ones(25, dtype=torch.int64)] ) image_target = torch.cat((x_val_neg[25:50], x_val_pos[25:50]), dim=0) # Create graph. bapp_params = { "norm": "l2", "stepsize_search": "grid_search", "num_iterations": 10, "verbose": True, "y_target": y_target, "image_target": image_target, } x_adv = self.attack(model_fn=self.model, x=x_val_under_attack, **bapp_params) _, new_labs = self.model(x_adv).max(1) adv_acc = new_labs.eq(y_target).sum().to(torch.float) / y_target.size(0) self.assertGreater(adv_acc, 0.9) class TestSparseL1Descent(CommonAttackProperties): def setUp(self): super(TestSparseL1Descent, self).setUp() self.attack = sparse_l1_descent def generate_adversarial_examples(self, **kwargs): x_adv = self.attack(model_fn=self.model, x=self.normalized_x, **kwargs) _, ori_label = self.model(self.normalized_x).max(1) _, adv_label = self.model(x_adv).max(1) adv_acc = adv_label.eq(ori_label).sum().to( torch.float ) / self.normalized_x.size(0) delta = torch.sum(torch.abs(x_adv - self.normalized_x), dim=1) return x_adv, delta, adv_acc def generate_targeted_adversarial_examples(self, **kwargs): y_target = torch.randint(low=0, high=2, size=(self.normalized_x.size(0),)) x_adv = self.attack( model_fn=self.model, x=self.normalized_x, y=y_target, targeted=True, **kwargs ) _, adv_label = self.model(x_adv).max(1) adv_success = adv_label.eq(y_target).sum().to( torch.float ) / self.normalized_x.size(0) delta = torch.sum(torch.abs(x_adv - self.normalized_x), dim=1) return x_adv, delta, adv_success def test_invalid_input(self): x_val = -torch.ones((2, 2)) with self.assertRaises(AssertionError): self.attack(self.model, x_val, eps=10.0, clip_min=0.0, clip_max=1.0) def test_gives_adversarial_example(self): _, delta, adv_acc = self.generate_adversarial_examples( eps=2, clip_min=-5, clip_max=5 ) self.assertLess(adv_acc, 0.5) self.assertLess(torch.max(torch.abs(delta - 2)), 1e-3) def test_targeted_gives_adversarial_example(self): _, delta, adv_acc = self.generate_targeted_adversarial_examples( eps=10, clip_min=-5, clip_max=5 ) self.assertGreater(adv_acc, 0.7) self.assertLessEqual(torch.max(delta), 10.001) def test_can_be_called_with_different_eps(self): for eps in [10, 20, 30, 40]: _, delta, _ = self.generate_adversarial_examples( eps=eps, clip_min=-5, clip_max=5 ) self.assertLessEqual(torch.max(delta), eps + 1e-4) def test_clip_works_as_expected(self): x_adv, _, _ = self.generate_adversarial_examples( eps=10, nb_iter=20, rand_init=True, clip_min=-0.2, clip_max=0.1, sanity_checks=False, ) self.assertClose(torch.min(x_adv), -0.2) self.assertClose(torch.max(x_adv), 0.1) def test_do_not_reach_lp_boundary(self): """ Make sure that iterative attack don't reach boundary of Lp neighbourhood if nb_iter * eps_iter is relatively small compared to epsilon. """ _, delta, _ = self.generate_adversarial_examples( eps=0.5, clip_min=-5, clip_max=5, nb_iter=10, eps_iter=0.01 ) self.assertTrue(torch.max(0.5 - delta) > 0.25) def test_generate_np_gives_clipped_adversarial_examples(self): x_adv, _, _ = self.generate_adversarial_examples( eps=1.0, eps_iter=0.1, nb_iter=5, clip_min=-0.2, clip_max=0.3, sanity_checks=False, ) self.assertLess(-0.201, torch.min(x_adv)) self.assertLess(torch.max(x_adv), 0.301) def test_clip_eta(self): _, delta, _ = self.generate_adversarial_examples( eps=1, clip_min=-5, clip_max=5, nb_iter=5, eps_iter=0.1 ) # this projection is less numerically stable so give it some slack self.assertLessEqual(torch.max(delta), 1.0 + 1e-6) def test_attack_strength(self): # sanity checks turned off because this test initializes outside # the valid range. _, _, adv_acc = self.generate_adversarial_examples( eps=10, rand_init=True, clip_min=0.5, clip_max=0.7, nb_iter=10, sanity_checks=False, ) self.assertLess(adv_acc, 0.4) def test_grad_clip(self): """ With clipped gradients, we achieve np.mean(orig_labels == new_labels) == 0.0 """ # sanity checks turned off because this test initializes outside # the valid range. _, _, adv_acc = self.generate_adversarial_examples( eps=10, rand_init=True, clip_grad=True, clip_min=0.5, clip_max=0.7, nb_iter=10, sanity_checks=False, ) self.assertLess(adv_acc, 0.1) def test_sparsity(self): # use a model with larger input dimensionality for this test. model_fn = DummyModel(1000) x_val = torch.rand(100, 1000) for q in [1, 9, 25.8, 50, 75.4, 90.2, 99, 99.9]: x_adv = self.attack( model_fn, x_val, eps=5.0, grad_sparsity=q, nb_iter=1, sanity_checks=False, ) numzero = torch.sum(x_adv - x_val == 0, dim=-1).float() self.assertAlmostEqual(q * 1000.0 / 100.0, torch.mean(numzero), delta=1) def test_grad_sparsity_checks(self): # test that the attacks allows `grad_sparsity` to be specified as a scalar # in (0, 100) or as a vector. # scalar values out of range with self.assertRaises(ValueError): self.generate_adversarial_examples(grad_sparsity=0) with self.assertRaises(ValueError): self.generate_adversarial_examples(grad_sparsity=100) # sparsity as 2D array should fail with self.assertRaises(ValueError): gs = torch.empty(100, 2).uniform_(90, 99) self.generate_adversarial_examples(sanity_checks=False, grad_sparsity=gs) # sparsity as 1D array should succeed gs = torch.empty(100).uniform_(90, 99) self.generate_adversarial_examples(sanity_checks=False, grad_sparsity=gs) # sparsity vector of wrong size should fail with self.assertRaises(ValueError) as context: gs = torch.empty(101).uniform_(90, 99) self.generate_adversarial_examples(sanity_checks=False, grad_sparsity=gs) ================================================ FILE: cleverhans/torch/tests/test_utils.py ================================================ # pylint: disable=missing-docstring import numpy as np import torch import cleverhans.torch.utils as utils from cleverhans.devtools.checks import CleverHansTest class TestOptimizeLinear(CleverHansTest): """ Identical to the TestOptimizeLinear in tests_tf/test_attacks. """ def setUp(self): super(TestOptimizeLinear, self).setUp() self.clip_eta = utils.clip_eta self.rand_grad = torch.randn(100, 3, 2) self.rand_eta = torch.randn(100, 3, 2) self.red_ind = list(range(1, len(self.rand_grad.size()))) # eps needs to be nonnegative self.eps_list = [0, 0.1, 1.0, 3] def test_optimize_linear_linf(self): grad = torch.tensor([[1.0, -2.0]]) eta = utils.optimize_linear(grad, eps=1.0, norm=np.inf) objective = torch.sum(grad * eta) self.assertEqual(grad.size(), eta.size()) self.assertClose(objective, grad.abs().sum()) self.assertClose(eta.abs(), 1.0) def test_optimize_linear_l2(self): grad = torch.tensor([[0.5 ** 0.5, -(0.5 ** 0.5)]]) eta = utils.optimize_linear(grad, eps=1.0, norm=2) objective = torch.sum(grad * eta) self.assertEqual(grad.size(), eta.size()) self.assertClose(objective, 1.0) self.assertClose(eta.pow(2).sum().sqrt(), 1.0) def test_optimize_linear_l1(self): grad = torch.tensor([[1.0, -2.0]]) eta = utils.optimize_linear(grad, eps=1.0, norm=1) objective = torch.sum(grad * eta) self.assertEqual(grad.size(), eta.size()) self.assertClose(objective, 2.0) self.assertClose(eta.abs().sum(), 1.0) def test_optimize_linear_l1_ties(self): grad = torch.tensor([[2.0, -2.0]]) eta = utils.optimize_linear(grad, eps=1.0, norm=1) objective = torch.sum(grad * eta) self.assertEqual(grad.size(), eta.size()) self.assertClose(objective, 2.0) self.assertClose(eta.abs().sum(), 1.0) def test_optimize_linear_linf_satisfies_norm_constraint(self): for eps in self.eps_list: eta = utils.optimize_linear(self.rand_grad, eps=eps, norm=np.inf) self.assertClose(eta.abs(), eps) def test_optimize_linear_l1_satisfies_norm_constraint(self): for eps in self.eps_list: eta = utils.optimize_linear(self.rand_grad, eps=eps, norm=1) norm = eta.abs().sum(dim=self.red_ind) self.assertTrue(torch.allclose(norm, eps * torch.ones_like(norm))) def test_optimize_linear_l2_satisfies_norm_constraint(self): for eps in self.eps_list: eta = utils.optimize_linear(self.rand_grad, eps=eps, norm=2) # optimize_linear uses avoid_zero_div as the divisor for # gradients with overly small l2 norms when performing norm # normalizations on the gradients so as to safeguard against # zero division error. Therefore, the replaced gradient vectors # will not be l2-unit vectors after normalization. In this test, # these gradients are filtered out by the one_mask # below and are not tested. # NOTE the value of avoid_zero_div should be the same as the # avoid_zero_div used in the optimize_linear function avoid_zero_div = torch.tensor(1e-12) square = torch.max( avoid_zero_div, torch.sum(self.rand_grad ** 2, self.red_ind, keepdim=True), ) norm = eta.pow(2).sum(dim=self.red_ind, keepdim=True).sqrt() one_mask = (square <= avoid_zero_div).to(torch.float) * norm + ( square > avoid_zero_div ).to(torch.float) self.assertTrue(torch.allclose(norm, eps * one_mask)) def test_clip_eta_linf(self): clipped = self.clip_eta(eta=self.rand_eta, norm=np.inf, eps=0.5) self.assertTrue(torch.all(clipped <= 0.5)) self.assertTrue(torch.all(clipped >= -0.5)) def test_clip_eta_l1(self): self.assertRaises( NotImplementedError, self.clip_eta, eta=self.rand_eta, norm=1, eps=0.5 ) # TODO uncomment the actual test below after we have implemented the L1 attack # clipped = self.clip_eta(eta=self.rand_eta, norm=1, eps=.5) # norm = clipped.abs().sum(dim=self.red_ind) # self.assertTrue(torch.all(norm <= .5001)) def test_clip_eta_l2(self): clipped = self.clip_eta(eta=self.rand_eta, norm=2, eps=0.5) norm = clipped.pow(2).sum(dim=self.red_ind).pow(0.5) self.assertTrue(torch.all(norm <= 0.5001)) ================================================ FILE: cleverhans/torch/utils.py ================================================ """Utils for PyTorch""" import numpy as np import torch def clip_eta(eta, norm, eps): """ PyTorch implementation of the clip_eta in utils_tf. :param eta: Tensor :param norm: np.inf, 1, or 2 :param eps: float """ if norm not in [np.inf, 1, 2]: raise ValueError("norm must be np.inf, 1, or 2.") avoid_zero_div = torch.tensor(1e-12, dtype=eta.dtype, device=eta.device) reduc_ind = list(range(1, len(eta.size()))) if norm == np.inf: eta = torch.clamp(eta, -eps, eps) else: if norm == 1: raise NotImplementedError("L1 clip is not implemented.") norm = torch.max( avoid_zero_div, torch.sum(torch.abs(eta), dim=reduc_ind, keepdim=True) ) elif norm == 2: norm = torch.sqrt( torch.max( avoid_zero_div, torch.sum(eta ** 2, dim=reduc_ind, keepdim=True) ) ) factor = torch.min( torch.tensor(1.0, dtype=eta.dtype, device=eta.device), eps / norm ) eta *= factor return eta def get_or_guess_labels(model, x, **kwargs): """ Get the label to use in generating an adversarial example for x. The kwargs are fed directly from the kwargs of the attack. If 'y' is in kwargs, then assume it's an untargeted attack and use that as the label. If 'y_target' is in kwargs and is not none, then assume it's a targeted attack and use that as the label. Otherwise, use the model's prediction as the label and perform an untargeted attack. :param model: PyTorch model. Do not add a softmax gate to the output. :param x: Tensor, shape (N, d_1, ...). :param y: (optional) Tensor, shape (N). :param y_target: (optional) Tensor, shape (N). """ if "y" in kwargs and "y_target" in kwargs: raise ValueError("Can not set both 'y' and 'y_target'.") if "y" in kwargs: labels = kwargs["y"] elif "y_target" in kwargs and kwargs["y_target"] is not None: labels = kwargs["y_target"] else: _, labels = torch.max(model(x), 1) return labels def optimize_linear(grad, eps, norm=np.inf): """ Solves for the optimal input to a linear function under a norm constraint. Optimal_perturbation = argmax_{eta, ||eta||_{norm} < eps} dot(eta, grad) :param grad: Tensor, shape (N, d_1, ...). Batch of gradients :param eps: float. Scalar specifying size of constraint region :param norm: np.inf, 1, or 2. Order of norm constraint. :returns: Tensor, shape (N, d_1, ...). Optimal perturbation """ red_ind = list(range(1, len(grad.size()))) avoid_zero_div = torch.tensor(1e-12, dtype=grad.dtype, device=grad.device) if norm == np.inf: # Take sign of gradient optimal_perturbation = torch.sign(grad) elif norm == 1: abs_grad = torch.abs(grad) sign = torch.sign(grad) red_ind = list(range(1, len(grad.size()))) abs_grad = torch.abs(grad) ori_shape = [1] * len(grad.size()) ori_shape[0] = grad.size(0) max_abs_grad, _ = torch.max(abs_grad.view(grad.size(0), -1), 1) max_mask = abs_grad.eq(max_abs_grad.view(ori_shape)).to(torch.float) num_ties = max_mask for red_scalar in red_ind: num_ties = torch.sum(num_ties, red_scalar, keepdim=True) optimal_perturbation = sign * max_mask / num_ties # TODO integrate below to a test file # check that the optimal perturbations have been correctly computed opt_pert_norm = optimal_perturbation.abs().sum(dim=red_ind) assert torch.all(opt_pert_norm == torch.ones_like(opt_pert_norm)) elif norm == 2: square = torch.max(avoid_zero_div, torch.sum(grad ** 2, red_ind, keepdim=True)) optimal_perturbation = grad / torch.sqrt(square) # TODO integrate below to a test file # check that the optimal perturbations have been correctly computed opt_pert_norm = ( optimal_perturbation.pow(2).sum(dim=red_ind, keepdim=True).sqrt() ) one_mask = (square <= avoid_zero_div).to(torch.float) * opt_pert_norm + ( square > avoid_zero_div ).to(torch.float) assert torch.allclose(opt_pert_norm, one_mask, rtol=1e-05, atol=1e-08) else: raise NotImplementedError( "Only L-inf, L1 and L2 norms are " "currently implemented." ) # Scale perturbation to be the solution for the norm=eps rather than # norm=1 problem scaled_perturbation = eps * optimal_perturbation return scaled_perturbation def zero_out_clipped_grads(grad, x, clip_min, clip_max): """ Helper function to erase entries in the gradient where the update would be clipped. :param grad: The gradient :param x: The current input :param clip_min: Minimum input component value :param clip_max: Maximum input component value """ signed_grad = torch.sign(grad) # Find input components that lie at the boundary of the input range, and # where the gradient points in the wrong direction. clip_low = torch.le(x, clip_min) & torch.lt(signed_grad, 0) clip_high = torch.ge(x, clip_max) & torch.gt(signed_grad, 0) clip = clip_low | clip_high grad = torch.where(clip, torch.zeros_like(grad), grad) return grad ================================================ FILE: cleverhans/utils.py ================================================ """ Generic utility functions useful for writing Python code in general """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from collections import OrderedDict import warnings import logging import os import re import subprocess import numpy as np from six.moves import xrange known_number_types = ( int, float, np.float16, np.float32, np.float64, np.int8, np.int16, np.int32, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64, ) CLEVERHANS_ROOT = os.path.dirname(os.path.dirname(__file__)) class _ArgsWrapper(object): """ Wrapper that allows attribute access to dictionaries """ def __init__(self, args): if not isinstance(args, dict): args = vars(args) self.args = args def __getattr__(self, name): return self.args.get(name) class AccuracyReport(object): """ An object summarizing the accuracy results for experiments involving training on clean examples or adversarial examples, then evaluating on clean or adversarial examples. """ def __init__(self): self.clean_train_clean_eval = 0.0 self.clean_train_adv_eval = 0.0 self.adv_train_clean_eval = 0.0 self.adv_train_adv_eval = 0.0 # Training data accuracy results to be used by tutorials self.train_clean_train_clean_eval = 0.0 self.train_clean_train_adv_eval = 0.0 self.train_adv_train_clean_eval = 0.0 self.train_adv_train_adv_eval = 0.0 def batch_indices(batch_nb, data_length, batch_size): """ This helper function computes a batch start and end index :param batch_nb: the batch number :param data_length: the total length of the data being parsed by batches :param batch_size: the number of inputs in each batch :return: pair of (start, end) indices """ # Batch start and end index start = int(batch_nb * batch_size) end = int((batch_nb + 1) * batch_size) # When there are not enough inputs left, we reuse some to complete the # batch if end > data_length: shift = end - data_length start -= shift end -= shift return start, end def other_classes(nb_classes, class_ind): """ Returns a list of class indices excluding the class indexed by class_ind :param nb_classes: number of classes in the task :param class_ind: the class index to be omitted :return: list of class indices excluding the class indexed by class_ind """ if class_ind < 0 or class_ind >= nb_classes: error_str = "class_ind must be within the range (0, nb_classes - 1)" raise ValueError(error_str) other_classes_list = list(range(nb_classes)) other_classes_list.remove(class_ind) return other_classes_list def to_categorical(y, nb_classes, num_classes=None): """ Converts a class vector (integers) to binary class matrix. This is adapted from the Keras function with the same name. :param y: class vector to be converted into a matrix (integers from 0 to nb_classes). :param nb_classes: nb_classes: total number of classes. :param num_classses: depricated version of nb_classes :return: A binary matrix representation of the input. """ if num_classes is not None: if nb_classes is not None: raise ValueError( "Should not specify both nb_classes and its deprecated " "alias, num_classes" ) warnings.warn( "`num_classes` is deprecated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23." ) nb_classes = num_classes del num_classes y = np.array(y, dtype="int").ravel() n = y.shape[0] categorical = np.zeros((n, nb_classes)) categorical[np.arange(n), y] = 1 return categorical def random_targets(gt, nb_classes): """ Take in an array of correct labels and randomly select a different label for each label in the array. This is typically used to randomly select a target class in targeted adversarial examples attacks (i.e., when the search algorithm takes in both a source class and target class to compute the adversarial example). :param gt: the ground truth (correct) labels. They can be provided as a 1D vector or 2D array of one-hot encoded labels. :param nb_classes: The number of classes for this task. The random class will be chosen between 0 and nb_classes such that it is different from the correct class. :return: A numpy array holding the randomly-selected target classes encoded as one-hot labels. """ # If the ground truth labels are encoded as one-hot, convert to labels. if len(gt.shape) == 2: gt = np.argmax(gt, axis=1) # This vector will hold the randomly selected labels. result = np.zeros(gt.shape, dtype=np.int32) for class_ind in xrange(nb_classes): # Compute all indices in that class. in_cl = gt == class_ind size = np.sum(in_cl) # Compute the set of potential targets for this class. potential_targets = other_classes(nb_classes, class_ind) # Draw with replacement random targets among the potential targets. result[in_cl] = np.random.choice(potential_targets, size=size) # Encode vector of random labels as one-hot labels. result = to_categorical(result, nb_classes) result = result.astype(np.int32) return result def pair_visual(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`pair_visual` has moved to `cleverhans.plot.pyplot_image`. " "cleverhans.utils.pair_visual may be removed on or after " "2019-04-24." ) from cleverhans.plot.pyplot_image import pair_visual as new_pair_visual return new_pair_visual(*args, **kwargs) def grid_visual(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`grid_visual` has moved to `cleverhans.plot.pyplot_image`. " "cleverhans.utils.grid_visual may be removed on or after " "2019-04-24." ) from cleverhans.plot.pyplot_image import grid_visual as new_grid_visual return new_grid_visual(*args, **kwargs) def get_logits_over_interval(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`get_logits_over_interval` has moved to " "`cleverhans.plot.pyplot_image`. " "cleverhans.utils.get_logits_over_interval may be removed on " "or after 2019-04-24." ) # pylint:disable=line-too-long from cleverhans.plot.pyplot_image import ( get_logits_over_interval as new_get_logits_over_interval, ) return new_get_logits_over_interval(*args, **kwargs) def linear_extrapolation_plot(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`linear_extrapolation_plot` has moved to " "`cleverhans.plot.pyplot_image`. " "cleverhans.utils.linear_extrapolation_plot may be removed on " "or after 2019-04-24." ) # pylint:disable=line-too-long from cleverhans.plot.pyplot_image import ( linear_extrapolation_plot as new_linear_extrapolation_plot, ) return new_linear_extrapolation_plot(*args, **kwargs) def set_log_level(level, name="cleverhans"): """ Sets the threshold for the cleverhans logger to level :param level: the logger threshold. You can find values here: https://docs.python.org/2/library/logging.html#levels :param name: the name used for the cleverhans logger """ logging.getLogger(name).setLevel(level) def get_log_level(name="cleverhans"): """ Gets the current threshold for the cleverhans logger :param name: the name used for the cleverhans logger """ return logging.getLogger(name).getEffectiveLevel() class TemporaryLogLevel(object): """ A ContextManager that changes a log level temporarily. Note that the log level will be set back to its original value when the context manager exits, even if the log level has been changed again in the meantime. """ def __init__(self, level, name): self.name = name self.level = level def __enter__(self): self.old_level = get_log_level(self.name) set_log_level(self.level, self.name) def __exit__(self, type, value, traceback): set_log_level(self.old_level, self.name) return True def create_logger(name): """ Create a logger object with the given name. If this is the first time that we call this method, then initialize the formatter. """ base = logging.getLogger("cleverhans") if len(base.handlers) == 0: ch = logging.StreamHandler() formatter = logging.Formatter( "[%(levelname)s %(asctime)s %(name)s] " + "%(message)s" ) ch.setFormatter(formatter) base.addHandler(ch) return base def deterministic_dict(normal_dict): """ Returns a version of `normal_dict` whose iteration order is always the same """ out = OrderedDict() for key in sorted(normal_dict.keys()): out[key] = normal_dict[key] return out def ordered_union(l1, l2): """ Return the union of l1 and l2, with a deterministic ordering. (Union of python sets does not necessarily have a consisten iteration order) :param l1: list of items :param l2: list of items :returns: list containing one copy of each item that is in l1 or in l2 """ out = [] for e in l1 + l2: if e not in out: out.append(e) return out def safe_zip(*args): """like zip but with these properties: - returns a list, rather than an iterator. This is the old Python2 zip behavior. - a guarantee that all arguments are the same length. (normal zip silently drops entries to make them the same length) """ length = len(args[0]) if not all(len(arg) == length for arg in args): raise ValueError( "Lengths of arguments do not match: " + str([len(arg) for arg in args]) ) return list(zip(*args)) def shell_call(command, **kwargs): """Calls shell command with argument substitution. Args: command: command represented as a list. Each element of the list is one token of the command. For example "cp a b" becomes ['cp', 'a', 'b'] If any element of the list looks like '${NAME}' then it will be replaced by value from **kwargs with key 'NAME'. **kwargs: dictionary with argument substitution Returns: output of the command Raises: subprocess.CalledProcessError if command return value is not zero This function is useful when you need to do variable substitution prior running the command. Below are few examples of how it works: shell_call(['cp', 'a', 'b'], a='asd') calls command 'cp a b' shell_call(['cp', '${a}', 'b'], a='asd') calls command 'cp asd b', '${a}; was replaced with 'asd' before calling the command """ # Regular expression to find instances of '${NAME}' in a string CMD_VARIABLE_RE = re.compile("^\\$\\{(\\w+)\\}$") command = list(command) for i in range(len(command)): m = CMD_VARIABLE_RE.match(command[i]) if m: var_id = m.group(1) if var_id in kwargs: command[i] = kwargs[var_id] str_command = " ".join(command) logging.debug("Executing shell command: %s" % str_command) return subprocess.check_output(command) def deep_copy(numpy_dict): """ Returns a copy of a dictionary whose values are numpy arrays. Copies their values rather than copying references to them. """ out = {} for key in numpy_dict: out[key] = numpy_dict[key].copy() return out ================================================ FILE: cleverhans_v3.1.0/CODE_OF_CONDUCT.rst ================================================ CleverHans is dedicated to providing a harassment-free experience for everyone, regardless of gender, gender identity and expression, sexual orientation, disability, physical appearance, body size, age, race, or religion. We do not tolerate harassment of participants in any form. This code of conduct applies to all CleverHans spaces (including Gist comments) both online and off. Anyone who violates this code of conduct may be sanctioned or expelled from these spaces at the discretion of the OpenAI / Pennsylvania State University team. We may add additional rules over time, which will be made clearly available to participants. Participants are responsible for knowing and abiding by these rules. ================================================ FILE: cleverhans_v3.1.0/CONTRIBUTING.md ================================================ # Contributing to CleverHans First off, thank you for considering contributing to CleverHans. Following these guidelines helps to communicate that you respect the time of the researchers and developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. Adding new features, improving documentation, bug triaging, or writing tutorials are all examples of helpful contributions. Furthermore, if you are publishing a new attack or defense, we strongly encourage you to add it to CleverHans so that others may evaluate it fairly in their own work. To speed the code review process, we ask that: * New efforts and features be coordinated on the mailing list for CleverHans development: [cleverhans-dev@googlegroups.com](https://groups.google.com/forum/#!forum/cleverhans-dev). * When making code contributions to CleverHans, you should follow the [`Black`](https://black.readthedocs.io/en/stable/index.html) coding style in your pull requests. * We do not accept pull requests that add git submodules because of [the problems that arise when maintaining git submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407) Bug fixes can be initiated through Github pull requests. ================================================ FILE: cleverhans_v3.1.0/Dockerfile ================================================ FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y python RUN apt-get install -y python-pip RUN pip install --upgrade pip COPY .setup_vm_and_run_tests.sh / RUN chmod +x /.setup_vm_and_run_tests.sh CMD ["/.setup_vm_and_run_tests.sh"] ================================================ FILE: cleverhans_v3.1.0/LICENSE ================================================ MIT License Copyright (c) 2019 Google Inc., OpenAI and Pennsylvania State University Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: cleverhans_v3.1.0/README.md ================================================ # CleverHans (latest release: v3.1.0) Note: This is the final version of CleverHans v3, which supports TensorFlow 1, Python 3 and Python 2. In our version 4 update, we’re dropping support for TF1 and Python 2, and transitioning to JAX, PyTorch and TF2 on Python 3. This version was last tested with Python 3.5 and Tensorflow {1.8, 1.12} on Ubuntu 14.04.5 LTS (Trusty Tahr). You’re welcome to continue using it, but it’s no longer maintained. cleverhans logo [![Build Status](https://travis-ci.org/tensorflow/cleverhans.svg?branch=master)](https://travis-ci.org/tensorflow/cleverhans) [![Documentation Status](https://readthedocs.org/projects/cleverhans/badge/?version=latest)](https://cleverhans.readthedocs.io/en/latest/?badge=latest) This repository contains the source code for CleverHans, a Python library to benchmark machine learning systems' vulnerability to [adversarial examples](http://karpathy.github.io/2015/03/30/breaking-convnets/). You can learn more about such vulnerabilities on the accompanying [blog](http://cleverhans.io). The CleverHans library is under continual development, always welcoming [contributions](https://github.com/tensorflow/cleverhans#contributing) of the latest attacks and defenses. In particular, we always welcome help towards resolving the [issues](https://github.com/tensorflow/cleverhans/issues) currently open. ## Major updates coming to CleverHans CleverHans will soon support 3 frameworks: JAX, PyTorch, and TF2. The package itself will focus on its initial principle: reference implementation of attacks against machine learning models to help with benchmarking models against adversarial examples. This repository will also contain two folders: `tutorials/` for scripts demonstrating the features of CleverHans and `defenses/` for scripts that contain authoritative implementations of defenses in one of the 3 supported frameworks. The structure of the future repository will look like this: ``` cleverhans/ jax/ attacks/ ... tests/ ... tf2/ attacks/ ... tests/ ... torch/ attacks/ ... tests/ ... defenses/ jax/ ... tf2/ ... torch/ ... tutorials/ jax/ ... tf2/ ... torch/ ... ``` In the meanwhile, all of these folders can be found in the correspond `future/` subdirectory (e.g., `cleverhans/future/jax/attacks`, `cleverhans/future/jax/tests` or `defenses/future/jax/`). A public milestone has been created to track the changes that are to be implemented before the library version is incremented to v4. ## Setting up CleverHans ### Dependencies This library uses [TensorFlow](https://www.tensorflow.org/) to accelerate graph computations performed by many machine learning models. Therefore, installing TensorFlow is a pre-requisite. You can find instructions [here](https://www.tensorflow.org/install/). For better performance, it is also recommended to install TensorFlow with GPU support (detailed instructions on how to do this are available in the TensorFlow installation documentation). Installing TensorFlow will take care of all other dependencies like `numpy` and `scipy`. ### Installation Once dependencies have been taken care of, you can install CleverHans using `pip` or by cloning this Github repository. #### `pip` installation If you are installing CleverHans using `pip`, run the following command after installing TensorFlow: ``` pip install cleverhans ``` This will install the last version uploaded to [Pypi](https://pypi.org/project/cleverhans). If you'd instead like to install the bleeding edge version, use: ``` pip install git+https://github.com/tensorflow/cleverhans.git#egg=cleverhans ``` #### Installation for development If you want to make an editable installation of CleverHans so that you can develop the library and contribute changes back, first fork the repository on GitHub and then clone your fork into a directory of your choice: ``` git clone https://github.com/tensorflow/cleverhans ``` You can then install the local package in "editable" mode in order to add it to your `PYTHONPATH`: ``` cd cleverhans pip install -e . ``` ### Currently supported setups Although CleverHans is likely to work on many other machine configurations, we currently [test it](https://travis-ci.org/tensorflow/cleverhans) it with Python 3.5 and TensorFlow {1.8, 1.12} on Ubuntu 14.04.5 LTS (Trusty Tahr). Support for Python 2.7 is deprecated. CleverHans 3.0.1 supports Python 2.7 and the master branch is likely to continue to work in Python 2.7 for some time, but we no longer run the tests in Python 2.7 and we do not plan to fix bugs affecting only Python 2.7 after 2019-07-04. Support for TensorFlow prior to 1.12 is deprecated. Backwards compatibility wrappers for these versions may be removed after 2019-07-07, and we will not fix bugs for those versions after that date. Support for TensorFlow 1.7 and earlier is already deprecated: we do not fix bugs for those versions and any remaining wrapper code for those versions may be removed without further notice. ## Getting support If you have a request for support, please ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans) rather than opening an issue in the GitHub tracker. The GitHub issue tracker should *only* be used to report bugs or make feature requests. ## Contributing Contributions are welcomed! To speed the code review process, we ask that: * New efforts and features be coordinated on the mailing list for CleverHans development: [cleverhans-dev@googlegroups.com](https://groups.google.com/forum/#!forum/cleverhans-dev). * When making code contributions to CleverHans, you follow the `PEP8 with two spaces` coding style (the same as the one used by TensorFlow) in your pull requests. In most cases this can be done by running `autopep8 -i --indent-size 2 ` on the files you have edited. You can check your code by running `nosetests cleverhans/devtools/tests/test_format.py` or check an individual file by running `pylint ` from inside the cleverhans repository root directory. * When making your first pull request, you [sign the Google CLA](https://cla.developers.google.com/clas) * We do not accept pull requests that add git submodules because of [the problems that arise when maintaining git submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407) Bug fixes can be initiated through Github pull requests. ## Scripts: `scripts` directory The `scripts` directory contains command line utilities. In many cases you can use these to run CleverHans functionality on your saved models without needing to write any of your own Python code. You may want to set your `.bashrc` / `.bash_profile` file to add the CleverHans `scripts` directory to your `PATH` environment variable so that these scripts will be conveniently executable from any directory. ## Tutorials: `cleverhans_tutorials` directory To help you get started with the functionalities provided by this library, the `cleverhans_tutorials/` folder comes with the following tutorials: * **MNIST with FGSM** ([code](cleverhans_tutorials/mnist_tutorial_tf.py)): this tutorial covers how to train a MNIST model using TensorFlow, craft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572), and make the model more robust to adversarial examples using adversarial training. * **MNIST with FGSM using Keras** ([code](cleverhans_tutorials/mnist_tutorial_keras_tf.py)): this tutorial covers how to define a MNIST model with Keras and train it using TensorFlow, craft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572), and make the model more robust to adversarial examples using adversarial training. * **MNIST with JSMA** ([code](cleverhans_tutorials/mnist_tutorial_jsma.py)): this second tutorial covers how to define a MNIST model with Keras and train it using TensorFlow and craft adversarial examples using the [Jacobian-based saliency map approach](https://arxiv.org/abs/1511.07528). * **MNIST using a black-box attack** ([code](cleverhans_tutorials/mnist_blackbox.py)): this tutorial implements the black-box attack described in this [paper](https://arxiv.org/abs/1602.02697). The adversary train a substitute model: a copy that imitates the black-box model by observing the labels that the black-box model assigns to inputs chosen carefully by the adversary. The adversary then uses the substitute model’s gradients to find adversarial examples that are misclassified by the black-box model as well. NOTE: the tutorials are maintained carefully, in the sense that we use continuous integration to make sure they continue working. They are not considered part of the API and they can change at any time without warning. You should not write 3rd party code that imports the tutorials and expect that the interface will not break. Only the main library is subject to our six month interface deprecation warning rule. NOTE: please write to cleverhans-dev@googlegroups.com before writing a new tutorial. Because each new tutorial involves a large amount of duplicated code relative to the existing tutorials, and because every line of code requires ongoing testing and maintenance indefinitely, we generally prefer not to add new tutorials. Each tutorial should showcase an extremely different way of using the library. Just calling a different attack, model, or dataset is not enough to justify maintaining a parallel tutorial. ## Examples : `examples` directory The `examples/` folder contains additional scripts to showcase different uses of the CleverHans library or get you started competing in different adversarial example contests. We do not offer nearly as much ongoing maintenance or support for this directory as the rest of the library, and if code in here gets broken we may just delete it without warning. ## Reporting benchmarks When reporting benchmarks, please: * Use a versioned release of CleverHans. You can find a list of released versions [here](https://github.com/tensorflow/cleverhans/releases). * Either use the latest version, or, if comparing to an earlier publication, use the same version as the earlier publication. * Report which attack method was used. * Report any configuration variables used to determine the behavior of the attack. For example, you might report "We benchmarked the robustness of our method to adversarial attack using v3.0.1 of CleverHans. On a test set modified by the `FastGradientMethod` with a max-norm `eps` of 0.3, we obtained a test set accuracy of 71.3%." ## Citing this work If you use CleverHans for academic research, you are highly encouraged (though not required) to cite the following [paper](https://arxiv.org/abs/1610.00768): ``` @article{papernot2018cleverhans, title={Technical Report on the CleverHans v2.1.0 Adversarial Examples Library}, author={Nicolas Papernot and Fartash Faghri and Nicholas Carlini and Ian Goodfellow and Reuben Feinman and Alexey Kurakin and Cihang Xie and Yash Sharma and Tom Brown and Aurko Roy and Alexander Matyasko and Vahid Behzadan and Karen Hambardzumyan and Zhishuai Zhang and Yi-Lin Juang and Zhi Li and Ryan Sheatsley and Abhibhav Garg and Jonathan Uesato and Willi Gierke and Yinpeng Dong and David Berthelot and Paul Hendricks and Jonas Rauber and Rujun Long}, journal={arXiv preprint arXiv:1610.00768}, year={2018} } ``` ## About the name The name CleverHans is a reference to a presentation by Bob Sturm titled “Clever Hans, Clever Algorithms: Are Your Machine Learnings Learning What You Think?" and the corresponding publication, ["A Simple Method to Determine if a Music Information Retrieval System is a 'Horse'."](http://ieeexplore.ieee.org/document/6847693/) Clever Hans was a horse that appeared to have learned to answer arithmetic questions, but had in fact only learned to read social cues that enabled him to give the correct answer. In controlled settings where he could not see people's faces or receive other feedback, he was unable to answer the same questions. The story of Clever Hans is a metaphor for machine learning systems that may achieve very high accuracy on a test set drawn from the same distribution as the training data, but that do not actually understand the underlying task and perform poorly on other inputs. ## Authors This library is managed and maintained by Ian Goodfellow (Google Brain) and Nicolas Papernot (Google Brain). The following authors contributed 100 lines or more (ordered according to the GitHub contributors page): * Ian Goodfellow (Google Brain) * Nicolas Papernot (Google Brain) * Nicholas Carlini (Google Brain) * Fartash Faghri (University of Toronto) * Tzu-Wei Sung (National Taiwan University) * Alexey Kurakin (Google Brain) * Reuben Feinman (New York University) * Shiyu Duan (University of Florida) * Phani Krishna (Video Analytics Lab) * David Berthelot (Google Brain) * Tom Brown (Google Brain) * Cihang Xie (Johns Hopkins) * Yash Sharma (The Cooper Union) * Aashish Kumar (HARMAN X) * Aurko Roy (Google Brain) * Alexander Matyasko (Nanyang Technological University) * Anshuman Suri (University of Virginia) * Yen-Chen Lin (MIT) * Vahid Behzadan (Kansas State) * Jonathan Uesato (DeepMind) * Florian Tramèr (Stanford University) * Haojie Yuan (University of Science & Technology of China) * Zhishuai Zhang (Johns Hopkins) * Karen Hambardzumyan (YerevaNN) * Jianbo Chen (UC Berkeley) * Catherine Olsson (Google Brain) * Aidan Gomez (University of Oxford) * Zhi Li (University of Toronto) * Yi-Lin Juang (NTUEE) * Pratyush Sahay (formerly HARMAN X) * Abhibhav Garg (IIT Delhi) * Aditi Raghunathan (Stanford University) * Yang Song (Stanford University) * Riccardo Volpi (Italian Institute of Technology) * Angus Galloway (University of Guelph) * Yinpeng Dong (Tsinghua University) * Willi Gierke (Hasso Plattner Institute) * Bruno López * Jonas Rauber (IMPRS) * Paul Hendricks (NVIDIA) * Ryan Sheatsley (Pennsylvania State University) * Rujun Long (0101.AI) * Bogdan Kulynych (EPFL) * Erfan Noury (UMBC) * Robert Wagner (Case Western Reserve University) * Erh-Chung Chen (National Tsing Hua University) ## Copyright Copyright 2019 - Google Inc., OpenAI and Pennsylvania State University. ================================================ FILE: cleverhans_v3.1.0/cleverhans/__init__.py ================================================ """The CleverHans adversarial example library""" from cleverhans.devtools.version import append_dev_version # If possible attach a hex digest to the version string to keep track of # changes in the development branch __version__ = append_dev_version("3.0.1") ================================================ FILE: cleverhans_v3.1.0/cleverhans/attack_bundling.py ================================================ """ Runs multiple attacks against each example. References: https://openreview.net/forum?id=H1g0piA9tQ https://arxiv.org/abs/1811.03685 """ # pylint: disable=missing-docstring import copy import logging import time import numpy as np import six from six.moves import range import tensorflow as tf from cleverhans.attacks import Noise from cleverhans.attacks import ProjectedGradientDescent from cleverhans.attacks import SPSA from cleverhans.evaluation import correctness_and_confidence from cleverhans.evaluation import batch_eval_multi_worker, run_attack from cleverhans.model import Model from cleverhans import serial from cleverhans.utils import create_logger, deep_copy, safe_zip from cleverhans.utils_tf import infer_devices from cleverhans.confidence_report import ConfidenceReport from cleverhans.confidence_report import ConfidenceReportEntry from cleverhans.confidence_report import print_stats _logger = create_logger("attack_bundling") _logger.setLevel(logging.INFO) devices = infer_devices() num_devices = len(devices) DEFAULT_EXAMPLES_PER_DEVICE = 128 BATCH_SIZE = DEFAULT_EXAMPLES_PER_DEVICE * num_devices REPORT_TIME_INTERVAL = 60 # TODO: lower priority: make it possible to initialize one attack with # the output of an earlier attack def single_run_max_confidence_recipe( sess, model, x, y, nb_classes, eps, clip_min, clip_max, eps_iter, nb_iter, report_path, batch_size=BATCH_SIZE, eps_iter_small=None, ): """A reasonable attack bundling recipe for a max norm threat model and a defender that uses confidence thresholding. This recipe uses both uniform noise and randomly-initialized PGD targeted attacks. References: https://openreview.net/forum?id=H1g0piA9tQ This version runs each attack (noise, targeted PGD for each class with nb_iter iterations, target PGD for each class with 25X more iterations) just once and then stops. See `basic_max_confidence_recipe` for a version that runs indefinitely. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param nb_classes: int, number of classes :param eps: float, maximum size of perturbation (measured by max norm) :param eps_iter: float, step size for one version of PGD attacks (will also run another version with eps_iter_small step size) :param nb_iter: int, number of iterations for the cheaper PGD attacks (will also run another version with 25X more iterations) :param report_path: str, the path that the report will be saved to. :param batch_size: int, the total number of examples to run simultaneously :param eps_iter_small: optional, float. The second version of the PGD attack is run with 25 * nb_iter iterations and eps_iter_small step size. If eps_iter_small is not specified it is set to eps_iter / 25. """ noise_attack = Noise(model, sess) pgd_attack = ProjectedGradientDescent(model, sess) threat_params = {"eps": eps, "clip_min": clip_min, "clip_max": clip_max} noise_attack_config = AttackConfig(noise_attack, threat_params, "noise") attack_configs = [noise_attack_config] pgd_attack_configs = [] pgd_params = copy.copy(threat_params) pgd_params["eps_iter"] = eps_iter pgd_params["nb_iter"] = nb_iter assert batch_size % num_devices == 0 dev_batch_size = batch_size // num_devices ones = tf.ones(dev_batch_size, tf.int32) expensive_pgd = [] if eps_iter_small is None: eps_iter_small = eps_iter / 25.0 for cls in range(nb_classes): cls_params = copy.copy(pgd_params) cls_params["y_target"] = tf.to_float(tf.one_hot(ones * cls, nb_classes)) cls_attack_config = AttackConfig(pgd_attack, cls_params, "pgd_" + str(cls)) pgd_attack_configs.append(cls_attack_config) expensive_params = copy.copy(cls_params) expensive_params["eps_iter"] = eps_iter_small expensive_params["nb_iter"] *= 25.0 expensive_config = AttackConfig( pgd_attack, expensive_params, "expensive_pgd_" + str(cls) ) expensive_pgd.append(expensive_config) attack_configs = [noise_attack_config] + pgd_attack_configs + expensive_pgd new_work_goal = {config: 1 for config in attack_configs} goals = [MaxConfidence(t=1.0, new_work_goal=new_work_goal)] bundle_attacks( sess, model, x, y, attack_configs, goals, report_path, attack_batch_size=batch_size, eval_batch_size=batch_size, ) def basic_max_confidence_recipe( sess, model, x, y, nb_classes, eps, clip_min, clip_max, eps_iter, nb_iter, report_path, batch_size=BATCH_SIZE, eps_iter_small=None, ): """A reasonable attack bundling recipe for a max norm threat model and a defender that uses confidence thresholding. References: https://openreview.net/forum?id=H1g0piA9tQ This version runs indefinitely, updating the report on disk continuously. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param nb_classes: int, number of classes :param eps: float, maximum size of perturbation (measured by max norm) :param eps_iter: float, step size for one version of PGD attacks (will also run another version with eps_iter_small) :param nb_iter: int, number of iterations for one version of PGD attacks (will also run another version with 25X more iterations) :param report_path: str, the path that the report will be saved to. :batch_size: int, the total number of examples to run simultaneously :param eps_iter_small: optional, float. The second version of the PGD attack is run with 25 * nb_iter iterations and eps_iter_small step size. If eps_iter_small is not specified it is set to eps_iter / 25. """ noise_attack = Noise(model, sess) pgd_attack = ProjectedGradientDescent(model, sess) threat_params = {"eps": eps, "clip_min": clip_min, "clip_max": clip_max} noise_attack_config = AttackConfig(noise_attack, threat_params) attack_configs = [noise_attack_config] pgd_attack_configs = [] pgd_params = copy.copy(threat_params) pgd_params["eps_iter"] = eps_iter pgd_params["nb_iter"] = nb_iter assert batch_size % num_devices == 0 dev_batch_size = batch_size // num_devices ones = tf.ones(dev_batch_size, tf.int32) expensive_pgd = [] if eps_iter_small is None: eps_iter_small = eps_iter / 25.0 for cls in range(nb_classes): cls_params = copy.copy(pgd_params) cls_params["y_target"] = tf.to_float(tf.one_hot(ones * cls, nb_classes)) cls_attack_config = AttackConfig(pgd_attack, cls_params, "pgd_" + str(cls)) pgd_attack_configs.append(cls_attack_config) expensive_params = copy.copy(cls_params) expensive_params["eps_iter"] = eps_iter_small expensive_params["nb_iter"] *= 25.0 expensive_config = AttackConfig( pgd_attack, expensive_params, "expensive_pgd_" + str(cls) ) expensive_pgd.append(expensive_config) attack_configs = [noise_attack_config] + pgd_attack_configs + expensive_pgd new_work_goal = {config: 5 for config in attack_configs} pgd_work_goal = {config: 5 for config in pgd_attack_configs} goals = [ Misclassify(new_work_goal={noise_attack_config: 50}), Misclassify(new_work_goal=pgd_work_goal), MaxConfidence(t=0.5, new_work_goal=new_work_goal), MaxConfidence(t=0.75, new_work_goal=new_work_goal), MaxConfidence(t=0.875, new_work_goal=new_work_goal), MaxConfidence(t=0.9375, new_work_goal=new_work_goal), MaxConfidence(t=0.96875, new_work_goal=new_work_goal), MaxConfidence(t=0.984375, new_work_goal=new_work_goal), MaxConfidence(t=1.0), ] bundle_attacks(sess, model, x, y, attack_configs, goals, report_path) # This runs forever def fixed_max_confidence_recipe( sess, model, x, y, nb_classes, eps, clip_min, clip_max, eps_iter, nb_iter, report_path, batch_size=BATCH_SIZE, eps_iter_small=None, ): """A reasonable attack bundling recipe for a max norm threat model and a defender that uses confidence thresholding. References: https://openreview.net/forum?id=H1g0piA9tQ This version runs each attack a fixed number of times. It is more exhaustive than `single_run_max_confidence_recipe` but because it uses a fixed budget rather than running indefinitely it is more appropriate for making fair comparisons between two models. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param nb_classes: int, number of classes :param eps: float, maximum size of perturbation (measured by max norm) :param eps_iter: float, step size for one version of PGD attacks (will also run another version with smaller step size) :param nb_iter: int, number of iterations for one version of PGD attacks (will also run another version with 25X more iterations) :param report_path: str, the path that the report will be saved to. :batch_size: int, the total number of examples to run simultaneously :param eps_iter_small: float, the step size to use for more expensive version of the attack. If not specified, usess eps_iter / 25 """ noise_attack = Noise(model, sess) pgd_attack = ProjectedGradientDescent(model, sess) threat_params = {"eps": eps, "clip_min": clip_min, "clip_max": clip_max} noise_attack_config = AttackConfig(noise_attack, threat_params) attack_configs = [noise_attack_config] pgd_attack_configs = [] pgd_params = copy.copy(threat_params) pgd_params["eps_iter"] = eps_iter pgd_params["nb_iter"] = nb_iter assert batch_size % num_devices == 0 dev_batch_size = batch_size // num_devices ones = tf.ones(dev_batch_size, tf.int32) if eps_iter_small is None: eps_iter_small = eps_iter / 25.0 expensive_pgd = [] for cls in range(nb_classes): cls_params = copy.copy(pgd_params) cls_params["y_target"] = tf.to_float(tf.one_hot(ones * cls, nb_classes)) cls_attack_config = AttackConfig(pgd_attack, cls_params, "pgd_" + str(cls)) pgd_attack_configs.append(cls_attack_config) expensive_params = copy.copy(cls_params) expensive_params["eps_iter"] = eps_iter_small expensive_params["nb_iter"] *= 25.0 expensive_config = AttackConfig( pgd_attack, expensive_params, "expensive_pgd_" + str(cls) ) expensive_pgd.append(expensive_config) attack_configs = [noise_attack_config] + pgd_attack_configs + expensive_pgd new_work_goal = {config: 5 for config in attack_configs} pgd_work_goal = {config: 5 for config in pgd_attack_configs} # TODO: lower priority: make sure bundler won't waste time running targeted # attacks on examples where the target class is the true class. goals = [ Misclassify(new_work_goal={noise_attack_config: 50}), Misclassify(new_work_goal=pgd_work_goal), MaxConfidence(t=0.5, new_work_goal=new_work_goal), MaxConfidence(t=0.75, new_work_goal=new_work_goal), MaxConfidence(t=0.875, new_work_goal=new_work_goal), MaxConfidence(t=0.9375, new_work_goal=new_work_goal), MaxConfidence(t=0.96875, new_work_goal=new_work_goal), MaxConfidence(t=0.984375, new_work_goal=new_work_goal), MaxConfidence(t=1.0, new_work_goal=new_work_goal), ] bundle_attacks(sess, model, x, y, attack_configs, goals, report_path) def random_search_max_confidence_recipe( sess, model, x, y, eps, clip_min, clip_max, report_path, batch_size=BATCH_SIZE, num_noise_points=10000, ): """Max confidence using random search. References: https://openreview.net/forum?id=H1g0piA9tQ Describes the max_confidence procedure used for the bundling in this recipe https://arxiv.org/abs/1802.00420 Describes using random search with 1e5 or more random points to avoid gradient masking. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param nb_classes: int, number of classes :param eps: float, maximum size of perturbation (measured by max norm) :param eps_iter: float, step size for one version of PGD attacks (will also run another version with 25X smaller step size) :param nb_iter: int, number of iterations for one version of PGD attacks (will also run another version with 25X more iterations) :param report_path: str, the path that the report will be saved to. :batch_size: int, the total number of examples to run simultaneously """ noise_attack = Noise(model, sess) threat_params = {"eps": eps, "clip_min": clip_min, "clip_max": clip_max} noise_attack_config = AttackConfig(noise_attack, threat_params) attack_configs = [noise_attack_config] assert batch_size % num_devices == 0 new_work_goal = {noise_attack_config: num_noise_points} goals = [MaxConfidence(t=1.0, new_work_goal=new_work_goal)] bundle_attacks(sess, model, x, y, attack_configs, goals, report_path) class AttackConfig(object): """ An attack and associated parameters. :param attack: cleverhans.attacks.Attack :param params: dict of keyword arguments to pass to attack.generate :param name: str, name to be returned by __str__ / __repr__ :param pass_y: bool, whether to pass y to `attack.generate` """ def __init__(self, attack, params=None, name=None, pass_y=False): self.attack = attack self.params = params self.name = name if params is not None: assert isinstance(params, dict) for key in params: assert isinstance(key, six.string_types), type(key) self.pass_y = pass_y def __str__(self): if self.name is not None: return self.name return "AttackConfig(" + str(self.attack) + ", " + str(self.params) + ")" def __repr__(self): return self.__str__() def bundle_attacks( sess, model, x, y, attack_configs, goals, report_path, attack_batch_size=BATCH_SIZE, eval_batch_size=BATCH_SIZE, ): """ Runs attack bundling. Users of cleverhans may call this function but are more likely to call one of the recipes above. Reference: https://openreview.net/forum?id=H1g0piA9tQ :param sess: tf.session.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param attack_configs: list of AttackConfigs to run :param goals: list of AttackGoals to run The bundler works through the goals in order, until each is satisfied. Some goals may never be satisfied, in which case the bundler will run forever, updating the report on disk as it goes. :param report_path: str, the path the report will be saved to :param attack_batch_size: int, batch size for generating adversarial examples :param eval_batch_size: int, batch size for evaluating the model on clean / adversarial examples :returns: adv_x: The adversarial examples, in the same format as `x` run_counts: dict mapping each AttackConfig to a numpy array reporting how many times that AttackConfig was run on each example """ assert isinstance(sess, tf.Session) assert isinstance(model, Model) assert all( isinstance(attack_config, AttackConfig) for attack_config in attack_configs ) assert all(isinstance(goal, AttackGoal) for goal in goals) assert isinstance(report_path, six.string_types) if x.shape[0] != y.shape[0]: raise ValueError("Number of input examples does not match number of labels") # Note: no need to precompile attacks, correctness_and_confidence # caches them run_counts = {} for attack_config in attack_configs: run_counts[attack_config] = np.zeros(x.shape[0], dtype=np.int64) # TODO: make an interface to pass this in if it has already been computed # elsewhere _logger.info("Running on clean data to initialize the report...") packed = correctness_and_confidence( sess, model, x, y, batch_size=eval_batch_size, devices=devices ) _logger.info("...done") correctness, confidence = packed _logger.info("Accuracy: " + str(correctness.mean())) report = ConfidenceReport() report["clean"] = ConfidenceReportEntry(correctness, confidence) adv_x = x.copy() for goal in goals: bundle_attacks_with_goal( sess, model, x, y, adv_x, attack_configs, run_counts, goal, report, report_path, attack_batch_size=attack_batch_size, eval_batch_size=eval_batch_size, ) # Many users will set `goals` to make this run forever, so the return # statement is not the primary way to get information out. return adv_x, run_counts def bundle_attacks_with_goal( sess, model, x, y, adv_x, attack_configs, run_counts, goal, report, report_path, attack_batch_size=BATCH_SIZE, eval_batch_size=BATCH_SIZE, ): """ Runs attack bundling, working on one specific AttackGoal. This function is mostly intended to be called by `bundle_attacks`. Reference: https://openreview.net/forum?id=H1g0piA9tQ :param sess: tf.session.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param adv_x: numpy array containing the adversarial examples made so far by earlier work in the bundling process :param attack_configs: list of AttackConfigs to run :param run_counts: dict mapping AttackConfigs to numpy arrays specifying how many times they have been run on each example :param goal: AttackGoal to run :param report: ConfidenceReport :param report_path: str, the path the report will be saved to :param attack_batch_size: int, batch size for generating adversarial examples :param eval_batch_size: int, batch size for evaluating the model on adversarial examples """ goal.start(run_counts) _logger.info("Running criteria for new goal...") criteria = goal.get_criteria(sess, model, adv_x, y, batch_size=eval_batch_size) assert "correctness" in criteria _logger.info("Accuracy: " + str(criteria["correctness"].mean())) assert "confidence" in criteria while not goal.is_satisfied(criteria, run_counts): run_batch_with_goal( sess, model, x, y, adv_x, criteria, attack_configs, run_counts, goal, report, report_path, attack_batch_size=attack_batch_size, ) # Save after finishing all goals. # The incremental saves run on a timer. This save is needed so that the last # few attacks after the timer don't get discarded report.completed = True save(criteria, report, report_path, adv_x) def run_batch_with_goal( sess, model, x, y, adv_x_val, criteria, attack_configs, run_counts, goal, report, report_path, attack_batch_size=BATCH_SIZE, ): """ Runs attack bundling on one batch of data. This function is mostly intended to be called by `bundle_attacks_with_goal`. :param sess: tf.session.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param adv_x_val: numpy array containing the adversarial examples made so far by earlier work in the bundling process :param criteria: dict mapping string names of criteria to numpy arrays with their values for each example (Different AttackGoals track different criteria) :param run_counts: dict mapping AttackConfigs to numpy arrays reporting how many times they have been run on each example :param goal: the AttackGoal to work on :param report: dict, see `bundle_attacks_with_goal` :param report_path: str, path to save the report to """ attack_config = goal.get_attack_config(attack_configs, run_counts, criteria) idxs = goal.request_examples(attack_config, criteria, run_counts, attack_batch_size) x_batch = x[idxs] assert x_batch.shape[0] == attack_batch_size y_batch = y[idxs] assert y_batch.shape[0] == attack_batch_size adv_x_batch = run_attack( sess, model, x_batch, y_batch, attack_config.attack, attack_config.params, attack_batch_size, devices, pass_y=attack_config.pass_y, ) criteria_batch = goal.get_criteria( sess, model, adv_x_batch, y_batch, batch_size=min(attack_batch_size, BATCH_SIZE) ) # This can't be parallelized because some orig examples are copied more # than once into the batch cur_run_counts = run_counts[attack_config] for batch_idx, orig_idx in enumerate(idxs): cur_run_counts[orig_idx] += 1 should_copy = goal.new_wins(criteria, orig_idx, criteria_batch, batch_idx) if should_copy: adv_x_val[orig_idx] = adv_x_batch[batch_idx] for key in criteria: criteria[key][orig_idx] = criteria_batch[key][batch_idx] assert np.allclose(y[orig_idx], y_batch[batch_idx]) report["bundled"] = ConfidenceReportEntry( criteria["correctness"], criteria["confidence"] ) should_save = False new_time = time.time() if hasattr(report, "time"): if new_time - report.time > REPORT_TIME_INTERVAL: should_save = True else: should_save = True if should_save: report.time = new_time goal.print_progress(criteria, run_counts) save(criteria, report, report_path, adv_x_val) def save(criteria, report, report_path, adv_x_val): """ Saves the report and adversarial examples. :param criteria: dict, of the form returned by AttackGoal.get_criteria :param report: dict containing a confidence report :param report_path: string, filepath :param adv_x_val: numpy array containing dataset of adversarial examples """ print_stats(criteria["correctness"], criteria["confidence"], "bundled") print("Saving to " + report_path) serial.save(report_path, report) assert report_path.endswith(".joblib") adv_x_path = report_path[: -len(".joblib")] + "_adv.npy" np.save(adv_x_path, adv_x_val) class AttackGoal(object): """Specifies goals for attack bundling. Different bundling recipes can have different priorities. - When choosing which examples to attack in the next batch, do we want to focus on examples that are not yet misclassified? Among the still correctly classified ones, do we want to focus on the ones that have not been attacked many times yet? Do we want to focus on the ones that have low loss / low confidence so far? - After an attack has been run, do we prefer the new adversarial example or the old one? Is the new one better if it causes higher confidence in the wrong prediction? If it succeeds with a smaller perturbation? For different use cases, the answers to these questions is different. Implement different AttackGoal subclasses to represent the priorities for your use case. """ def start(self, run_counts): """ Called by the bundler when it starts working on the goal. :param run_counts: dict mapping AttackConfigs to numpy arrays reporting how many times they have been run on each example. """ def get_criteria(self, sess, model, advx, y, batch_size=BATCH_SIZE): """ Returns a dictionary mapping the name of each criterion to a NumPy array containing the value of that criterion for each adversarial example. Subclasses can add extra criteria by implementing the `extra_criteria` method. :param sess: tf.session.Session :param model: cleverhans.model.Model :param adv_x: numpy array containing the adversarial examples made so far by earlier work in the bundling process :param y: numpy array containing true labels :param batch_size: int, batch size """ names, factory = self.extra_criteria() factory = _CriteriaFactory(model, factory) results = batch_eval_multi_worker( sess, factory, [advx, y], batch_size=batch_size, devices=devices ) names = ["correctness", "confidence"] + names out = dict(safe_zip(names, results)) return out def extra_criteria(self): """ Subclasses implement this to specify any extra criteria they need to track. : returns: list of criterion names, _ExtraCriteriaFactory implementing them """ return [], None def request_examples(self, attack_config, criteria, run_counts, batch_size): """ Returns a numpy array of integer example indices to run in the next batch. """ raise NotImplementedError( str(type(self)) + "needs to implement request_examples" ) def is_satisfied(self, criteria, run_counts): """ Returns a bool indicating whether the goal has been satisfied. """ raise NotImplementedError(str(type(self)) + " needs to implement is_satisfied.") def print_progress(self, criteria, run_counts): """ Prints a progress message about how much has been done toward the goal. :param criteria: dict, of the format returned by get_criteria :param run_counts: dict mapping each AttackConfig to a numpy array specifying how many times it has been run for each example """ print("Working on a " + self.__class__.__name__ + " goal.") def get_attack_config(self, attack_configs, run_counts, criteria): """ Returns an AttackConfig to run on the next batch. """ raise NotImplementedError( str(type(self)) + " needs to implement get_attack_config" ) def new_wins(self, orig_criteria, orig_idx, new_criteria, new_idx): """ Returns a bool indicating whether a new adversarial example is better than the pre-existing one for the same clean example. :param orig_criteria: dict mapping names of criteria to their value for each example in the whole dataset :param orig_idx: The position of the pre-existing example within the whole dataset. :param new_criteria: dict, like orig_criteria, but with values only on the latest batch of adversarial examples :param new_idx: The position of the new adversarial example within the batch """ raise NotImplementedError(str(type(self)) + " needs to implement new_wins.") class Misclassify(AttackGoal): """An AttackGoal that prioritizes misclassifying all examples. Times out when each attack has been run the requested number of times. Some examples may be attacked more than the goal number because we always run a full batch of attacks and sometimes the batch size is larger than the number of examples with attacks left to do. :param new_work_goal: dict Maps AttackConfigs to ints specifying how many times they should be run before timing out. If this dict is not specified, all attacks will be run, repeatedly, until all examples are misclassified (or forever if some cannot be changed into misclassified examples). If this dict is specfied, only attacks in the dict will be run. :param break_ties: string name of tie-breaking scheme for `new_wins` When two examples are misclassified, how do we choose between them? Currently the only scheme is 'wrong_confidence', where we prefer the one with higher confidence assigned to a single wrong class. In the future we may support other schemes like smaller perturbation size, higher loss, etc. """ def __init__(self, new_work_goal=None, break_ties="wrong_confidence"): super(Misclassify, self).__init__() self.new_work_goal = new_work_goal assert all(isinstance(key, AttackConfig) for key in new_work_goal.keys()) assert all(isinstance(value, int) for value in new_work_goal.values()) self.rng = np.random.RandomState([2018, 10, 5, 9]) self.break_ties = break_ties def start(self, run_counts): for key in run_counts: value = run_counts[key] assert value.ndim == 1 _logger.info("Started working on a Misclassify goal") self.work_before = deep_copy(run_counts) def is_satisfied(self, criteria, run_counts): correctness = criteria["correctness"] assert correctness.dtype == np.bool assert correctness.ndim == 1 if correctness.max() == 0: _logger.info("Everything is misclassified! Done with Misclassify goal") return True if self.new_work_goal is None: return False correct_run_counts = self.filter(run_counts, criteria) correct_work_before = self.filter(self.work_before, criteria) unfinished = unfinished_attack_configs( self.new_work_goal, correct_work_before, correct_run_counts ) finished = len(unfinished) == 0 if finished: _logger.info("Misclassify timed out after running all requested attacks") else: pass # _logger.info("Miclassify goal still has attacks to run") return finished def print_progress(self, criteria, run_counts): print("Working on a " + self.__class__.__name__ + " goal.") num_below = criteria["correctness"].sum() print(str(num_below) + " examples are still correctly classified.") if self.new_work_goal is None: print("No work goal: running all attacks indefinitely") else: print("Working until all attacks have been run enough times") filtered_run_counts = self.filter(run_counts, criteria) filtered_work_before = self.filter(self.work_before, criteria) for ac in self.new_work_goal: goal = self.new_work_goal[ac] new = filtered_run_counts[ac] - filtered_work_before[ac] if new.size > 0: min_new = new.min() if min_new < goal: num_min = (new == min_new).sum() print( "\t" + str(ac) + ": goal of " + str(goal) + " runs, but " + str(num_min) + " examples have been run only " + str(min_new) + " times" ) def filter(self, run_counts, criteria): """ Return run counts only for examples that are still correctly classified """ correctness = criteria["correctness"] assert correctness.dtype == np.bool filtered_counts = deep_copy(run_counts) for key in filtered_counts: filtered_counts[key] = filtered_counts[key][correctness] return filtered_counts def get_attack_config(self, attack_configs, run_counts, criteria): if self.new_work_goal is not None: correct_work_before = self.filter(self.work_before, criteria) correct_run_counts = self.filter(run_counts, criteria) attack_configs = unfinished_attack_configs( self.new_work_goal, correct_work_before, correct_run_counts ) attack_config = attack_configs[self.rng.randint(len(attack_configs))] return attack_config def extra_criteria(self): if self.break_ties == "wrong_confidence": return ["wrong_confidence"], _WrongConfidenceFactory() else: raise NotImplementedError() def request_examples(self, attack_config, criteria, run_counts, batch_size): correctness = criteria["correctness"] assert correctness.dtype == np.bool total = correctness.size total_correct = correctness.sum() all_idxs = np.arange(total) run_counts = run_counts[attack_config] if total_correct > 0: correct_idxs = all_idxs[correctness] assert correct_idxs.size == total_correct run_counts = run_counts[correctness] pairs = safe_zip(correct_idxs, run_counts) else: pairs = safe_zip(all_idxs, run_counts) # In PY3, pairs is now an iterator. # To support sorting, we need to make it a list. pairs = list(pairs) def key(pair): return pair[1] pairs.sort(key=key) idxs = [pair[0] for pair in pairs] while len(idxs) < batch_size: needed = batch_size - len(idxs) idxs = idxs + idxs[:needed] if len(idxs) > batch_size: idxs = idxs[:batch_size] idxs = np.array(idxs) return idxs def new_wins(self, orig_criteria, orig_idx, new_criteria, new_idx): orig_correct = orig_criteria["correctness"][orig_idx] new_correct = new_criteria["correctness"][new_idx] if orig_correct and not new_correct: return True if (not orig_correct) and new_correct: return False assert orig_correct == new_correct if self.break_ties == "wrong_confidence": new = new_criteria["wrong_confidence"][new_idx] orig = orig_criteria["wrong_confidence"][orig_idx] return new > orig else: raise NotImplementedError(self.break_ties) class MaxConfidence(AttackGoal): """ The AttackGoal corresponding the MaxConfidence procedure. Reference: https://openreview.net/forum?id=H1g0piA9tQ This should be used with a recipe that includes AttackConfigs that target all of the classes, plus an any additional AttackConfigs that may help to avoid gradient masking. This AttackGoal prioritizes getting all examples above a specified threshold. (If the threshold is set to 1, then no examples are above the threshold, so all are attacked equally often). The MaxConfidence attack procedure against *a single example* is optimal regardless of threshold, so long as t >= 0.5, but when attacking a population of examples with finite computation time, knowledge of the threshold is necessary to determine which examples to prioritize attacking. :param t: Prioritize pushing examples above this threshold. :param new_work_goal: Optional dict mapping AttackConfigs to ints. The int specifies the number of times to run each AttackConfig on each below-threshold example before giving up. If not specified, this goal runs all available attacks and never gives up. """ def __init__(self, t=1.0, new_work_goal=None): super(MaxConfidence, self).__init__() self.t = t self.new_work_goal = new_work_goal if new_work_goal is not None: for key in new_work_goal: assert isinstance(key, AttackConfig) assert isinstance(new_work_goal[key], int) self.rng = np.random.RandomState([2018, 10, 7, 12]) def filter(self, run_counts, criteria): """ Return the counts for only those examples that are below the threshold """ wrong_confidence = criteria["wrong_confidence"] below_t = wrong_confidence <= self.t filtered_counts = deep_copy(run_counts) for key in filtered_counts: filtered_counts[key] = filtered_counts[key][below_t] return filtered_counts def extra_criteria(self): return ["wrong_confidence"], _WrongConfidenceFactory() def is_satisfied(self, criteria, run_counts): wrong_confidence = criteria["wrong_confidence"] if wrong_confidence.min() > self.t: _logger.info("Everything is above threshold " + str(self.t)) _logger.info("Done with MaxConfidence goal") return True if self.new_work_goal is None: return False filtered_run_counts = self.filter(run_counts, criteria) filtered_work_before = self.filter(self.work_before, criteria) unfinished = unfinished_attack_configs( self.new_work_goal, filtered_work_before, filtered_run_counts, log=False ) finished = len(unfinished) == 0 if finished: _logger.info("MaxConfidence timed out after running all requested attacks") else: pass return finished def print_progress(self, criteria, run_counts): print("Working on a " + self.__class__.__name__ + " goal.") if self.t == 1.0: print("Threshold of 1, so just driving up confidence of all examples.") else: print("Target threshold of " + str(self.t)) num_below = (criteria["wrong_confidence"] <= self.t).sum() print(str(num_below) + " examples are below the target threshold.") if self.new_work_goal is None: print("No work goal: running all attacks indefinitely") else: print("Working until all attacks have been run enough times") filtered_run_counts = self.filter(run_counts, criteria) filtered_work_before = self.filter(self.work_before, criteria) for ac in self.new_work_goal: goal = self.new_work_goal[ac] new = filtered_run_counts[ac] - filtered_work_before[ac] min_new = new.min() if min_new < goal: num_min = (new == min_new).sum() print( "\t" + str(ac) + ": goal of " + str(goal) + " runs, but " + str(num_min) + " examples have been run only " + str(min_new) + " times" ) def get_attack_config(self, attack_configs, run_counts, criteria): # TODO: refactor to avoid this duplicated method if self.new_work_goal is not None: correct_work_before = self.filter(self.work_before, criteria) correct_run_counts = self.filter(run_counts, criteria) attack_configs = unfinished_attack_configs( self.new_work_goal, correct_work_before, correct_run_counts ) attack_config = attack_configs[self.rng.randint(len(attack_configs))] return attack_config def start(self, run_counts): _logger.info("Started working on a MaxConfidence goal") _logger.info("Threshold: " + str(self.t)) if self.new_work_goal is None: if self.t >= 1.0: _logger.info("This goal will run forever") else: _logger.info( "This goal will run until all examples have confidence" + " greater than " + str(self.t) + ", which may never" + " happen." ) self.work_before = deep_copy(run_counts) def request_examples(self, attack_config, criteria, run_counts, batch_size): wrong_confidence = criteria["wrong_confidence"] below_t = wrong_confidence <= self.t assert below_t.dtype == np.bool total = below_t.size total_below = below_t.sum() all_idxs = np.arange(total) run_counts = run_counts[attack_config] if total_below > 0: correct_idxs = all_idxs[below_t] assert correct_idxs.size == total_below run_counts = run_counts[below_t] pairs = safe_zip(correct_idxs, run_counts) else: pairs = safe_zip(all_idxs, run_counts) def key(pair): return pair[1] pairs.sort(key=key) idxs = [pair[0] for pair in pairs] while len(idxs) < batch_size: needed = batch_size - len(idxs) idxs = idxs + idxs[:needed] if len(idxs) > batch_size: idxs = idxs[:batch_size] idxs = np.array(idxs) return idxs def new_wins(self, orig_criteria, orig_idx, new_criteria, new_idx): new_wrong_confidence = new_criteria["wrong_confidence"][new_idx] orig_wrong_confidence = orig_criteria["wrong_confidence"][orig_idx] return new_wrong_confidence > orig_wrong_confidence def unfinished_attack_configs(new_work_goal, work_before, run_counts, log=False): """ Returns a list of attack configs that have not yet been run the desired number of times. :param new_work_goal: dict mapping attacks to desired number of times to run :param work_before: dict mapping attacks to number of times they were run before starting this new goal. Should be prefiltered to include only examples that don't already meet the primary goal :param run_counts: dict mapping attacks to total number of times they have ever been run. Should be prefiltered to include only examples that don't already meet the primary goal """ assert isinstance(work_before, dict), work_before for key in work_before: value = work_before[key] assert value.ndim == 1, value.shape if key in run_counts: assert run_counts[key].shape == value.shape attack_configs = [] for attack_config in new_work_goal: done_now = run_counts[attack_config] if log: _logger.info(str(attack_config) + " ave run count: " + str(done_now.mean())) _logger.info(str(attack_config) + " min run count: " + str(done_now.min())) done_before = work_before[attack_config] if log: _logger.info( str(attack_config) + " mean work before: " + str(done_before.mean()) ) # This is the vector for all examples new = done_now - done_before # The work is only done when it has been done for every example new = new.min() assert isinstance(new, (int, np.int64)), type(new) new_goal = new_work_goal[attack_config] assert isinstance(new_goal, int), type(new_goal) if new < new_goal: if log: _logger.info( str(attack_config) + " has run " + str(new) + " of " + str(new_goal) ) attack_configs.append(attack_config) return attack_configs class _CriteriaFactory(object): """ A factory that builds the expression to evaluate all criteria. """ def __init__(self, model, extra_criteria_factory=None): self.model = model self.extra_criteria_factory = extra_criteria_factory properties_to_hash = (model,) if extra_criteria_factory is not None: if extra_criteria_factory.properties_to_hash is not None: extra_properties = extra_criteria_factory.properties_to_hash properties_to_hash = properties_to_hash + extra_properties self.properties_to_hash = properties_to_hash def __hash__(self): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs return self.properties_to_hash.__hash__() def __eq__(self, other): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs if not isinstance(other, _CriteriaFactory): return False if type(self.extra_criteria_factory) is not type(other.extra_criteria_factory): return False return self.properties_to_hash == other.properties_to_hash def __call__(self): x_batch = self.model.make_input_placeholder() y_batch = self.model.make_label_placeholder() predictions = self.model.get_probs(x_batch) correct = tf.equal(tf.argmax(y_batch, axis=-1), tf.argmax(predictions, axis=-1)) max_probs = tf.reduce_max(predictions, axis=1) if self.extra_criteria_factory is not None: extra_criteria = self.extra_criteria_factory( x_batch, y_batch, predictions, correct, max_probs ) else: extra_criteria = tuple([]) return (x_batch, y_batch), (correct, max_probs) + extra_criteria class _ExtraCriteriaFactory(object): """ A factory that builds extra criteria """ def __init__(self, properties_to_hash=None): self.properties_to_hash = properties_to_hash def __hash__(self): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs return self.properties_to_hash.__hash__() def __eq__(self, other): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs if not isinstance(other, _ExtraCriteriaFactory): return False return self.properties_to_hash == other.properties_to_hash def __call__(self, x_batch, y_batch, predictions, correct, max_probs): raise NotImplementedError() class _WrongConfidenceFactory(_ExtraCriteriaFactory): def __call__(self, x_batch, y_batch, predictions, correct, max_probs): max_wrong_probs = tf.reduce_max(predictions * (1.0 - y_batch), axis=1) return tuple([max_wrong_probs]) def bundle_examples_with_goal( sess, model, adv_x_list, y, goal, report_path, batch_size=BATCH_SIZE ): """ A post-processor version of attack bundling, that chooses the strongest example from the output of multiple earlier bundling strategies. :param sess: tf.session.Session :param model: cleverhans.model.Model :param adv_x_list: list of numpy arrays Each entry in the list is the output of a previous bundler; it is an adversarial version of the whole dataset. :param y: numpy array containing true labels :param goal: AttackGoal to use to choose the best version of each adversarial example :param report_path: str, the path the report will be saved to :param batch_size: int, batch size """ # Check the input num_attacks = len(adv_x_list) assert num_attacks > 0 adv_x_0 = adv_x_list[0] assert isinstance(adv_x_0, np.ndarray) assert all(adv_x.shape == adv_x_0.shape for adv_x in adv_x_list) # Allocate the output out = np.zeros_like(adv_x_0) m = adv_x_0.shape[0] # Initialize with negative sentinel values to make sure everything is # written to correctness = -np.ones(m, dtype="int32") confidence = -np.ones(m, dtype="float32") # Gather criteria criteria = [ goal.get_criteria(sess, model, adv_x, y, batch_size=batch_size) for adv_x in adv_x_list ] assert all("correctness" in c for c in criteria) assert all("confidence" in c for c in criteria) _logger.info("Accuracy on each advx dataset: ") for c in criteria: _logger.info("\t" + str(c["correctness"].mean())) for example_idx in range(m): # Index of the best attack for this example attack_idx = 0 # Find the winner for candidate_idx in range(1, num_attacks): if goal.new_wins( criteria[attack_idx], example_idx, criteria[candidate_idx], example_idx ): attack_idx = candidate_idx # Copy the winner into the output out[example_idx] = adv_x_list[attack_idx][example_idx] correctness[example_idx] = criteria[attack_idx]["correctness"][example_idx] confidence[example_idx] = criteria[attack_idx]["confidence"][example_idx] assert correctness.min() >= 0 assert correctness.max() <= 1 assert confidence.min() >= 0.0 assert confidence.max() <= 1.0 correctness = correctness.astype("bool") _logger.info("Accuracy on bundled examples: " + str(correctness.mean())) report = ConfidenceReport() report["bundled"] = ConfidenceReportEntry(correctness, confidence) serial.save(report_path, report) assert report_path.endswith(".joblib") adv_x_path = report_path[: -len(".joblib")] + "_adv_x.npy" np.save(adv_x_path, out) def spsa_max_confidence_recipe( sess, model, x, y, nb_classes, eps, clip_min, clip_max, nb_iter, report_path, spsa_samples=SPSA.DEFAULT_SPSA_SAMPLES, spsa_iters=SPSA.DEFAULT_SPSA_ITERS, eval_batch_size=BATCH_SIZE, ): """Runs the MaxConfidence attack using SPSA as the underlying optimizer. Even though this runs only one attack, it must be implemented as a bundler because SPSA supports only batch_size=1. The cleverhans.attacks.MaxConfidence attack internally multiplies the batch size by nb_classes, so it can't take SPSA as a base attacker. Insteader, we must bundle batch_size=1 calls using cleverhans.attack_bundling.MaxConfidence. References: https://openreview.net/forum?id=H1g0piA9tQ :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing clean example inputs to attack :param y: numpy array containing true labels :param nb_classes: int, number of classes :param eps: float, maximum size of perturbation (measured by max norm) :param nb_iter: int, number of iterations for one version of PGD attacks (will also run another version with 25X more iterations) :param report_path: str, the path that the report will be saved to. :param eval_batch_size: int, batch size for evaluation (as opposed to making attacks) """ spsa = SPSA(model, sess) spsa_params = { "eps": eps, "clip_min": clip_min, "clip_max": clip_max, "nb_iter": nb_iter, "spsa_samples": spsa_samples, "spsa_iters": spsa_iters, } attack_configs = [] dev_batch_size = 1 # The only batch size supported by SPSA batch_size = num_devices ones = tf.ones(dev_batch_size, tf.int32) for cls in range(nb_classes): cls_params = copy.copy(spsa_params) cls_params["y_target"] = tf.to_float(tf.one_hot(ones * cls, nb_classes)) cls_attack_config = AttackConfig(spsa, cls_params, "spsa_" + str(cls)) attack_configs.append(cls_attack_config) new_work_goal = {config: 1 for config in attack_configs} goals = [MaxConfidence(t=1.0, new_work_goal=new_work_goal)] bundle_attacks( sess, model, x, y, attack_configs, goals, report_path, attack_batch_size=batch_size, eval_batch_size=eval_batch_size, ) ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/__init__.py ================================================ """ The Attack class, providing a universal abstract interface describing attacks, and many implementations of it. """ from abc import ABCMeta import collections import warnings import numpy as np from six.moves import xrange import tensorflow as tf from cleverhans import utils from cleverhans.attacks.attack import Attack from cleverhans.attacks.basic_iterative_method import BasicIterativeMethod from cleverhans.attacks.carlini_wagner_l2 import CarliniWagnerL2 from cleverhans.attacks.deep_fool import DeepFool from cleverhans.attacks.elastic_net_method import ElasticNetMethod from cleverhans.attacks.fast_feature_adversaries import FastFeatureAdversaries from cleverhans.attacks.fast_gradient_method import ( FastGradientMethod, fgm, optimize_linear, ) from cleverhans.attacks.lbfgs import LBFGS from cleverhans.attacks.madry_et_al import MadryEtAl from cleverhans.attacks.max_confidence import MaxConfidence from cleverhans.attacks.momentum_iterative_method import MomentumIterativeMethod from cleverhans.attacks.noise import Noise from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent from cleverhans.attacks.saliency_map_method import SaliencyMapMethod from cleverhans.attacks.semantic import Semantic from cleverhans.attacks.spsa import SPSA, projected_optimization from cleverhans.attacks.spatial_transformation_method import SpatialTransformationMethod from cleverhans.attacks.virtual_adversarial_method import VirtualAdversarialMethod, vatm from cleverhans.attacks.hop_skip_jump_attack import ( HopSkipJumpAttack, BoundaryAttackPlusPlus, ) from cleverhans.attacks.sparse_l1_descent import SparseL1Descent from cleverhans.model import Model, CallableModelWrapper from cleverhans.model import wrapper_warning, wrapper_warning_logits from cleverhans.compat import reduce_sum, reduce_mean from cleverhans.compat import reduce_max from cleverhans.compat import softmax_cross_entropy_with_logits from cleverhans.utils_tf import clip_eta from cleverhans import utils_tf _logger = utils.create_logger("cleverhans.attacks") tf_dtype = tf.as_dtype("float32") ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/attack.py ================================================ """ The Attack interface. """ from abc import ABCMeta import collections import warnings import numpy as np import tensorflow as tf from cleverhans.compat import reduce_max from cleverhans.model import Model from cleverhans import utils _logger = utils.create_logger("cleverhans.attacks.attack") class Attack(object): """ Abstract base class for all attack classes. """ __metaclass__ = ABCMeta def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ :param model: An instance of the cleverhans.model.Model class. :param sess: The (possibly optional) tf.Session to run graphs in. :param dtypestr: Floating point precision to use (change to float64 to avoid numerical instabilities). :param back: (deprecated and will be removed on or after 2019-03-26). The backend to use. Currently 'tf' is the only option. """ if "back" in kwargs: if kwargs["back"] == "tf": warnings.warn( "Argument back to attack constructors is not needed" " anymore and will be removed on or after 2019-03-26." " All attacks are implemented using TensorFlow." ) else: raise ValueError( "Backend argument must be 'tf' and is now deprecated" "It will be removed on or after 2019-03-26." ) self.tf_dtype = tf.as_dtype(dtypestr) self.np_dtype = np.dtype(dtypestr) if sess is not None and not isinstance(sess, tf.Session): raise TypeError("sess is not an instance of tf.Session") from cleverhans import attacks_tf attacks_tf.np_dtype = self.np_dtype attacks_tf.tf_dtype = self.tf_dtype if not isinstance(model, Model): raise TypeError( "The model argument should be an instance of" " the cleverhans.model.Model class." ) # Prepare attributes self.model = model self.sess = sess self.dtypestr = dtypestr # We are going to keep track of old graphs and cache them. self.graphs = {} # When calling generate_np, arguments in the following set should be # fed into the graph, as they are not structural items that require # generating a new graph. # This dict should map names of arguments to the types they should # have. # (Usually, the target class will be a feedable keyword argument.) self.feedable_kwargs = tuple() # When calling generate_np, arguments in the following set should NOT # be fed into the graph, as they ARE structural items that require # generating a new graph. # This list should contain the names of the structural arguments. self.structural_kwargs = [] def generate(self, x, **kwargs): """ Generate the attack's symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator. :param x: The model's symbolic inputs. :param **kwargs: optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names: clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified. If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input. For other concepts, it's generally a good idea to read other classes and check for name consistency. :return: A symbolic representation of the adversarial examples. """ error = "Sub-classes must implement generate." raise NotImplementedError(error) # Include an unused return so pylint understands the method signature return x def construct_graph(self, fixed, feedable, x_val, hash_key): """ Construct the graph required to run the attack through generate_np. :param fixed: Structural elements that require defining a new graph. :param feedable: Arguments that can be fed to the same graph when they take different values. :param x_val: symbolic adversarial example :param hash_key: the key used to store this graph in our cache """ # try our very best to create a TF placeholder for each of the # feedable keyword arguments, and check the types are one of # the allowed types class_name = str(self.__class__).split(".")[-1][:-2] _logger.info("Constructing new graph for attack " + class_name) # remove the None arguments, they are just left blank for k in list(feedable.keys()): if feedable[k] is None: del feedable[k] # process all of the rest and create placeholders for them new_kwargs = dict(x for x in fixed.items()) for name, value in feedable.items(): given_type = value.dtype if isinstance(value, np.ndarray): if value.ndim == 0: # This is pretty clearly not a batch of data new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name) else: # Assume that this is a batch of data, make the first axis variable # in size new_shape = [None] + list(value.shape[1:]) new_kwargs[name] = tf.placeholder(given_type, new_shape, name=name) elif isinstance(value, utils.known_number_types): new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name) else: raise ValueError( "Could not identify type of argument " + name + ": " + str(value) ) # x is a special placeholder we always want to have x_shape = [None] + list(x_val.shape)[1:] x = tf.placeholder(self.tf_dtype, shape=x_shape) # now we generate the graph that we want x_adv = self.generate(x, **new_kwargs) self.graphs[hash_key] = (x, new_kwargs, x_adv) if len(self.graphs) >= 10: warnings.warn( "Calling generate_np() with multiple different " "structural parameters is inefficient and should" " be avoided. Calling generate() is preferred." ) def generate_np(self, x_val, **kwargs): """ Generate adversarial examples and return them as a NumPy array. Sub-classes *should not* implement this method unless they must perform special handling of arguments. :param x_val: A NumPy array with the original inputs. :param **kwargs: optional parameters used by child classes. :return: A NumPy array holding the adversarial examples. """ if self.sess is None: raise ValueError("Cannot use `generate_np` when no `sess` was" " provided") packed = self.construct_variables(kwargs) fixed, feedable, _, hash_key = packed if hash_key not in self.graphs: self.construct_graph(fixed, feedable, x_val, hash_key) else: # remove the None arguments, they are just left blank for k in list(feedable.keys()): if feedable[k] is None: del feedable[k] x, new_kwargs, x_adv = self.graphs[hash_key] feed_dict = {x: x_val} for name in feedable: feed_dict[new_kwargs[name]] = feedable[name] return self.sess.run(x_adv, feed_dict) def construct_variables(self, kwargs): """ Construct the inputs to the attack graph to be used by generate_np. :param kwargs: Keyword arguments to generate_np. :return: Structural arguments Feedable arguments Output of `arg_type` describing feedable arguments A unique key """ if isinstance(self.feedable_kwargs, dict): warnings.warn( "Using a dict for `feedable_kwargs is deprecated." "Switch to using a tuple." "It is not longer necessary to specify the types " "of the arguments---we build a different graph " "for each received type." "Using a dict may become an error on or after " "2019-04-18." ) feedable_names = tuple(sorted(self.feedable_kwargs.keys())) else: feedable_names = self.feedable_kwargs if not isinstance(feedable_names, tuple): raise TypeError( "Attack.feedable_kwargs should be a tuple, but " "for subclass " + str(type(self)) + " it is " + str(self.feedable_kwargs) + " of type " + str(type(self.feedable_kwargs)) ) # the set of arguments that are structural properties of the attack # if these arguments are different, we must construct a new graph fixed = dict((k, v) for k, v in kwargs.items() if k in self.structural_kwargs) # the set of arguments that are passed as placeholders to the graph # on each call, and can change without constructing a new graph feedable = {k: v for k, v in kwargs.items() if k in feedable_names} for k in feedable: if isinstance(feedable[k], (float, int)): feedable[k] = np.array(feedable[k]) for key in kwargs: if key not in fixed and key not in feedable: raise ValueError(str(type(self)) + ": Undeclared argument: " + key) feed_arg_type = arg_type(feedable_names, feedable) if not all(isinstance(value, collections.Hashable) for value in fixed.values()): # we have received a fixed value that isn't hashable # this means we can't cache this graph for later use, # and it will have to be discarded later hash_key = None else: # create a unique key for this set of fixed paramaters hash_key = tuple(sorted(fixed.items())) + tuple([feed_arg_type]) return fixed, feedable, feed_arg_type, hash_key def get_or_guess_labels(self, x, kwargs): """ Get the label to use in generating an adversarial example for x. The kwargs are fed directly from the kwargs of the attack. If 'y' is in kwargs, then assume it's an untargeted attack and use that as the label. If 'y_target' is in kwargs and is not none, then assume it's a targeted attack and use that as the label. Otherwise, use the model's prediction as the label and perform an untargeted attack. """ if "y" in kwargs and "y_target" in kwargs: raise ValueError("Can not set both 'y' and 'y_target'.") elif "y" in kwargs: labels = kwargs["y"] elif "y_target" in kwargs and kwargs["y_target"] is not None: labels = kwargs["y_target"] else: preds = self.model.get_probs(x) preds_max = reduce_max(preds, 1, keepdims=True) original_predictions = tf.to_float(tf.equal(preds, preds_max)) labels = tf.stop_gradient(original_predictions) del preds if isinstance(labels, np.ndarray): nb_classes = labels.shape[1] else: nb_classes = labels.get_shape().as_list()[1] return labels, nb_classes def parse_params(self, params=None): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param params: a dictionary of attack-specific parameters :return: True when parsing was successful """ if params is not None: warnings.warn( "`params` is unused and will be removed " " on or after 2019-04-26." ) return True def arg_type(arg_names, kwargs): """ Returns a hashable summary of the types of arg_names within kwargs. :param arg_names: tuple containing names of relevant arguments :param kwargs: dict mapping string argument names to values. These must be values for which we can create a tf placeholder. Currently supported: numpy darray or something that can ducktype it returns: API contract is to return a hashable object describing all structural consequences of argument values that can otherwise be fed into a graph of fixed structure. Currently this is implemented as a tuple of tuples that track: - whether each argument was passed - whether each argument was passed and not None - the dtype of each argument Callers shouldn't rely on the exact structure of this object, just its hashability and one-to-one mapping between graph structures. """ assert isinstance(arg_names, tuple) passed = tuple(name in kwargs for name in arg_names) passed_and_not_none = [] for name in arg_names: if name in kwargs: passed_and_not_none.append(kwargs[name] is not None) else: passed_and_not_none.append(False) passed_and_not_none = tuple(passed_and_not_none) dtypes = [] for name in arg_names: if name not in kwargs: dtypes.append(None) continue value = kwargs[name] if value is None: dtypes.append(None) continue assert hasattr(value, "dtype"), type(value) dtype = value.dtype if not isinstance(dtype, np.dtype): dtype = dtype.as_np_dtype assert isinstance(dtype, np.dtype) dtypes.append(dtype) dtypes = tuple(dtypes) return (passed, passed_and_not_none, dtypes) ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/basic_iterative_method.py ================================================ """ The BasicIterativeMethod attack. """ from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent class BasicIterativeMethod(ProjectedGradientDescent): """ The BasicIterativeMethod attack. """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): super(BasicIterativeMethod, self).__init__( model, sess=sess, dtypestr=dtypestr, default_rand_init=False, **kwargs ) ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/carlini_wagner_l2.py ================================================ """The CarliniWagnerL2 attack """ # pylint: disable=missing-docstring import logging import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_sum, reduce_max from cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits from cleverhans import utils np_dtype = np.dtype("float32") tf_dtype = tf.as_dtype("float32") _logger = utils.create_logger("cleverhans.attacks.carlini_wagner_l2") _logger.setLevel(logging.INFO) class CarliniWagnerL2(Attack): """ This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644 At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr="float32", **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, "logits") super(CarliniWagnerL2, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("y", "y_target") self.structural_kwargs = [ "batch_size", "confidence", "targeted", "learning_rate", "binary_search_steps", "max_iterations", "abort_early", "initial_const", "clip_min", "clip_max", ] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See `parse_params` """ assert ( self.sess is not None ), "Cannot use `generate` when no `sess` was provided" self.parse_params(**kwargs) labels, nb_classes = self.get_or_guess_labels(x, kwargs) attack = CWL2( self.sess, self.model, self.batch_size, self.confidence, "y_target" in kwargs, self.learning_rate, self.binary_search_steps, self.max_iterations, self.abort_early, self.initial_const, self.clip_min, self.clip_max, nb_classes, x.get_shape().as_list()[1:], ) def cw_wrap(x_val, y_val): return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(cw_wrap, [x, labels], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap def parse_params( self, y=None, y_target=None, batch_size=1, confidence=0, learning_rate=5e-3, binary_search_steps=5, max_iterations=1000, abort_early=True, initial_const=1e-2, clip_min=0, clip_max=1, ): """ :param y: (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns. :param y_target: (optional) A tensor with the target labels for a targeted attack. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param batch_size: Number of attacks to run simultaneously. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.batch_size = batch_size self.confidence = confidence self.learning_rate = learning_rate self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max def ZERO(): return np.asarray(0.0, dtype=np_dtype) class CWL2(object): def __init__( self, sess, model, batch_size, confidence, targeted, learning_rate, binary_search_steps, max_iterations, abort_early, initial_const, clip_min, clip_max, num_labels, shape, ): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param model: a cleverhans.model.Model object. :param batch_size: Number of attacks to run simultaneously. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param targeted: boolean controlling the behavior of the adversarial examples produced. If set to False, they will be misclassified in any wrong class. If set to True, they will be misclassified in a chosen target class. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the pururbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param clip_min: (optional float) Minimum input component value. :param clip_max: (optional float) Maximum input component value. :param num_labels: the number of classes in the model's output. :param shape: the shape of the model's input tensor. """ self.sess = sess self.TARGETED = targeted self.LEARNING_RATE = learning_rate self.MAX_ITERATIONS = max_iterations self.BINARY_SEARCH_STEPS = binary_search_steps self.ABORT_EARLY = abort_early self.CONFIDENCE = confidence self.initial_const = initial_const self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.model = model self.repeat = binary_search_steps >= 10 self.shape = shape = tuple([batch_size] + list(shape)) # the variable we're going to optimize over modifier = tf.Variable(np.zeros(shape, dtype=np_dtype)) # these are variables to be more efficient in sending data to tf self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name="timg") self.tlab = tf.Variable( np.zeros((batch_size, num_labels)), dtype=tf_dtype, name="tlab" ) self.const = tf.Variable(np.zeros(batch_size), dtype=tf_dtype, name="const") # and here's what we use to assign them self.assign_timg = tf.placeholder(tf_dtype, shape, name="assign_timg") self.assign_tlab = tf.placeholder( tf_dtype, (batch_size, num_labels), name="assign_tlab" ) self.assign_const = tf.placeholder(tf_dtype, [batch_size], name="assign_const") # the resulting instance, tanh'd to keep bounded from clip_min # to clip_max self.newimg = (tf.tanh(modifier + self.timg) + 1) / 2 self.newimg = self.newimg * (clip_max - clip_min) + clip_min # prediction BEFORE-SOFTMAX of the model self.output = model.get_logits(self.newimg) # distance to the input data self.other = (tf.tanh(self.timg) + 1) / 2 * (clip_max - clip_min) + clip_min self.l2dist = reduce_sum( tf.square(self.newimg - self.other), list(range(1, len(shape))) ) # compute the probability of the label class versus the maximum other real = reduce_sum((self.tlab) * self.output, 1) other = reduce_max((1 - self.tlab) * self.output - self.tlab * 10000, 1) if self.TARGETED: # if targeted, optimize for making the other class most likely loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE) else: # if untargeted, optimize for making this class least likely. loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE) # sum up the losses self.loss2 = reduce_sum(self.l2dist) self.loss1 = reduce_sum(self.const * loss1) self.loss = self.loss1 + self.loss2 # Setup the adam optimizer and keep track of variables we're creating start_vars = set(x.name for x in tf.global_variables()) optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE) self.train = optimizer.minimize(self.loss, var_list=[modifier]) end_vars = tf.global_variables() new_vars = [x for x in end_vars if x.name not in start_vars] # these are the variables to initialize when we run self.setup = [] self.setup.append(self.timg.assign(self.assign_timg)) self.setup.append(self.tlab.assign(self.assign_tlab)) self.setup.append(self.const.assign(self.assign_const)) self.init = tf.variables_initializer(var_list=[modifier] + new_vars) def attack(self, imgs, targets): """ Perform the L_2 attack on the given instance for the given targets. If self.targeted is true, then the targets represents the target labels If self.targeted is false, then targets are the original class labels """ r = [] for i in range(0, len(imgs), self.batch_size): _logger.debug(("Running CWL2 attack on instance %s of %s", i, len(imgs))) r.extend( self.attack_batch( imgs[i : i + self.batch_size], targets[i : i + self.batch_size] ) ) return np.array(r) def attack_batch(self, imgs, labs): """ Run the attack on a batch of instance and labels. """ def compare(x, y): if not isinstance(x, (float, int, np.int64)): x = np.copy(x) if self.TARGETED: x[y] -= self.CONFIDENCE else: x[y] += self.CONFIDENCE x = np.argmax(x) if self.TARGETED: return x == y else: return x != y batch_size = self.batch_size oimgs = np.clip(imgs, self.clip_min, self.clip_max) # re-scale instances to be within range [0, 1] imgs = (imgs - self.clip_min) / (self.clip_max - self.clip_min) imgs = np.clip(imgs, 0, 1) # now convert to [-1, 1] imgs = (imgs * 2) - 1 # convert to tanh-space imgs = np.arctanh(imgs * 0.999999) # set the lower and upper bounds accordingly lower_bound = np.zeros(batch_size) CONST = np.ones(batch_size) * self.initial_const upper_bound = np.ones(batch_size) * 1e10 # placeholders for the best l2, score, and instance attack found so far o_bestl2 = [1e10] * batch_size o_bestscore = [-1] * batch_size o_bestattack = np.copy(oimgs) for outer_step in range(self.BINARY_SEARCH_STEPS): # completely reset adam's internal state. self.sess.run(self.init) batch = imgs[:batch_size] batchlab = labs[:batch_size] bestl2 = [1e10] * batch_size bestscore = [-1] * batch_size _logger.debug( " Binary search step %s of %s", outer_step, self.BINARY_SEARCH_STEPS ) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1: CONST = upper_bound # set the variables so that we don't have to send them over again self.sess.run( self.setup, { self.assign_timg: batch, self.assign_tlab: batchlab, self.assign_const: CONST, }, ) prev = 1e6 for iteration in range(self.MAX_ITERATIONS): # perform the attack _, l, l2s, scores, nimg = self.sess.run( [self.train, self.loss, self.l2dist, self.output, self.newimg] ) if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: _logger.debug( ( " Iteration {} of {}: loss={:.3g} " + "l2={:.3g} f={:.3g}" ).format( iteration, self.MAX_ITERATIONS, l, np.mean(l2s), np.mean(scores), ) ) # check if we should abort search if we're getting nowhere. if ( self.ABORT_EARLY and iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0 ): if l > prev * 0.9999: msg = " Failed to make progress; stop early" _logger.debug(msg) break prev = l # adjust the best result found so far for e, (l2, sc, ii) in enumerate(zip(l2s, scores, nimg)): lab = np.argmax(batchlab[e]) if l2 < bestl2[e] and compare(sc, lab): bestl2[e] = l2 bestscore[e] = np.argmax(sc) if l2 < o_bestl2[e] and compare(sc, lab): o_bestl2[e] = l2 o_bestscore[e] = np.argmax(sc) o_bestattack[e] = ii # adjust the constant as needed for e in range(batch_size): if compare(bestscore[e], np.argmax(batchlab[e])) and bestscore[e] != -1: # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug( " Successfully generated adversarial examples " + "on {} of {} instances.".format(sum(upper_bound < 1e9), batch_size) ) o_bestl2 = np.array(o_bestl2) mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9])) _logger.debug(" Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestl2 = np.array(o_bestl2) return o_bestattack ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/deep_fool.py ================================================ """The DeepFool attack """ import copy import logging import warnings import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.model import Model, wrapper_warning_logits, CallableModelWrapper from cleverhans import utils from cleverhans import utils_tf np_dtype = np.dtype("float32") _logger = utils.create_logger("cleverhans.attacks.deep_fool") _logger.setLevel(logging.INFO) class DeepFool(Attack): """ DeepFool is an untargeted & iterative attack which is based on an iterative linearization of the classifier. The implementation here is w.r.t. the L2 norm. Paper link: "https://arxiv.org/pdf/1511.04599.pdf" :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr="float32", **kwargs): """ Create a DeepFool instance. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, "logits") super(DeepFool, self).__init__(model, sess, dtypestr, **kwargs) self.structural_kwargs = [ "overshoot", "max_iter", "clip_max", "clip_min", "nb_candidate", ] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ assert ( self.sess is not None ), "Cannot use `generate` when no `sess` was provided" from cleverhans.utils_tf import jacobian_graph # Parse and save attack-specific parameters assert self.parse_params(**kwargs) # Define graph wrt to this input placeholder logits = self.model.get_logits(x) self.nb_classes = logits.get_shape().as_list()[-1] assert ( self.nb_candidate <= self.nb_classes ), "nb_candidate should not be greater than nb_classes" preds = tf.reshape( tf.nn.top_k(logits, k=self.nb_candidate)[0], [-1, self.nb_candidate] ) # grads will be the shape [batch_size, nb_candidate, image_size] grads = tf.stack(jacobian_graph(preds, x, self.nb_candidate), axis=1) # Define graph def deepfool_wrap(x_val): """deepfool function for py_func""" return deepfool_batch( self.sess, x, preds, logits, grads, x_val, self.nb_candidate, self.overshoot, self.max_iter, self.clip_min, self.clip_max, self.nb_classes, ) wrap = tf.py_func(deepfool_wrap, [x], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap def parse_params( self, nb_candidate=10, overshoot=0.02, max_iter=50, clip_min=0.0, clip_max=1.0, **kwargs ): """ :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for deepfool :param clip_min: Minimum component value for clipping :param clip_max: Maximum component value for clipping """ self.nb_candidate = nb_candidate self.overshoot = overshoot self.max_iter = max_iter self.clip_min = clip_min self.clip_max = clip_max if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def deepfool_batch( sess, x, pred, logits, grads, X, nb_candidate, overshoot, max_iter, clip_min, clip_max, nb_classes, feed=None, ): """ Applies DeepFool to a batch of inputs :param sess: TF session :param x: The input placeholder :param pred: The model's sorted symbolic output of logits, only the top nb_candidate classes are contained :param logits: The model's unnormalized output tensor (the input to the softmax layer) :param grads: Symbolic gradients of the top nb_candidate classes, procuded from gradient_graph :param X: Numpy array with sample inputs :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for DeepFool :param clip_min: Minimum value for components of the example returned :param clip_max: Maximum value for components of the example returned :param nb_classes: Number of model output classes :return: Adversarial examples """ X_adv = deepfool_attack( sess, x, pred, logits, grads, X, nb_candidate, overshoot, max_iter, clip_min, clip_max, feed=feed, ) return np.asarray(X_adv, dtype=np_dtype) def deepfool_attack( sess, x, predictions, logits, grads, sample, nb_candidate, overshoot, max_iter, clip_min, clip_max, feed=None, ): """ TensorFlow implementation of DeepFool. Paper link: see https://arxiv.org/pdf/1511.04599.pdf :param sess: TF session :param x: The input placeholder :param predictions: The model's sorted symbolic output of logits, only the top nb_candidate classes are contained :param logits: The model's unnormalized output tensor (the input to the softmax layer) :param grads: Symbolic gradients of the top nb_candidate classes, procuded from gradient_graph :param sample: Numpy array with sample input :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for DeepFool :param clip_min: Minimum value for components of the example returned :param clip_max: Maximum value for components of the example returned :return: Adversarial examples """ adv_x = copy.copy(sample) # Initialize the loop variables iteration = 0 current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed) if current.shape == (): current = np.array([current]) w = np.squeeze(np.zeros(sample.shape[1:])) # same shape as original image r_tot = np.zeros(sample.shape) original = current # use original label as the reference _logger.debug("Starting DeepFool attack up to %s iterations", max_iter) # Repeat this main loop until we have achieved misclassification while np.any(current == original) and iteration < max_iter: if iteration % 5 == 0 and iteration > 0: _logger.info("Attack result at iteration %s is %s", iteration, current) gradients = sess.run(grads, feed_dict={x: adv_x}) predictions_val = sess.run(predictions, feed_dict={x: adv_x}) for idx in range(sample.shape[0]): pert = np.inf if current[idx] != original[idx]: continue for k in range(1, nb_candidate): w_k = gradients[idx, k, ...] - gradients[idx, 0, ...] f_k = predictions_val[idx, k] - predictions_val[idx, 0] # adding value 0.00001 to prevent f_k = 0 pert_k = (abs(f_k) + 0.00001) / np.linalg.norm(w_k.flatten()) if pert_k < pert: pert = pert_k w = w_k r_i = pert * w / np.linalg.norm(w) r_tot[idx, ...] = r_tot[idx, ...] + r_i adv_x = np.clip(r_tot + sample, clip_min, clip_max) current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed) if current.shape == (): current = np.array([current]) # Update loop variables iteration = iteration + 1 # need more revision, including info like how many succeed _logger.info("Attack result at iteration %s is %s", iteration, current) _logger.info( "%s out of %s become adversarial examples at iteration %s", sum(current != original), sample.shape[0], iteration, ) # need to clip this image into the given range adv_x = np.clip((1 + overshoot) * r_tot + sample, clip_min, clip_max) return adv_x ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/elastic_net_method.py ================================================ """The ElasticNetMethod attack. """ # pylint: disable=missing-docstring import logging import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_sum, reduce_max from cleverhans.model import Model, CallableModelWrapper, wrapper_warning_logits from cleverhans import utils np_dtype = np.dtype("float32") tf_dtype = tf.as_dtype("float32") _logger = utils.create_logger("cleverhans.attacks.elastic_net_method") _logger.setLevel(logging.INFO) def ZERO(): return np.asarray(0.0, dtype=np_dtype) class ElasticNetMethod(Attack): """ This attack features L1-oriented adversarial examples and includes the C&W L2 attack as a special case (when beta is set to 0). Adversarial examples attain similar performance to those generated by the C&W L2 attack in the white-box case, and more importantly, have improved transferability properties and complement adversarial training. Paper link: https://arxiv.org/abs/1709.04114 :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr="float32", **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, "logits") super(ElasticNetMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("y", "y_target") self.structural_kwargs = [ "beta", "decision_rule", "batch_size", "confidence", "targeted", "learning_rate", "binary_search_steps", "max_iterations", "abort_early", "initial_const", "clip_min", "clip_max", ] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See `parse_params` """ assert ( self.sess is not None ), "Cannot use `generate` when no `sess` was provided" self.parse_params(**kwargs) labels, nb_classes = self.get_or_guess_labels(x, kwargs) attack = EAD( self.sess, self.model, self.beta, self.decision_rule, self.batch_size, self.confidence, "y_target" in kwargs, self.learning_rate, self.binary_search_steps, self.max_iterations, self.abort_early, self.initial_const, self.clip_min, self.clip_max, nb_classes, x.get_shape().as_list()[1:], ) def ead_wrap(x_val, y_val): return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(ead_wrap, [x, labels], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap def parse_params( self, y=None, y_target=None, beta=1e-2, decision_rule="EN", batch_size=1, confidence=0, learning_rate=1e-2, binary_search_steps=9, max_iterations=1000, abort_early=False, initial_const=1e-3, clip_min=0, clip_max=1, ): """ :param y: (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns. :param y_target: (optional) A tensor with the target labels for a targeted attack. :param beta: Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion :param decision_rule: EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param batch_size: Number of attacks to run simultaneously. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set 'initial_const' to a large value and fix this param to 1 for speed. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet) :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.beta = beta self.decision_rule = decision_rule self.batch_size = batch_size self.confidence = confidence self.learning_rate = learning_rate self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max class EAD(object): def __init__( self, sess, model, beta, decision_rule, batch_size, confidence, targeted, learning_rate, binary_search_steps, max_iterations, abort_early, initial_const, clip_min, clip_max, num_labels, shape, ): """ EAD Attack Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param model: a cleverhans.model.Model object. :param beta: Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion :param decision_rule: EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion. :param batch_size: Number of attacks to run simultaneously. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param targeted: boolean controlling the behavior of the adversarial examples produced. If set to False, they will be misclassified in any wrong class. If set to True, they will be misclassified in a chosen target class. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set 'initial_const' to a large value and fix this param to 1 for speed. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet) :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value. :param clip_min: (optional float) Minimum input component value. :param clip_max: (optional float) Maximum input component value. :param num_labels: the number of classes in the model's output. :param shape: the shape of the model's input tensor. """ self.sess = sess self.TARGETED = targeted self.LEARNING_RATE = learning_rate self.MAX_ITERATIONS = max_iterations self.BINARY_SEARCH_STEPS = binary_search_steps self.ABORT_EARLY = abort_early self.CONFIDENCE = confidence self.initial_const = initial_const self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.model = model self.decision_rule = decision_rule self.beta = beta self.beta_t = tf.cast(self.beta, tf_dtype) self.repeat = binary_search_steps >= 10 self.shape = shape = tuple([batch_size] + list(shape)) # these are variables to be more efficient in sending data to tf self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name="timg") self.newimg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name="newimg") self.slack = tf.Variable(np.zeros(shape), dtype=tf_dtype, name="slack") self.tlab = tf.Variable( np.zeros((batch_size, num_labels)), dtype=tf_dtype, name="tlab" ) self.const = tf.Variable(np.zeros(batch_size), dtype=tf_dtype, name="const") # and here's what we use to assign them self.assign_timg = tf.placeholder(tf_dtype, shape, name="assign_timg") self.assign_newimg = tf.placeholder(tf_dtype, shape, name="assign_newimg") self.assign_slack = tf.placeholder(tf_dtype, shape, name="assign_slack") self.assign_tlab = tf.placeholder( tf_dtype, (batch_size, num_labels), name="assign_tlab" ) self.assign_const = tf.placeholder(tf_dtype, [batch_size], name="assign_const") self.global_step = tf.Variable(0, trainable=False) self.global_step_t = tf.cast(self.global_step, tf_dtype) # Fast Iterative Shrinkage Thresholding self.zt = tf.divide( self.global_step_t, self.global_step_t + tf.cast(3, tf_dtype) ) cond1 = tf.cast( tf.greater(tf.subtract(self.slack, self.timg), self.beta_t), tf_dtype ) cond2 = tf.cast( tf.less_equal(tf.abs(tf.subtract(self.slack, self.timg)), self.beta_t), tf_dtype, ) cond3 = tf.cast( tf.less(tf.subtract(self.slack, self.timg), tf.negative(self.beta_t)), tf_dtype, ) upper = tf.minimum( tf.subtract(self.slack, self.beta_t), tf.cast(self.clip_max, tf_dtype) ) lower = tf.maximum( tf.add(self.slack, self.beta_t), tf.cast(self.clip_min, tf_dtype) ) self.assign_newimg = tf.multiply(cond1, upper) self.assign_newimg += tf.multiply(cond2, self.timg) self.assign_newimg += tf.multiply(cond3, lower) self.assign_slack = self.assign_newimg self.assign_slack += tf.multiply(self.zt, self.assign_newimg - self.newimg) # -------------------------------- self.setter = tf.assign(self.newimg, self.assign_newimg) self.setter_y = tf.assign(self.slack, self.assign_slack) # prediction BEFORE-SOFTMAX of the model self.output = model.get_logits(self.newimg) self.output_y = model.get_logits(self.slack) # distance to the input data self.l2dist = reduce_sum( tf.square(self.newimg - self.timg), list(range(1, len(shape))) ) self.l2dist_y = reduce_sum( tf.square(self.slack - self.timg), list(range(1, len(shape))) ) self.l1dist = reduce_sum( tf.abs(self.newimg - self.timg), list(range(1, len(shape))) ) self.l1dist_y = reduce_sum( tf.abs(self.slack - self.timg), list(range(1, len(shape))) ) self.elasticdist = self.l2dist + tf.multiply(self.l1dist, self.beta_t) self.elasticdist_y = self.l2dist_y + tf.multiply(self.l1dist_y, self.beta_t) if self.decision_rule == "EN": self.crit = self.elasticdist self.crit_p = "Elastic" else: self.crit = self.l1dist self.crit_p = "L1" # compute the probability of the label class versus the maximum other real = reduce_sum((self.tlab) * self.output, 1) real_y = reduce_sum((self.tlab) * self.output_y, 1) other = reduce_max((1 - self.tlab) * self.output - (self.tlab * 10000), 1) other_y = reduce_max((1 - self.tlab) * self.output_y - (self.tlab * 10000), 1) if self.TARGETED: # if targeted, optimize for making the other class most likely loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE) loss1_y = tf.maximum(ZERO(), other_y - real_y + self.CONFIDENCE) else: # if untargeted, optimize for making this class least likely. loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE) loss1_y = tf.maximum(ZERO(), real_y - other_y + self.CONFIDENCE) # sum up the losses self.loss21 = reduce_sum(self.l1dist) self.loss21_y = reduce_sum(self.l1dist_y) self.loss2 = reduce_sum(self.l2dist) self.loss2_y = reduce_sum(self.l2dist_y) self.loss1 = reduce_sum(self.const * loss1) self.loss1_y = reduce_sum(self.const * loss1_y) self.loss_opt = self.loss1_y + self.loss2_y self.loss = self.loss1 + self.loss2 + tf.multiply(self.beta_t, self.loss21) self.learning_rate = tf.train.polynomial_decay( self.LEARNING_RATE, self.global_step, self.MAX_ITERATIONS, 0, power=0.5 ) # Setup the optimizer and keep track of variables we're creating start_vars = set(x.name for x in tf.global_variables()) optimizer = tf.train.GradientDescentOptimizer(self.learning_rate) self.train = optimizer.minimize( self.loss_opt, var_list=[self.slack], global_step=self.global_step ) end_vars = tf.global_variables() new_vars = [x for x in end_vars if x.name not in start_vars] # these are the variables to initialize when we run self.setup = [] self.setup.append(self.timg.assign(self.assign_timg)) self.setup.append(self.tlab.assign(self.assign_tlab)) self.setup.append(self.const.assign(self.assign_const)) var_list = [self.global_step] + [self.slack] + [self.newimg] + new_vars self.init = tf.variables_initializer(var_list=var_list) def attack(self, imgs, targets): """ Perform the EAD attack on the given instance for the given targets. If self.targeted is true, then the targets represents the target labels If self.targeted is false, then targets are the original class labels """ batch_size = self.batch_size r = [] for i in range(0, len(imgs) // batch_size): _logger.debug( ("Running EAD attack on instance %s of %s", i * batch_size, len(imgs)) ) r.extend( self.attack_batch( imgs[i * batch_size : (i + 1) * batch_size], targets[i * batch_size : (i + 1) * batch_size], ) ) if len(imgs) % batch_size != 0: last_elements = len(imgs) - (len(imgs) % batch_size) _logger.debug( ("Running EAD attack on instance %s of %s", last_elements, len(imgs)) ) temp_imgs = np.zeros((batch_size,) + imgs.shape[2:]) temp_targets = np.zeros((batch_size,) + targets.shape[2:]) temp_imgs[: (len(imgs) % batch_size)] = imgs[last_elements:] temp_targets[: (len(imgs) % batch_size)] = targets[last_elements:] temp_data = self.attack_batch(temp_imgs, temp_targets) r.extend(temp_data[: (len(imgs) % batch_size)], targets[last_elements:]) return np.array(r) def attack_batch(self, imgs, labs): """ Run the attack on a batch of instance and labels. """ def compare(x, y): if not isinstance(x, (float, int, np.int64)): x = np.copy(x) if self.TARGETED: x[y] -= self.CONFIDENCE else: x[y] += self.CONFIDENCE x = np.argmax(x) if self.TARGETED: return x == y else: return x != y batch_size = self.batch_size imgs = np.clip(imgs, self.clip_min, self.clip_max) # set the lower and upper bounds accordingly lower_bound = np.zeros(batch_size) CONST = np.ones(batch_size) * self.initial_const upper_bound = np.ones(batch_size) * 1e10 # placeholders for the best en, score, and instance attack found so far o_bestdst = [1e10] * batch_size o_bestscore = [-1] * batch_size o_bestattack = np.copy(imgs) for outer_step in range(self.BINARY_SEARCH_STEPS): # completely reset the optimizer's internal state. self.sess.run(self.init) batch = imgs[:batch_size] batchlab = labs[:batch_size] bestdst = [1e10] * batch_size bestscore = [-1] * batch_size _logger.debug( " Binary search step %s of %s", outer_step, self.BINARY_SEARCH_STEPS ) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1: CONST = upper_bound # set the variables so that we don't have to send them over again self.sess.run( self.setup, { self.assign_timg: batch, self.assign_tlab: batchlab, self.assign_const: CONST, }, ) self.sess.run(self.setter, {self.assign_newimg: batch}) self.sess.run(self.setter_y, {self.assign_slack: batch}) prev = 1e6 for iteration in range(self.MAX_ITERATIONS): # perform the attack self.sess.run([self.train]) self.sess.run([self.setter, self.setter_y]) l, l2s, l1s, crit, scores, nimg = self.sess.run( [ self.loss, self.l2dist, self.l1dist, self.crit, self.output, self.newimg, ] ) if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: _logger.debug( ( " Iteration {} of {}: loss={:.3g} " + "l2={:.3g} l1={:.3g} f={:.3g}" ).format( iteration, self.MAX_ITERATIONS, l, np.mean(l2s), np.mean(l1s), np.mean(scores), ) ) # check if we should abort search if we're getting nowhere. if ( self.ABORT_EARLY and iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0 ): if l > prev * 0.9999: msg = " Failed to make progress; stop early" _logger.debug(msg) break prev = l # adjust the best result found so far for e, (dst, sc, ii) in enumerate(zip(crit, scores, nimg)): lab = np.argmax(batchlab[e]) if dst < bestdst[e] and compare(sc, lab): bestdst[e] = dst bestscore[e] = np.argmax(sc) if dst < o_bestdst[e] and compare(sc, lab): o_bestdst[e] = dst o_bestscore[e] = np.argmax(sc) o_bestattack[e] = ii # adjust the constant as needed for e in range(batch_size): if compare(bestscore[e], np.argmax(batchlab[e])) and bestscore[e] != -1: # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug( " Successfully generated adversarial examples " + "on {} of {} instances.".format(sum(upper_bound < 1e9), batch_size) ) o_bestdst = np.array(o_bestdst) mean = np.mean(np.sqrt(o_bestdst[o_bestdst < 1e9])) _logger.debug( self.crit_p + " Mean successful distortion: {:.4g}".format(mean) ) # return the best solution found o_bestdst = np.array(o_bestdst) return o_bestattack ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/fast_feature_adversaries.py ================================================ """ The FastFeatureAdversaries attack """ # pylint: disable=missing-docstring import warnings import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_sum from cleverhans.model import Model from cleverhans.utils_tf import clip_eta class FastFeatureAdversaries(Attack): """ This is a fast implementation of "Feature Adversaries", an attack against a target internal representation of a model. "Feature adversaries" were originally introduced in (Sabour et al. 2016), where the optimization was done using LBFGS. Paper link: https://arxiv.org/abs/1511.05122 This implementation is similar to "Basic Iterative Method" (Kurakin et al. 2016) but applied to the internal representations. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Create a FastFeatureAdversaries instance. """ super(FastFeatureAdversaries, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("eps", "eps_iter", "clip_min", "clip_max") self.structural_kwargs = ["ord", "nb_iter", "layer"] assert isinstance(self.model, Model) def parse_params( self, layer=None, eps=0.3, eps_iter=0.05, nb_iter=10, ord=np.inf, clip_min=None, clip_max=None, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param layer: (required str) name of the layer to target. :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.layer = layer self.eps = eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.ord = ord self.clip_min = clip_min self.clip_max = clip_max # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def attack_single_step(self, x, eta, g_feat): """ TensorFlow implementation of the Fast Feature Gradient. This is a single step attack similar to Fast Gradient Method that attacks an internal representation. :param x: the input placeholder :param eta: A tensor the same shape as x that holds the perturbation. :param g_feat: model's internal tensor for guide :return: a tensor for the adversarial example """ adv_x = x + eta a_feat = self.model.fprop(adv_x)[self.layer] # feat.shape = (batch, c) or (batch, w, h, c) axis = list(range(1, len(a_feat.shape))) # Compute loss # This is a targeted attack, hence the negative sign loss = -reduce_sum(tf.square(a_feat - g_feat), axis) # Define gradient of loss wrt input (grad,) = tf.gradients(loss, adv_x) # Multiply by constant epsilon scaled_signed_grad = self.eps_iter * tf.sign(grad) # Add perturbation to original example to obtain adversarial example adv_x = adv_x + scaled_signed_grad # If clipping is needed, # reset all values outside of [clip_min, clip_max] if (self.clip_min is not None) and (self.clip_max is not None): adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) adv_x = tf.stop_gradient(adv_x) eta = adv_x - x eta = clip_eta(eta, self.ord, self.eps) return eta def generate(self, x, g, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param g: The target value of the symbolic representation :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) g_feat = self.model.fprop(g)[self.layer] # Initialize loop variables eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype) eta = clip_eta(eta, self.ord, self.eps) def cond(i, _): return tf.less(i, self.nb_iter) def body(i, e): new_eta = self.attack_single_step(x, e, g_feat) return i + 1, new_eta _, eta = tf.while_loop( cond, body, (tf.zeros([]), eta), back_prop=True, maximum_iterations=self.nb_iter, ) # Define adversarial example (and clip if necessary) adv_x = x + eta if self.clip_min is not None and self.clip_max is not None: adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/fast_gradient_method.py ================================================ """ The FastGradientMethod attack. """ import warnings import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_max, reduce_sum, softmax_cross_entropy_with_logits from cleverhans import utils_tf class FastGradientMethod(Attack): """ This attack was originally implemented by Goodfellow et al. (2014) with the infinity norm (and is known as the "Fast Gradient Sign Method"). This implementation extends the attack to other norms, and is therefore called the Fast Gradient Method. Paper link: https://arxiv.org/abs/1412.6572 :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Create a FastGradientMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(FastGradientMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("eps", "y", "y_target", "clip_min", "clip_max") self.structural_kwargs = ["ord", "sanity_checks", "clip_grad", "loss_fn"] def generate(self, x, **kwargs): """ Returns the graph for Fast Gradient Method adversarial examples. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) return fgm( x, self.model.get_logits(x), y=labels, eps=self.eps, ord=self.ord, loss_fn=self.loss_fn, clip_min=self.clip_min, clip_max=self.clip_max, clip_grad=self.clip_grad, targeted=(self.y_target is not None), sanity_checks=self.sanity_checks, ) def parse_params( self, eps=0.3, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, y=None, y_target=None, clip_min=None, clip_max=None, clip_grad=False, sanity_checks=True, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) attack step size (input variation) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param y: (optional) A tensor with the true labels. Only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) """ # Save attack-specific parameters self.eps = eps self.ord = ord self.loss_fn = loss_fn self.y = y self.y_target = y_target self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad self.sanity_checks = sanity_checks if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, int(1), int(2)]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def fgm( x, logits, y=None, eps=0.3, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True, ): """ TensorFlow implementation of the Fast Gradient Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param eps: the epsilon (input variation parameter) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param clip_min: Minimum float value for adversarial example components :param clip_max: Maximum float value for adversarial example components :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(clip_min, x.dtype))) if clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype))) # Make sure the caller has not passed probs by accident assert logits.op.type != "Softmax" if y is None: # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(logits, 1, keepdims=True) y = tf.to_float(tf.equal(logits, preds_max)) y = tf.stop_gradient(y) y = y / reduce_sum(y, 1, keepdims=True) # Compute loss loss = loss_fn(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input (grad,) = tf.gradients(loss, x) if clip_grad: grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max) optimal_perturbation = optimize_linear(grad, eps, ord) # Add perturbation to original example to obtain adversarial example adv_x = x + optimal_perturbation # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x def optimize_linear(grad, eps, ord=np.inf): """ Solves for the optimal input to a linear function under a norm constraint. Optimal_perturbation = argmax_{eta, ||eta||_{ord} < eps} dot(eta, grad) :param grad: tf tensor containing a batch of gradients :param eps: float scalar specifying size of constraint region :param ord: int specifying order of norm :returns: tf tensor containing optimal perturbation """ # In Python 2, the `list` call in the following line is redundant / harmless. # In Python 3, the `list` call is needed to convert the iterator returned by `range` into a list. red_ind = list(range(1, len(grad.get_shape()))) avoid_zero_div = 1e-12 if ord == np.inf: # Take sign of gradient optimal_perturbation = tf.sign(grad) # The following line should not change the numerical results. # It applies only because `optimal_perturbation` is the output of # a `sign` op, which has zero derivative anyway. # It should not be applied for the other norms, where the # perturbation has a non-zero derivative. optimal_perturbation = tf.stop_gradient(optimal_perturbation) elif ord == 1: abs_grad = tf.abs(grad) sign = tf.sign(grad) max_abs_grad = tf.reduce_max(abs_grad, red_ind, keepdims=True) tied_for_max = tf.to_float(tf.equal(abs_grad, max_abs_grad)) num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True) optimal_perturbation = sign * tied_for_max / num_ties elif ord == 2: square = tf.maximum( avoid_zero_div, reduce_sum(tf.square(grad), reduction_indices=red_ind, keepdims=True), ) optimal_perturbation = grad / tf.sqrt(square) else: raise NotImplementedError( "Only L-inf, L1 and L2 norms are " "currently implemented." ) # Scale perturbation to be the solution for the norm=eps rather than # norm=1 problem scaled_perturbation = utils_tf.mul(eps, optimal_perturbation) return scaled_perturbation ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/hop_skip_jump_attack.py ================================================ """ Boundary Attack++ """ import logging import numpy as np import tensorflow as tf from warnings import warn from cleverhans.attacks import Attack from cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits from cleverhans import utils, utils_tf np_dtype = np.dtype("float32") tf_dtype = tf.as_dtype("float32") _logger = utils.create_logger("cleverhans.attacks.hop_skip_jump_attack") _logger.setLevel(logging.INFO) class HopSkipJumpAttack(Attack): """ HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright. It is a decision-based attack that requires access to output labels of a model alone. Paper link: https://arxiv.org/abs/1904.02144 At a high level, this attack is an iterative attack composed of three steps: Binary search to approach the boundary; gradient estimation; stepsize search. HopSkipJumpAttack requires fewer model queries than Boundary Attack which was based on rejective sampling. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor. see parse_params for details. """ def __init__(self, model, sess, dtypestr="float32", **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, "logits") super(HopSkipJumpAttack, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("y_target", "image_target") self.structural_kwargs = [ "stepsize_search", "clip_min", "clip_max", "constraint", "num_iterations", "initial_num_evals", "max_num_evals", "batch_size", "verbose", "gamma", ] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See `parse_params` """ self.parse_params(**kwargs) shape = [int(i) for i in x.get_shape().as_list()[1:]] assert ( self.sess is not None ), "Cannot use `generate` when no `sess` was provided" _check_first_dimension(x, "input") if self.y_target is not None: _check_first_dimension(self.y_target, "y_target") assert ( self.image_target is not None ), "Require a target image for targeted attack." _check_first_dimension(self.image_target, "image_target") # Set shape and d. self.shape = shape self.d = int(np.prod(shape)) # Set binary search threshold. if self.constraint == "l2": self.theta = self.gamma / (np.sqrt(self.d) * self.d) else: self.theta = self.gamma / (self.d * self.d) # Construct input placeholder and output for decision function. self.input_ph = tf.placeholder( tf_dtype, [None] + list(self.shape), name="input_image" ) self.logits = self.model.get_logits(self.input_ph) def hsja_wrap(x, target_label, target_image): """ Wrapper to use tensors as input and output. """ return np.array( self._hsja(x, target_label, target_image), dtype=self.np_dtype ) if self.y_target is not None: # targeted attack that requires target label and image. wrap = tf.py_func( hsja_wrap, [x[0], self.y_target[0], self.image_target[0]], self.tf_dtype ) else: if self.image_target is not None: # untargeted attack with an initialized image. wrap = tf.py_func( lambda x, target_image: hsja_wrap(x, None, target_image), [x[0], self.image_target[0]], self.tf_dtype, ) else: # untargeted attack without an initialized image. wrap = tf.py_func( lambda x: hsja_wrap(x, None, None), [x[0]], self.tf_dtype ) wrap.set_shape(x.get_shape()) return wrap def generate_np(self, x, **kwargs): """ Generate adversarial images in a for loop. :param y: An array of shape (n, nb_classes) for true labels. :param y_target: An array of shape (n, nb_classes) for target labels. Required for targeted attack. :param image_target: An array of shape (n, **image shape) for initial target images. Required for targeted attack. See parse_params for other kwargs. """ x_adv = [] if "image_target" in kwargs and kwargs["image_target"] is not None: image_target = np.copy(kwargs["image_target"]) else: image_target = None if "y_target" in kwargs and kwargs["y_target"] is not None: y_target = np.copy(kwargs["y_target"]) else: y_target = None for i, x_single in enumerate(x): img = np.expand_dims(x_single, axis=0) if image_target is not None: single_img_target = np.expand_dims(image_target[i], axis=0) kwargs["image_target"] = single_img_target if y_target is not None: single_y_target = np.expand_dims(y_target[i], axis=0) kwargs["y_target"] = single_y_target adv_img = super(HopSkipJumpAttack, self).generate_np(img, **kwargs) x_adv.append(adv_img) return np.concatenate(x_adv, axis=0) def parse_params( self, y_target=None, image_target=None, initial_num_evals=100, max_num_evals=10000, stepsize_search="geometric_progression", num_iterations=64, gamma=1.0, constraint="l2", batch_size=128, verbose=True, clip_min=0, clip_max=1, ): """ :param y: A tensor of shape (1, nb_classes) for true labels. :param y_target: A tensor of shape (1, nb_classes) for target labels. Required for targeted attack. :param image_target: A tensor of shape (1, **image shape) for initial target images. Required for targeted attack. :param initial_num_evals: initial number of evaluations for gradient estimation. :param max_num_evals: maximum number of evaluations for gradient estimation. :param stepsize_search: How to search for stepsize; choices are 'geometric_progression', 'grid_search'. 'geometric progression' initializes the stepsize by ||x_t - x||_p / sqrt(iteration), and keep decreasing by half until reaching the target side of the boundary. 'grid_search' chooses the optimal epsilon over a grid, in the scale of ||x_t - x||_p. :param num_iterations: The number of iterations. :param gamma: The binary search threshold theta is gamma / d^{3/2} for l2 attack and gamma / d^2 for linf attack. :param constraint: The distance to optimize; choices are 'l2', 'linf'. :param batch_size: batch_size for model prediction. :param verbose: (boolean) Whether distance at each step is printed. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.y_target = y_target self.image_target = image_target self.initial_num_evals = initial_num_evals self.max_num_evals = max_num_evals self.stepsize_search = stepsize_search self.num_iterations = num_iterations self.gamma = gamma self.constraint = constraint self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.verbose = verbose def _hsja(self, sample, target_label, target_image): """ Main algorithm for HopSkipJumpAttack. Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sample: input image. Without the batchsize dimension. :param target_label: integer for targeted attack, None for nontargeted attack. Without the batchsize dimension. :param target_image: an array with the same size as sample, or None. Without the batchsize dimension. Output: perturbed image. """ # Original label required for untargeted attack. if target_label is None: original_label = np.argmax( self.sess.run(self.logits, feed_dict={self.input_ph: sample[None]}) ) else: target_label = np.argmax(target_label) def decision_function(images): """ Decision function output 1 on the desired side of the boundary, 0 otherwise. """ images = clip_image(images, self.clip_min, self.clip_max) prob = [] for i in range(0, len(images), self.batch_size): batch = images[i : i + self.batch_size] prob_i = self.sess.run(self.logits, feed_dict={self.input_ph: batch}) prob.append(prob_i) prob = np.concatenate(prob, axis=0) if target_label is None: return np.argmax(prob, axis=1) != original_label else: return np.argmax(prob, axis=1) == target_label # Initialize. if target_image is None: perturbed = initialize( decision_function, sample, self.shape, self.clip_min, self.clip_max ) else: perturbed = target_image # Project the initialization to the boundary. perturbed, dist_post_update = binary_search_batch( sample, np.expand_dims(perturbed, 0), decision_function, self.shape, self.constraint, self.theta, ) dist = compute_distance(perturbed, sample, self.constraint) for j in np.arange(self.num_iterations): current_iteration = j + 1 # Choose delta. delta = select_delta( dist_post_update, current_iteration, self.clip_max, self.clip_min, self.d, self.theta, self.constraint, ) # Choose number of evaluations. num_evals = int( min([self.initial_num_evals * np.sqrt(j + 1), self.max_num_evals]) ) # approximate gradient. gradf = approximate_gradient( decision_function, perturbed, num_evals, delta, self.constraint, self.shape, self.clip_min, self.clip_max, ) if self.constraint == "linf": update = np.sign(gradf) else: update = gradf # search step size. if self.stepsize_search == "geometric_progression": # find step size. epsilon = geometric_progression_for_stepsize( perturbed, update, dist, decision_function, current_iteration ) # Update the sample. perturbed = clip_image( perturbed + epsilon * update, self.clip_min, self.clip_max ) # Binary search to return to the boundary. perturbed, dist_post_update = binary_search_batch( sample, perturbed[None], decision_function, self.shape, self.constraint, self.theta, ) elif self.stepsize_search == "grid_search": # Grid search for stepsize. epsilons = np.logspace(-4, 0, num=20, endpoint=True) * dist epsilons_shape = [20] + len(self.shape) * [1] perturbeds = perturbed + epsilons.reshape(epsilons_shape) * update perturbeds = clip_image(perturbeds, self.clip_min, self.clip_max) idx_perturbed = decision_function(perturbeds) if np.sum(idx_perturbed) > 0: # Select the perturbation that yields the minimum distance # after binary search. perturbed, dist_post_update = binary_search_batch( sample, perturbeds[idx_perturbed], decision_function, self.shape, self.constraint, self.theta, ) # compute new distance. dist = compute_distance(perturbed, sample, self.constraint) if self.verbose: print( "iteration: {:d}, {:s} distance {:.4E}".format( j + 1, self.constraint, dist ) ) perturbed = np.expand_dims(perturbed, 0) return perturbed def BoundaryAttackPlusPlus(model, sess, dtypestr="float32", **kwargs): """ A previous name used for HopSkipJumpAttack. """ warn( "BoundaryAttackPlusPlus will be removed after 2019-12-08; use HopSkipJumpAttack." ) return HopSkipJumpAttack(model, sess, dtypestr, **kwargs) def _check_first_dimension(x, tensor_name): message = "Tensor {} should have batch_size of 1.".format(tensor_name) if x.get_shape().as_list()[0] is None: check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1, message=message) with tf.control_dependencies([check_batch]): x = tf.identity(x) elif x.get_shape().as_list()[0] != 1: raise ValueError(message) def clip_image(image, clip_min, clip_max): """ Clip an image, or an image batch, with upper and lower threshold. """ return np.minimum(np.maximum(clip_min, image), clip_max) def compute_distance(x_ori, x_pert, constraint="l2"): """ Compute the distance between two images. """ if constraint == "l2": dist = np.linalg.norm(x_ori - x_pert) elif constraint == "linf": dist = np.max(abs(x_ori - x_pert)) return dist def approximate_gradient( decision_function, sample, num_evals, delta, constraint, shape, clip_min, clip_max ): """ Gradient direction estimation """ # Generate random vectors. noise_shape = [num_evals] + list(shape) if constraint == "l2": rv = np.random.randn(*noise_shape) elif constraint == "linf": rv = np.random.uniform(low=-1, high=1, size=noise_shape) axis = tuple(range(1, 1 + len(shape))) rv = rv / np.sqrt(np.sum(rv ** 2, axis=axis, keepdims=True)) perturbed = sample + delta * rv perturbed = clip_image(perturbed, clip_min, clip_max) rv = (perturbed - sample) / delta # query the model. decisions = decision_function(perturbed) decision_shape = [len(decisions)] + [1] * len(shape) fval = 2 * decisions.astype(np_dtype).reshape(decision_shape) - 1.0 # Baseline subtraction (when fval differs) if np.mean(fval) == 1.0: # label changes. gradf = np.mean(rv, axis=0) elif np.mean(fval) == -1.0: # label not change. gradf = -np.mean(rv, axis=0) else: fval = fval - np.mean(fval) gradf = np.mean(fval * rv, axis=0) # Get the gradient direction. gradf = gradf / np.linalg.norm(gradf) return gradf def project(original_image, perturbed_images, alphas, shape, constraint): """ Projection onto given l2 / linf balls in a batch. """ alphas_shape = [len(alphas)] + [1] * len(shape) alphas = alphas.reshape(alphas_shape) if constraint == "l2": projected = (1 - alphas) * original_image + alphas * perturbed_images elif constraint == "linf": projected = clip_image( perturbed_images, original_image - alphas, original_image + alphas ) return projected def binary_search_batch( original_image, perturbed_images, decision_function, shape, constraint, theta ): """ Binary search to approach the boundary. """ # Compute distance between each of perturbed image and original image. dists_post_update = np.array( [ compute_distance(original_image, perturbed_image, constraint) for perturbed_image in perturbed_images ] ) # Choose upper thresholds in binary searchs based on constraint. if constraint == "linf": highs = dists_post_update # Stopping criteria. thresholds = np.minimum(dists_post_update * theta, theta) else: highs = np.ones(len(perturbed_images)) thresholds = theta lows = np.zeros(len(perturbed_images)) while np.max((highs - lows) / thresholds) > 1: # projection to mids. mids = (highs + lows) / 2.0 mid_images = project(original_image, perturbed_images, mids, shape, constraint) # Update highs and lows based on model decisions. decisions = decision_function(mid_images) lows = np.where(decisions == 0, mids, lows) highs = np.where(decisions == 1, mids, highs) out_images = project(original_image, perturbed_images, highs, shape, constraint) # Compute distance of the output image to select the best choice. # (only used when stepsize_search is grid_search.) dists = np.array( [ compute_distance(original_image, out_image, constraint) for out_image in out_images ] ) idx = np.argmin(dists) dist = dists_post_update[idx] out_image = out_images[idx] return out_image, dist def initialize(decision_function, sample, shape, clip_min, clip_max): """ Efficient Implementation of BlendedUniformNoiseAttack in Foolbox. """ success = 0 num_evals = 0 # Find a misclassified random noise. while True: random_noise = np.random.uniform(clip_min, clip_max, size=shape) success = decision_function(random_noise[None])[0] if success: break num_evals += 1 message = ( "Initialization failed! Try to use a misclassified image as `target_image`" ) assert num_evals < 1e4, message # Binary search to minimize l2 distance to original image. low = 0.0 high = 1.0 while high - low > 0.001: mid = (high + low) / 2.0 blended = (1 - mid) * sample + mid * random_noise success = decision_function(blended[None])[0] if success: high = mid else: low = mid initialization = (1 - high) * sample + high * random_noise return initialization def geometric_progression_for_stepsize( x, update, dist, decision_function, current_iteration ): """Geometric progression to search for stepsize. Keep decreasing stepsize by half until reaching the desired side of the boundary. """ epsilon = dist / np.sqrt(current_iteration) while True: updated = x + epsilon * update success = decision_function(updated[None])[0] if success: break else: epsilon = epsilon / 2.0 return epsilon def select_delta( dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint ): """ Choose the delta at the scale of distance between x and perturbed sample. """ if current_iteration == 1: delta = 0.1 * (clip_max - clip_min) else: if constraint == "l2": delta = np.sqrt(d) * theta * dist_post_update elif constraint == "linf": delta = d * theta * dist_post_update return delta ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/lbfgs.py ================================================ """The LBFGS attack """ import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_sum, softmax_cross_entropy_with_logits from cleverhans.model import CallableModelWrapper, Model, wrapper_warning from cleverhans import utils from cleverhans import utils_tf _logger = utils.create_logger("cleverhans.attacks.lbfgs") tf_dtype = tf.as_dtype("float32") class LBFGS(Attack): """ LBFGS is the first adversarial attack for convolutional neural networks, and is a target & iterative attack. Paper link: "https://arxiv.org/pdf/1312.6199.pdf" :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr="float32", **kwargs): if not isinstance(model, Model): wrapper_warning() model = CallableModelWrapper(model, "probs") super(LBFGS, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("y_target",) self.structural_kwargs = [ "batch_size", "binary_search_steps", "max_iterations", "initial_const", "clip_min", "clip_max", ] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See `parse_params` """ assert ( self.sess is not None ), "Cannot use `generate` when no `sess` was provided" self.parse_params(**kwargs) if self.y_target is None: self.y_target, nb_classes = self.get_or_guess_labels(x, kwargs) self.targeted_attack = False else: _, nb_classes = self.get_or_guess_labels(x, kwargs) self.targeted_attack = True attack = LBFGS_impl( self.sess, x, self.model.get_logits(x), self.y_target, self.targeted_attack, self.binary_search_steps, self.max_iterations, self.initial_const, self.clip_min, self.clip_max, nb_classes, self.batch_size, ) def lbfgs_wrap(x_val, y_val): """ Wrapper creating TensorFlow interface for use with py_func """ return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(lbfgs_wrap, [x, self.y_target], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap def parse_params( self, y_target=None, batch_size=1, binary_search_steps=5, max_iterations=1000, initial_const=1e-2, clip_min=0, clip_max=1, ): """ :param y_target: (optional) A tensor with the one-hot target labels. :param batch_size: The number of inputs to include in a batch and process simultaneously. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification. :param max_iterations: The maximum number of iterations. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and cross-entropy loss of the classification. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ self.y_target = y_target self.batch_size = batch_size self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max class LBFGS_impl(object): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param x: A tensor with the inputs. :param logits: A tensor with model's output logits. :param targeted_label: A tensor with the target labels. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification. :param max_iterations: The maximum number of iterations. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the purturbation and cross-entropy loss of the classification. :param clip_min: Minimum input component value :param clip_max: Maximum input component value :param num_labels: The number of classes in the model's output. :param batch_size: Number of attacks to run simultaneously. """ def __init__( self, sess, x, logits, targeted_label, targeted_attack, binary_search_steps, max_iterations, initial_const, clip_min, clip_max, nb_classes, batch_size, ): self.sess = sess self.x = x self.logits = logits assert logits.op.type != "Softmax" self.targeted_label = targeted_label self.targeted_attack = targeted_attack self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max self.batch_size = batch_size self.repeat = self.binary_search_steps >= 10 self.shape = tuple([self.batch_size] + list(self.x.get_shape().as_list()[1:])) self.ori_img = tf.Variable(np.zeros(self.shape), dtype=tf_dtype, name="ori_img") self.const = tf.Variable( np.zeros(self.batch_size), dtype=tf_dtype, name="const" ) self.score = softmax_cross_entropy_with_logits( labels=self.targeted_label, logits=self.logits ) self.l2dist = reduce_sum(tf.square(self.x - self.ori_img)) # small self.const will result small adversarial perturbation # targeted attack aims at minimize loss against target label # untargeted attack aims at maximize loss against True label if self.targeted_attack: self.loss = reduce_sum(self.score * self.const) + self.l2dist else: self.loss = -reduce_sum(self.score * self.const) + self.l2dist (self.grad,) = tf.gradients(self.loss, self.x) def attack(self, x_val, targets): """ Perform the attack on the given instance for the given targets. """ def lbfgs_objective(adv_x, self, targets, oimgs, CONST): """ returns the function value and the gradient for fmin_l_bfgs_b """ loss = self.sess.run( self.loss, feed_dict={ self.x: adv_x.reshape(oimgs.shape), self.targeted_label: targets, self.ori_img: oimgs, self.const: CONST, }, ) grad = self.sess.run( self.grad, feed_dict={ self.x: adv_x.reshape(oimgs.shape), self.targeted_label: targets, self.ori_img: oimgs, self.const: CONST, }, ) return loss, grad.flatten().astype(float) def attack_success(out, target, targeted_attack): """ returns attack result """ if targeted_attack: return out == target else: return out != target # begin the main part for the attack from scipy.optimize import fmin_l_bfgs_b oimgs = np.clip(x_val, self.clip_min, self.clip_max) CONST = np.ones(self.batch_size) * self.initial_const # set the lower and upper bounds accordingly lower_bound = np.zeros(self.batch_size) upper_bound = np.ones(self.batch_size) * 1e10 # set the box constraints for the optimization function clip_min = self.clip_min * np.ones(oimgs.shape[:]) clip_max = self.clip_max * np.ones(oimgs.shape[:]) clip_bound = list(zip(clip_min.flatten(), clip_max.flatten())) # placeholders for the best l2 and instance attack found so far o_bestl2 = [1e10] * self.batch_size o_bestattack = np.copy(oimgs) for outer_step in range(self.binary_search_steps): _logger.debug( " Binary search step %s of %s", outer_step, self.binary_search_steps ) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.binary_search_steps - 1: CONST = upper_bound # optimization function adv_x, _, __ = fmin_l_bfgs_b( lbfgs_objective, oimgs.flatten().astype(float), args=(self, targets, oimgs, CONST), bounds=clip_bound, maxiter=self.max_iterations, iprint=0, ) adv_x = adv_x.reshape(oimgs.shape) assert ( np.amax(adv_x) <= self.clip_max and np.amin(adv_x) >= self.clip_min ), "fmin_l_bfgs_b returns are invalid" # adjust the best result (i.e., the adversarial example with the # smallest perturbation in terms of L_2 norm) found so far preds = np.atleast_1d( utils_tf.model_argmax(self.sess, self.x, self.logits, adv_x) ) _logger.debug("predicted labels are %s", preds) l2s = np.zeros(self.batch_size) for i in range(self.batch_size): l2s[i] = np.sum(np.square(adv_x[i] - oimgs[i])) for e, (l2, pred, ii) in enumerate(zip(l2s, preds, adv_x)): if l2 < o_bestl2[e] and attack_success( pred, np.argmax(targets[e]), self.targeted_attack ): o_bestl2[e] = l2 o_bestattack[e] = ii # adjust the constant as needed for e in range(self.batch_size): if attack_success( preds[e], np.argmax(targets[e]), self.targeted_attack ): # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug( " Successfully generated adversarial examples " "on %s of %s instances.", sum(upper_bound < 1e9), self.batch_size, ) o_bestl2 = np.array(o_bestl2) mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9])) _logger.debug(" Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestl2 = np.array(o_bestl2) return o_bestattack ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/madry_et_al.py ================================================ """ The MadryEtAl attack """ from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent class MadryEtAl(ProjectedGradientDescent): """ The attack from Madry et al 2017 """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): super(MadryEtAl, self).__init__( model, sess=sess, dtypestr=dtypestr, default_rand_init=True, **kwargs ) ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/max_confidence.py ================================================ """The MaxConfidence attack. """ import warnings import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent from cleverhans.model import Model class MaxConfidence(Attack): """ The MaxConfidence attack. An attack designed for use against models that use confidence thresholding as a defense. If the underlying optimizer is optimal, this attack procedure gives the optimal failure rate for every confidence threshold t > 0.5. Publication: https://openreview.net/forum?id=H1g0piA9tQ :param model: cleverhans.model.Model :param sess: optional tf.session.Session :param base_attacker: cleverhans.attacks.Attack """ def __init__(self, model, sess=None, base_attacker=None): if not isinstance(model, Model): raise TypeError( "Model must be cleverhans.model.Model, got " + str(type(model)) ) super(MaxConfidence, self).__init__(model, sess) if base_attacker is None: self.base_attacker = ProjectedGradientDescent(model, sess=sess) else: self.base_attacker = base_attacker self.structural_kwargs = self.base_attacker.structural_kwargs self.feedable_kwargs = self.base_attacker.feedable_kwargs def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: Keyword arguments for the base attacker """ assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) adv_x = self.attack(x, labels) return adv_x def parse_params(self, y=None, nb_classes=10, **kwargs): self.y = y self.nb_classes = nb_classes self.params = kwargs if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def attack(self, x, true_y): """ Runs the untargeted attack. :param x: The input :param true_y: The correct label for `x`. This attack aims to produce misclassification. """ adv_x_cls = [] prob_cls = [] m = tf.shape(x)[0] true_y_idx = tf.argmax(true_y, axis=1) expanded_x = tf.concat([x] * self.nb_classes, axis=0) target_ys = [ tf.to_float(tf.one_hot(tf.ones(m, dtype=tf.int32) * cls, self.nb_classes)) for cls in range(self.nb_classes) ] target_y = tf.concat(target_ys, axis=0) adv_x_cls = self.attack_class(expanded_x, target_y) expanded_all_probs = self.model.get_probs(adv_x_cls) adv_x_list = tf.split(adv_x_cls, self.nb_classes) all_probs_list = tf.split(expanded_all_probs, self.nb_classes) for cls in range(self.nb_classes): target_y = target_ys[cls] all_probs = all_probs_list[cls] # We don't actually care whether we hit the target class. # We care about the probability of the most likely wrong class cur_prob_cls = tf.reduce_max(all_probs - true_y, axis=1) # Knock out examples that are correctly classified. # This is not needed to be optimal for t >= 0.5, but may as well do it # to get better failure rate at lower thresholds. chosen_cls = tf.argmax(all_probs, axis=1) eligible = tf.to_float(tf.not_equal(true_y_idx, chosen_cls)) cur_prob_cls = cur_prob_cls * eligible prob_cls.append(cur_prob_cls) probs = tf.concat([tf.expand_dims(e, 1) for e in prob_cls], axis=1) # Don't need to censor here because we knocked out the true class above # probs = probs - true_y most_confident = tf.argmax(probs, axis=1) fused_mask = tf.one_hot(most_confident, self.nb_classes) masks = tf.split(fused_mask, num_or_size_splits=self.nb_classes, axis=1) shape = [m] + [1] * (len(x.get_shape()) - 1) reshaped_masks = [tf.reshape(mask, shape) for mask in masks] out = sum(adv_x * rmask for adv_x, rmask in zip(adv_x_list, reshaped_masks)) return out def attack_class(self, x, target_y): """ Run the attack on a specific target class. :param x: tf Tensor. The input example. :param target_y: tf Tensor. The attacker's desired target class. Returns: A targeted adversarial example, intended to be classified as the target class. """ adv = self.base_attacker.generate(x, y_target=target_y, **self.params) return adv ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/momentum_iterative_method.py ================================================ """The MomentumIterativeMethod attack. """ import warnings import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.attacks.fast_gradient_method import optimize_linear from cleverhans.compat import reduce_sum, reduce_mean, softmax_cross_entropy_with_logits from cleverhans import utils_tf class MomentumIterativeMethod(Attack): """ The Momentum Iterative Method (Dong et al. 2017). This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks and Targeted Adversarial Attacks. The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1710.06081.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Create a MomentumIterativeMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(MomentumIterativeMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ( "eps", "eps_iter", "y", "y_target", "clip_min", "clip_max", ) self.structural_kwargs = [ "ord", "nb_iter", "decay_factor", "sanity_checks", "clip_grad", ] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: Keyword arguments. See `parse_params` for documentation. """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append( utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype)) ) if self.clip_max is not None: asserts.append( utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype)) ) # Initialize loop variables momentum = tf.zeros_like(x) adv_x = x # Fix labels to the first model predictions for loss computation y, _nb_classes = self.get_or_guess_labels(x, kwargs) y = y / reduce_sum(y, 1, keepdims=True) targeted = self.y_target is not None def cond(i, _, __): """Iterate until number of iterations completed""" return tf.less(i, self.nb_iter) def body(i, ax, m): """Do a momentum step""" logits = self.model.get_logits(ax) loss = softmax_cross_entropy_with_logits(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input (grad,) = tf.gradients(loss, ax) # Normalize current gradient and add it to the accumulated gradient red_ind = list(range(1, len(grad.get_shape()))) avoid_zero_div = tf.cast(1e-12, grad.dtype) grad = grad / tf.maximum( avoid_zero_div, reduce_mean(tf.abs(grad), red_ind, keepdims=True) ) m = self.decay_factor * m + grad optimal_perturbation = optimize_linear(m, self.eps_iter, self.ord) if self.ord == 1: raise NotImplementedError( "This attack hasn't been tested for ord=1." "It's not clear that FGM makes a good inner " "loop step for iterative optimization since " "it updates just one coordinate at a time." ) # Update and clip adversarial example in current iteration ax = ax + optimal_perturbation ax = x + utils_tf.clip_eta(ax - x, self.ord, self.eps) if self.clip_min is not None and self.clip_max is not None: ax = utils_tf.clip_by_value(ax, self.clip_min, self.clip_max) ax = tf.stop_gradient(ax) return i + 1, ax, m _, adv_x, _ = tf.while_loop( cond, body, (tf.zeros([]), adv_x, momentum), back_prop=True, maximum_iterations=self.nb_iter, ) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x def parse_params( self, eps=0.3, eps_iter=0.06, nb_iter=10, y=None, ord=np.inf, decay_factor=1.0, clip_min=None, clip_max=None, y_target=None, sanity_checks=True, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param decay_factor: (optional) Decay factor for the momentum term. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.eps = eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.ord = ord self.decay_factor = decay_factor self.clip_min = clip_min self.clip_max = clip_max self.sanity_checks = sanity_checks if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/noise.py ================================================ """The Noise attack """ import warnings import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack class Noise(Attack): """ A weak attack that just picks a random point in the attacker's action space. When combined with an attack bundling function, this can be used to implement random search. References: https://arxiv.org/abs/1802.00420 recommends random search to help identify gradient masking. https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part of an attack bundling recipe combining many different optimizers to yield a stronger optimizer. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): super(Noise, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ("eps", "clip_min", "clip_max") self.structural_kwargs = ["ord"] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) if self.ord != np.inf: raise NotImplementedError(self.ord) eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: assert self.clip_min is not None and self.clip_max is not None adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x def parse_params(self, eps=0.3, ord=np.inf, clip_min=None, clip_max=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.eps = eps self.ord = ord self.clip_min = clip_min self.clip_max = clip_max # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf]: raise ValueError("Norm order must be np.inf") if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/projected_gradient_descent.py ================================================ """ The ProjectedGradientDescent attack. """ import warnings import numpy as np import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.attacks.fast_gradient_method import FastGradientMethod from cleverhans import utils_tf from cleverhans.compat import softmax_cross_entropy_with_logits from cleverhans.utils_tf import clip_eta, random_lp_vector class ProjectedGradientDescent(Attack): """ This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param default_rand_init: whether to use random initialization by default :param kwargs: passed through to super constructor """ FGM_CLASS = FastGradientMethod def __init__( self, model, sess=None, dtypestr="float32", default_rand_init=True, **kwargs ): """ Create a ProjectedGradientDescent instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(ProjectedGradientDescent, self).__init__( model, sess=sess, dtypestr=dtypestr, **kwargs ) self.feedable_kwargs = ( "eps", "eps_iter", "y", "y_target", "clip_min", "clip_max", ) self.structural_kwargs = [ "ord", "nb_iter", "rand_init", "clip_grad", "sanity_checks", "loss_fn", ] self.default_rand_init = default_rand_init def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append( utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype)) ) if self.clip_max is not None: asserts.append( utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype)) ) # Initialize loop variables if self.rand_init: eta = random_lp_vector( tf.shape(x), self.ord, tf.cast(self.rand_init_eps, x.dtype), dtype=x.dtype, ) else: eta = tf.zeros(tf.shape(x)) # Clip eta eta = clip_eta(eta, self.ord, self.eps) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) if self.y_target is not None: y = self.y_target targeted = True elif self.y is not None: y = self.y targeted = False else: model_preds = self.model.get_probs(x) preds_max = tf.reduce_max(model_preds, 1, keepdims=True) y = tf.to_float(tf.equal(model_preds, preds_max)) y = tf.stop_gradient(y) targeted = False del model_preds y_kwarg = "y_target" if targeted else "y" fgm_params = { "eps": self.eps_iter, y_kwarg: y, "ord": self.ord, "loss_fn": self.loss_fn, "clip_min": self.clip_min, "clip_max": self.clip_max, "clip_grad": self.clip_grad, } if self.ord == 1: raise NotImplementedError( "FGM is not a good inner loop step for PGD " " when ord=1, because ord=1 FGM changes only " " one pixel at a time. Use the SparseL1Descent " " attack instead, which allows fine-grained " " control over the sparsity of the gradient " " updates." ) # Use getattr() to avoid errors in eager execution attacks FGM = self.FGM_CLASS( self.model, sess=getattr(self, "sess", None), dtypestr=self.dtypestr ) def cond(i, _): """Iterate until requested number of iterations is completed""" return tf.less(i, self.nb_iter) def body(i, adv_x): """Do a projected gradient step""" adv_x = FGM.generate(adv_x, **fgm_params) # Clipping perturbation eta to self.ord norm ball eta = adv_x - x eta = clip_eta(eta, self.ord, self.eps) adv_x = x + eta # Redo the clipping. # FGM already did it, but subtracting and re-adding eta can add some # small numerical error. if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return i + 1, adv_x _, adv_x = tf.while_loop( cond, body, (tf.zeros([]), adv_x), back_prop=True, maximum_iterations=self.nb_iter, ) # Asserts run only on CPU. # When multi-GPU eval code tries to force all PGD ops onto GPU, this # can cause an error. common_dtype = tf.float32 asserts.append( utils_tf.assert_less_equal( tf.cast(self.eps_iter, dtype=common_dtype), tf.cast(self.eps, dtype=common_dtype), ) ) if self.ord == np.inf and self.clip_min is not None: # The 1e-6 is needed to compensate for numerical error. # Without the 1e-6 this fails when e.g. eps=.2, clip_min=.5, # clip_max=.7 asserts.append( utils_tf.assert_less_equal( tf.cast(self.eps, x.dtype), 1e-6 + tf.cast(self.clip_max, x.dtype) - tf.cast(self.clip_min, x.dtype), ) ) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x def parse_params( self, eps=0.3, eps_iter=0.05, nb_iter=10, y=None, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, clip_min=None, clip_max=None, y_target=None, rand_init=None, rand_init_eps=None, clip_grad=False, sanity_checks=True, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param rand_init: (optional) Start the gradient descent from a point chosen uniformly at random in the norm ball of radius rand_init_eps :param rand_init_eps: (optional float) size of the norm ball from which the initial starting point is chosen. Defaults to eps :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param sanity_checks: bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the tests intentionally configure the attack strangely) """ # Save attack-specific parameters self.eps = eps if rand_init is None: rand_init = self.default_rand_init self.rand_init = rand_init if rand_init_eps is None: rand_init_eps = self.eps self.rand_init_eps = rand_init_eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.ord = ord self.loss_fn = loss_fn self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad if isinstance(eps, float) and isinstance(eps_iter, float): # If these are both known at compile time, we can check before anything # is run. If they are tf, we can't check them yet. assert eps_iter <= eps, (eps_iter, eps) if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") self.sanity_checks = sanity_checks if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/saliency_map_method.py ================================================ """The SalienceMapMethod attack """ # pylint: disable=missing-docstring import warnings import numpy as np from six.moves import xrange import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_sum, reduce_max, reduce_any tf_dtype = tf.as_dtype("float32") class SaliencyMapMethod(Attack): """ The Jacobian-based Saliency Map Method (Papernot et al. 2016). Paper link: https://arxiv.org/pdf/1511.07528.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor :note: When not using symbolic implementation in `generate`, `sess` should be provided """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Create a SaliencyMapMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(SaliencyMapMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("y_target",) self.structural_kwargs = [ "theta", "gamma", "clip_max", "clip_min", "symbolic_impl", ] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) if self.symbolic_impl: # Create random targets if y_target not provided if self.y_target is None: from random import randint def random_targets(gt): result = gt.copy() nb_s = gt.shape[0] nb_classes = gt.shape[1] for i in range(nb_s): result[i, :] = np.roll(result[i, :], randint(1, nb_classes - 1)) return result labels, nb_classes = self.get_or_guess_labels(x, kwargs) self.y_target = tf.py_func(random_targets, [labels], self.tf_dtype) self.y_target.set_shape([None, nb_classes]) x_adv = jsma_symbolic( x, model=self.model, y_target=self.y_target, theta=self.theta, gamma=self.gamma, clip_min=self.clip_min, clip_max=self.clip_max, ) else: raise NotImplementedError( "The jsma_batch function has been removed." " The symbolic_impl argument to SaliencyMapMethod will be removed" " on 2019-07-18 or after. Any code that depends on the non-symbolic" " implementation of the JSMA should be revised. Consider using" " SaliencyMapMethod.generate_np() instead." ) return x_adv def parse_params( self, theta=1.0, gamma=1.0, clip_min=0.0, clip_max=1.0, y_target=None, symbolic_impl=True, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param theta: (optional float) Perturbation introduced to modified components (can be positive or negative) :param gamma: (optional float) Maximum percentage of perturbed features :param clip_min: (optional float) Minimum component value for clipping :param clip_max: (optional float) Maximum component value for clipping :param y_target: (optional) Target tensor if the attack is targeted """ self.theta = theta self.gamma = gamma self.clip_min = clip_min self.clip_max = clip_max self.y_target = y_target self.symbolic_impl = symbolic_impl if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def jsma_batch(*args, **kwargs): raise NotImplementedError( "The jsma_batch function has been removed. Any code that depends on it should be revised." ) def jsma_symbolic(x, y_target, model, theta, gamma, clip_min, clip_max): """ TensorFlow implementation of the JSMA (see https://arxiv.org/abs/1511.07528 for details about the algorithm design choices). :param x: the input placeholder :param y_target: the target tensor :param model: a cleverhans.model.Model object. :param theta: delta for each feature adjustment :param gamma: a float between 0 - 1 indicating the maximum distortion percentage :param clip_min: minimum value for components of the example returned :param clip_max: maximum value for components of the example returned :return: a tensor for the adversarial example """ nb_classes = int(y_target.shape[-1].value) nb_features = int(np.product(x.shape[1:]).value) if x.dtype == tf.float32 and y_target.dtype == tf.int64: y_target = tf.cast(y_target, tf.int32) if x.dtype == tf.float32 and y_target.dtype == tf.float64: warnings.warn( "Downcasting labels---this should be harmless unless" " they are smoothed" ) y_target = tf.cast(y_target, tf.float32) max_iters = np.floor(nb_features * gamma / 2) increase = bool(theta > 0) tmp = np.ones((nb_features, nb_features), int) np.fill_diagonal(tmp, 0) zero_diagonal = tf.constant(tmp, tf_dtype) # Compute our initial search domain. We optimize the initial search domain # by removing all features that are already at their maximum values (if # increasing input features---otherwise, at their minimum value). if increase: search_domain = tf.reshape(tf.cast(x < clip_max, tf_dtype), [-1, nb_features]) else: search_domain = tf.reshape(tf.cast(x > clip_min, tf_dtype), [-1, nb_features]) # Loop variables # x_in: the tensor that holds the latest adversarial outputs that are in # progress. # y_in: the tensor for target labels # domain_in: the tensor that holds the latest search domain # cond_in: the boolean tensor to show if more iteration is needed for # generating adversarial samples def condition(x_in, y_in, domain_in, i_in, cond_in): # Repeat the loop until we have achieved misclassification or # reaches the maximum iterations return tf.logical_and(tf.less(i_in, max_iters), cond_in) # Same loop variables as above def body(x_in, y_in, domain_in, i_in, cond_in): # Create graph for model logits and predictions logits = model.get_logits(x_in) preds = tf.nn.softmax(logits) preds_onehot = tf.one_hot(tf.argmax(preds, axis=1), depth=nb_classes) # create the Jacobian graph list_derivatives = [] for class_ind in xrange(nb_classes): derivatives = tf.gradients(logits[:, class_ind], x_in) list_derivatives.append(derivatives[0]) grads = tf.reshape( tf.stack(list_derivatives), shape=[nb_classes, -1, nb_features] ) # Compute the Jacobian components # To help with the computation later, reshape the target_class # and other_class to [nb_classes, -1, 1]. # The last dimention is added to allow broadcasting later. target_class = tf.reshape( tf.transpose(y_in, perm=[1, 0]), shape=[nb_classes, -1, 1] ) other_classes = tf.cast(tf.not_equal(target_class, 1), tf_dtype) grads_target = reduce_sum(grads * target_class, axis=0) grads_other = reduce_sum(grads * other_classes, axis=0) # Remove the already-used input features from the search space # Subtract 2 times the maximum value from those value so that # they won't be picked later increase_coef = (4 * int(increase) - 2) * tf.cast( tf.equal(domain_in, 0), tf_dtype ) target_tmp = grads_target target_tmp -= increase_coef * reduce_max( tf.abs(grads_target), axis=1, keepdims=True ) target_sum = tf.reshape(target_tmp, shape=[-1, nb_features, 1]) + tf.reshape( target_tmp, shape=[-1, 1, nb_features] ) other_tmp = grads_other other_tmp += increase_coef * reduce_max( tf.abs(grads_other), axis=1, keepdims=True ) other_sum = tf.reshape(other_tmp, shape=[-1, nb_features, 1]) + tf.reshape( other_tmp, shape=[-1, 1, nb_features] ) # Create a mask to only keep features that match conditions if increase: scores_mask = (target_sum > 0) & (other_sum < 0) else: scores_mask = (target_sum < 0) & (other_sum > 0) # Create a 2D numpy array of scores for each pair of candidate features scores = ( tf.cast(scores_mask, tf_dtype) * (-target_sum * other_sum) * zero_diagonal ) # Extract the best two pixels best = tf.argmax( tf.reshape(scores, shape=[-1, nb_features * nb_features]), axis=1 ) p1 = tf.mod(best, nb_features) p2 = tf.floordiv(best, nb_features) p1_one_hot = tf.one_hot(p1, depth=nb_features) p2_one_hot = tf.one_hot(p2, depth=nb_features) # Check if more modification is needed for each sample mod_not_done = tf.equal(reduce_sum(y_in * preds_onehot, axis=1), 0) cond = mod_not_done & (reduce_sum(domain_in, axis=1) >= 2) # Update the search domain cond_float = tf.reshape(tf.cast(cond, tf_dtype), shape=[-1, 1]) to_mod = (p1_one_hot + p2_one_hot) * cond_float domain_out = domain_in - to_mod # Apply the modification to the images to_mod_reshape = tf.reshape(to_mod, shape=([-1] + x_in.shape[1:].as_list())) if increase: x_out = tf.minimum(clip_max, x_in + to_mod_reshape * theta) else: x_out = tf.maximum(clip_min, x_in - to_mod_reshape * theta) # Increase the iterator, and check if all misclassifications are done i_out = tf.add(i_in, 1) cond_out = reduce_any(cond) return x_out, y_in, domain_out, i_out, cond_out # Run loop to do JSMA x_adv, _, _, _, _ = tf.while_loop( condition, body, [x, y_target, search_domain, 0, True], parallel_iterations=1 ) return x_adv ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/semantic.py ================================================ """Semantic adversarial examples """ from cleverhans.attacks.attack import Attack class Semantic(Attack): """ Semantic adversarial examples https://arxiv.org/abs/1703.06857 Note: data must either be centered (so that the negative image can be made by simple negation) or must be in the interval [-1, 1] :param model: cleverhans.model.Model :param center: bool If True, assumes data has 0 mean so the negative image is just negation. If False, assumes data is in the interval [0, max_val] :param max_val: float Maximum value allowed in the input data :param sess: optional tf.Session :param dtypestr: dtype of data :param kwargs: passed through to the super constructor """ def __init__( self, model, center, max_val=1.0, sess=None, dtypestr="float32", **kwargs ): super(Semantic, self).__init__(model, sess, dtypestr, **kwargs) self.center = center self.max_val = max_val if hasattr(model, "dataset_factory"): if "center" in model.dataset_factory.kwargs: assert center == model.dataset_factory.kwargs["center"] def generate(self, x, **kwargs): if self.center: return -x return self.max_val - x ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/sparse_l1_descent.py ================================================ """ The SparseL1Descent attack. """ import warnings from distutils.version import LooseVersion import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans import utils_tf from cleverhans.utils_tf import clip_eta, random_lp_vector from cleverhans.compat import reduce_max, reduce_sum, softmax_cross_entropy_with_logits class SparseL1Descent(Attack): """ This class implements a variant of Projected Gradient Descent for the l1-norm (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2 cases covered by the ProjectedGradientDescent class, because the steepest descent direction for the l1-norm is too sparse (it updates a single coordinate in the adversarial perturbation in each step). This attack has an additional parameter that controls the sparsity of the update step. For moderately sparse update steps, the attack vastly outperforms Projected Steepest Descent and is competitive with other attacks targeted at the l1-norm such as the ElasticNetMethod attack (which is much more computationally expensive). Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Create a SparseL1Descent instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(SparseL1Descent, self).__init__( model, sess=sess, dtypestr=dtypestr, **kwargs ) self.feedable_kwargs = ( "eps", "eps_iter", "y", "y_target", "clip_min", "clip_max", "grad_sparsity", ) self.structural_kwargs = ["nb_iter", "rand_init", "clip_grad", "sanity_checks"] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append( utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype)) ) if self.clip_max is not None: asserts.append( utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype)) ) # Initialize loop variables if self.rand_init: eta = random_lp_vector( tf.shape(x), ord=1, eps=tf.cast(self.eps, x.dtype), dtype=x.dtype ) else: eta = tf.zeros(tf.shape(x)) # Clip eta eta = clip_eta(eta, ord=1, eps=self.eps) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) if self.y_target is not None: y = self.y_target targeted = True elif self.y is not None: y = self.y targeted = False else: model_preds = self.model.get_probs(x) preds_max = tf.reduce_max(model_preds, 1, keepdims=True) y = tf.to_float(tf.equal(model_preds, preds_max)) y = tf.stop_gradient(y) targeted = False del model_preds y_kwarg = "y_target" if targeted else "y" def cond(i, _): """Iterate until requested number of iterations is completed""" return tf.less(i, self.nb_iter) def body(i, adv_x): """Do a projected gradient step""" labels, _ = self.get_or_guess_labels(adv_x, {y_kwarg: y}) logits = self.model.get_logits(adv_x) adv_x = sparse_l1_descent( adv_x, logits, y=labels, eps=self.eps_iter, q=self.grad_sparsity, clip_min=self.clip_min, clip_max=self.clip_max, clip_grad=self.clip_grad, targeted=(self.y_target is not None), sanity_checks=self.sanity_checks, ) # Clipping perturbation eta to the l1-ball eta = adv_x - x eta = clip_eta(eta, ord=1, eps=self.eps) adv_x = x + eta # Redo the clipping. # Subtracting and re-adding eta can add some small numerical error. if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return i + 1, adv_x _, adv_x = tf.while_loop( cond, body, (tf.zeros([]), adv_x), back_prop=True, maximum_iterations=self.nb_iter, ) # Asserts run only on CPU. # When multi-GPU eval code tries to force all PGD ops onto GPU, this # can cause an error. common_dtype = tf.float32 asserts.append( utils_tf.assert_less_equal( tf.cast(self.eps_iter, dtype=common_dtype), tf.cast(self.eps, dtype=common_dtype), ) ) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x def parse_params( self, eps=10.0, eps_iter=1.0, nb_iter=20, y=None, clip_min=None, clip_max=None, y_target=None, rand_init=False, clip_grad=False, grad_sparsity=99, sanity_checks=True, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param grad_sparsity (optional) Relative sparsity of the gradient update step, in percent. Only gradient values larger than this percentile are retained. This parameter can be a scalar, or a vector of the same length as the input batch dimension. :param sanity_checks: bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the tests intentionally configure the attack strangely) """ # Save attack-specific parameters self.eps = eps self.rand_init = rand_init self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad self.grad_sparsity = grad_sparsity if isinstance(eps, float) and isinstance(eps_iter, float): # If these are both known at compile time, we can check before anything # is run. If they are tf, we can't check them yet. assert eps_iter <= eps, (eps_iter, eps) if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") # The grad_sparsity argument governs the sparsity of the gradient # update. It indicates the percentile value above which gradient entries # are retained. It can be specified as a scalar or as a 1-dimensional # vector of the same size as the input's batch dimension. if isinstance(self.grad_sparsity, int) or isinstance(self.grad_sparsity, float): if not 0 < self.grad_sparsity < 100: raise ValueError("grad_sparsity should be in (0, 100)") else: self.grad_sparsity = tf.convert_to_tensor(self.grad_sparsity) if len(self.grad_sparsity.shape) > 1: raise ValueError("grad_sparsity should either be a scalar or a vector") self.sanity_checks = sanity_checks if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def sparse_l1_descent( x, logits, y=None, eps=1.0, q=99, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True, ): """ TensorFlow implementation of the Dense L1 Descent Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param eps: the epsilon (input variation parameter) :param q: the percentile above which gradient values are retained. Either a scalar or a vector of same length as the input batch dimension. :param clip_min: Minimum float value for adversarial example components :param clip_max: Maximum float value for adversarial example components :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(clip_min, x.dtype))) if clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype))) # Make sure the caller has not passed probs by accident assert logits.op.type != "Softmax" if y is None: # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(logits, 1, keepdims=True) y = tf.to_float(tf.equal(logits, preds_max)) y = tf.stop_gradient(y) y = y / reduce_sum(y, 1, keepdims=True) # Compute loss loss = softmax_cross_entropy_with_logits(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input (grad,) = tf.gradients(loss, x) if clip_grad: grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max) red_ind = list(range(1, len(grad.get_shape()))) dim = tf.reduce_prod(tf.shape(x)[1:]) abs_grad = tf.reshape(tf.abs(grad), (-1, dim)) # if q is a scalar, broadcast it to a vector of same length as the batch dim q = tf.cast(tf.broadcast_to(q, tf.shape(x)[0:1]), tf.float32) k = tf.cast(tf.floor(q / 100 * tf.cast(dim, tf.float32)), tf.int32) # `tf.sort` is much faster than `tf.contrib.distributions.percentile`. # For TF <= 1.12, use `tf.nn.top_k` as `tf.sort` is not implemented. if LooseVersion(tf.__version__) <= LooseVersion("1.12.0"): # `tf.sort` is only available in TF 1.13 onwards sorted_grad = -tf.nn.top_k(-abs_grad, k=dim, sorted=True)[0] else: sorted_grad = tf.sort(abs_grad, axis=-1) idx = tf.stack((tf.range(tf.shape(abs_grad)[0]), k), -1) percentiles = tf.gather_nd(sorted_grad, idx) tied_for_max = tf.greater_equal(abs_grad, tf.expand_dims(percentiles, -1)) tied_for_max = tf.reshape(tf.cast(tied_for_max, x.dtype), tf.shape(grad)) num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True) optimal_perturbation = tf.sign(grad) * tied_for_max / num_ties # Add perturbation to original example to obtain adversarial example adv_x = x + utils_tf.mul(eps, optimal_perturbation) # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/spatial_transformation_method.py ================================================ """The SpatialTransformationMethod attack """ import warnings from cleverhans.attacks.attack import Attack class SpatialTransformationMethod(Attack): """ Spatial transformation attack """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Create a SpatialTransformationMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ super(SpatialTransformationMethod, self).__init__( model, sess, dtypestr, **kwargs ) self.feedable_kwargs = ( "n_samples", "dx_min", "dx_max", "n_dxs", "dy_min", "dy_max", "n_dys", "angle_min", "angle_max", "n_angles", "black_border_size", ) def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) from cleverhans.attacks_tf import spm labels, _ = self.get_or_guess_labels(x, kwargs) return spm( x, self.model, y=labels, n_samples=self.n_samples, dx_min=self.dx_min, dx_max=self.dx_max, n_dxs=self.n_dxs, dy_min=self.dy_min, dy_max=self.dy_max, n_dys=self.n_dys, angle_min=self.angle_min, angle_max=self.angle_max, n_angles=self.n_angles, black_border_size=self.black_border_size, ) def parse_params( self, n_samples=None, dx_min=-0.1, dx_max=0.1, n_dxs=2, dy_min=-0.1, dy_max=0.1, n_dys=2, angle_min=-30, angle_max=30, n_angles=6, black_border_size=0, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param n_samples: (optional) The number of transformations sampled to construct the attack. Set it to None to run full grid attack. :param dx_min: (optional float) Minimum translation ratio along x-axis. :param dx_max: (optional float) Maximum translation ratio along x-axis. :param n_dxs: (optional int) Number of discretized translation ratios along x-axis. :param dy_min: (optional float) Minimum translation ratio along y-axis. :param dy_max: (optional float) Maximum translation ratio along y-axis. :param n_dys: (optional int) Number of discretized translation ratios along y-axis. :param angle_min: (optional float) Largest counter-clockwise rotation angle. :param angle_max: (optional float) Largest clockwise rotation angle. :param n_angles: (optional int) Number of discretized angles. :param black_border_size: (optional int) size of the black border in pixels. """ self.n_samples = n_samples self.dx_min = dx_min self.dx_max = dx_max self.n_dxs = n_dxs self.dy_min = dy_min self.dy_max = dy_max self.n_dys = n_dys self.angle_min = angle_min self.angle_max = angle_max self.n_angles = n_angles self.black_border_size = black_border_size if self.dx_min < -1 or self.dy_min < -1 or self.dx_max > 1 or self.dy_max > 1: raise ValueError( "The value of translation must be bounded " "within [-1, 1]" ) if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/spsa.py ================================================ """The SPSA attack """ # pylint: disable=missing-docstring import warnings import numpy as np from six.moves import xrange import tensorflow as tf import tensorflow_addons as tfa from cleverhans.attacks.attack import Attack from cleverhans.compat import reduce_mean, reduce_sum, reduce_max from cleverhans.model import Model from cleverhans import utils_tf tf_dtype = tf.as_dtype("float32") class SPSA(Attack): """ This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ DEFAULT_SPSA_SAMPLES = 128 DEFAULT_SPSA_ITERS = 1 DEFAULT_DELTA = 0.01 DEFAULT_LEARNING_RATE = 0.01 def __init__(self, model, sess=None, dtypestr="float32", **kwargs): super(SPSA, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("eps", "clip_min", "clip_max", "y", "y_target") self.structural_kwargs = [ "nb_iter", "spsa_samples", "spsa_iters", "early_stop_loss_threshold", "is_debug", "is_targeted", ] assert isinstance(self.model, Model) def generate( self, x, y=None, y_target=None, eps=None, clip_min=None, clip_max=None, nb_iter=None, is_targeted=None, early_stop_loss_threshold=None, learning_rate=DEFAULT_LEARNING_RATE, delta=DEFAULT_DELTA, spsa_samples=DEFAULT_SPSA_SAMPLES, batch_size=None, spsa_iters=DEFAULT_SPSA_ITERS, is_debug=False, epsilon=None, num_steps=None, ): """ Generate symbolic graph for adversarial examples. :param x: The model's symbolic inputs. Must be a batch of size 1. :param y: A Tensor or None. The index of the correct label. :param y_target: A Tensor or None. The index of the target label in a targeted attack. :param eps: The size of the maximum perturbation, measured in the L-infinity norm. :param clip_min: If specified, the minimum input value :param clip_max: If specified, the maximum input value :param nb_iter: The number of optimization steps. :param early_stop_loss_threshold: A float or None. If specified, the attack will end as soon as the loss is below `early_stop_loss_threshold`. :param learning_rate: Learning rate of ADAM optimizer. :param delta: Perturbation size used for SPSA approximation. :param spsa_samples: Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is `spsa_samples * spsa_iters` :param batch_size: Deprecated param that is an alias for spsa_samples :param spsa_iters: Number of model evaluations before performing an update, where each evaluation is on `spsa_samples` different inputs. :param is_debug: If True, print the adversarial loss after each update. :param epsilon: Deprecated alias for `eps` :param num_steps: Deprecated alias for `nb_iter`. :param is_targeted: Deprecated argument. Ignored. """ if epsilon is not None: if eps is not None: raise ValueError( "Should not specify both eps and its deprecated " "alias, epsilon" ) warnings.warn( "`epsilon` is deprecated. Switch to `eps`. `epsilon` may " "be removed on or after 2019-04-15." ) eps = epsilon del epsilon if num_steps is not None: if nb_iter is not None: raise ValueError( "Should not specify both nb_iter and its deprecated " "alias, num_steps" ) warnings.warn( "`num_steps` is deprecated. Switch to `nb_iter`. " "`num_steps` may be removed on or after 2019-04-15." ) nb_iter = num_steps del num_steps assert nb_iter is not None if (y is not None) + (y_target is not None) != 1: raise ValueError( "Must specify exactly one of y (untargeted attack, " "cause the input not to be classified as this true " "label) and y_target (targeted attack, cause the " "input to be classified as this target label)." ) if is_targeted is not None: warnings.warn( "`is_targeted` is deprecated. Simply do not specify it." " It may become an error to specify it on or after " "2019-04-15." ) assert is_targeted == y_target is not None is_targeted = y_target is not None if x.get_shape().as_list()[0] is None: check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1) with tf.control_dependencies([check_batch]): x = tf.identity(x) elif x.get_shape().as_list()[0] != 1: raise ValueError("For SPSA, input tensor x must have batch_size of 1.") if batch_size is not None: warnings.warn( 'The "batch_size" argument to SPSA is deprecated, and will ' "be removed on 2019-03-17. " "Please use spsa_samples instead." ) spsa_samples = batch_size optimizer = SPSAAdam( lr=learning_rate, delta=delta, num_samples=spsa_samples, num_iters=spsa_iters, ) def loss_fn(x, label): """ Margin logit loss, with correct sign for targeted vs untargeted loss. """ logits = self.model.get_logits(x) loss_multiplier = 1 if is_targeted else -1 return loss_multiplier * margin_logit_loss( logits, label, nb_classes=self.model.nb_classes or logits.get_shape()[-1], ) y_attack = y_target if is_targeted else y adv_x = projected_optimization( loss_fn, x, y_attack, eps, num_steps=nb_iter, optimizer=optimizer, early_stop_loss_threshold=early_stop_loss_threshold, is_debug=is_debug, clip_min=clip_min, clip_max=clip_max, ) return adv_x def generate_np(self, x_val, **kwargs): if "epsilon" in kwargs: warnings.warn("Using deprecated argument: see `generate`") assert "eps" not in kwargs kwargs["eps"] = kwargs["epsilon"] del kwargs["epsilon"] assert "eps" in kwargs if "num_steps" in kwargs: warnings.warn("Using deprecated argument: see `generate`") assert "nb_iter" not in kwargs kwargs["nb_iter"] = kwargs["num_steps"] del kwargs["num_steps"] if "y" in kwargs and kwargs["y"] is not None: assert kwargs["y"].dtype in [np.int32, np.int64] if "y_target" in kwargs and kwargs["y_target"] is not None: assert kwargs["y_target"].dtype in [np.int32, np.int64] # Call self.generate() sequentially for each image in the batch x_adv = [] batch_size = x_val.shape[0] y = kwargs.pop("y", [None] * batch_size) assert len(x_val) == len(y), "# of images and labels should match" for x_single, y_single in zip(x_val, y): x = np.expand_dims(x_single, axis=0) adv_img = super(SPSA, self).generate_np(x, y=y_single, **kwargs) x_adv.append(adv_img) return np.concatenate(x_adv, axis=0) def _project_perturbation( perturbation, epsilon, input_image, clip_min=None, clip_max=None ): """Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into hypercube such that the resulting adversarial example is between clip_min and clip_max, if applicable. """ if clip_min is None or clip_max is None: raise NotImplementedError( "_project_perturbation currently has clipping " "hard-coded in." ) # Ensure inputs are in the correct range with tf.control_dependencies( [ utils_tf.assert_less_equal( input_image, tf.cast(clip_max, input_image.dtype) ), utils_tf.assert_greater_equal( input_image, tf.cast(clip_min, input_image.dtype) ), ] ): clipped_perturbation = utils_tf.clip_by_value(perturbation, -epsilon, epsilon) new_image = utils_tf.clip_by_value( input_image + clipped_perturbation, clip_min, clip_max ) return new_image - input_image class TensorOptimizer(object): """Optimizer for Tensors rather than tf.Variables. TensorOptimizers implement optimizers where the values being optimized are ordinary Tensors, rather than Variables. TF Variables can have strange behaviors when being assigned multiple times within a single sess.run() call, particularly in Distributed TF, so this avoids thinking about those issues. These are helper classes for the `projected_optimization` method. Apart from not using Variables, they follow an interface very similar to tf.Optimizer. """ def _compute_gradients(self, loss_fn, x, unused_optim_state): """Compute a new value of `x` to minimize `loss_fn`. Args: loss_fn: a callable that takes `x`, a batch of images, and returns a batch of loss values. `x` will be optimized to minimize `loss_fn(x)`. x: A list of Tensors, the values to be updated. This is analogous to the `var_list` argument in standard TF Optimizer. unused_optim_state: A (possibly nested) dict, containing any state info needed for the optimizer. Returns: new_x: A list of Tensors, the same length as `x`, which are updated new_optim_state: A dict, with the same structure as `optim_state`, which have been updated. """ # Assumes `x` is a list, # and contains a tensor representing a batch of images assert len(x) == 1 and isinstance( x, list ), "x should be a list and contain only one image tensor" x = x[0] loss = reduce_mean(loss_fn(x), axis=0) return tf.gradients(loss, x) def _apply_gradients(self, grads, x, optim_state): """ Given a gradient, make one optimization step. :param grads: list of tensors, same length as `x`, containing the corresponding gradients :param x: list of tensors to update :param optim_state: dict Returns: new_x: list of tensors, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ raise NotImplementedError("_apply_gradients should be defined in each subclass") def minimize(self, loss_fn, x, optim_state): """ Analogous to tf.Optimizer.minimize :param loss_fn: tf Tensor, representing the loss to minimize :param x: list of Tensor, analogous to tf.Optimizer's var_list :param optim_state: A possibly nested dict, containing any optimizer state. Returns: new_x: list of Tensor, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ grads = self._compute_gradients(loss_fn, x, optim_state) return self._apply_gradients(grads, x, optim_state) def init_state(self, x): """Returns the initial state of the optimizer. Args: x: A list of Tensors, which will be optimized. Returns: A dictionary, representing the initial state of the optimizer. """ raise NotImplementedError("init_state should be defined in each subclass") class TensorGradientDescent(TensorOptimizer): """Vanilla Gradient Descent TensorOptimizer.""" def __init__(self, lr): self._lr = lr def init_state(self, x): return {} def _apply_gradients(self, grads, x, optim_state): new_x = [None] * len(x) for i in xrange(len(x)): new_x[i] = x[i] - self._lr * grads[i] return new_x, optim_state class TensorAdam(TensorOptimizer): """The Adam optimizer defined in https://arxiv.org/abs/1412.6980.""" def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-9): self._lr = lr self._beta1 = beta1 self._beta2 = beta2 self._epsilon = epsilon def init_state(self, x): """ Initialize t, m, and u """ optim_state = {} optim_state["t"] = 0.0 optim_state["m"] = [tf.zeros_like(v) for v in x] optim_state["u"] = [tf.zeros_like(v) for v in x] return optim_state def _apply_gradients(self, grads, x, optim_state): """Refer to parent class documentation.""" new_x = [None] * len(x) new_optim_state = { "t": optim_state["t"] + 1.0, "m": [None] * len(x), "u": [None] * len(x), } t = new_optim_state["t"] for i in xrange(len(x)): g = grads[i] m_old = optim_state["m"][i] u_old = optim_state["u"][i] new_optim_state["m"][i] = self._beta1 * m_old + (1.0 - self._beta1) * g new_optim_state["u"][i] = self._beta2 * u_old + (1.0 - self._beta2) * g * g m_hat = new_optim_state["m"][i] / (1.0 - tf.pow(self._beta1, t)) u_hat = new_optim_state["u"][i] / (1.0 - tf.pow(self._beta2, t)) new_x[i] = x[i] - self._lr * m_hat / (tf.sqrt(u_hat) + self._epsilon) return new_x, new_optim_state class SPSAAdam(TensorAdam): """Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666. Gradients estimates are computed using Simultaneous Perturbation Stochastic Approximation (SPSA), combined with the ADAM update rule. """ def __init__( self, lr=0.01, delta=0.01, num_samples=128, num_iters=1, compare_to_analytic_grad=False, ): super(SPSAAdam, self).__init__(lr=lr) assert num_samples % 2 == 0, "number of samples must be even" self._delta = delta self._num_samples = num_samples // 2 # Since we mirror +/- delta later self._num_iters = num_iters self._compare_to_analytic_grad = compare_to_analytic_grad def _get_delta(self, x, delta): x_shape = x.get_shape().as_list() delta_x = delta * tf.sign( tf.random_uniform( [self._num_samples] + x_shape[1:], minval=-1.0, maxval=1.0, dtype=tf_dtype, ) ) return delta_x def _compute_gradients(self, loss_fn, x, unused_optim_state): """Compute gradient estimates using SPSA.""" # Assumes `x` is a list, containing a [1, H, W, C] image # If static batch dimension is None, tf.reshape to batch size 1 # so that static shape can be inferred assert len(x) == 1 static_x_shape = x[0].get_shape().as_list() if static_x_shape[0] is None: x[0] = tf.reshape(x[0], [1] + static_x_shape[1:]) assert x[0].get_shape().as_list()[0] == 1 x = x[0] x_shape = x.get_shape().as_list() def body(i, grad_array): delta = self._delta delta_x = self._get_delta(x, delta) delta_x = tf.concat([delta_x, -delta_x], axis=0) loss_vals = tf.reshape( loss_fn(x + delta_x), [2 * self._num_samples] + [1] * (len(x_shape) - 1) ) avg_grad = reduce_mean(loss_vals * delta_x, axis=0) / delta avg_grad = tf.expand_dims(avg_grad, axis=0) new_grad_array = grad_array.write(i, avg_grad) return i + 1, new_grad_array def cond(i, _): return i < self._num_iters _, all_grads = tf.while_loop( cond, body, loop_vars=[0, tf.TensorArray(size=self._num_iters, dtype=tf_dtype)], back_prop=False, parallel_iterations=1, ) avg_grad = reduce_sum(all_grads.stack(), axis=0) return [avg_grad] def margin_logit_loss(model_logits, label, nb_classes=10, num_classes=None): """Computes difference between logit for `label` and next highest logit. The loss is high when `label` is unlikely (targeted by default). This follows the same interface as `loss_fn` for TensorOptimizer and projected_optimization, i.e. it returns a batch of loss values. """ if num_classes is not None: warnings.warn( "`num_classes` is depreciated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23." ) nb_classes = num_classes del num_classes if "int" in str(label.dtype): logit_mask = tf.one_hot(label, depth=nb_classes, axis=-1) else: logit_mask = label if "int" in str(logit_mask.dtype): logit_mask = tf.to_float(logit_mask) try: label_logits = reduce_sum(logit_mask * model_logits, axis=-1) except TypeError: raise TypeError( "Could not take row-wise dot product between " "logit mask, of dtype " + str(logit_mask.dtype) + " and model_logits, of dtype " + str(model_logits.dtype) ) logits_with_target_label_neg_inf = model_logits - logit_mask * 99999 highest_nonlabel_logits = reduce_max(logits_with_target_label_neg_inf, axis=-1) loss = highest_nonlabel_logits - label_logits return loss def _apply_black_border(x, border_size): orig_height = x.get_shape().as_list()[1] orig_width = x.get_shape().as_list()[2] x = tf.image.resize_images( x, (orig_width - 2 * border_size, orig_height - 2 * border_size) ) return tf.pad( x, [[0, 0], [border_size, border_size], [border_size, border_size], [0, 0]], "CONSTANT", ) def _apply_transformation(inputs): x, trans = inputs[0], inputs[1] dx, dy, angle = trans[0], trans[1], trans[2] height = x.get_shape().as_list()[1] width = x.get_shape().as_list()[2] # Pad the image to prevent two-step rotation / translation from truncating # corners max_dist_from_center = np.sqrt(height ** 2 + width ** 2) / 2 min_edge_from_center = float(np.min([height, width])) / 2 padding = np.ceil(max_dist_from_center - min_edge_from_center).astype(np.int32) x = tf.pad(x, [[0, 0], [padding, padding], [padding, padding], [0, 0]], "CONSTANT") # Apply rotation angle *= np.pi / 180 x = tfa.image.rotate(x, angle, interpolation="BILINEAR") # Apply translation dx_in_px = -dx * height dy_in_px = -dy * width translation = tf.convert_to_tensor([dx_in_px, dy_in_px]) try: x = tfa.image.translate(x, translation, interpolation="BILINEAR") except AttributeError as e: print("WARNING: SpatialAttack requires tf 1.6 or higher") raise e x = tfa.image.translate(x, translation, interpolation="BILINEAR") return tf.image.resize_image_with_crop_or_pad(x, height, width) def spm( x, model, y=None, n_samples=None, dx_min=-0.1, dx_max=0.1, n_dxs=5, dy_min=-0.1, dy_max=0.1, n_dys=5, angle_min=-30, angle_max=30, n_angles=31, black_border_size=0, ): """ TensorFlow implementation of the Spatial Transformation Method. :return: a tensor for the adversarial example """ if y is None: preds = model.get_probs(x) # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(preds, 1, keepdims=True) y = tf.to_float(tf.equal(preds, preds_max)) y = tf.stop_gradient(y) del preds y = y / reduce_sum(y, 1, keepdims=True) # Define the range of transformations dxs = np.linspace(dx_min, dx_max, n_dxs) dys = np.linspace(dy_min, dy_max, n_dys) angles = np.linspace(angle_min, angle_max, n_angles) if n_samples is None: import itertools transforms = list(itertools.product(*[dxs, dys, angles])) else: sampled_dxs = np.random.choice(dxs, n_samples) sampled_dys = np.random.choice(dys, n_samples) sampled_angles = np.random.choice(angles, n_samples) transforms = zip(sampled_dxs, sampled_dys, sampled_angles) transformed_ims = parallel_apply_transformations(x, transforms, black_border_size) def _compute_xent(x): preds = model.get_logits(x) return tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=preds) all_xents = tf.map_fn( _compute_xent, transformed_ims, parallel_iterations=1 ) # Must be 1 to avoid keras race conditions # Return the adv_x with worst accuracy # all_xents is n_total_samples x batch_size (SB) all_xents = tf.stack(all_xents) # SB # We want the worst case sample, with the largest xent_loss worst_sample_idx = tf.argmax(all_xents, axis=0) # B batch_size = tf.shape(x)[0] keys = tf.stack( [tf.range(batch_size, dtype=tf.int32), tf.cast(worst_sample_idx, tf.int32)], axis=1, ) transformed_ims_bshwc = tf.einsum("sbhwc->bshwc", transformed_ims) after_lookup = tf.gather_nd(transformed_ims_bshwc, keys) # BHWC return after_lookup def parallel_apply_transformations(x, transforms, black_border_size=0): """ Apply image transformations in parallel. :param transforms: TODO :param black_border_size: int, size of black border to apply Returns: Transformed images """ transforms = tf.convert_to_tensor(transforms, dtype=tf.float32) x = _apply_black_border(x, black_border_size) num_transforms = transforms.get_shape().as_list()[0] im_shape = x.get_shape().as_list()[1:] # Pass a copy of x and a transformation to each iteration of the map_fn # callable tiled_x = tf.reshape( tf.tile(x, [num_transforms, 1, 1, 1]), [num_transforms, -1] + im_shape ) elems = [tiled_x, transforms] transformed_ims = tf.map_fn( _apply_transformation, elems, dtype=tf.float32, parallel_iterations=1, # Must be 1 to avoid keras race conditions ) return transformed_ims def projected_optimization( loss_fn, input_image, label, epsilon, num_steps, clip_min=None, clip_max=None, optimizer=TensorAdam(), project_perturbation=_project_perturbation, early_stop_loss_threshold=None, is_debug=False, ): """Generic projected optimization, generalized to work with approximate gradients. Used for e.g. the SPSA attack. Args: :param loss_fn: A callable which takes `input_image` and `label` as arguments, and returns a batch of loss values. Same interface as TensorOptimizer. :param input_image: Tensor, a batch of images :param label: Tensor, a batch of labels :param epsilon: float, the L-infinity norm of the maximum allowable perturbation :param num_steps: int, the number of steps of gradient descent :param clip_min: float, minimum pixel value :param clip_max: float, maximum pixel value :param optimizer: A `TensorOptimizer` object :param project_perturbation: A function, which will be used to enforce some constraint. It should have the same signature as `_project_perturbation`. :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below `early_stop_loss_threshold`. Enabling this option can have several different effects: - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned. This increases the attack success rate, because without early stopping the optimizer can accidentally bounce back to a point where the attack fails. - Early stopping can make the attack run faster because it may run for fewer steps. - Early stopping can make the attack run slower because the loss must be calculated at each step. The loss is not calculated as part of the normal SPSA optimization procedure. For most reasonable choices of hyperparameters, early stopping makes the attack much faster because it decreases the number of steps dramatically. :param is_debug: A bool. If True, print debug info for attack progress. Returns: adversarial version of `input_image`, with L-infinity difference less than epsilon, which tries to minimize loss_fn. Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper function which you can use to write your own attack methods. The method uses a tf.while_loop to optimize a loss function in a single sess.run() call. """ assert num_steps is not None if is_debug: with tf.device("/cpu:0"): input_image = tf.Print( input_image, [], "Starting PGD attack with epsilon: %s" % epsilon ) init_perturbation = tf.random_uniform( tf.shape(input_image), minval=tf.cast(-epsilon, input_image.dtype), maxval=tf.cast(epsilon, input_image.dtype), dtype=input_image.dtype, ) init_perturbation = project_perturbation( init_perturbation, epsilon, input_image, clip_min=clip_min, clip_max=clip_max ) init_optim_state = optimizer.init_state([init_perturbation]) nest = tf.nest def loop_body(i, perturbation, flat_optim_state): """Update perturbation to input image.""" optim_state = nest.pack_sequence_as( structure=init_optim_state, flat_sequence=flat_optim_state ) def wrapped_loss_fn(x): return loss_fn(input_image + x, label) new_perturbation_list, new_optim_state = optimizer.minimize( wrapped_loss_fn, [perturbation], optim_state ) projected_perturbation = project_perturbation( new_perturbation_list[0], epsilon, input_image, clip_min=clip_min, clip_max=clip_max, ) # Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we must explicitly # check whether the value is None. early_stop = early_stop_loss_threshold is not None compute_loss = is_debug or early_stop # Don't waste time building the loss graph if we're not going to use it if compute_loss: # NOTE: this step is not actually redundant with the optimizer step. # SPSA calculates the loss at randomly perturbed points but doesn't calculate the loss at the current point. loss = reduce_mean(wrapped_loss_fn(projected_perturbation), axis=0) if is_debug: with tf.device("/cpu:0"): loss = tf.Print(loss, [loss], "Total batch loss") if early_stop: i = tf.cond( tf.less(loss, early_stop_loss_threshold), lambda: float(num_steps), lambda: i, ) return i + 1, projected_perturbation, nest.flatten(new_optim_state) def cond(i, *_): return tf.less(i, num_steps) flat_init_optim_state = nest.flatten(init_optim_state) _, final_perturbation, _ = tf.while_loop( cond, loop_body, loop_vars=(tf.constant(0.0), init_perturbation, flat_init_optim_state), parallel_iterations=1, back_prop=False, maximum_iterations=num_steps, ) if project_perturbation is _project_perturbation: # TODO: this assert looks totally wrong. # Not bothering to fix it now because it's only an assert. # 1) Multiplying by 1.1 gives a huge margin of error. This should probably # take the difference and allow a tolerance of 1e-6 or something like # that. # 2) I think it should probably check the *absolute value* of # final_perturbation perturbation_max = epsilon * 1.1 check_diff = utils_tf.assert_less_equal( final_perturbation, tf.cast(perturbation_max, final_perturbation.dtype), message="final_perturbation must change no pixel by more than " "%s" % perturbation_max, ) else: # TODO: let caller pass in a check_diff function as well as # project_perturbation check_diff = tf.no_op() if clip_min is None or clip_max is None: raise NotImplementedError("This function only supports clipping for now") check_range = [ utils_tf.assert_less_equal(input_image, tf.cast(clip_max, input_image.dtype)), utils_tf.assert_greater_equal( input_image, tf.cast(clip_min, input_image.dtype) ), ] with tf.control_dependencies([check_diff] + check_range): adversarial_image = input_image + final_perturbation return tf.stop_gradient(adversarial_image) ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks/virtual_adversarial_method.py ================================================ """The VirtualAdversarialMethod attack """ import warnings import tensorflow as tf from cleverhans.attacks.attack import Attack from cleverhans.model import Model, CallableModelWrapper from cleverhans.model import wrapper_warning_logits from cleverhans import utils_tf tf_dtype = tf.as_dtype("float32") class VirtualAdversarialMethod(Attack): """ This attack was originally proposed by Miyato et al. (2016) and was used for virtual adversarial training. Paper link: https://arxiv.org/abs/1507.00677 :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr="float32", **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, "logits") super(VirtualAdversarialMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ("eps", "xi", "clip_min", "clip_max") self.structural_kwargs = ["num_iterations"] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) return vatm( self.model, x, self.model.get_logits(x), eps=self.eps, num_iterations=self.num_iterations, xi=self.xi, clip_min=self.clip_min, clip_max=self.clip_max, ) def parse_params( self, eps=2.0, nb_iter=None, xi=1e-6, clip_min=None, clip_max=None, num_iterations=None, **kwargs ): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float )the epsilon (input variation parameter) :param nb_iter: (optional) the number of iterations Defaults to 1 if not specified :param xi: (optional float) the finite difference parameter :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param num_iterations: Deprecated alias for `nb_iter` """ # Save attack-specific parameters self.eps = eps if num_iterations is not None: warnings.warn( "`num_iterations` is deprecated. Switch to `nb_iter`." " The old name will be removed on or after 2019-04-26." ) # Note: when we remove the deprecated alias, we can put the default # value of 1 for nb_iter back in the method signature assert nb_iter is None nb_iter = num_iterations del num_iterations if nb_iter is None: nb_iter = 1 self.num_iterations = nb_iter self.xi = xi self.clip_min = clip_min self.clip_max = clip_max if len(kwargs.keys()) > 0: warnings.warn( "kwargs is unused and will be removed on or after " "2019-04-26." ) return True def vatm( model, x, logits, eps, num_iterations=1, xi=1e-6, clip_min=None, clip_max=None, scope=None, ): """ Tensorflow implementation of the perturbation method used for virtual adversarial training: https://arxiv.org/abs/1507.00677 :param model: the model which returns the network unnormalized logits :param x: the input placeholder :param logits: the model's unnormalized output tensor (the input to the softmax layer) :param eps: the epsilon (input variation parameter) :param num_iterations: the number of iterations :param xi: the finite difference parameter :param clip_min: optional parameter that can be used to set a minimum value for components of the example returned :param clip_max: optional parameter that can be used to set a maximum value for components of the example returned :param seed: the seed for random generator :return: a tensor for the adversarial example """ with tf.name_scope(scope, "virtual_adversarial_perturbation"): d = tf.random_normal(tf.shape(x), dtype=tf_dtype) for _ in range(num_iterations): d = xi * utils_tf.l2_batch_normalize(d) logits_d = model.get_logits(x + d) kl = utils_tf.kl_with_logits(logits, logits_d) Hd = tf.gradients(kl, d)[0] d = tf.stop_gradient(Hd) d = eps * utils_tf.l2_batch_normalize(d) adv_x = x + d if (clip_min is not None) and (clip_max is not None): adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) return adv_x ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks_tf.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import warnings import numpy as np from cleverhans.attacks.carlini_wagner_l2 import ( CWL2 as CarliniWagnerL2, ) # pylint: disable=unused-import from cleverhans.attacks.deep_fool import ( deepfool_batch, deepfool_attack, ) # pylint: disable=unused-import from cleverhans.attacks.elastic_net_method import ( EAD as ElasticNetMethod, ) # pylint: disable=unused-import from cleverhans.attacks.lbfgs import ( LBFGS_impl as LBFGS_attack, ) # pylint: disable=unused-import from cleverhans.attacks.saliency_map_method import ( jsma_symbolic, ) # pylint: disable=unused-import from cleverhans.attacks.spsa import ( TensorOptimizer, TensorGradientDescent, TensorAdam, ) # pylint: disable=unused-import from cleverhans.attacks.spsa import ( SPSAAdam, margin_logit_loss, _apply_black_border, ) # pylint: disable=unused-import from cleverhans.attacks.spsa import ( _apply_transformation, spm, parallel_apply_transformations, ) # pylint: disable=unused-import from cleverhans.attacks.virtual_adversarial_method import ( vatm, ) # pylint: disable=unused-import from cleverhans.utils_tf import ( jacobian_graph, jacobian_augmentation, ) # pylint: disable=unused-import from cleverhans import utils np_dtype = np.dtype("float32") _logger = utils.create_logger("cleverhans.attacks.tf") warnings.warn( "attacks_tf is deprecated and will be removed on 2019-07-18" " or after. Code should import functions from their new locations directly." ) def fgsm(x, predictions, eps=0.3, clip_min=None, clip_max=None): warnings.warn( "This function is deprecated and will be removed on or after " "2019-04-09. Switch to cleverhans.attacks.FastGradientMethod." ) return fgm( x, predictions, y=None, eps=eps, ord=np.inf, clip_min=clip_min, clip_max=clip_max, ) def fgm(x, preds, *args, **kwargs): if preds.op.type == "Softmax": (logits,) = preds.op.inputs else: raise TypeError("Unclear how to get logits") warnings.warn( "This function is deprecated. Switch to passing *logits* to" " cleverhans.attacks.fgm" ) from cleverhans.attacks import fgm as logits_fgm return logits_fgm(x, logits, *args, **kwargs) def apply_perturbations(i, j, X, increase, theta, clip_min, clip_max): """ TensorFlow implementation for apply perturbations to input features based on saliency maps :param i: index of first selected feature :param j: index of second selected feature :param X: a matrix containing our input features for our sample :param increase: boolean; true if we are increasing pixels, false otherwise :param theta: delta for each feature adjustment :param clip_min: mininum value for a feature in our sample :param clip_max: maximum value for a feature in our sample : return: a perturbed input feature matrix for a target class """ warnings.warn( "This function is dead code and will be removed on or after 2019-07-18" ) # perturb our input sample if increase: X[0, i] = np.minimum(clip_max, X[0, i] + theta) X[0, j] = np.minimum(clip_max, X[0, j] + theta) else: X[0, i] = np.maximum(clip_min, X[0, i] - theta) X[0, j] = np.maximum(clip_min, X[0, j] - theta) return X def saliency_map(grads_target, grads_other, search_domain, increase): """ TensorFlow implementation for computing saliency maps :param grads_target: a matrix containing forward derivatives for the target class :param grads_other: a matrix where every element is the sum of forward derivatives over all non-target classes at that index :param search_domain: the set of input indices that we are considering :param increase: boolean; true if we are increasing pixels, false otherwise :return: (i, j, search_domain) the two input indices selected and the updated search domain """ warnings.warn( "This function is dead code and will be removed on or after 2019-07-18" ) # Compute the size of the input (the number of features) nf = len(grads_target) # Remove the already-used input features from the search space invalid = list(set(range(nf)) - search_domain) increase_coef = 2 * int(increase) - 1 grads_target[invalid] = -increase_coef * np.max(np.abs(grads_target)) grads_other[invalid] = increase_coef * np.max(np.abs(grads_other)) # Create a 2D numpy array of the sum of grads_target and grads_other target_sum = grads_target.reshape((1, nf)) + grads_target.reshape((nf, 1)) other_sum = grads_other.reshape((1, nf)) + grads_other.reshape((nf, 1)) # Create a mask to only keep features that match saliency map conditions if increase: scores_mask = (target_sum > 0) & (other_sum < 0) else: scores_mask = (target_sum < 0) & (other_sum > 0) # Create a 2D numpy array of the scores for each pair of candidate features scores = scores_mask * (-target_sum * other_sum) # A pixel can only be selected (and changed) once np.fill_diagonal(scores, 0) # Extract the best two pixels best = np.argmax(scores) p1, p2 = best % nf, best // nf # Remove used pixels from our search domain search_domain.discard(p1) search_domain.discard(p2) return p1, p2, search_domain def jacobian(sess, x, grads, target, X, nb_features, nb_classes, feed=None): """ TensorFlow implementation of the foward derivative / Jacobian :param x: the input placeholder :param grads: the list of TF gradients returned by jacobian_graph() :param target: the target misclassification class :param X: numpy array with sample input :param nb_features: the number of features in the input :return: matrix of forward derivatives flattened into vectors """ warnings.warn( "This function is dead code and will be removed on or after 2019-07-18" ) # Prepare feeding dictionary for all gradient computations feed_dict = {x: X} if feed is not None: feed_dict.update(feed) # Initialize a numpy array to hold the Jacobian component values jacobian_val = np.zeros((nb_classes, nb_features), dtype=np_dtype) # Compute the gradients for all classes for class_ind, grad in enumerate(grads): run_grad = sess.run(grad, feed_dict) jacobian_val[class_ind] = np.reshape(run_grad, (1, nb_features)) # Sum over all classes different from the target class to prepare for # saliency map computation in the next step of the attack other_classes = utils.other_classes(nb_classes, target) grad_others = np.sum(jacobian_val[other_classes, :], axis=0) return jacobian_val[target], grad_others class UnrolledOptimizer(TensorOptimizer): def __init__(self, *args, **kwargs): warnings.warn( "UnrolledOptimizer has been renamed to TensorOptimizer." " The old name may be removed on or after 2019-04-25." ) super(UnrolledOptimizer, self).__init__(*args, **kwargs) class UnrolledGradientDescent(TensorGradientDescent): def __init__(self, *args, **kwargs): warnings.warn( "UnrolledGradientDescent has been renamed to " "TensorGradientDescent." " The old name may be removed on or after 2019-04-25." ) super(UnrolledGradientDescent, self).__init__(*args, **kwargs) class UnrolledAdam(TensorAdam): def __init__(self, *args, **kwargs): warnings.warn( "UnrolledAdam has been renamed to TensorAdam." " The old name may be removed on or after 2019-04-25." ) super(UnrolledAdam, self).__init__(*args, **kwargs) def pgd_attack(*args, **kwargs): warnings.warn( "cleverhans.attacks_tf.pgd_attack has been renamed to " "cleverhans.attacks.projected_optimization. " "Please switch to the new name. The current name will " "become unsupport on or after 2019-04-24." ) from cleverhans.attacks import projected_optimization return projected_optimization(*args, **kwargs) ================================================ FILE: cleverhans_v3.1.0/cleverhans/attacks_tfe.py ================================================ """ Attacks for TensorFlow Eager """ from distutils.version import LooseVersion import numpy as np import tensorflow as tf from cleverhans import attacks from cleverhans import utils from cleverhans.model import CallableModelWrapper, wrapper_warning from cleverhans.model import Model from cleverhans.loss import LossCrossEntropy _logger = utils.create_logger("cleverhans.attacks_tfe") if LooseVersion(tf.__version__) < LooseVersion("1.8.0"): error_msg = ("For eager execution", "use Tensorflow version greather than 1.8.0.") raise ValueError(error_msg) class Attack(attacks.Attack): """ Abstract base class for all eager attack classes. :param model: An instance of the cleverhans.model.Model class. :param back: The backend to use. Inherited from AttackBase class. :param dtypestr: datatype of the input data samples and crafted adversarial attacks. """ def __init__(self, model, dtypestr="float32"): super(Attack, self).__init__(model, dtypestr=dtypestr) # Validate the input arguments. if dtypestr != "float32" and dtypestr != "float64": raise ValueError("Unexpected input for argument dtypestr.") self.tf_dtype = tf.as_dtype(dtypestr) self.np_dtype = np.dtype(dtypestr) if not isinstance(model, Model): raise ValueError( "The model argument should be an instance of" " the cleverhans.model.Model class." ) # Prepare attributes self.model = model self.dtypestr = dtypestr def construct_graph(self, **kwargs): """ Constructs the graph required to run the attacks. Is inherited from the attack class, is overloaded to raise an error. """ error = "This method is not required for eager execution." raise AttributeError(error) def generate_np(self, x_val, **kwargs): """ Generate adversarial examples and return them as a NumPy array. :param x_val: A NumPy array with the original inputs. :param **kwargs: optional parameters used by child classes. :return: A NumPy array holding the adversarial examples. """ tfe = tf.contrib.eager x = tfe.Variable(x_val) adv_x = self.generate(x, **kwargs) return adv_x.numpy() def construct_variables(self, kwargs): """ Construct the inputs to the attack graph. Is inherited from the attack class, is overloaded to raise an error. """ error = "This method is not required for eager execution." raise AttributeError(error) class FastGradientMethod(Attack, attacks.FastGradientMethod): """ Inherited class from Attack and cleverhans.attacks.FastGradientMethod. This attack was originally implemented by Goodfellow et al. (2015) with the infinity norm (and is known as the "Fast Gradient Sign Method"). This implementation extends the attack to other norms, and is therefore called the Fast Gradient Method. Paper link: https://arxiv.org/abs/1412.6572 """ def __init__(self, model, dtypestr="float32", **kwargs): """ Creates a FastGradientMethod instance in eager execution. :model: cleverhans.model.Model :dtypestr: datatype in the string format. """ del kwargs if not isinstance(model, Model): wrapper_warning() model = CallableModelWrapper(model, "probs") super(FastGradientMethod, self).__init__(model, dtypestr) def generate(self, x, **kwargs): """ Generates the adversarial sample for the given input. :param x: The model's inputs. :param eps: (optional float) attack step size (input variation) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param y: (optional) A tf variable` with the model labels. Only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param y_target: (optional) A tf variable` with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) return self.fgm(x, labels=labels, targeted=(self.y_target is not None)) def fgm(self, x, labels, targeted=False): """ TensorFlow Eager implementation of the Fast Gradient Method. :param x: the input variable :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ # Compute loss with tf.GradientTape() as tape: # input should be watched because it may be # combination of trainable and non-trainable variables tape.watch(x) loss_obj = LossCrossEntropy(self.model, smoothing=0.0) loss = loss_obj.fprop(x=x, y=labels) if targeted: loss = -loss # Define gradient of loss wrt input grad = tape.gradient(loss, x) optimal_perturbation = attacks.optimize_linear(grad, self.eps, self.ord) # Add perturbation to original example to obtain adversarial example adv_x = x + optimal_perturbation # If clipping is needed # reset all values outside of [clip_min, clip_max] if (self.clip_min is not None) and (self.clip_max is not None): adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x class BasicIterativeMethod(Attack, attacks.BasicIterativeMethod): """ Inherited class from Attack and cleverhans.attacks.BasicIterativeMethod. The Basic Iterative Method (Kurakin et al. 2016). The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1607.02533.pdf """ FGM_CLASS = FastGradientMethod def __init__(self, model, dtypestr="float32"): """ Creates a BasicIterativeMethod instance in eager execution. :param model: cleverhans.model.Model :param dtypestr: datatype in the string format. """ if not isinstance(model, Model): wrapper_warning() model = CallableModelWrapper(model, "probs") super(BasicIterativeMethod, self).__init__(model, dtypestr) ================================================ FILE: cleverhans_v3.1.0/cleverhans/augmentation.py ================================================ """ Dataset augmentation functionality NOTE: This module is much more free to change than many other modules in CleverHans. CleverHans is very conservative about changes to any code that affects the output of benchmark tests (attacks, evaluation methods, etc.). This module provides *dataset augmentation* code for building models to be benchmarked, not *benchmarks,* and thus is free to change rapidly to provide better speed, accuracy, etc. """ import tensorflow as tf # Convenient renaming of existing function random_horizontal_flip = tf.image.random_flip_left_right def random_shift(x, pad=(4, 4), mode="REFLECT"): """Pad a single image and then crop to the original size with a random offset.""" assert mode in "REFLECT SYMMETRIC CONSTANT".split() assert x.get_shape().ndims == 3 xp = tf.pad(x, [[pad[0], pad[0]], [pad[1], pad[1]], [0, 0]], mode) return tf.random_crop(xp, tf.shape(x)) def batch_augment(x, func, device="/CPU:0"): """ Apply dataset augmentation to a batch of exmaples. :param x: Tensor representing a batch of examples. :param func: Callable implementing dataset augmentation, operating on a single image. :param device: String specifying which device to use. """ with tf.device(device): return tf.map_fn(func, x) def random_crop_and_flip(x, pad_rows=4, pad_cols=4): """Augment a batch by randomly cropping and horizontally flipping it.""" rows = tf.shape(x)[1] cols = tf.shape(x)[2] channels = x.get_shape()[3] def _rand_crop_img(img): """Randomly crop an individual image""" return tf.random_crop(img, [rows, cols, channels]) # Some of these ops are only on CPU. # This function will often be called with the device set to GPU. # We need to set it to CPU temporarily to avoid an exception. with tf.device("/CPU:0"): x = tf.image.resize_image_with_crop_or_pad(x, rows + pad_rows, cols + pad_cols) x = tf.map_fn(_rand_crop_img, x) x = tf.image.random_flip_left_right(x) return x ================================================ FILE: cleverhans_v3.1.0/cleverhans/canary.py ================================================ """ Canary code that dies if the underlying hardware / drivers aren't working right. """ import time import numpy as np import tensorflow as tf from cleverhans.utils_tf import infer_devices last_run = None def run_canary(): """ Runs some code that will crash if the GPUs / GPU driver are suffering from a common bug. This helps to prevent contaminating results in the rest of the library with incorrect calculations. """ # Note: please do not edit this function unless you have access to a machine # with GPUs suffering from the bug and can verify that the canary still # crashes after your edits. Due to the transient nature of the GPU bug it is # not possible to unit test the canary in our continuous integration system. global last_run current = time.time() if last_run is None or current - last_run > 3600: last_run = current else: # Run the canary at most once per hour return # Try very hard not to let the canary affect the graph for the rest of the # python process canary_graph = tf.Graph() with canary_graph.as_default(): devices = infer_devices() num_devices = len(devices) if num_devices < 3: # We have never observed GPU failure when less than 3 GPUs were used return v = np.random.RandomState([2018, 10, 16]).randn(2, 2) # Try very hard not to let this Variable end up in any collections used # by the rest of the python process w = tf.Variable(v, trainable=False, collections=[]) loss = tf.reduce_sum(tf.square(w)) grads = [] for device in devices: with tf.device(device): (grad,) = tf.gradients(loss, w) grads.append(grad) sess = tf.Session() sess.run(tf.variables_initializer([w])) grads = sess.run(grads) first = grads[0] for grad in grads[1:]: if not np.allclose(first, grad): first_string = str(first) grad_string = str(grad) raise RuntimeError( "Something is wrong with your GPUs or GPU driver." "%(num_devices)d different GPUS were asked to " "calculate the same 2x2 gradient. One returned " "%(first_string)s and another returned " "%(grad_string)s. This can usually be fixed by " "rebooting the machine." % { "num_devices": num_devices, "first_string": first_string, "grad_string": grad_string, } ) sess.close() if __name__ == "__main__": run_canary() ================================================ FILE: cleverhans_v3.1.0/cleverhans/compat.py ================================================ """ Wrapper functions for writing code that is compatible with many versions of TensorFlow. """ import warnings import tensorflow as tf # The following 2 imports are not used in this module. They are imported so that users of cleverhans.compat can # get access to device_lib, app, and flags. A pylint bug makes these imports cause errors when using python3+tf1.8. # Doing the sanitized import here once makes it possible to do "from cleverhans.compat import flags" throughout the # library without needing to repeat the pylint boilerplate. from tensorflow.python.client import ( device_lib, ) # pylint: disable=no-name-in-module,unused-import from tensorflow.python.platform import ( app, flags, ) # pylint: disable=no-name-in-module,unused-import def _wrap(f): """ Wraps a callable `f` in a function that warns that the function is deprecated. """ def wrapper(*args, **kwargs): """ Issues a deprecation warning and passes through the arguments. """ warnings.warn( str(f) + " is deprecated. Switch to calling the equivalent function in tensorflow. " " This function was originally needed as a compatibility layer for old versions of tensorflow, " " but support for those versions has now been dropped." ) return f(*args, **kwargs) return wrapper reduce_sum = _wrap(tf.reduce_sum) reduce_max = _wrap(tf.reduce_max) reduce_min = _wrap(tf.reduce_min) reduce_mean = _wrap(tf.reduce_mean) reduce_prod = _wrap(tf.reduce_prod) reduce_any = _wrap(tf.reduce_any) def reduce_function( op_func, input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None ): """ This function used to be needed to support tf 1.4 and early, but support for tf 1.4 and earlier is now dropped. :param op_func: expects the function to handle eg: tf.reduce_sum. :param input_tensor: The tensor to reduce. Should have numeric type. :param axis: The dimensions to reduce. If None (the default), reduces all dimensions. Must be in the range [-rank(input_tensor), rank(input_tensor)). :param keepdims: If true, retains reduced dimensions with length 1. :param name: A name for the operation (optional). :param reduction_indices: The old (deprecated) name for axis. :return: outputs same value as op_func. """ warnings.warn( "`reduce_function` is deprecated and may be removed on or after 2019-09-08." ) out = op_func( input_tensor, axis=axis, keepdims=keepdims, name=name, reduction_indices=reduction_indices, ) return out def softmax_cross_entropy_with_logits(sentinel=None, labels=None, logits=None, dim=-1): """ Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle deprecated warning """ # Make sure that all arguments were passed as named arguments. if sentinel is not None: name = "softmax_cross_entropy_with_logits" raise ValueError( "Only call `%s` with " "named arguments (labels=..., logits=..., ...)" % name ) if labels is None or logits is None: raise ValueError("Both labels and logits must be provided.") try: f = tf.nn.softmax_cross_entropy_with_logits_v2 except AttributeError: raise RuntimeError( "This version of TensorFlow is no longer supported. See cleverhans/README.md" ) labels = tf.stop_gradient(labels) loss = f(labels=labels, logits=logits, dim=dim) return loss ================================================ FILE: cleverhans_v3.1.0/cleverhans/confidence_report.py ================================================ """Functionality for making confidence reports. A confidence report is a dictionary. Each dictionary key is the name of a type of data: clean : Clean data bundled : bundled adversarial examples Each value in the dictionary contains an array of bools indicating whether the model got each example correct and an array containing the confidence that the model assigned to each prediction. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from collections import OrderedDict import logging import time import warnings import numpy as np import six import tensorflow as tf from cleverhans.attacks import MaxConfidence from cleverhans.attacks import Semantic from cleverhans.evaluation import correctness_and_confidence from cleverhans.evaluation import run_attack from cleverhans.utils import set_log_level from cleverhans.serial import load, save from cleverhans.utils_tf import infer_devices # Defaults. Imported elsewhere so that command line script defaults match # function defaults. TRAIN_START = 0 TRAIN_END = 60000 TEST_START = 0 TEST_END = 10000 WHICH_SET = "test" RECIPE = "basic_max_confidence_recipe" REPORT_PATH = None # Used for `make_confidence_report` but not `make_confidence_report_bundled` devices = infer_devices() num_devices = len(devices) BATCH_SIZE = 128 * num_devices MC_BATCH_SIZE = 16 * num_devices NB_ITER = 40 BASE_EPS_ITER = None # Differs by dataset SAVE_ADVX = 1 class ConfidenceReport(OrderedDict): """ A data structure reporting how much confidence a model assigned to its predictions on each example and whether those predictions were correct. This class is just a dictionary with some type checks. It maps string data type names (like "clean" for clean data or "Semantic" for semantic adversarial examples) to ConfidenceReportEntry instances. :param iterable: optional iterable containing (key, value) tuples """ def __init__(self, iterable=None): super(ConfidenceReport, self).__init__() # This field tracks whether the report is completed. # It's important e.g. for reports that are made by bundlers and repeatedly # written to disk during the process. This field makes it possible to tell # whether a report on disk is complete or whether the bundling process # got killed (e.g. due to VM migration) self.completed = False if iterable is not None: # pickle sometimes wants to use this interface to unpickle the OrderedDict for key, value in iterable: self[key] = value def __setitem__(self, key, value): assert isinstance(key, six.string_types) if not isinstance(value, ConfidenceReportEntry): raise TypeError( "`value` must be a ConfidenceReportEntry, but got " + str(value) + " of type " + str(type(value)) ) super(ConfidenceReport, self).__setitem__(key, value) class ConfidenceReportEntry(object): """ A data structure reporting how much confidence a model assigned to its predictions on each example and whether those predictions were correct. :param correctness: ndarray, one bool per example indicating whether it was correct :param confidence: ndarray, one floating point value per example reporting the probability assigned to the prediction for that example """ def __init__(self, correctness, confidence): assert isinstance(correctness, np.ndarray) assert isinstance(correctness, np.ndarray) assert correctness.ndim == 1 assert confidence.ndim == 1 assert correctness.dtype == np.bool, correctness.dtype assert np.issubdtype(confidence.dtype, np.floating) assert correctness.shape == confidence.shape assert confidence.min() >= 0.0 assert confidence.max() <= 1.0 self.correctness = correctness self.confidence = confidence def __getitem__(self, key): warnings.warn( "Dictionary confidence report entries are deprecated. " "Switch to accessing the appropriate field of " "ConfidenceReportEntry. " "Dictionary-style access will be removed on or after " "2019-04-24." ) assert key in ["correctness", "confidence"] return self.__dict__[key] def __setitem__(self, key, value): warnings.warn( "Dictionary confidence report entries are deprecated." "Switch to accessing the appropriate field of " "ConfidenceReportEntry. " "Dictionary-style access will be removed on or after " "2019-04-24." ) assert key in ["correctness", "confidence"] self.__dict__[key] = value def make_confidence_report_bundled( filepath, train_start=TRAIN_START, train_end=TRAIN_END, test_start=TEST_START, test_end=TEST_END, which_set=WHICH_SET, recipe=RECIPE, report_path=REPORT_PATH, nb_iter=NB_ITER, base_eps=None, base_eps_iter=None, base_eps_iter_small=None, batch_size=BATCH_SIZE, ): """ Load a saved model, gather its predictions, and save a confidence report. :param filepath: path to model to evaluate :param train_start: index of first training set example to use :param train_end: index of last training set example to use :param test_start: index of first test set example to use :param test_end: index of last test set example to use :param which_set: 'train' or 'test' :param nb_iter: int, number of iterations of attack algorithm (note that different recipes will use this differently, for example many will run two attacks, one with nb_iter iterations and one with 25X more) :param base_eps: float, epsilon parameter for threat model, on a scale of [0, 1]. Inferred from the dataset if not specified. :param base_eps_iter: float, a step size used in different ways by different recipes. Typically the step size for a PGD attack. Inferred from the dataset if not specified. :param base_eps_iter_small: float, a second step size for a more fine-grained attack. Inferred from the dataset if not specified. :param batch_size: int, batch size """ # Avoid circular import from cleverhans import attack_bundling if callable(recipe): run_recipe = recipe else: run_recipe = getattr(attack_bundling, recipe) # Set logging level to see debug information set_log_level(logging.INFO) # Create TF session sess = tf.Session() assert filepath.endswith(".joblib") if report_path is None: report_path = filepath[: -len(".joblib")] + "_bundled_report.joblib" with sess.as_default(): model = load(filepath) assert len(model.get_params()) > 0 factory = model.dataset_factory factory.kwargs["train_start"] = train_start factory.kwargs["train_end"] = train_end factory.kwargs["test_start"] = test_start factory.kwargs["test_end"] = test_end dataset = factory() center = dataset.kwargs["center"] if "max_val" in factory.kwargs: max_value = factory.kwargs["max_val"] elif hasattr(dataset, "max_val"): max_value = dataset.max_val else: raise AttributeError("Can't find max_value specification") min_value = 0.0 - center * max_value value_range = max_value - min_value if "CIFAR" in str(factory.cls): if base_eps is None: base_eps = 8.0 / 255.0 if base_eps_iter is None: base_eps_iter = 2.0 / 255.0 if base_eps_iter_small is None: base_eps_iter_small = 1.0 / 255.0 elif "MNIST" in str(factory.cls): if base_eps is None: base_eps = 0.3 if base_eps_iter is None: base_eps_iter = 0.1 base_eps_iter_small = None else: # Note that it is not required to specify base_eps_iter_small if base_eps is None or base_eps_iter is None: raise NotImplementedError( "Not able to infer threat model from " + str(factory.cls) ) eps = base_eps * value_range eps_iter = base_eps_iter * value_range if base_eps_iter_small is None: eps_iter_small = None else: eps_iter_small = base_eps_iter_small * value_range clip_min = min_value clip_max = max_value x_data, y_data = dataset.get_set(which_set) assert x_data.max() <= max_value assert x_data.min() >= min_value assert eps_iter <= eps assert eps_iter_small is None or eps_iter_small <= eps # Different recipes take different arguments. # For now I don't have an idea for a beautiful unifying framework, so # we get an if statement. if recipe == "random_search_max_confidence_recipe": # pylint always checks against the default recipe here # pylint: disable=no-value-for-parameter run_recipe( sess=sess, model=model, x=x_data, y=y_data, eps=eps, clip_min=clip_min, clip_max=clip_max, report_path=report_path, ) else: run_recipe( sess=sess, model=model, x=x_data, y=y_data, nb_classes=dataset.NB_CLASSES, eps=eps, clip_min=clip_min, clip_max=clip_max, eps_iter=eps_iter, nb_iter=nb_iter, report_path=report_path, eps_iter_small=eps_iter_small, batch_size=batch_size, ) def print_stats(correctness, confidence, name): """ Prints out accuracy, coverage, etc. statistics :param correctness: ndarray One bool per example specifying whether it was correctly classified :param confidence: ndarray The probability associated with each prediction :param name: str The name of this type of data (e.g. "clean", "MaxConfidence") """ accuracy = correctness.mean() wrongness = 1 - correctness denom1 = np.maximum(1, wrongness.sum()) ave_prob_on_mistake = (wrongness * confidence).sum() / denom1 assert ave_prob_on_mistake <= 1.0, ave_prob_on_mistake denom2 = np.maximum(1, correctness.sum()) ave_prob_on_correct = (correctness * confidence).sum() / denom2 covered = confidence > 0.5 cov_half = covered.mean() acc_half = (correctness * covered).sum() / np.maximum(1, covered.sum()) print("Accuracy on %s examples: %0.4f" % (name, accuracy)) print("Average prob on mistakes: %0.4f" % ave_prob_on_mistake) print("Average prob on correct: %0.4f" % ave_prob_on_correct) print("Accuracy when prob thresholded at .5: %0.4f" % acc_half) print("Coverage when prob thresholded at .5: %0.4f" % cov_half) success_rate = acc_half * cov_half # Success is correctly classifying a covered example print("Success rate at .5: %0.4f" % success_rate) # Failure is misclassifying a covered example failure_rate = (1.0 - acc_half) * cov_half print("Failure rate at .5: %0.4f" % failure_rate) print() def make_confidence_report( filepath, train_start=TRAIN_START, train_end=TRAIN_END, test_start=TEST_START, test_end=TEST_END, batch_size=BATCH_SIZE, which_set=WHICH_SET, mc_batch_size=MC_BATCH_SIZE, report_path=REPORT_PATH, base_eps_iter=BASE_EPS_ITER, nb_iter=NB_ITER, save_advx=SAVE_ADVX, ): """ Load a saved model, gather its predictions, and save a confidence report. This function works by running a single MaxConfidence attack on each example. This provides a reasonable estimate of the true failure rate quickly, so long as the model does not suffer from gradient masking. However, this estimate is mostly intended for development work and not for publication. A more accurate estimate may be obtained by running make_confidence_report_bundled.py instead. :param filepath: path to model to evaluate :param train_start: index of first training set example to use :param train_end: index of last training set example to use :param test_start: index of first test set example to use :param test_end: index of last test set example to use :param batch_size: size of evaluation batches :param which_set: 'train' or 'test' :param mc_batch_size: batch size for MaxConfidence attack :param base_eps_iter: step size if the data were in [0,1] (Step size will be rescaled proportional to the actual data range) :param nb_iter: Number of iterations of PGD to run per class :param save_advx: bool. If True, saves the adversarial examples to disk. On by default, but can be turned off to save memory, etc. """ # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.INFO) # Create TF session sess = tf.Session() if report_path is None: assert filepath.endswith(".joblib") report_path = filepath[: -len(".joblib")] + "_report.joblib" with sess.as_default(): model = load(filepath) assert len(model.get_params()) > 0 factory = model.dataset_factory factory.kwargs["train_start"] = train_start factory.kwargs["train_end"] = train_end factory.kwargs["test_start"] = test_start factory.kwargs["test_end"] = test_end dataset = factory() center = dataset.kwargs["center"] max_val = dataset.kwargs["max_val"] value_range = max_val * (1.0 + center) min_value = 0.0 - center * max_val if "CIFAR" in str(factory.cls): base_eps = 8.0 / 255.0 if base_eps_iter is None: base_eps_iter = 2.0 / 255.0 elif "MNIST" in str(factory.cls): base_eps = 0.3 if base_eps_iter is None: base_eps_iter = 0.1 else: raise NotImplementedError(str(factory.cls)) mc_params = { "eps": base_eps * value_range, "eps_iter": base_eps_iter * value_range, "nb_iter": nb_iter, "clip_min": min_value, "clip_max": max_val, } x_data, y_data = dataset.get_set(which_set) report = ConfidenceReport() semantic = Semantic(model, center, max_val, sess) mc = MaxConfidence(model, sess=sess) jobs = [ ("clean", None, None, None, False), ("Semantic", semantic, None, None, False), ("mc", mc, mc_params, mc_batch_size, True), ] for job in jobs: name, attack, attack_params, job_batch_size, save_this_job = job if job_batch_size is None: job_batch_size = batch_size t1 = time.time() if save_advx and save_this_job: # If we want to save the adversarial examples to the filesystem, we need # to fetch all of them. Otherwise they're just computed one batch at a # time and discarded # The path to save to assert report_path.endswith(".joblib") advx_path = report_path[: -len(".joblib")] + "_advx_" + name + ".npy" # Fetch the adversarial examples x_data = run_attack( sess, model, x_data, y_data, attack, attack_params, batch_size=job_batch_size, devices=devices, ) # Turn off the attack so `correctness_and_confidence` won't run it a # second time. attack = None attack_params = None # Save the adversarial examples np.save(advx_path, x_data) # Run correctness and confidence evaluation on adversarial examples packed = correctness_and_confidence( sess, model, x_data, y_data, batch_size=job_batch_size, devices=devices, attack=attack, attack_params=attack_params, ) t2 = time.time() print("Evaluation took", t2 - t1, "seconds") correctness, confidence = packed report[name] = ConfidenceReportEntry( correctness=correctness, confidence=confidence ) print_stats(correctness, confidence, name) save(report_path, report) ================================================ FILE: cleverhans_v3.1.0/cleverhans/dataset.py ================================================ """Dataset class for CleverHans """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import array import functools import gzip import operator import os import struct import tempfile import sys import warnings import numpy as np import tensorflow as tf try: from tensorflow.python.keras.utils import np_utils from tensorflow.keras.datasets import cifar10 except ImportError: # In tf 1.8, np_utils doesn't seem to be publicly exposed. # In later tf versions, it is, and in pre-tf keras it was too. from tensorflow.python.keras import _impl np_utils = _impl.keras.utils.np_utils # In tf 1.8, "from tensorflow.keras.datasets import cifar10" doesn't work even though the module exists cifar10 = tf.keras.datasets.cifar10 warnings.warn( "Support for TensorFlow versions prior to 1.12 is deprecated." " CleverHans using earlier versions may quit working on or after 2019-07-07." ) from cleverhans import utils class Dataset(object): """Abstract base class representing a dataset.""" # The number of classes in the dataset. Should be specified by subclasses. NB_CLASSES = None def __init__(self, kwargs=None): if kwargs is None: kwargs = {} if "self" in kwargs: del kwargs["self"] self.kwargs = kwargs def get_factory(self): """Returns a picklable callable that recreates the dataset.""" return Factory(type(self), self.kwargs) def get_set(self, which_set): """Returns the training set or test set as an (x_data, y_data) tuple. :param which_set: 'train' or 'test' """ return (getattr(self, "x_" + which_set), getattr(self, "y_" + which_set)) def to_tensorflow(self): raise NotImplementedError() @classmethod def in_memory_dataset(cls, x, y, shuffle=None, repeat=True): assert x.shape[0] == y.shape[0] d = tf.data.Dataset.range(x.shape[0]) if repeat: d = d.repeat() if shuffle: d = d.shuffle(shuffle) def lookup(p): return x[p], y[p] d = d.map(lambda i: tf.py_func(lookup, [i], [tf.float32] * 2)) return d class MNIST(Dataset): """The MNIST dataset""" NB_CLASSES = 10 def __init__( self, train_start=0, train_end=60000, test_start=0, test_end=10000, center=False, max_val=1.0, ): kwargs = locals() if "__class__" in kwargs: del kwargs["__class__"] super(MNIST, self).__init__(kwargs) x_train, y_train, x_test, y_test = data_mnist( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) if center: x_train = x_train * 2.0 - 1.0 x_test = x_test * 2.0 - 1.0 x_train *= max_val x_test *= max_val self.x_train = x_train.astype("float32") self.y_train = y_train.astype("float32") self.x_test = x_test.astype("float32") self.y_test = y_test.astype("float32") def to_tensorflow(self, shuffle=4096): return ( self.in_memory_dataset(self.x_train, self.y_train, shuffle), self.in_memory_dataset(self.x_test, self.y_test, repeat=False), ) class CIFAR10(Dataset): """The CIFAR-10 dataset""" NB_CLASSES = 10 LABEL_NAMES = [ "airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck", ] def __init__( self, train_start=0, train_end=60000, test_start=0, test_end=10000, center=False, max_val=1.0, ): kwargs = locals() if "__class__" in kwargs: del kwargs["__class__"] super(CIFAR10, self).__init__(kwargs) packed = data_cifar10( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train, x_test, y_test = packed if center: x_train = x_train * 2.0 - 1.0 x_test = x_test * 2.0 - 1.0 x_train *= max_val x_test *= max_val self.x_train = x_train self.y_train = y_train self.x_test = x_test self.y_test = y_test self.max_val = max_val def to_tensorflow(self, shuffle=4096): # This is much more efficient with data augmentation, see tutorials. return ( self.in_memory_dataset(self.x_train, self.y_train, shuffle), self.in_memory_dataset(self.x_test, self.y_test, repeat=False), ) class Factory(object): """ A callable that creates an object of the specified type and configuration. """ def __init__(self, cls, kwargs): self.cls = cls self.kwargs = kwargs def __call__(self): """Returns the created object.""" return self.cls(**self.kwargs) def maybe_download_file(url, datadir=None, force=False): try: from urllib.request import urlretrieve except ImportError: from urllib import urlretrieve if not datadir: datadir = tempfile.gettempdir() file_name = url[url.rfind("/") + 1 :] dest_file = os.path.join(datadir, file_name) isfile = os.path.isfile(dest_file) if force or not isfile: urlretrieve(url, dest_file) return dest_file def download_and_parse_mnist_file(file_name, datadir=None, force=False): url = os.path.join('https://storage.googleapis.com/cvdf-datasets/mnist/', file_name) file_name = maybe_download_file(url, datadir=datadir, force=force) # Open the file and unzip it if necessary if os.path.splitext(file_name)[1] == ".gz": open_fn = gzip.open else: open_fn = open # Parse the file with open_fn(file_name, "rb") as file_descriptor: header = file_descriptor.read(4) assert len(header) == 4 zeros, data_type, n_dims = struct.unpack(">HBB", header) assert zeros == 0 hex_to_data_type = { 0x08: "B", 0x09: "b", 0x0B: "h", 0x0C: "i", 0x0D: "f", 0x0E: "d", } data_type = hex_to_data_type[data_type] # data_type unicode to ascii conversion (Python2 fix) if sys.version_info[0] < 3: data_type = data_type.encode("ascii", "ignore") dim_sizes = struct.unpack(">" + "I" * n_dims, file_descriptor.read(4 * n_dims)) data = array.array(data_type, file_descriptor.read()) data.byteswap() desired_items = functools.reduce(operator.mul, dim_sizes) assert len(data) == desired_items return np.array(data).reshape(dim_sizes) def data_mnist( datadir=tempfile.gettempdir(), train_start=0, train_end=60000, test_start=0, test_end=10000, ): """ Load and preprocess MNIST dataset :param datadir: path to folder where data should be stored :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :return: tuple of four arrays containing training data, training labels, testing data and testing labels. """ assert isinstance(train_start, int) assert isinstance(train_end, int) assert isinstance(test_start, int) assert isinstance(test_end, int) X_train = ( download_and_parse_mnist_file("train-images-idx3-ubyte.gz", datadir=datadir) / 255.0 ) Y_train = download_and_parse_mnist_file( "train-labels-idx1-ubyte.gz", datadir=datadir ) X_test = ( download_and_parse_mnist_file("t10k-images-idx3-ubyte.gz", datadir=datadir) / 255.0 ) Y_test = download_and_parse_mnist_file("t10k-labels-idx1-ubyte.gz", datadir=datadir) X_train = np.expand_dims(X_train, -1) X_test = np.expand_dims(X_test, -1) X_train = X_train[train_start:train_end] Y_train = Y_train[train_start:train_end] X_test = X_test[test_start:test_end] Y_test = Y_test[test_start:test_end] Y_train = utils.to_categorical(Y_train, nb_classes=10) Y_test = utils.to_categorical(Y_test, nb_classes=10) return X_train, Y_train, X_test, Y_test def data_cifar10(train_start=0, train_end=50000, test_start=0, test_end=10000): """ Preprocess CIFAR10 dataset :return: """ # These values are specific to CIFAR10 img_rows = 32 img_cols = 32 nb_classes = 10 # the data, shuffled and split between train and test sets (x_train, y_train), (x_test, y_test) = cifar10.load_data() if tf.keras.backend.image_data_format() == "channels_first": x_train = x_train.reshape(x_train.shape[0], 3, img_rows, img_cols) x_test = x_test.reshape(x_test.shape[0], 3, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 3) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 3) x_train = x_train.astype("float32") x_test = x_test.astype("float32") x_train /= 255 x_test /= 255 print("x_train shape:", x_train.shape) print(x_train.shape[0], "train samples") print(x_test.shape[0], "test samples") # convert class vectors to binary class matrices y_train = np_utils.to_categorical(y_train, nb_classes) y_test = np_utils.to_categorical(y_test, nb_classes) x_train = x_train[train_start:train_end, :, :, :] y_train = y_train[train_start:train_end, :] x_test = x_test[test_start:test_end, :] y_test = y_test[test_start:test_end, :] return x_train, y_train, x_test, y_test ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/LICENSE.txt ================================================ The devtools module is a derivative work from the devtools module of pylearn2. We reproduce the corresponding license here. Copyright (c) 2011--2014, Université de Montréal All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/__init__.py ================================================ ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/autopep8_all.py ================================================ """ Run this script to run autopep8 on everything in the library """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from cleverhans.devtools.list_files import list_files from cleverhans.utils import shell_call for f in list_files(".py"): command = ["autopep8", "-i", "--indent-size", "2", f] shell_call(command) ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/checks.py ================================================ """Functionality for building tests. We have to call this file "checks" and not anything with "test" as a substring or nosetests will execute it. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import time import unittest import numpy as np class CleverHansTest(unittest.TestCase): """TestCase with some extra features""" def setUp(self): self.test_start = time.time() # seed the randomness np.random.seed(1234) def tearDown(self): print(self.id(), "took", time.time() - self.test_start, "seconds") def assertClose(self, x, y, *args, **kwargs): """Assert that `x` and `y` have close to the same value""" # self.assertTrue(np.allclose(x, y)) doesn't give a useful message # on failure assert np.allclose(x, y, *args, **kwargs), (x, y) ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/list_files.py ================================================ """Code for listing files that belong to the library.""" import os import cleverhans def list_files(suffix=""): """ Returns a list of all files in CleverHans with the given suffix. Parameters ---------- suffix : str Returns ------- file_list : list A list of all files in CleverHans whose filepath ends with `suffix`. """ cleverhans_path = os.path.abspath(cleverhans.__path__[0]) # In some environments cleverhans_path does not point to a real directory. # In such case return empty list. if not os.path.isdir(cleverhans_path): return [] repo_path = os.path.abspath(os.path.join(cleverhans_path, os.pardir)) file_list = _list_files(cleverhans_path, suffix) extra_dirs = [ "cleverhans_tutorials", "examples", "scripts", "tests_tf", "tests_pytorch", ] for extra_dir in extra_dirs: extra_path = os.path.join(repo_path, extra_dir) if os.path.isdir(extra_path): extra_files = _list_files(extra_path, suffix) extra_files = [os.path.join(os.pardir, path) for path in extra_files] file_list = file_list + extra_files return file_list def _list_files(path, suffix=""): """ Returns a list of all files ending in `suffix` contained within `path`. Parameters ---------- path : str a filepath suffix : str Returns ------- l : list A list of all files ending in `suffix` contained within `path`. (If `path` is a file rather than a directory, it is considered to "contain" itself) """ if os.path.isdir(path): incomplete = os.listdir(path) complete = [os.path.join(path, entry) for entry in incomplete] lists = [_list_files(subpath, suffix) for subpath in complete] flattened = [] for one_list in lists: for elem in one_list: flattened.append(elem) return flattened else: assert os.path.exists(path), "couldn't find file '%s'" % path if path.endswith(suffix): return [path] return [] ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/mocks.py ================================================ """Utility functions for mocking up tests. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import copy import numpy as np from cleverhans.dataset import Dataset, np_utils def random_feed_dict(rng, placeholders): """ Returns random data to be used with `feed_dict`. :param rng: A numpy.random.RandomState instance :param placeholders: List of tensorflow placeholders :return: A dict mapping placeholders to random numpy values """ output = {} for placeholder in placeholders: if placeholder.dtype != "float32": raise NotImplementedError() value = rng.randn(*placeholder.shape).astype("float32") output[placeholder] = value return output class SimpleDataset(Dataset): """ A dataset containing random values. Values are uniformly distributed, either in [0, max_val] or [-1, max_val]. """ def __init__( self, dim=2, train_start=0, train_end=3, test_start=0, test_end=5, center=False, max_val=1.0, nb_classes=5, ): kwargs = copy.copy(locals()) del kwargs["self"] if "__class__" in kwargs: del kwargs["__class__"] super(SimpleDataset, self).__init__(kwargs) self.__dict__.update(kwargs) train_x_rng = np.random.RandomState([2018, 11, 9, 1]) # Even if train_start is not 0, we should still generate the first training examples from the rng. # This way the dataset looks like it is an array of deterministic data that we index using train_start. self.x_train = train_x_rng.uniform( -center * max_val, max_val, (train_end, dim) )[train_start:] # Use a second rng for the test set so that it also looks like an array of deterministic data that we # index into, unaffected by the number of training examples. test_x_rng = np.random.RandomState([2018, 11, 9, 2]) self.x_test = test_x_rng.uniform(-center * max_val, max_val, (test_end, dim))[ test_start: ] # Likewise, to keep the number of examples read from the rng affecting the values of the labels, we # must generate the labels from a different rng train_y_rng = np.random.RandomState([2018, 11, 9, 3]) self.y_train = train_y_rng.randint(low=0, high=nb_classes, size=(train_end, 1))[ train_start: ] test_y_rng = np.random.RandomState([2018, 11, 9, 4]) self.y_test = test_y_rng.randint(low=0, high=nb_classes, size=(test_end, 1))[ test_start: ] assert self.x_train.shape[0] == self.y_train.shape[0] assert self.x_test.shape[0] == self.y_test.shape[0] self.y_train = np_utils.to_categorical(self.y_train, nb_classes) self.y_test = np_utils.to_categorical(self.y_test, nb_classes) ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/tests/__init__.py ================================================ ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/tests/test_format.py ================================================ """ Unit tests for format checking """ from __future__ import print_function import os import subprocess import cleverhans from cleverhans.devtools.list_files import list_files from cleverhans.utils import shell_call # Enter a manual list of files that are allowed to violate PEP8 here whitelist_pep8 = [ # This file is broken but could be fixed "../examples/multigpu_advtrain/test_attack_multigpu.py" ] all_py_files = list_files(".py") def update_whitelist(): """Add files to the whitelist""" global whitelist_pep8 # We don't want to test RL-attack because it has so many dependencies # not used elsewhere, and pylint wants to import them all whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "RL-attack" in path ] ) # Similarly, we don't want to require robust_vision_benchmark installed whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "robust_vision_benchmark" in path ] ) # Similarly, we don't want to require that cloud be installed whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "cloud_client" in path ] ) # This example has more dependencies too whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "facenet_adversarial_faces" in path ] ) # This too whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "madry_lab_challenges" in path ] ) # This code is no longer compatible with new versions of cleverhans / scipy and will be removed soon whitelist_pep8.extend( [ os.path.relpath(path, cleverhans.__path__[0]) for path in all_py_files if "nips17_adversarial_competition" in path ] ) update_whitelist() whitelist_docstrings = [] def test_format_pep8(): """ Test if pep8 is respected. """ files_to_check = [] module_dir = cleverhans.__path__[0] for path in all_py_files: rel_path = os.path.relpath(path, module_dir) if rel_path in whitelist_pep8: continue else: files_to_check.append(path) repo_dir = os.path.join(module_dir, os.pardir) rcpath = os.path.join(repo_dir, ".pylintrc") assert os.path.exists(rcpath) # We must run pylint via the command line and subprocess because of # problems with the pylint module. # The documentation claims you can run it as a python module, but # the documentation is wrong: https://github.com/PyCQA/pylint/issues/1870 # If you run the version described in the linked issue, pylint # calls sys.exit once it is done, so it kills the test. # Running all files in one pylint command is important for 2 reasons: # 1) Correctness: pylint can detect issues that require access to multiple # files, such as cyclic imports # 2) Speed: pylint imports modules for deep analysis, so if you run # multiple subprocesses each needs to re-import tensorflow. # On Ian's laptop, pylint takes about 10s per file to run on the repo, # and there are about 90 files as of the writing of this comment. # Running pylint on all files simultaneously takes about 70s, so it # is a little better than a 10X speedup. # Running multiple jobs in parallel helps but far less than linearly. # On Ian's 4-core laptop, running 4 jobs drops the runtime from 70s # to 45s. # Some of the work is I/O, so it actually makes some sense to run # more jobs than cores. On Ian's 4-core laptop, running 8 jobs drops # the runtime to 40s. # There's a further complication though: I think each job needs to # redo imports, so the total amount of work to do increases with # the number of jobs. On Ian's laptop, using 64 jobs causes the # runtime to increase to 220s. There is not an obvious simple # formula like "use one job per CPU core" or "use way more jobs # than cores to saturate I/O". For now I'm hoping that 8 will be # a reasonable default: it gets good performance on my laptop, # and on machines with fewer than 4 cores there should still be # a benefit to not being blocked on I/O. try: shell_call(["pylint", "--rcfile", rcpath, "--jobs", "8"] + files_to_check) except subprocess.CalledProcessError as e: raise ValueError(e.output.decode("utf-8")) if __name__ == "__main__": test_format_pep8() ================================================ FILE: cleverhans_v3.1.0/cleverhans/devtools/version.py ================================================ """ Utility functions for keeping track of the version of CleverHans. These functions provide a finer level of granularity than the manually specified version string attached to each release. """ import hashlib from cleverhans.devtools.list_files import list_files def dev_version(): """ Returns a hexdigest of all the python files in the module. """ md5_hash = hashlib.md5() py_files = sorted(list_files(suffix=".py")) if not py_files: return "" for filename in py_files: with open(filename, "rb") as fobj: content = fobj.read() md5_hash.update(content) return md5_hash.hexdigest() def append_dev_version(release_version): """ If dev version is not empty appends it to release_version. """ dev_version_value = dev_version() if dev_version_value: return release_version + "-" + dev_version_value else: return release_version ================================================ FILE: cleverhans_v3.1.0/cleverhans/evaluation.py ================================================ """ Functionality for evaluating expressions across entire datasets. Includes multi-GPU support for fast evaluation. """ from distutils.version import LooseVersion import warnings import numpy as np from six.moves import range import tensorflow as tf import cleverhans from cleverhans import canary from cleverhans.utils import create_logger from cleverhans.utils_tf import infer_devices def accuracy( sess, model, x, y, batch_size=None, devices=None, feed=None, attack=None, attack_params=None, ): """ Compute the accuracy of a TF model on some data :param sess: TF session to use when training the graph :param model: cleverhans.model.Model instance :param x: numpy array containing input examples (e.g. MNIST().x_test ) :param y: numpy array containing example labels (e.g. MNIST().y_test ) :param batch_size: Number of examples to use in a single evaluation batch. If not specified, this function will use a reasonable guess and may run out of memory. When choosing the batch size, keep in mind that the batch will be divided up evenly among available devices. If you can fit 128 examples in memory on one GPU and you have 8 GPUs, you probably want to use a batch size of 1024 (unless a different batch size runs faster with the ops you are using, etc.) :param devices: An optional list of string device names to use. If not specified, this function will use all visible GPUs. :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param attack: cleverhans.attack.Attack Optional. If no attack specified, evaluates the model on clean data. If attack is specified, evaluates the model on adversarial examples created by the attack. :param attack_params: dictionary If attack is specified, this dictionary is passed to attack.generate as keyword arguments. :return: a float with the accuracy value """ _check_x(x) _check_y(y) if x.shape[0] != y.shape[0]: raise ValueError("Number of input examples and labels do not match.") factory = _CorrectFactory(model, attack, attack_params) (correct,) = batch_eval_multi_worker( sess, factory, [x, y], batch_size=batch_size, devices=devices, feed=feed ) return correct.mean() def class_and_confidence( sess, model, x, y=None, batch_size=None, devices=None, feed=None, attack=None, attack_params=None, ): """ Return the model's classification of the input data, and the confidence (probability) assigned to each example. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing input examples (e.g. MNIST().x_test ) :param y: numpy array containing true labels (Needed only if using an attack that avoids these labels) :param batch_size: Number of examples to use in a single evaluation batch. If not specified, this function will use a reasonable guess and may run out of memory. When choosing the batch size, keep in mind that the batch will be divided up evenly among available devices. If you can fit 128 examples in memory on one GPU and you have 8 GPUs, you probably want to use a batch size of 1024 (unless a different batch size runs faster with the ops you are using, etc.) :param devices: An optional list of string device names to use. If not specified, this function will use all visible GPUs. :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param attack: cleverhans.attack.Attack Optional. If no attack specified, evaluates the model on clean data. If attack is specified, evaluates the model on adversarial examples created by the attack. :param attack_params: dictionary If attack is specified, this dictionary is passed to attack.generate as keyword arguments. :return: an ndarray of ints indicating the class assigned to each example an ndarray of probabilities assigned to the prediction for each example """ _check_x(x) inputs = [x] if attack is not None: inputs.append(y) _check_y(y) if x.shape[0] != y.shape[0]: raise ValueError("Number of input examples and labels do not match.") factory = _ClassAndProbFactory(model, attack, attack_params) out = batch_eval_multi_worker( sess, factory, inputs, batch_size=batch_size, devices=devices, feed=feed ) classes, confidence = out assert classes.shape == (x.shape[0],) assert confidence.shape == (x.shape[0],) min_confidence = confidence.min() if min_confidence < 0.0: raise ValueError( "Model does not return valid probabilities: " + str(min_confidence) ) max_confidence = confidence.max() if max_confidence > 1.0: raise ValueError( "Model does not return valid probablities: " + str(max_confidence) ) assert confidence.min() >= 0.0, confidence.min() return out def correctness_and_confidence( sess, model, x, y, batch_size=None, devices=None, feed=None, attack=None, attack_params=None, ): """ Report whether the model is correct and its confidence on each example in a dataset. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing input examples (e.g. MNIST().x_test ) :param y: numpy array containing example labels (e.g. MNIST().y_test ) :param batch_size: Number of examples to use in a single evaluation batch. If not specified, this function will use a reasonable guess and may run out of memory. When choosing the batch size, keep in mind that the batch will be divided up evenly among available devices. If you can fit 128 examples in memory on one GPU and you have 8 GPUs, you probably want to use a batch size of 1024 (unless a different batch size runs faster with the ops you are using, etc.) :param devices: An optional list of string device names to use. If not specified, this function will use all visible GPUs. :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param attack: cleverhans.attack.Attack Optional. If no attack specified, evaluates the model on clean data. If attack is specified, evaluates the model on adversarial examples created by the attack. :param attack_params: dictionary If attack is specified, this dictionary is passed to attack.generate as keyword arguments. :return: an ndarray of bools indicating whether each example is correct an ndarray of probabilities assigned to the prediction for each example """ _check_x(x) _check_y(y) if x.shape[0] != y.shape[0]: raise ValueError("Number of input examples and labels do not match.") factory = _CorrectAndProbFactory(model, attack, attack_params) out = batch_eval_multi_worker( sess, factory, [x, y], batch_size=batch_size, devices=devices, feed=feed ) correctness, confidence = out assert correctness.shape == (x.shape[0],) assert confidence.shape == (x.shape[0],) min_confidence = confidence.min() if min_confidence < 0.0: raise ValueError( "Model does not return valid probabilities: " + str(min_confidence) ) max_confidence = confidence.max() if max_confidence > 1.0: raise ValueError( "Model does not return valid probablities: " + str(max_confidence) ) assert confidence.min() >= 0.0, confidence.min() return out def run_attack( sess, model, x, y, attack, attack_params, batch_size=None, devices=None, feed=None, pass_y=False, ): """ Run attack on every example in a dataset. :param sess: tf.Session :param model: cleverhans.model.Model :param x: numpy array containing input examples (e.g. MNIST().x_test ) :param y: numpy array containing example labels (e.g. MNIST().y_test ) :param attack: cleverhans.attack.Attack :param attack_params: dictionary passed to attack.generate as keyword arguments. :param batch_size: Number of examples to use in a single evaluation batch. If not specified, this function will use a reasonable guess and may run out of memory. When choosing the batch size, keep in mind that the batch will be divided up evenly among available devices. If you can fit 128 examples in memory on one GPU and you have 8 GPUs, you probably want to use a batch size of 1024 (unless a different batch size runs faster with the ops you are using, etc.) :param devices: An optional list of string device names to use. If not specified, this function will use all visible GPUs. :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param pass_y: bool. If true pass 'y' to `attack.generate` :return: an ndarray of bools indicating whether each example is correct an ndarray of probabilities assigned to the prediction for each example """ _check_x(x) _check_y(y) factory = _AttackFactory(model, attack, attack_params, pass_y) (out,) = batch_eval_multi_worker( sess, factory, [x, y], batch_size=batch_size, devices=devices, feed=feed ) return out def batch_eval_multi_worker( sess, graph_factory, numpy_inputs, batch_size=None, devices=None, feed=None ): """ Generic computation engine for evaluating an expression across a whole dataset, divided into batches. This function assumes that the work can be parallelized with one worker device handling one batch of data. If you need multiple devices per batch, use `batch_eval`. The tensorflow graph for multiple workers is large, so the first few runs of the graph will be very slow. If you expect to run the graph few times (few calls to `batch_eval_multi_worker` that each run few batches) the startup cost might dominate the runtime, and it might be preferable to use the single worker `batch_eval` just because its startup cost will be lower. :param sess: tensorflow Session :param graph_factory: callable When called, returns (tf_inputs, tf_outputs) where: tf_inputs is a list of placeholders to feed from the dataset tf_outputs is a list of tf tensors to calculate Example: tf_inputs is [x, y] placeholders, tf_outputs is [accuracy]. This factory must make new tensors when called, rather than, e.g. handing out a reference to existing tensors. This factory must make exactly equivalent expressions every time it is called, otherwise the results of `batch_eval` will vary depending on how work is distributed to devices. This factory must respect "with tf.device()" context managers that are active when it is called, otherwise work will not be distributed to devices correctly. :param numpy_inputs: A list of numpy arrays defining the dataset to be evaluated. The list should have the same length as tf_inputs. Each array should have the same number of examples (shape[0]). Example: numpy_inputs is [MNIST().x_test, MNIST().y_test] :param batch_size: Number of examples to use in a single evaluation batch. If not specified, this function will use a reasonable guess and may run out of memory. When choosing the batch size, keep in mind that the batch will be divided up evenly among available devices. If you can fit 128 examples in memory on one GPU and you have 8 GPUs, you probably want to use a batch size of 1024 (unless a different batch size runs faster with the ops you are using, etc.) :param devices: List of devices to run on. If unspecified, uses all available GPUs if any GPUS are available, otherwise uses CPUs. :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :returns: List of numpy arrays corresponding to the outputs produced by the graph_factory """ canary.run_canary() global _batch_eval_multi_worker_cache devices = infer_devices(devices) if batch_size is None: # For big models this might result in OOM and then the user # should just specify batch_size batch_size = len(devices) * DEFAULT_EXAMPLES_PER_DEVICE n = len(numpy_inputs) assert n > 0 m = numpy_inputs[0].shape[0] for i in range(1, n): m_i = numpy_inputs[i].shape[0] if m != m_i: raise ValueError( "All of numpy_inputs must have the same number of examples, but the first one has " + str(m) + " examples and input " + str(i) + " has " + str(m_i) + "examples." ) out = [] replicated_tf_inputs = [] replicated_tf_outputs = [] p = None num_devices = len(devices) assert batch_size % num_devices == 0 device_batch_size = batch_size // num_devices cache_key = (graph_factory, tuple(devices)) if cache_key in _batch_eval_multi_worker_cache: # Retrieve graph for multi-GPU inference from cache. # This avoids adding tf ops to the graph packed = _batch_eval_multi_worker_cache[cache_key] replicated_tf_inputs, replicated_tf_outputs = packed p = len(replicated_tf_outputs[0]) assert p > 0 else: # This graph has not been built before. # Build it now. for device in devices: with tf.device(device): tf_inputs, tf_outputs = graph_factory() assert len(tf_inputs) == n if p is None: p = len(tf_outputs) assert p > 0 else: assert len(tf_outputs) == p replicated_tf_inputs.append(tf_inputs) replicated_tf_outputs.append(tf_outputs) del tf_inputs del tf_outputs # Store the result in the cache packed = replicated_tf_inputs, replicated_tf_outputs _batch_eval_multi_worker_cache[cache_key] = packed for _ in range(p): out.append([]) flat_tf_outputs = [] for output in range(p): for dev_idx in range(num_devices): flat_tf_outputs.append(replicated_tf_outputs[dev_idx][output]) # pad data to have # examples be multiple of batch size # we discard the excess later num_batches = int(np.ceil(float(m) / batch_size)) needed_m = num_batches * batch_size excess = needed_m - m if excess > m: raise NotImplementedError( ( "Your batch size (%(batch_size)d) is bigger" " than the dataset (%(m)d), this function is " "probably overkill." ) % locals() ) def pad(array): """Pads an array with replicated examples to have `excess` more entries""" if excess > 0: array = np.concatenate((array, array[:excess]), axis=0) return array numpy_inputs = [pad(numpy_input) for numpy_input in numpy_inputs] orig_m = m m = needed_m for start in range(0, m, batch_size): batch = start // batch_size if batch % 100 == 0 and batch > 0: _logger.debug("Batch " + str(batch)) # Compute batch start and end indices end = start + batch_size numpy_input_batches = [numpy_input[start:end] for numpy_input in numpy_inputs] feed_dict = {} for dev_idx, tf_inputs in enumerate(replicated_tf_inputs): for tf_input, numpy_input in zip(tf_inputs, numpy_input_batches): dev_start = dev_idx * device_batch_size dev_end = (dev_idx + 1) * device_batch_size value = numpy_input[dev_start:dev_end] assert value.shape[0] == device_batch_size feed_dict[tf_input] = value if feed is not None: feed_dict.update(feed) flat_output_batches = sess.run(flat_tf_outputs, feed_dict=feed_dict) for e in flat_output_batches: assert e.shape[0] == device_batch_size, e.shape output_batches = [] for output in range(p): o_start = output * num_devices o_end = (output + 1) * num_devices device_values = flat_output_batches[o_start:o_end] assert len(device_values) == num_devices output_batches.append(device_values) for out_elem, device_values in zip(out, output_batches): assert len(device_values) == num_devices, (len(device_values), num_devices) for device_value in device_values: assert device_value.shape[0] == device_batch_size out_elem.extend(device_values) out = [np.concatenate(x, axis=0) for x in out] for e in out: assert e.shape[0] == m, e.shape # Trim off the examples we used to pad up to batch size out = [e[:orig_m] for e in out] assert len(out) == p, (len(out), p) return out def batch_eval( sess, tf_inputs, tf_outputs, numpy_inputs, batch_size=None, feed=None, args=None ): """ A helper function that computes a tensor on numpy inputs by batches. This version uses exactly the tensorflow graph constructed by the caller, so the caller can place specific ops on specific devices to implement model parallelism. Most users probably prefer `batch_eval_multi_worker` which maps a single-device expression to multiple devices in order to evaluate faster by parallelizing across data. :param sess: tf Session to use :param tf_inputs: list of tf Placeholders to feed from the dataset :param tf_outputs: list of tf tensors to calculate :param numpy_inputs: list of numpy arrays defining the dataset :param batch_size: int, batch size to use for evaluation If not specified, this function will try to guess the batch size, but might get an out of memory error or run the model with an unsupported batch size, etc. :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Deprecated and included only for backwards compatibility. Should contain `batch_size` """ if args is not None: warnings.warn( "`args` is deprecated and will be removed on or " "after 2019-03-09. Pass `batch_size` directly." ) if "batch_size" in args: assert batch_size is None batch_size = args["batch_size"] if batch_size is None: batch_size = DEFAULT_EXAMPLES_PER_DEVICE n = len(numpy_inputs) assert n > 0 assert n == len(tf_inputs) m = numpy_inputs[0].shape[0] for i in range(1, n): assert numpy_inputs[i].shape[0] == m out = [] for _ in tf_outputs: out.append([]) for start in range(0, m, batch_size): batch = start // batch_size if batch % 100 == 0 and batch > 0: _logger.debug("Batch " + str(batch)) # Compute batch start and end indices start = batch * batch_size end = start + batch_size numpy_input_batches = [numpy_input[start:end] for numpy_input in numpy_inputs] cur_batch_size = numpy_input_batches[0].shape[0] assert cur_batch_size <= batch_size for e in numpy_input_batches: assert e.shape[0] == cur_batch_size feed_dict = dict(zip(tf_inputs, numpy_input_batches)) if feed is not None: feed_dict.update(feed) numpy_output_batches = sess.run(tf_outputs, feed_dict=feed_dict) for e in numpy_output_batches: assert e.shape[0] == cur_batch_size, e.shape for out_elem, numpy_output_batch in zip(out, numpy_output_batches): out_elem.append(numpy_output_batch) out = [np.concatenate(x, axis=0) for x in out] for e in out: assert e.shape[0] == m, e.shape return out DEFAULT_EXAMPLES_PER_DEVICE = 128 class _CorrectFactory(object): """ A factory for an expression for one bool per example indicating whether each example is correct. """ def __init__(self, model, attack=None, attack_params=None): if attack_params is None: attack_params = {} self.model = model self.attack = attack self.attack_params = attack_params hashable_attack_params = tuple( (key, attack_params[key]) for key in sorted(attack_params.keys()) ) self.properties_to_hash = (model, attack, hashable_attack_params) def __hash__(self): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs return self.properties_to_hash.__hash__() def __eq__(self, other): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs if not isinstance(other, _CorrectFactory): return False return self.properties_to_hash == other.properties_to_hash def __call__(self): x_batch = self.model.make_input_placeholder() y_batch = self.model.make_label_placeholder() if LooseVersion(tf.__version__) < LooseVersion("1.0.0"): raise NotImplementedError() if self.attack is None: x_input = x_batch else: attack_params = self.attack_params if attack_params is None: attack_params = {} x_input = self.attack.generate(x_batch, y=y_batch, **attack_params) predictions = self.model.get_probs(x_input) correct = tf.equal(tf.argmax(y_batch, axis=-1), tf.argmax(predictions, axis=-1)) return (x_batch, y_batch), (correct,) class _ClassAndProbFactory(object): """ A factory for an expression for the following tuple per (optionally adversarial) example: - integer class assigned to the example by the model - probability assigned to that prediction """ def __init__(self, model, attack=None, attack_params=None): if attack_params is None: attack_params = {} self.model = model self.attack = attack self.attack_params = attack_params hashable_attack_params = tuple( (key, attack_params[key]) for key in sorted(attack_params.keys()) ) self.properties_to_hash = (model, attack, hashable_attack_params) def __hash__(self): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs return self.properties_to_hash.__hash__() def __eq__(self, other): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs if not isinstance(other, _ClassAndProbFactory): return False return self.properties_to_hash == other.properties_to_hash def __call__(self): x_batch = self.model.make_input_placeholder() inputs = [x_batch] if LooseVersion(tf.__version__) < LooseVersion("1.0.0"): raise NotImplementedError() if self.attack is None: x_input = x_batch else: y_batch = self.model.make_label_placeholder() inputs.append(y_batch) attack_params = self.attack_params if attack_params is None: attack_params = {} x_input = self.attack.generate(x_batch, y=y_batch, **attack_params) predictions = self.model.get_probs(x_input) classes = tf.argmax(predictions, axis=-1) max_probs = tf.reduce_max(predictions, axis=1) return tuple(inputs), (classes, max_probs) class _CorrectAndProbFactory(object): """ A factory for an expression for the following tuple per (optionally adversarial) example: - bool per indicating whether each the example was classified correctly - probability assigned to that prediction """ def __init__(self, model, attack=None, attack_params=None): if attack_params is None: attack_params = {} self.model = model self.attack = attack self.attack_params = attack_params hashable_attack_params = tuple( (key, attack_params[key]) for key in sorted(attack_params.keys()) ) self.properties_to_hash = (model, attack, hashable_attack_params) def __hash__(self): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs return self.properties_to_hash.__hash__() def __eq__(self, other): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs if not isinstance(other, _CorrectAndProbFactory): return False return self.properties_to_hash == other.properties_to_hash def __call__(self): x_batch = self.model.make_input_placeholder() y_batch = self.model.make_label_placeholder() if LooseVersion(tf.__version__) < LooseVersion("1.0.0"): raise NotImplementedError() if self.attack is None: x_input = x_batch else: attack_params = self.attack_params if attack_params is None: attack_params = {} x_input = self.attack.generate(x_batch, y=y_batch, **attack_params) predictions = self.model.get_probs(x_input) correct = tf.equal(tf.argmax(y_batch, axis=-1), tf.argmax(predictions, axis=-1)) max_probs = tf.reduce_max(predictions, axis=1) return (x_batch, y_batch), (correct, max_probs) class _AttackFactory(object): """ A factory for an expression that runs an adversarial attack :param model: cleverhans.model.Model :param attack: cleverhans.attack.Attack :param attack_params: dict of arguments to pass to attack.generate :param pass_y: bool. If True, pass y to the attack. (Some untargeted attacks prefer to infer y to avoid label leaking. Targeted attacks require that y not be passed) """ def __init__(self, model, attack, attack_params=None, pass_y=False): assert isinstance(model, cleverhans.model.Model) if not isinstance(attack, cleverhans.attacks.Attack): raise TypeError( "`attack` must be an instance of cleverhans.attacks." "attack. Got %s with type %s " % (str(attack), str(type(attack))) ) if attack_params is None: attack_params = {} self.model = model self.attack = attack self.attack_params = attack_params self.pass_y = pass_y hashable_attack_params = tuple( (key, attack_params[key]) for key in sorted(attack_params.keys()) ) self.properties_to_hash = (model, attack, hashable_attack_params) def __hash__(self): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs return self.properties_to_hash.__hash__() def __eq__(self, other): # Make factory hashable so that no two factories for the # same model will be used to build redundant tf graphs if not isinstance(other, _AttackFactory): return False return self.properties_to_hash == other.properties_to_hash def __call__(self): x_batch = self.model.make_input_placeholder() y_batch = self.model.make_label_placeholder() attack_params = self.attack_params if attack_params is None: attack_params = {} if self.pass_y: x_adv = self.attack.generate(x_batch, y=y_batch, **attack_params) else: # Some code checks the keys of kwargs, rather than checking if # y is None, so we need to truly not pass y at all, rather than # just passing a None value for it. x_adv = self.attack.generate(x_batch, **attack_params) return (x_batch, y_batch), tuple([x_adv]) _logger = create_logger("cleverhans.evaluation") # Cache for storing output of `batch_eval_multi_worker`'s calls to # `graph_factory`, to avoid making the tf graph too big _batch_eval_multi_worker_cache = {} def _check_x(x): """ Makes sure an `x` argument is a valid numpy dataset. """ if not isinstance(x, np.ndarray): raise TypeError( "x must be a numpy array. Typically x contains " "the entire test set inputs." ) def _check_y(y): """ Makes sure a `y` argument is a vliad numpy dataset. """ if not isinstance(y, np.ndarray): raise TypeError( "y must be numpy array. Typically y contains " "the entire test set labels. Got " + str(y) + " of type " + str(type(y)) ) ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/README.md ================================================ This directory contains experimental features of cleverhans, which are not integrated into the main API yet. ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/__init__.py ================================================ ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/README.md ================================================ # Certification of adversarial robustness This code performs certification of adversarial robustness of given network on given example. Original author: [Aditi Raghunathan](https://github.com/RAditi) ## Dependencies TensorFlow 1.9.0 or higher (to have support of necessary [autograph](https://www.tensorflow.org/guide/autograph) features) ## Usage Example usage for two-layer network trained on MNIST: ```bash # Meaning of the arguments: # checkpoint - TensorFlow checkpoint of the model parameters # model_json - JSON file which describes the model (see below) # test_input - numpy file with input to certify # true_class - true class of the input # adv_class - adversarial class for which we're checking certificate, # -1 means that all adversarial classes will be checked # epsilon - maximum size of adversarial perturbation # init_nu and small_eig_num_steps - optimization parameters python cleverhans/experimental/certification/certify.py \ --checkpoint "${MODEL_DIR}/model.ckpt" \ --model_json "${MODEL_DIR}/model.json" \ --test_input "${INPUTS_DIR}/image.npy" \ --true_class 4 \ --adv_class 5 \ --epsilon 0.2 \ --init_nu 100.0 \ --small_eig_num_steps 100 ``` JSON file which accompany checkpoint and describes layers of the network: ```json [ { "weight_var": "Model/layer0/logits/kernel", "bias_var": "Model/layer0/logits/bias", "type": "ff_relu", "is_transpose": true }, { "weight_var": "Model/logits/kernel", "bias_var": "Model/logits/bias", "type": "ff", "is_transpose": true } ] ``` ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/__init__.py ================================================ ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/certify.py ================================================ """Code for running the certification problem.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import time import numpy as np import tensorflow as tf from cleverhans.experimental.certification import dual_formulation from cleverhans.experimental.certification import nn from cleverhans.experimental.certification import optimization from cleverhans.experimental.certification import utils flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_string( "checkpoint", None, "Path of checkpoint with trained model to verify" ) flags.DEFINE_string("model_json", None, "Path of json file with model description") flags.DEFINE_string( "init_dual_file", None, "Path of numpy file with dual variables to initialize" ) flags.DEFINE_string("test_input", None, "Path of numpy file with test input to certify") flags.DEFINE_integer("true_class", 0, "True class of the test input") flags.DEFINE_integer( "adv_class", -1, "target class of adversarial example; all classes if -1" ) flags.DEFINE_float("input_minval", -1, "Minimum value of valid input") flags.DEFINE_float("input_maxval", 1, "Maximum value of valid input") flags.DEFINE_float("epsilon", 0.2, "Size of perturbation") # Nu might need tuning based on the network flags.DEFINE_float("init_nu", 300.0, "Initialization of nu variable.") flags.DEFINE_float("init_penalty", 100.0, "Initial penalty") flags.DEFINE_integer( "small_eig_num_steps", 500, "Number of eigen value steps in intermediate iterations" ) flags.DEFINE_integer( "large_eig_num_steps", 5000, "Number of eigen value steps in each outer iteration" ) flags.DEFINE_integer("inner_num_steps", 600, "Number of steps to run in inner loop") flags.DEFINE_float("outer_num_steps", 10, "Number of steps to run in outer loop") flags.DEFINE_float("beta", 2, "Multiplicative factor to increase penalty by") flags.DEFINE_float( "smoothness_parameter", 0.001, "Smoothness parameter if using eigen decomposition" ) flags.DEFINE_float( "eig_learning_rate", 0.001, "Learning rate for computing min eigen value" ) flags.DEFINE_string("optimizer", "adam", "Optimizer to use for entire optimization") flags.DEFINE_float("init_learning_rate", 0.1, "Initial learning rate") flags.DEFINE_float("learning_rate_decay", 0.1, "Decay of learning rate") flags.DEFINE_float( "momentum_parameter", 0.9, "Momentum parameter if using momentum optimizer" ) flags.DEFINE_integer("print_stats_steps", 50, "Number of steps to print stats after") flags.DEFINE_string("stats_folder", None, "Folder to save stats of the iterations") flags.DEFINE_integer( "projection_steps", 200, "Number of steps to compute projection after" ) flags.DEFINE_integer("num_classes", 10, "Total number of classes") flags.DEFINE_enum( "verbosity", "INFO", ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], "Logging verbosity level.", ) flags.DEFINE_string( "eig_type", "LZS", "Method to compute eigenvalues (TF, SCIPY, or LZS), LZS" ) flags.DEFINE_integer( "lanczos_steps", 20, "Number of steps to perform in Lanczos method." ) flags.DEFINE_integer("num_rows", 28, "Number of rows in image") flags.DEFINE_integer("num_columns", 28, "Number of columns in image") flags.DEFINE_integer("num_channels", 1, "Number of channels in image") MIN_LANCZOS_ITER = 5 def main(_): # pylint: disable=missing-docstring tf.logging.set_verbosity(FLAGS.verbosity) start_time = time.time() # Initialize neural network based on config files input_shape = [FLAGS.num_rows, FLAGS.num_columns, FLAGS.num_channels] nn_params = nn.load_network_from_checkpoint( FLAGS.checkpoint, FLAGS.model_json, input_shape ) tf.logging.info("Loaded neural network with size of layers: %s", nn_params.sizes) tf.logging.info( "Loaded neural network with input shapes: %s", nn_params.input_shapes ) tf.logging.info( "Loaded neural network with output shapes: %s", nn_params.output_shapes ) dual_var = utils.initialize_dual( nn_params, FLAGS.init_dual_file, init_nu=FLAGS.init_nu ) # Reading test input and reshaping with tf.gfile.Open(FLAGS.test_input) as f: test_input = np.load(f) test_input = np.reshape(test_input, [np.size(test_input), 1]) if FLAGS.adv_class == -1: start_class = 0 end_class = FLAGS.num_classes else: start_class = FLAGS.adv_class end_class = FLAGS.adv_class + 1 for adv_class in range(start_class, end_class): tf.logging.info("Running certification for adversarial class %d", adv_class) if adv_class == FLAGS.true_class: continue optimization_params = { "init_penalty": FLAGS.init_penalty, "large_eig_num_steps": FLAGS.large_eig_num_steps, "small_eig_num_steps": FLAGS.small_eig_num_steps, "inner_num_steps": FLAGS.inner_num_steps, "outer_num_steps": FLAGS.outer_num_steps, "beta": FLAGS.beta, "smoothness_parameter": FLAGS.smoothness_parameter, "eig_learning_rate": FLAGS.eig_learning_rate, "optimizer": FLAGS.optimizer, "init_learning_rate": FLAGS.init_learning_rate, "learning_rate_decay": FLAGS.learning_rate_decay, "momentum_parameter": FLAGS.momentum_parameter, "print_stats_steps": FLAGS.print_stats_steps, "stats_folder": FLAGS.stats_folder, "projection_steps": FLAGS.projection_steps, "eig_type": FLAGS.eig_type, "has_conv": nn_params.has_conv, "lanczos_steps": FLAGS.lanczos_steps, } lzs_params = {"min_iter": MIN_LANCZOS_ITER, "max_iter": FLAGS.lanczos_steps} with tf.Session() as sess: dual = dual_formulation.DualFormulation( sess, dual_var, nn_params, test_input, FLAGS.true_class, adv_class, FLAGS.input_minval, FLAGS.input_maxval, FLAGS.epsilon, lzs_params, ) optimization_object = optimization.Optimization( dual, sess, optimization_params ) is_cert_found = optimization_object.run_optimization() if not is_cert_found: print("Example could not be verified") exit() print("Example successfully verified") print("Elapsed time: " + str(time.time() - start_time)) if __name__ == "__main__": tf.app.run(main) ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/dual_formulation.py ================================================ """Code with dual formulation for certification problem.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from scipy.sparse.linalg import eigs, LinearOperator import tensorflow as tf from tensorflow.contrib import autograph import numpy as np from cleverhans.experimental.certification import utils flags = tf.app.flags FLAGS = flags.FLAGS # Tolerance value for eigenvalue computation TOL = 1e-5 # Binary search constants MAX_BINARY_SEARCH_ITER = 10 NU_UPDATE_CONSTANT = 1.3 # Bound on lowest value of certificate to check for numerical errors LOWER_CERT_BOUND = -5.0 DEFAULT_LZS_PARAMS = {"min_iter": 5, "max_iter": 50} class DualFormulation(object): """DualFormulation is a class that creates the dual objective function and access to matrix vector products for the matrix that is constrained to be Positive semidefinite """ def __init__( self, sess, dual_var, neural_net_param_object, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, lzs_params=None, project_dual=True, ): """Initializes dual formulation class. Args: sess: Tensorflow session dual_var: dictionary of dual variables containing a) lambda_pos b) lambda_neg, c) lambda_quad, d) lambda_lu neural_net_param_object: NeuralNetParam object created for the network under consideration test_input: clean example to certify around true_class: the class label of the test input adv_class: the label that the adversary tried to perturb input to input_minval: minimum value of valid input range input_maxval: maximum value of valid input range epsilon: Size of the perturbation (scaled for [0, 1] input) lzs_params: Parameters for Lanczos algorithm (dictionary) in the form: { 'min_iter': 5 'max_iter': 50 } project_dual: Whether we should create a projected dual object """ self.sess = sess self.nn_params = neural_net_param_object self.test_input = tf.convert_to_tensor(test_input, dtype=tf.float32) self.true_class = true_class self.adv_class = adv_class self.input_minval = tf.convert_to_tensor(input_minval, dtype=tf.float32) self.input_maxval = tf.convert_to_tensor(input_maxval, dtype=tf.float32) self.epsilon = tf.convert_to_tensor(epsilon, dtype=tf.float32) self.lzs_params = lzs_params or DEFAULT_LZS_PARAMS.copy() self.final_linear = ( self.nn_params.final_weights[adv_class, :] - self.nn_params.final_weights[true_class, :] ) self.final_linear = tf.reshape( self.final_linear, shape=[tf.size(self.final_linear), 1] ) self.final_constant = ( self.nn_params.final_bias[adv_class] - self.nn_params.final_bias[true_class] ) self.lanczos_dtype = tf.float64 self.nn_dtype = tf.float32 # Computing lower and upper bounds # Note that lower and upper are of size nn_params.num_hidden_layers + 1 self.lower = [] self.upper = [] # Also computing pre activation lower and upper bounds # to compute always-off and always-on units self.pre_lower = [] self.pre_upper = [] # Initializing at the input layer with \ell_\infty constraints self.lower.append(tf.maximum(self.test_input - self.epsilon, self.input_minval)) self.upper.append(tf.minimum(self.test_input + self.epsilon, self.input_maxval)) self.pre_lower.append(self.lower[0]) self.pre_upper.append(self.upper[0]) for i in range(0, self.nn_params.num_hidden_layers): lo_plus_up = self.nn_params.forward_pass(self.lower[i] + self.upper[i], i) lo_minus_up = self.nn_params.forward_pass( self.lower[i] - self.upper[i], i, is_abs=True ) up_minus_lo = self.nn_params.forward_pass( self.upper[i] - self.lower[i], i, is_abs=True ) current_lower = 0.5 * (lo_plus_up + lo_minus_up) + self.nn_params.biases[i] current_upper = 0.5 * (lo_plus_up + up_minus_lo) + self.nn_params.biases[i] self.pre_lower.append(current_lower) self.pre_upper.append(current_upper) self.lower.append(tf.nn.relu(current_lower)) self.upper.append(tf.nn.relu(current_upper)) # Run lower and upper because they don't change self.pre_lower = self.sess.run(self.pre_lower) self.pre_upper = self.sess.run(self.pre_upper) self.lower = self.sess.run(self.lower) self.upper = self.sess.run(self.upper) # Using the preactivation lower and upper bounds # to compute the linear regions self.positive_indices = [] self.negative_indices = [] self.switch_indices = [] for i in range(0, self.nn_params.num_hidden_layers + 1): # Positive index = 1 if the ReLU is always "on" self.positive_indices.append( np.asarray(self.pre_lower[i] >= 0, dtype=np.float32) ) # Negative index = 1 if the ReLU is always off self.negative_indices.append( np.asarray(self.pre_upper[i] <= 0, dtype=np.float32) ) # Switch index = 1 if the ReLU could be either on or off self.switch_indices.append( np.asarray( np.multiply(self.pre_lower[i], self.pre_upper[i]) < 0, dtype=np.float32, ) ) # Computing the optimization terms self.lambda_pos = [x for x in dual_var["lambda_pos"]] self.lambda_neg = [x for x in dual_var["lambda_neg"]] self.lambda_quad = [x for x in dual_var["lambda_quad"]] self.lambda_lu = [x for x in dual_var["lambda_lu"]] self.nu = dual_var["nu"] self.vector_g = None self.scalar_f = None self.matrix_h = None self.matrix_m = None self.matrix_m_dimension = 1 + np.sum(self.nn_params.sizes) # The primal vector in the SDP can be thought of as [layer_1, layer_2..] # In this concatenated version, dual_index[i] that marks the start # of layer_i # This is useful while computing implicit products with matrix H self.dual_index = [0] for i in range(self.nn_params.num_hidden_layers + 1): self.dual_index.append(self.dual_index[-1] + self.nn_params.sizes[i]) # Construct objectives, matrices, and certificate self.set_differentiable_objective() if not self.nn_params.has_conv: self.get_full_psd_matrix() # Setup Lanczos functionality for compute certificate self.construct_lanczos_params() # Create projected dual object if project_dual: self.projected_dual = self.create_projected_dual() def create_projected_dual(self): """Function to create variables for the projected dual object. Function that projects the input dual variables onto the feasible set. Returns: projected_dual: Feasible dual solution corresponding to current dual """ # TODO: consider whether we can use shallow copy of the lists without # using tf.identity projected_nu = tf.placeholder(tf.float32, shape=[]) min_eig_h = tf.placeholder(tf.float32, shape=[]) projected_lambda_pos = [tf.identity(x) for x in self.lambda_pos] projected_lambda_neg = [tf.identity(x) for x in self.lambda_neg] projected_lambda_quad = [tf.identity(x) for x in self.lambda_quad] projected_lambda_lu = [tf.identity(x) for x in self.lambda_lu] for i in range(self.nn_params.num_hidden_layers + 1): # Making H PSD projected_lambda_lu[i] = ( self.lambda_lu[i] + 0.5 * tf.maximum(-min_eig_h, 0) + TOL ) # Adjusting the value of \lambda_neg to make change in g small projected_lambda_neg[i] = self.lambda_neg[i] + tf.multiply( (self.lower[i] + self.upper[i]), (self.lambda_lu[i] - projected_lambda_lu[i]), ) projected_lambda_neg[i] = tf.multiply( self.negative_indices[i], projected_lambda_neg[i] ) + tf.multiply( self.switch_indices[i], tf.maximum(projected_lambda_neg[i], 0) ) projected_dual_var = { "lambda_pos": projected_lambda_pos, "lambda_neg": projected_lambda_neg, "lambda_lu": projected_lambda_lu, "lambda_quad": projected_lambda_quad, "nu": projected_nu, } projected_dual_object = DualFormulation( self.sess, projected_dual_var, self.nn_params, self.test_input, self.true_class, self.adv_class, self.input_minval, self.input_maxval, self.epsilon, self.lzs_params, project_dual=False, ) projected_dual_object.min_eig_val_h = min_eig_h return projected_dual_object def construct_lanczos_params(self): """Computes matrices T and V using the Lanczos algorithm. Args: k: number of iterations and dimensionality of the tridiagonal matrix Returns: eig_vec: eigen vector corresponding to min eigenvalue """ # Using autograph to automatically handle # the control flow of minimum_eigen_vector self.min_eigen_vec = autograph.to_graph(utils.tf_lanczos_smallest_eigval) def _m_vector_prod_fn(x): return self.get_psd_product(x, dtype=self.lanczos_dtype) def _h_vector_prod_fn(x): return self.get_h_product(x, dtype=self.lanczos_dtype) # Construct nodes for computing eigenvalue of M self.m_min_vec_estimate = np.zeros( shape=(self.matrix_m_dimension, 1), dtype=np.float64 ) zeros_m = tf.zeros(shape=(self.matrix_m_dimension, 1), dtype=tf.float64) self.m_min_vec_ph = tf.placeholder_with_default( input=zeros_m, shape=(self.matrix_m_dimension, 1), name="m_min_vec_ph" ) self.m_min_eig, self.m_min_vec = self.min_eigen_vec( _m_vector_prod_fn, self.matrix_m_dimension, self.m_min_vec_ph, self.lzs_params["max_iter"], dtype=self.lanczos_dtype, ) self.m_min_eig = tf.cast(self.m_min_eig, self.nn_dtype) self.m_min_vec = tf.cast(self.m_min_vec, self.nn_dtype) self.h_min_vec_estimate = np.zeros( shape=(self.matrix_m_dimension - 1, 1), dtype=np.float64 ) zeros_h = tf.zeros(shape=(self.matrix_m_dimension - 1, 1), dtype=tf.float64) self.h_min_vec_ph = tf.placeholder_with_default( input=zeros_h, shape=(self.matrix_m_dimension - 1, 1), name="h_min_vec_ph" ) self.h_min_eig, self.h_min_vec = self.min_eigen_vec( _h_vector_prod_fn, self.matrix_m_dimension - 1, self.h_min_vec_ph, self.lzs_params["max_iter"], dtype=self.lanczos_dtype, ) self.h_min_eig = tf.cast(self.h_min_eig, self.nn_dtype) self.h_min_vec = tf.cast(self.h_min_vec, self.nn_dtype) def set_differentiable_objective(self): """Function that constructs minimization objective from dual variables.""" # Checking if graphs are already created if self.vector_g is not None: return # Computing the scalar term bias_sum = 0 for i in range(0, self.nn_params.num_hidden_layers): bias_sum = bias_sum + tf.reduce_sum( tf.multiply(self.nn_params.biases[i], self.lambda_pos[i + 1]) ) lu_sum = 0 for i in range(0, self.nn_params.num_hidden_layers + 1): lu_sum = lu_sum + tf.reduce_sum( tf.multiply( tf.multiply(self.lower[i], self.upper[i]), self.lambda_lu[i] ) ) self.scalar_f = -bias_sum - lu_sum + self.final_constant # Computing the vector term g_rows = [] for i in range(0, self.nn_params.num_hidden_layers): if i > 0: current_row = ( self.lambda_neg[i] + self.lambda_pos[i] - self.nn_params.forward_pass( self.lambda_pos[i + 1], i, is_transpose=True ) + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i]) + tf.multiply(self.lambda_quad[i], self.nn_params.biases[i - 1]) ) else: current_row = -self.nn_params.forward_pass( self.lambda_pos[i + 1], i, is_transpose=True ) + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i]) g_rows.append(current_row) # Term for final linear term g_rows.append( ( self.lambda_pos[self.nn_params.num_hidden_layers] + self.lambda_neg[self.nn_params.num_hidden_layers] + self.final_linear + tf.multiply( ( self.lower[self.nn_params.num_hidden_layers] + self.upper[self.nn_params.num_hidden_layers] ), self.lambda_lu[self.nn_params.num_hidden_layers], ) + tf.multiply( self.lambda_quad[self.nn_params.num_hidden_layers], self.nn_params.biases[self.nn_params.num_hidden_layers - 1], ) ) ) self.vector_g = tf.concat(g_rows, axis=0) self.unconstrained_objective = self.scalar_f + 0.5 * self.nu def get_h_product(self, vector, dtype=None): """Function that provides matrix product interface with PSD matrix. Args: vector: the vector to be multiplied with matrix H Returns: result_product: Matrix product of H and vector """ # Computing the product of matrix_h with beta (input vector) # At first layer, h is simply diagonal if dtype is None: dtype = self.nn_dtype beta = tf.cast(vector, self.nn_dtype) h_beta_rows = [] for i in range(self.nn_params.num_hidden_layers): # Split beta of this block into [gamma, delta] gamma = beta[self.dual_index[i] : self.dual_index[i + 1]] delta = beta[self.dual_index[i + 1] : self.dual_index[i + 2]] # Expanding the product with diagonal matrices if i == 0: h_beta_rows.append( tf.multiply(2 * self.lambda_lu[i], gamma) - self.nn_params.forward_pass( tf.multiply(self.lambda_quad[i + 1], delta), i, is_transpose=True, ) ) else: h_beta_rows[i] = ( h_beta_rows[i] + tf.multiply(self.lambda_quad[i] + self.lambda_lu[i], gamma) - self.nn_params.forward_pass( tf.multiply(self.lambda_quad[i + 1], delta), i, is_transpose=True, ) ) new_row = tf.multiply( self.lambda_quad[i + 1] + self.lambda_lu[i + 1], delta ) - tf.multiply( self.lambda_quad[i + 1], self.nn_params.forward_pass(gamma, i) ) h_beta_rows.append(new_row) # Last boundary case h_beta_rows[self.nn_params.num_hidden_layers] = h_beta_rows[ self.nn_params.num_hidden_layers ] + tf.multiply( ( self.lambda_quad[self.nn_params.num_hidden_layers] + self.lambda_lu[self.nn_params.num_hidden_layers] ), delta, ) h_beta = tf.concat(h_beta_rows, axis=0) return tf.cast(h_beta, dtype) def get_psd_product(self, vector, dtype=None): """Function that provides matrix product interface with PSD matrix. Args: vector: the vector to be multiplied with matrix M Returns: result_product: Matrix product of M and vector """ # For convenience, think of x as [\alpha, \beta] if dtype is None: dtype = self.nn_dtype vector = tf.cast(vector, self.nn_dtype) alpha = tf.reshape(vector[0], shape=[1, 1]) beta = vector[1:] # Computing the product of matrix_h with beta part of vector # At first layer, h is simply diagonal h_beta = self.get_h_product(beta) # Constructing final result using vector_g result = tf.concat( [ alpha * self.nu + tf.reduce_sum(tf.multiply(beta, self.vector_g)), tf.multiply(alpha, self.vector_g) + h_beta, ], axis=0, ) return tf.cast(result, dtype) def get_full_psd_matrix(self): """Function that returns the tf graph corresponding to the entire matrix M. Returns: matrix_h: unrolled version of tf matrix corresponding to H matrix_m: unrolled tf matrix corresponding to M """ if self.matrix_m is not None: return self.matrix_h, self.matrix_m # Computing the matrix term h_columns = [] for i in range(self.nn_params.num_hidden_layers + 1): current_col_elems = [] for j in range(i): current_col_elems.append( tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]]) ) # For the first layer, there is no relu constraint if i == 0: current_col_elems.append(utils.diag(self.lambda_lu[i])) else: current_col_elems.append( utils.diag(self.lambda_lu[i] + self.lambda_quad[i]) ) if i < self.nn_params.num_hidden_layers: current_col_elems.append( tf.matmul( utils.diag(-1 * self.lambda_quad[i + 1]), self.nn_params.weights[i], ) ) for j in range(i + 2, self.nn_params.num_hidden_layers + 1): current_col_elems.append( tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]]) ) current_column = tf.concat(current_col_elems, 0) h_columns.append(current_column) self.matrix_h = tf.concat(h_columns, 1) self.matrix_h = self.matrix_h + tf.transpose(self.matrix_h) self.matrix_m = tf.concat( [ tf.concat( [tf.reshape(self.nu, (1, 1)), tf.transpose(self.vector_g)], axis=1 ), tf.concat([self.vector_g, self.matrix_h], axis=1), ], axis=0, ) return self.matrix_h, self.matrix_m def make_m_psd(self, original_nu, feed_dictionary): """Run binary search to find a value for nu that makes M PSD Args: original_nu: starting value of nu to do binary search on feed_dictionary: dictionary of updated lambda variables to feed into M Returns: new_nu: new value of nu """ feed_dict = feed_dictionary.copy() _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict) lower_nu = original_nu upper_nu = original_nu num_iter = 0 # Find an upper bound on nu while min_eig_val_m - TOL < 0 and num_iter < (MAX_BINARY_SEARCH_ITER / 2): num_iter += 1 upper_nu *= NU_UPDATE_CONSTANT feed_dict.update({self.nu: upper_nu}) _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict) final_nu = upper_nu # Perform binary search to find best value of nu while lower_nu <= upper_nu and num_iter < MAX_BINARY_SEARCH_ITER: num_iter += 1 mid_nu = (lower_nu + upper_nu) / 2 feed_dict.update({self.nu: mid_nu}) _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict) if min_eig_val_m - TOL < 0: lower_nu = mid_nu else: upper_nu = mid_nu final_nu = upper_nu return final_nu def get_lanczos_eig(self, compute_m=True, feed_dict=None): """Computes the min eigen value and corresponding vector of matrix M or H using the Lanczos algorithm. Args: compute_m: boolean to determine whether we should compute eig val/vec for M or for H. True for M; False for H. feed_dict: dictionary mapping from TF placeholders to values (optional) Returns: min_eig_vec: Corresponding eigen vector to min eig val eig_val: Minimum eigen value """ if compute_m: min_eig, min_vec = self.sess.run( [self.m_min_eig, self.m_min_vec], feed_dict=feed_dict ) else: min_eig, min_vec = self.sess.run( [self.h_min_eig, self.h_min_vec], feed_dict=feed_dict ) return min_vec, min_eig def compute_certificate(self, current_step, feed_dictionary): """Function to compute the certificate based either current value or dual variables loaded from dual folder""" feed_dict = feed_dictionary.copy() nu = feed_dict[self.nu] second_term = self.make_m_psd(nu, feed_dict) tf.logging.info("Nu after modifying: " + str(second_term)) feed_dict.update({self.nu: second_term}) computed_certificate = self.sess.run( self.unconstrained_objective, feed_dict=feed_dict ) tf.logging.info( "Inner step: %d, current value of certificate: %f", current_step, computed_certificate, ) # Sometimes due to either overflow or instability in inverses, # the returned certificate is large and negative -- keeping a check if LOWER_CERT_BOUND < computed_certificate < 0: _, min_eig_val_m = self.get_lanczos_eig(feed_dict=feed_dict) tf.logging.info("min eig val from lanczos: " + str(min_eig_val_m)) input_vector_m = tf.placeholder( tf.float32, shape=(self.matrix_m_dimension, 1) ) output_vector_m = self.get_psd_product(input_vector_m) def np_vector_prod_fn_m(np_vector): np_vector = np.reshape(np_vector, [-1, 1]) feed_dict.update({input_vector_m: np_vector}) output_np_vector = self.sess.run(output_vector_m, feed_dict=feed_dict) return output_np_vector linear_operator_m = LinearOperator( (self.matrix_m_dimension, self.matrix_m_dimension), matvec=np_vector_prod_fn_m, ) # Performing shift invert scipy operation when eig val estimate is available min_eig_val_m_scipy, _ = eigs(linear_operator_m, k=1, which="SR", tol=TOL) tf.logging.info("min eig val m from scipy: " + str(min_eig_val_m_scipy)) if min_eig_val_m - TOL > 0: tf.logging.info("Found certificate of robustness!") return True return False ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/nn.py ================================================ """This file defines the neural network class, where a network is reinitialized from configuration files. The class also has a forward propagation method. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import json import numpy as np import tensorflow as tf class NeuralNetwork(object): """NeuralNetwork is a class that interfaces the verification code with the neural net parameters (weights). """ def __init__( self, net_weights, net_biases, net_layer_types, input_shape=None, cnn_params=None, ): """Function to initialize NeuralNetParams class. Args: net_weights: list of numpy matrices of weights of each layer [convention: x[i+1] = W[i] x[i] net_biases: list of numpy arrays of biases of each layer net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv' or 'ff_conv_relu'] 'ff': Simple feedforward layer with no activations 'ff_relu': Simple feedforward layer with ReLU activations 'ff_conv': Convolution layer with no activation 'ff_conv_relu': Convolution layer with ReLU activation input_shape: [num_rows, num_columns, num_channels] at the input layer cnn_params: list of dictionaries containing stride and padding for each layer Raises: ValueError: the input lists of net params are not of the same length """ if (len(net_weights) != len(net_biases)) or len(net_biases) != len( net_layer_types ): raise ValueError("Inputs of net params are not of same length ....") if net_layer_types[len(net_layer_types) - 1] != "ff": raise ValueError("Final layer is not linear") self.num_hidden_layers = len(net_weights) - 1 self.weights = [] self.biases = [] self.layer_types = [] self.sizes = [] self.input_shapes = [] self.output_shapes = [] self.has_conv = False if input_shape is not None: current_num_rows = input_shape[0] current_num_columns = input_shape[1] current_num_channels = input_shape[2] self.cnn_params = cnn_params # Setting the sizes of the layers of the network # sizes[i] contains the size of x_i for i in range(self.num_hidden_layers): shape = np.shape(net_weights[i]) self.weights.append(tf.convert_to_tensor(net_weights[i], dtype=tf.float32)) self.layer_types.append(net_layer_types[i]) if self.layer_types[i] in {"ff", "ff_relu"}: self.sizes.append(int(shape[1])) # For feedforward networks, no unraveling the bias terms small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32) self.biases.append(tf.reshape(small_bias, [-1, 1])) # Assumes that x^{i+1} = W_i x^i self.input_shapes.append([int(shape[1]), 1]) self.output_shapes.append([int(shape[0]), 1]) # Convolution type else: self.has_conv = True num_filters = shape[3] self.input_shapes.append( [1, current_num_rows, current_num_columns, current_num_channels] ) self.sizes.append( current_num_rows * current_num_columns * current_num_channels ) current_num_channels = num_filters # For propagating across multiple conv layers if self.cnn_params[i]["padding"] == "SAME": current_num_rows = int( current_num_rows / self.cnn_params[i]["stride"] ) current_num_columns = int( current_num_columns / self.cnn_params[i]["stride"] ) self.output_shapes.append( [1, current_num_rows, current_num_columns, current_num_channels] ) # For conv networks, unraveling the bias terms small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32) large_bias = tf.tile( tf.reshape(small_bias, [-1, 1]), [current_num_rows * current_num_columns, 1], ) self.biases.append(large_bias) # Last layer shape: always ff if self.has_conv: final_dim = int(np.shape(net_weights[self.num_hidden_layers])[1]) self.input_shapes.append([final_dim, 1]) else: final_dim = int(np.shape(net_weights[self.num_hidden_layers - 1])[0]) self.sizes.append(final_dim) self.final_weights = tf.convert_to_tensor( net_weights[self.num_hidden_layers], dtype=tf.float32 ) self.final_bias = tf.convert_to_tensor( net_biases[self.num_hidden_layers], dtype=tf.float32 ) def forward_pass(self, vector, layer_index, is_transpose=False, is_abs=False): """Performs forward pass through the layer weights at layer_index. Args: vector: vector that has to be passed through in forward pass layer_index: index of the layer is_transpose: whether the weights of the layer have to be transposed is_abs: whether to take the absolute value of the weights Returns: tensor that corresponds to the forward pass through the layer Raises: ValueError: if the layer_index is negative or more than num hidden layers """ if layer_index < 0 or layer_index > self.num_hidden_layers: raise ValueError("Invalid layer index") layer_type = self.layer_types[layer_index] weight = self.weights[layer_index] if is_abs: weight = tf.abs(weight) if is_transpose: vector = tf.reshape(vector, self.output_shapes[layer_index]) else: vector = tf.reshape(vector, self.input_shapes[layer_index]) if layer_type in {"ff", "ff_relu"}: if is_transpose: weight = tf.transpose(weight) return_vector = tf.matmul(weight, vector) elif layer_type in {"conv", "conv_relu"}: if is_transpose: return_vector = tf.nn.conv2d_transpose( vector, weight, output_shape=self.input_shapes[layer_index], strides=[ 1, self.cnn_params[layer_index]["stride"], self.cnn_params[layer_index]["stride"], 1, ], padding=self.cnn_params[layer_index]["padding"], ) else: return_vector = tf.nn.conv2d( vector, weight, strides=[ 1, self.cnn_params[layer_index]["stride"], self.cnn_params[layer_index]["stride"], 1, ], padding=self.cnn_params[layer_index]["padding"], ) else: raise NotImplementedError("Unsupported layer type: {0}".format(layer_type)) if is_transpose: return tf.reshape(return_vector, (self.sizes[layer_index], 1)) return tf.reshape(return_vector, (self.sizes[layer_index + 1], 1)) def load_network_from_checkpoint(checkpoint, model_json, input_shape=None): """Function to read the weights from checkpoint based on json description. Args: checkpoint: tensorflow checkpoint with trained model to verify model_json: path of json file with model description of the network list of dictionary items for each layer containing 'type', 'weight_var', 'bias_var' and 'is_transpose' 'type'is one of {'ff', 'ff_relu' or 'conv'}; 'weight_var' is the name of tf variable for weights of layer i; 'bias_var' is the name of tf variable for bias of layer i; 'is_transpose' is set to True if the weights have to be transposed as per convention Note that last layer is always feedforward net_weights: list of numpy matrices of weights of each layer convention: x[i+1] = W[i] x[i] net_biases: list of numpy arrays of biases of each layer net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv' or 'ff_conv_relu'] 'ff': Simple feedforward layer with no activations 'ff_relu': Simple feedforward layer with ReLU activations 'ff_conv': Convolution layer with no activation 'ff_conv_relu': Convolution layer with ReLU activation Raises: ValueError: If layer_types are invalid or variable names not found in checkpoint """ # Load checkpoint reader = tf.train.load_checkpoint(checkpoint) variable_map = reader.get_variable_to_shape_map() checkpoint_variable_names = variable_map.keys() # Parse JSON file for names with tf.gfile.Open(model_json) as f: list_model_var = json.load(f) net_layer_types = [] net_weights = [] net_biases = [] cnn_params = [] # Checking validity of the input and adding to list for layer_model_var in list_model_var: if layer_model_var["type"] not in {"ff", "ff_relu", "conv"}: raise ValueError("Invalid layer type in description") if ( layer_model_var["weight_var"] not in checkpoint_variable_names or layer_model_var["bias_var"] not in checkpoint_variable_names ): raise ValueError("Variable names not found in checkpoint") net_layer_types.append(layer_model_var["type"]) layer_weight = reader.get_tensor(layer_model_var["weight_var"]) layer_bias = reader.get_tensor(layer_model_var["bias_var"]) # TODO(aditirag): is there a way to automatically check when to transpose # We want weights W such that x^{i+1} = W^i x^i + b^i # Can think of a hack involving matching shapes but if shapes are equal # it can be ambiguous if layer_model_var["type"] in {"ff", "ff_relu"}: layer_weight = np.transpose(layer_weight) cnn_params.append(None) if layer_model_var["type"] in {"conv"}: if "stride" not in layer_model_var or "padding" not in layer_model_var: raise ValueError("Please define stride and padding for conv layers.") cnn_params.append( { "stride": layer_model_var["stride"], "padding": layer_model_var["padding"], } ) net_weights.append(layer_weight) net_biases.append(np.reshape(layer_bias, (np.size(layer_bias), 1))) return NeuralNetwork( net_weights, net_biases, net_layer_types, input_shape, cnn_params ) ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/optimization.py ================================================ """Code for setting up the optimization problem for certification.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import json import os import numpy as np from scipy.sparse.linalg import eigs, LinearOperator import tensorflow as tf from tensorflow.contrib import autograph from cleverhans.experimental.certification import utils UPDATE_PARAM_CONSTANT = -0.1 # Tolerance value for eigenvalue computation TOL = 1e-5 class Optimization(object): """Class that sets up and runs the optimization of dual_formulation""" def __init__(self, dual_formulation_object, sess, optimization_params): """Initialize the class variables. Args: dual_formulation_object: Instance of DualFormulation that contains the dual variables and objective sess: tf session to be used to run optimization_params: Dictionary with the following eig_num_iter - Number of iterations to run for computing minimum eigen value eig_learning_rate - Learning rate for minimum eigen value iterations init_smooth - Starting value of the smoothness parameter (typically around 0.001) smooth_decay - The factor by which to decay after every outer loop epoch optimizer - one of gd, adam, momentum or adagrad eig_type - The method to compute eigenvalues (TF or SCIPY) """ self.sess = sess self.dual_object = dual_formulation_object self.params = optimization_params self.penalty_placeholder = tf.placeholder(tf.float32, shape=[]) # The dimensionality of matrix M is the sum of sizes of all layers + 1 # The + 1 comes due to a row and column of M representing the linear terms self.eig_init_vec_placeholder = tf.placeholder( tf.float32, shape=[1 + self.dual_object.dual_index[-1], 1] ) self.smooth_placeholder = tf.placeholder(tf.float32, shape=[]) self.eig_num_iter_placeholder = tf.placeholder(tf.int32, shape=[]) self.current_eig_val_estimate = None # Create graph for optimization self.prepare_for_optimization() def tf_min_eig_vec(self): """Function for min eigen vector using tf's full eigen decomposition.""" # Full eigen decomposition requires the explicit psd matrix M _, matrix_m = self.dual_object.get_full_psd_matrix() [eig_vals, eig_vectors] = tf.self_adjoint_eig(matrix_m) index = tf.argmin(eig_vals) return tf.reshape(eig_vectors[:, index], shape=[eig_vectors.shape[0].value, 1]) def tf_smooth_eig_vec(self): """Function that returns smoothed version of min eigen vector.""" _, matrix_m = self.dual_object.get_full_psd_matrix() # Easier to think in terms of max so negating the matrix [eig_vals, eig_vectors] = tf.self_adjoint_eig(-matrix_m) exp_eig_vals = tf.exp(tf.divide(eig_vals, self.smooth_placeholder)) scaling_factor = tf.reduce_sum(exp_eig_vals) # Multiplying each eig vector by exponential of corresponding eig value # Scaling factor normalizes the vector to be unit norm eig_vec_smooth = tf.divide( tf.matmul(eig_vectors, tf.diag(tf.sqrt(exp_eig_vals))), tf.sqrt(scaling_factor), ) return tf.reshape( tf.reduce_sum(eig_vec_smooth, axis=1), shape=[eig_vec_smooth.shape[0].value, 1], ) def get_min_eig_vec_proxy(self, use_tf_eig=False): """Computes the min eigen value and corresponding vector of matrix M. Args: use_tf_eig: Whether to use tf's default full eigen decomposition Returns: eig_vec: Minimum absolute eigen value eig_val: Corresponding eigen vector """ if use_tf_eig: # If smoothness parameter is too small, essentially no smoothing # Just output the eigen vector corresponding to min return tf.cond( self.smooth_placeholder < 1e-8, self.tf_min_eig_vec, self.tf_smooth_eig_vec, ) # Using autograph to automatically handle # the control flow of minimum_eigen_vector min_eigen_tf = autograph.to_graph(utils.minimum_eigen_vector) def _vector_prod_fn(x): return self.dual_object.get_psd_product(x) estimated_eigen_vector = min_eigen_tf( x=self.eig_init_vec_placeholder, num_steps=self.eig_num_iter_placeholder, learning_rate=self.params["eig_learning_rate"], vector_prod_fn=_vector_prod_fn, ) return estimated_eigen_vector def get_scipy_eig_vec(self): """Computes scipy estimate of min eigenvalue for matrix M. Returns: eig_vec: Minimum absolute eigen value eig_val: Corresponding eigen vector """ if not self.params["has_conv"]: matrix_m = self.sess.run(self.dual_object.matrix_m) min_eig_vec_val, estimated_eigen_vector = eigs( matrix_m, k=1, which="SR", tol=1e-4 ) min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1]) return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val else: dim = self.dual_object.matrix_m_dimension input_vector = tf.placeholder(tf.float32, shape=(dim, 1)) output_vector = self.dual_object.get_psd_product(input_vector) def np_vector_prod_fn(np_vector): np_vector = np.reshape(np_vector, [-1, 1]) output_np_vector = self.sess.run( output_vector, feed_dict={input_vector: np_vector} ) return output_np_vector linear_operator = LinearOperator((dim, dim), matvec=np_vector_prod_fn) # Performing shift invert scipy operation when eig val estimate is available min_eig_vec_val, estimated_eigen_vector = eigs( linear_operator, k=1, which="SR", tol=1e-4 ) min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1]) return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val def prepare_for_optimization(self): """Create tensorflow op for running one step of descent.""" if self.params["eig_type"] == "TF": self.eig_vec_estimate = self.get_min_eig_vec_proxy() elif self.params["eig_type"] == "LZS": self.eig_vec_estimate = self.dual_object.m_min_vec else: self.eig_vec_estimate = tf.placeholder( tf.float32, shape=(self.dual_object.matrix_m_dimension, 1) ) self.stopped_eig_vec_estimate = tf.stop_gradient(self.eig_vec_estimate) # Eig value is v^\top M v, where v is eigen vector self.eig_val_estimate = tf.matmul( tf.transpose(self.stopped_eig_vec_estimate), self.dual_object.get_psd_product(self.stopped_eig_vec_estimate), ) # Penalizing negative of min eigen value because we want min eig value # to be positive self.total_objective = ( self.dual_object.unconstrained_objective + 0.5 * tf.square( tf.maximum(-self.penalty_placeholder * self.eig_val_estimate, 0) ) ) global_step = tf.Variable(0, trainable=False) # Set up learning rate as a placeholder self.learning_rate = tf.placeholder(tf.float32, shape=[]) # Set up the optimizer if self.params["optimizer"] == "adam": self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate) elif self.params["optimizer"] == "adagrad": self.optimizer = tf.train.AdagradOptimizer(learning_rate=self.learning_rate) elif self.params["optimizer"] == "momentum": self.optimizer = tf.train.MomentumOptimizer( learning_rate=self.learning_rate, momentum=self.params["momentum_parameter"], use_nesterov=True, ) else: self.optimizer = tf.train.GradientDescentOptimizer( learning_rate=self.learning_rate ) # Write out the projection step self.train_step = self.optimizer.minimize( self.total_objective, global_step=global_step ) self.sess.run(tf.global_variables_initializer()) # Projecting the dual variables proj_ops = [] for i in range(self.dual_object.nn_params.num_hidden_layers + 1): # Lambda_pos is non negative for switch indices, # Unconstrained for positive indices # Zero for negative indices proj_ops.append( self.dual_object.lambda_pos[i].assign( tf.multiply( self.dual_object.positive_indices[i], self.dual_object.lambda_pos[i], ) + tf.multiply( self.dual_object.switch_indices[i], tf.nn.relu(self.dual_object.lambda_pos[i]), ) ) ) proj_ops.append( self.dual_object.lambda_neg[i].assign( tf.multiply( self.dual_object.negative_indices[i], self.dual_object.lambda_neg[i], ) + tf.multiply( self.dual_object.switch_indices[i], tf.nn.relu(self.dual_object.lambda_neg[i]), ) ) ) # Lambda_quad is only non zero and positive for switch proj_ops.append( self.dual_object.lambda_quad[i].assign( tf.multiply( self.dual_object.switch_indices[i], tf.nn.relu(self.dual_object.lambda_quad[i]), ) ) ) # Lambda_lu is always non negative proj_ops.append( self.dual_object.lambda_lu[i].assign( tf.nn.relu(self.dual_object.lambda_lu[i]) ) ) self.proj_step = tf.group(proj_ops) # Create folder for saving stats if the folder is not None if self.params.get("stats_folder") and not tf.gfile.IsDirectory( self.params["stats_folder"] ): tf.gfile.MkDir(self.params["stats_folder"]) def run_one_step( self, eig_init_vec_val, eig_num_iter_val, smooth_val, penalty_val, learning_rate_val, ): """Run one step of gradient descent for optimization. Args: eig_init_vec_val: Start value for eigen value computations eig_num_iter_val: Number of iterations to run for eigen computations smooth_val: Value of smoothness parameter penalty_val: Value of penalty for the current step learning_rate_val: Value of learning rate Returns: found_cert: True is negative certificate is found, False otherwise """ # Running step step_feed_dict = { self.eig_init_vec_placeholder: eig_init_vec_val, self.eig_num_iter_placeholder: eig_num_iter_val, self.smooth_placeholder: smooth_val, self.penalty_placeholder: penalty_val, self.learning_rate: learning_rate_val, } if self.params["eig_type"] == "SCIPY": current_eig_vector, self.current_eig_val_estimate = self.get_scipy_eig_vec() step_feed_dict.update({self.eig_vec_estimate: current_eig_vector}) elif self.params["eig_type"] == "LZS": step_feed_dict.update( {self.dual_object.m_min_vec_ph: self.dual_object.m_min_vec_estimate} ) self.sess.run(self.train_step, feed_dict=step_feed_dict) [ _, self.dual_object.m_min_vec_estimate, self.current_eig_val_estimate, ] = self.sess.run( [self.proj_step, self.eig_vec_estimate, self.eig_val_estimate], feed_dict=step_feed_dict, ) if self.current_step % self.params["print_stats_steps"] == 0: [ self.current_total_objective, self.current_unconstrained_objective, self.dual_object.m_min_vec_estimate, self.current_eig_val_estimate, self.current_nu, ] = self.sess.run( [ self.total_objective, self.dual_object.unconstrained_objective, self.eig_vec_estimate, self.eig_val_estimate, self.dual_object.nu, ], feed_dict=step_feed_dict, ) stats = { "total_objective": float(self.current_total_objective), "unconstrained_objective": float(self.current_unconstrained_objective), "min_eig_val_estimate": float(self.current_eig_val_estimate), } tf.logging.info( "Current inner step: %d, optimization stats: %s", self.current_step, stats, ) if self.params["stats_folder"] is not None: stats = json.dumps(stats) filename = os.path.join( self.params["stats_folder"], str(self.current_step) + ".json" ) with tf.gfile.Open(filename) as file_f: file_f.write(stats) # Project onto feasible set of dual variables if ( self.current_step % self.params["projection_steps"] == 0 and self.current_unconstrained_objective < 0 ): nu = self.sess.run(self.dual_object.nu) dual_feed_dict = { self.dual_object.h_min_vec_ph: self.dual_object.h_min_vec_estimate } _, min_eig_val_h_lz = self.dual_object.get_lanczos_eig( compute_m=False, feed_dict=dual_feed_dict ) projected_dual_feed_dict = { self.dual_object.projected_dual.nu: nu, self.dual_object.projected_dual.min_eig_val_h: min_eig_val_h_lz, } if self.dual_object.projected_dual.compute_certificate( self.current_step, projected_dual_feed_dict ): return True return False def run_optimization(self): """Run the optimization, call run_one_step with suitable placeholders. Returns: True if certificate is found False otherwise """ penalty_val = self.params["init_penalty"] # Don't use smoothing initially - very inaccurate for large dimension self.smooth_on = False smooth_val = 0 learning_rate_val = self.params["init_learning_rate"] self.current_outer_step = 1 while self.current_outer_step <= self.params["outer_num_steps"]: tf.logging.info( "Running outer step %d with penalty %f", self.current_outer_step, penalty_val, ) # Running inner loop of optimization with current_smooth_val, # current_penalty as smoothness parameters and penalty respectively self.current_step = 0 # Run first step with random eig initialization and large number of steps found_cert = self.run_one_step( self.dual_object.m_min_vec_estimate, self.params["large_eig_num_steps"], smooth_val, penalty_val, learning_rate_val, ) if found_cert: return True while self.current_step < self.params["inner_num_steps"]: self.current_step = self.current_step + 1 found_cert = self.run_one_step( self.dual_object.m_min_vec_estimate, self.params["small_eig_num_steps"], smooth_val, penalty_val, learning_rate_val, ) if found_cert: return True # Update penalty only if it looks like current objective is optimizes if self.current_total_objective < UPDATE_PARAM_CONSTANT: penalty_val = penalty_val * self.params["beta"] learning_rate_val = ( learning_rate_val * self.params["learning_rate_decay"] ) else: # To get more accurate gradient estimate self.params["small_eig_num_steps"] = ( 1.5 * self.params["small_eig_num_steps"] ) # If eigen values seem small enough, turn on smoothing # useful only when performing full eigen decomposition if np.abs(self.current_eig_val_estimate) < 0.01: smooth_val = self.params["smoothness_parameter"] self.current_outer_step = self.current_outer_step + 1 return False ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/tests/dual_formulation_test.py ================================================ """Tests for cleverhans.experimental.certification.dual_formulation.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import unittest import numpy as np import tensorflow as tf from cleverhans.experimental.certification import dual_formulation from cleverhans.experimental.certification import nn class DualFormulationTest(unittest.TestCase): def test_init(self): # Function to test initialization of dual formulation class. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) self.assertIsNotNone(dual_formulation_object) def test_set_differentiable_objective(self): # Function to test the function that sets the differentiable objective. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) dual_formulation_object.set_differentiable_objective() self.assertEqual(dual_formulation_object.scalar_f.shape.as_list(), [1]) self.assertEqual( dual_formulation_object.unconstrained_objective.shape.as_list(), [1, 1] ) self.assertEqual(dual_formulation_object.vector_g.shape.as_list(), [5, 1]) def test_get_full_psd_matrix(self): # Function to test product with PSD matrix. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) matrix_h, matrix_m = dual_formulation_object.get_full_psd_matrix() self.assertEqual(matrix_h.shape.as_list(), [5, 5]) self.assertEqual(matrix_m.shape.as_list(), [6, 6]) def test_get_psd_product(self): # Function to test implicit product with PSD matrix. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32) two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32) scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32) lambda_pos = [two_dim_tensor, three_dim_tensor] lambda_neg = lambda_pos lambda_quad = lambda_pos lambda_lu = lambda_pos nu = scalar dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } with tf.Session() as sess: dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) _, matrix_m = dual_formulation_object.get_full_psd_matrix() # Testing if the values match six_dim_tensor = tf.random_uniform(shape=(6, 1), dtype=tf.float32) implicit_product = dual_formulation_object.get_psd_product(six_dim_tensor) explicit_product = tf.matmul(matrix_m, six_dim_tensor) [implicit_product_value, explicit_product_value] = sess.run( [implicit_product, explicit_product] ) self.assertEqual( np.shape(implicit_product_value), np.shape(explicit_product_value) ) self.assertLess( np.max(np.abs(implicit_product_value - explicit_product_value)), 1e-5 ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/tests/nn_test.py ================================================ """Tests for cleverhans.experimental.certification.nn.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import unittest import numpy as np import tensorflow as tf from cleverhans.experimental.certification import nn class NeuralNetworkTest(unittest.TestCase): def test_init(self): # Function to test initialization of NeuralNetParams object. # Valid params net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) self.assertIsNotNone(nn_params1) # Invalid params : list length net_biases = [0] with self.assertRaises(ValueError): nn.NeuralNetwork(net_weights, net_biases, net_layer_types) # Invalid params: layer types with self.assertRaises(ValueError): net_layer_types = ["ff_relu", "ff_relu"] nn.NeuralNetwork(net_weights, net_biases, net_layer_types) def test_forward_pass(self): # Function to test forward pass of nn_params. net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) input_vector = tf.random_uniform(shape=(2, 1), dtype=tf.float32) output_vector = nn_params.forward_pass(input_vector, 0) self.assertEqual(output_vector.shape.as_list(), [3, 1]) output_vector_2 = nn_params.forward_pass(input_vector, 0, is_abs=True) self.assertEqual(output_vector_2.shape.as_list(), [3, 1]) input_vector_trans = tf.random_uniform(shape=(3, 1), dtype=tf.float32) output_vector_3 = nn_params.forward_pass( input_vector_trans, 0, is_transpose=True ) self.assertEqual(output_vector_3.shape.as_list(), [2, 1]) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/tests/optimization_test.py ================================================ """Tests for cleverhans.experimental.certification.optimization.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf from cleverhans.experimental.certification import dual_formulation from cleverhans.experimental.certification import nn from cleverhans.experimental.certification import optimization class OptimizationTest(tf.test.TestCase): # pylint: disable=missing-docstring def prepare_dual_object(self): # Function to prepare dual object to be used for testing optimization. net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]] net_biases = [ np.transpose(np.matrix([0, 0, 0])), np.transpose(np.matrix([0, 0])), ] net_layer_types = ["ff_relu", "ff"] nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types) test_input = np.transpose(np.matrix([0, 0])) true_class = 0 adv_class = 1 input_minval = 0 input_maxval = 0 epsilon = 0.1 # Creating dual variables to use for optimization lambda_pos = [ tf.get_variable( "lambda_pos0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_pos1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] lambda_neg = [ tf.get_variable( "lambda_neg0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_neg1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] lambda_quad = [ tf.get_variable( "lambda_quad0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_quad1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] lambda_lu = [ tf.get_variable( "lambda_lu0", initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32), ), tf.get_variable( "lambda_lu1", initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32), ), ] nu = tf.reshape( tf.get_variable("nu", initializer=200.0, dtype=tf.float32), shape=(1, 1) ) dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } sess = tf.Session() dual_formulation_object = dual_formulation.DualFormulation( sess, dual_var, nn_params1, test_input, true_class, adv_class, input_minval, input_maxval, epsilon, ) return sess, dual_formulation_object def test_init(self): """ Function to test initialization of OptimizationTest. """ sess, dual_formulation_object = self.prepare_dual_object() dual_formulation_object.set_differentiable_objective() sess.run(tf.global_variables_initializer()) optimization_params = { "init_learning_rate": 0.1, "learning_rate_decay": 0.9, "eig_num_iter": 10, "eig_learning_rate": 0.01, "init_smooth": 0.5, "smooth_decay": 0.9, "inner_num_steps": 10, "optimizer": "adam", "momentum_parameter": 0.9, "eig_type": "TF", } optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) self.assertIsNotNone(optimization_object) def test_get_min_eig_vec_proxy(self): """ Function test computing min eigen value using matrix vector products.""" sess, dual_formulation_object = self.prepare_dual_object() _, matrix_m = dual_formulation_object.get_full_psd_matrix() optimization_params = { "init_learning_rate": 0.1, "learning_rate_decay": 0.9, "eig_num_iter": 2000, "eig_learning_rate": 0.01, "init_smooth": 0.0, "smooth_decay": 0.9, "inner_num_steps": 10, "optimizer": "adam", "momentum_parameter": 0.9, "eig_type": "TF", } sess.run(tf.global_variables_initializer()) optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) eig_vec = optimization_object.get_min_eig_vec_proxy() tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True) self.assertIsNotNone(eig_vec) # Running the graphs and checking that minimum eigen value is correct # ** No smoothing tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run( [tf_eig_vec, eig_vec, matrix_m], feed_dict={ optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1), optimization_object.eig_num_iter_placeholder: 2000, optimization_object.smooth_placeholder: 0.0, }, ) # Eigen value corresponding to v is v^\top M v eig_val = np.matmul( np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val) ) tf_eig_val = np.matmul( np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val) ) [np_eig_values, _] = np.linalg.eig(matrix_m_val) self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5) self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-5) # Running the graphs and checking that minimum eigen value is correct # **Smoothing optimization_params["init_smooth"] = 0.0001 optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) eig_vec = optimization_object.get_min_eig_vec_proxy() tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True) tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run( [tf_eig_vec, eig_vec, matrix_m], feed_dict={ optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1), optimization_object.smooth_placeholder: 0.1, optimization_object.eig_num_iter_placeholder: 2000, }, ) # Eigen value corresponding to v is v^\top M v eig_val = np.matmul( np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val) ) tf_eig_val = np.matmul( np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val) ) [np_eig_values, _] = np.linalg.eig(matrix_m_val) self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5) # In general, smoothed version can be far off self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-1) def test_optimization(self): """Function to test optimization.""" sess, dual_formulation_object = self.prepare_dual_object() optimization_params = { "init_penalty": 10000, "large_eig_num_steps": 1000, "small_eig_num_steps": 500, "inner_num_steps": 10, "outer_num_steps": 2, "beta": 2, "smoothness_parameter": 0.001, "eig_learning_rate": 0.01, "optimizer": "adam", "init_learning_rate": 0.1, "learning_rate_decay": 0.9, "momentum_parameter": 0.9, "print_stats_steps": 1, "stats_folder": None, "projection_steps": 200, "eig_type": "TF", } sess.run(tf.global_variables_initializer()) optimization_object = optimization.Optimization( dual_formulation_object, sess, optimization_params ) is_cert_found = optimization_object.run_optimization() self.assertFalse(is_cert_found) if __name__ == "__main__": tf.test.main() ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/tests/utils_test.py ================================================ """Tests for cleverhans.experimental.certification.utils.""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np from scipy.sparse.linalg import eigs import tensorflow as tf from tensorflow.contrib import autograph from cleverhans.experimental.certification import utils MATRIX_DIMENTION = 100 NUM_LZS_ITERATIONS = 100 NUM_RANDOM_MATRICES = 10 class UtilsTest(tf.test.TestCase): def test_minimum_eigen_vector(self): matrix = np.array([[1.0, 2.0], [2.0, 5.0]], dtype=np.float32) initial_vec = np.array([[1.0], [-1.0]], dtype=np.float32) def _vector_prod_fn(x): return tf.matmul(matrix, x) min_eigen_fn = autograph.to_graph(utils.minimum_eigen_vector) x = tf.placeholder(tf.float32, shape=(2, 1)) min_eig_vec = min_eigen_fn(x, 10, 0.1, _vector_prod_fn) with self.test_session() as sess: v = sess.run(min_eig_vec, feed_dict={x: initial_vec}) if v.flatten()[0] < 0: v = -v np.testing.assert_almost_equal(v, [[0.9239], [-0.3827]], decimal=4) def test_tf_lanczos_smallest_eigval(self): tf_num_iter = tf.placeholder(dtype=tf.int32, shape=()) tf_matrix = tf.placeholder(dtype=tf.float32) def _vector_prod_fn(x): return tf.matmul(tf_matrix, tf.reshape(x, [-1, 1])) min_eigen_fn = autograph.to_graph(utils.tf_lanczos_smallest_eigval) init_vec_ph = tf.placeholder(shape=(MATRIX_DIMENTION, 1), dtype=tf.float32) tf_eigval, tf_eigvec = min_eigen_fn( _vector_prod_fn, MATRIX_DIMENTION, init_vec_ph, tf_num_iter, dtype=tf.float32, ) eigvec = np.zeros((MATRIX_DIMENTION, 1), dtype=np.float32) with self.test_session() as sess: # run this test for a few random matrices for _ in range(NUM_RANDOM_MATRICES): matrix = np.random.random((MATRIX_DIMENTION, MATRIX_DIMENTION)) matrix = matrix + matrix.T # symmetrizing matrix eigval, eigvec = sess.run( [tf_eigval, tf_eigvec], feed_dict={ tf_num_iter: NUM_LZS_ITERATIONS, tf_matrix: matrix, init_vec_ph: eigvec, }, ) scipy_min_eigval, scipy_min_eigvec = eigs(matrix, k=1, which="SR") scipy_min_eigval = np.real(scipy_min_eigval) scipy_min_eigvec = np.real(scipy_min_eigvec) scipy_min_eigvec = scipy_min_eigvec / np.linalg.norm(scipy_min_eigvec) np.testing.assert_almost_equal(eigval, scipy_min_eigval, decimal=3) np.testing.assert_almost_equal(np.linalg.norm(eigvec), 1.0, decimal=3) abs_dot_prod = abs(np.dot(eigvec.flatten(), scipy_min_eigvec.flatten())) np.testing.assert_almost_equal(abs_dot_prod, 1.0, decimal=3) if __name__ == "__main__": tf.test.main() ================================================ FILE: cleverhans_v3.1.0/cleverhans/experimental/certification/utils.py ================================================ """File containing some simple helper functions.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf def diag(diag_elements): """Function to create tensorflow diagonal matrix with input diagonal entries. Args: diag_elements: tensor with diagonal elements Returns: tf matrix with diagonal entries as diag_elements """ return tf.diag(tf.reshape(diag_elements, [-1])) def initialize_dual( neural_net_params_object, init_dual_file=None, random_init_variance=0.01, init_nu=200.0, ): """Function to initialize the dual variables of the class. Args: neural_net_params_object: Object with the neural net weights, biases and types init_dual_file: Path to file containing dual variables, if the path is empty, perform random initialization Expects numpy dictionary with lambda_pos_0, lambda_pos_1, .. lambda_neg_0, lambda_neg_1, .. lambda_quad_0, lambda_quad_1, .. lambda_lu_0, lambda_lu_1, .. random_init_variance: variance for random initialization init_nu: Value to initialize nu variable with Returns: dual_var: dual variables initialized appropriately. """ lambda_pos = [] lambda_neg = [] lambda_quad = [] lambda_lu = [] if init_dual_file is None: for i in range(0, neural_net_params_object.num_hidden_layers + 1): initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_pos.append( tf.get_variable( "lambda_pos_" + str(i), initializer=initializer, dtype=tf.float32 ) ) initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_neg.append( tf.get_variable( "lambda_neg_" + str(i), initializer=initializer, dtype=tf.float32 ) ) initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_quad.append( tf.get_variable( "lambda_quad_" + str(i), initializer=initializer, dtype=tf.float32 ) ) initializer = ( np.random.uniform( 0, random_init_variance, size=(neural_net_params_object.sizes[i], 1) ) ).astype(np.float32) lambda_lu.append( tf.get_variable( "lambda_lu_" + str(i), initializer=initializer, dtype=tf.float32 ) ) nu = tf.get_variable("nu", initializer=init_nu) else: # Loading from file dual_var_init_val = np.load(init_dual_file).item() for i in range(0, neural_net_params_object.num_hidden_layers + 1): lambda_pos.append( tf.get_variable( "lambda_pos_" + str(i), initializer=dual_var_init_val["lambda_pos"][i], dtype=tf.float32, ) ) lambda_neg.append( tf.get_variable( "lambda_neg_" + str(i), initializer=dual_var_init_val["lambda_neg"][i], dtype=tf.float32, ) ) lambda_quad.append( tf.get_variable( "lambda_quad_" + str(i), initializer=dual_var_init_val["lambda_quad"][i], dtype=tf.float32, ) ) lambda_lu.append( tf.get_variable( "lambda_lu_" + str(i), initializer=dual_var_init_val["lambda_lu"][i], dtype=tf.float32, ) ) nu = tf.get_variable("nu", initializer=1.0 * dual_var_init_val["nu"]) dual_var = { "lambda_pos": lambda_pos, "lambda_neg": lambda_neg, "lambda_quad": lambda_quad, "lambda_lu": lambda_lu, "nu": nu, } return dual_var def eig_one_step(current_vector, learning_rate, vector_prod_fn): """Function that performs one step of gd (variant) for min eigen value. Args: current_vector: current estimate of the eigen vector with minimum eigen value. learning_rate: learning rate. vector_prod_fn: function which returns product H*x, where H is a matrix for which we computing eigenvector. Returns: updated vector after one step """ grad = 2 * vector_prod_fn(current_vector) # Current objective = (1/2)*v^T (2*M*v); v = current_vector # grad = 2*M*v current_objective = tf.reshape( tf.matmul(tf.transpose(current_vector), grad) / 2.0, shape=() ) # Project the gradient into the tangent space of the constraint region. # This way we do not waste time taking steps that try to change the # norm of current_vector grad = grad - current_vector * tf.matmul(tf.transpose(current_vector), grad) grad_norm = tf.norm(grad) grad_norm_sq = tf.square(grad_norm) # Computing normalized gradient of unit norm norm_grad = grad / grad_norm # Computing directional second derivative (dsd) # dsd = 2*g^T M g, where g is normalized gradient directional_second_derivative = tf.reshape( 2 * tf.matmul(tf.transpose(norm_grad), vector_prod_fn(norm_grad)), shape=() ) # Computing grad^\top M grad [useful to compute step size later] # Just a rescaling of the directional_second_derivative (which uses # normalized gradient grad_m_grad = directional_second_derivative * grad_norm_sq / 2 # Directional_second_derivative/2 = objective when vector is norm_grad # If this is smaller than current objective, simply return that if directional_second_derivative / 2.0 < current_objective: return norm_grad # If curvature is positive, jump to the bottom of the bowl if directional_second_derivative > 0.0: step = -1.0 * grad_norm / directional_second_derivative else: # If the gradient is very small, do not move if grad_norm_sq <= 1e-16: step = 0.0 else: # Make a heuristic guess of the step size step = -2.0 * tf.reduce_sum(current_vector * grad) / grad_norm_sq # Computing gain using the gradient and second derivative gain = -( 2 * tf.reduce_sum(current_vector * grad) + (step * step) * grad_m_grad ) # Fall back to pre-determined learning rate if no gain if gain < 0.0: step = -learning_rate * grad_norm current_vector = current_vector + step * norm_grad return tf.nn.l2_normalize(current_vector) def minimum_eigen_vector(x, num_steps, learning_rate, vector_prod_fn): """Computes eigenvector which corresponds to minimum eigenvalue. Args: x: initial value of eigenvector. num_steps: number of optimization steps. learning_rate: learning rate. vector_prod_fn: function which takes x and returns product H*x. Returns: approximate value of eigenvector. This function finds approximate value of eigenvector of matrix H which corresponds to smallest (by absolute value) eigenvalue of H. It works by solving optimization problem x^{T}*H*x -> min. """ x = tf.nn.l2_normalize(x) for _ in range(num_steps): x = eig_one_step(x, learning_rate, vector_prod_fn) return x def tf_lanczos_smallest_eigval( vector_prod_fn, matrix_dim, initial_vector, num_iter=1000, max_iter=1000, collapse_tol=1e-9, dtype=tf.float32, ): """Computes smallest eigenvector and eigenvalue using Lanczos in pure TF. This function computes smallest eigenvector and eigenvalue of the matrix which is implicitly specified by `vector_prod_fn`. `vector_prod_fn` is a function which takes `x` and returns a product of matrix in consideration and `x`. Computation is done using Lanczos algorithm, see https://en.wikipedia.org/wiki/Lanczos_algorithm#The_algorithm Args: vector_prod_fn: function which takes a vector as an input and returns matrix vector product. matrix_dim: dimentionality of the matrix. initial_vector: guess vector to start the algorithm with num_iter: user-defined number of iterations for the algorithm max_iter: maximum number of iterations. collapse_tol: tolerance to determine collapse of the Krylov subspace dtype: type of data Returns: tuple of (eigenvalue, eigenvector) of smallest eigenvalue and corresponding eigenvector. """ # alpha will store diagonal elements alpha = tf.TensorArray(dtype, size=1, dynamic_size=True, element_shape=()) # beta will store off diagonal elements beta = tf.TensorArray(dtype, size=0, dynamic_size=True, element_shape=()) # q will store Krylov space basis q_vectors = tf.TensorArray( dtype, size=1, dynamic_size=True, element_shape=(matrix_dim, 1) ) # If start vector is all zeros, make it a random normal vector and run for max_iter if tf.norm(initial_vector) < collapse_tol: initial_vector = tf.random_normal(shape=(matrix_dim, 1), dtype=dtype) num_iter = max_iter w = initial_vector / tf.norm(initial_vector) # Iteration 0 of Lanczos q_vectors = q_vectors.write(0, w) w_ = vector_prod_fn(w) cur_alpha = tf.reduce_sum(w_ * w) alpha = alpha.write(0, cur_alpha) w_ = w_ - tf.scalar_mul(cur_alpha, w) w_prev = w w = w_ # Subsequent iterations of Lanczos for i in tf.range(1, num_iter): cur_beta = tf.norm(w) if cur_beta < collapse_tol: # return early if Krylov subspace collapsed break # cur_beta is larger than collapse_tol, # so division will return finite result. w = w / cur_beta w_ = vector_prod_fn(w) cur_alpha = tf.reduce_sum(w_ * w) q_vectors = q_vectors.write(i, w) alpha = alpha.write(i, cur_alpha) beta = beta.write(i - 1, cur_beta) w_ = w_ - tf.scalar_mul(cur_alpha, w) - tf.scalar_mul(cur_beta, w_prev) w_prev = w w = w_ alpha = alpha.stack() beta = beta.stack() q_vectors = tf.reshape(q_vectors.stack(), (-1, matrix_dim)) offdiag_submatrix = tf.linalg.diag(beta) tridiag_matrix = ( tf.linalg.diag(alpha) + tf.pad(offdiag_submatrix, [[0, 1], [1, 0]]) + tf.pad(offdiag_submatrix, [[1, 0], [0, 1]]) ) eigvals, eigvecs = tf.linalg.eigh(tridiag_matrix) smallest_eigval = eigvals[0] smallest_eigvec = tf.matmul(tf.reshape(eigvecs[:, 0], (1, -1)), q_vectors) smallest_eigvec = smallest_eigvec / tf.norm(smallest_eigvec) smallest_eigvec = tf.reshape(smallest_eigvec, (matrix_dim, 1)) return smallest_eigval, smallest_eigvec ================================================ FILE: cleverhans_v3.1.0/cleverhans/initializers.py ================================================ """ Initializers. """ import tensorflow as tf class HeReLuNormalInitializer(tf.initializers.random_normal): """ The initializer from He et al 2015 """ def __init__(self, dtype=tf.float32): super(HeReLuNormalInitializer, self).__init__(dtype=dtype) def get_config(self): return dict(dtype=self.dtype.name) def __call__(self, shape, dtype=None, partition_info=None): del partition_info dtype = self.dtype if dtype is None else dtype std = tf.rsqrt(tf.cast(tf.reduce_prod(shape[:-1]), tf.float32) + 1e-7) return tf.random_normal(shape, stddev=std, dtype=dtype) ================================================ FILE: cleverhans_v3.1.0/cleverhans/loss.py ================================================ """Loss functions for training models.""" import copy import json import os import warnings import numpy as np import tensorflow as tf from cleverhans.attacks import Attack from cleverhans.compat import softmax_cross_entropy_with_logits from cleverhans.model import Model from cleverhans.utils import safe_zip try: import tensorflow_probability as tfp tf_distributions = tfp.distributions except ImportError: tf_distributions = tf.distributions class Loss(object): """ An abstract interface for loss wrappers that allows flexible control of real examples, adversarial examples and labels. These losses are used for defenses (during model training). """ def __init__(self, model, hparams=None, attack=None): """ :param model: Model instance, the model on which to apply the loss. :param hparams: dict, hyper-parameters for the loss. :param attack: cleverhans.attacks.Attack instance """ assert isinstance(model, Model) standard = attack is None or isinstance(attack, Attack) deprecated = callable(attack) if not standard and not deprecated: raise TypeError("`attack` must be `None` or `Attack` subclass instance") if deprecated: warnings.warn( "callable attacks are deprecated, switch to an Attack " "subclass. callable attacks will not be supported after " "2019-05-05." ) class Wrapper(Attack): """ Temporary wrapper class to be removed when deprecated callable arguments are removed. :param f: a callable object implementing the attack """ def __init__(self, f): dummy_model = Model() super(Wrapper, self).__init__(model=dummy_model) self.f = f def generate(self, x): return self.f(x) attack = Wrapper(attack) self.model = model self.hparams = hparams self.attack = attack def save(self, path): """Save loss in json format""" json.dump( dict(loss=self.__class__.__name__, params=self.hparams), open(os.path.join(path, "loss.json"), "wb"), ) def fprop(self, x, y): """Forward propagate the loss. Loss should be a scalar value, independent of batch size (i.e. use reduce_mean over batch axis, don't use reduce_sum or return a tensor). Scalar losses are easier to add together, e.g. through `WeightedSum`. Mean losses are easier to redistribute across multiple replicas without needing to change learning rates, etc. :param x: tensor, a batch of inputs. :param y: tensor, a batch of outputs (1-hot labels typically). """ raise NotImplementedError class WeightedSum(Loss): """ A Loss that adds up a weighted sum of other losses. """ def __init__(self, model, terms): self.terms = terms Loss.__init__(self, model, locals()) def fprop(self, x, y, **kwargs): weights, loss_objects = safe_zip(*self.terms) for weight in weights: if isinstance(weight, float): continue if hasattr(weight, "ndim"): assert weight.ndim == 0 continue raise TypeError( "weight of %s is not a type that this function " "knows it can accept yet" % str(weight) ) losses = [loss.fprop(x, y, **kwargs) for loss in loss_objects] for loss, loss_object in safe_zip(losses, loss_objects): if len(loss.get_shape()) > 0: raise ValueError( "%s.fprop returned a non-scalar value" % str(loss_object) ) terms = [weight * loss for weight, loss in safe_zip(weights, losses)] return tf.add_n(terms) class CrossEntropy(Loss): """Cross-entropy loss for a multiclass softmax classifier. :param model: Model instance, the model on which to apply the loss. :param smoothing: float, amount of label smoothing for cross-entropy. :param attack: function, given an input x, return an attacked x'. :param pass_y: bool, if True pass y to the attack :param adv_coeff: Coefficient to put on the cross-entropy for adversarial examples, if adversarial examples are used. The coefficient on the cross-entropy for clean examples is 1. - adv_coeff. :param attack_params: dict, keyword arguments passed to `attack.generate` """ def __init__( self, model, smoothing=0.0, attack=None, pass_y=False, adv_coeff=0.5, attack_params=None, **kwargs ): if smoothing < 0 or smoothing > 1: raise ValueError("Smoothing must be in [0, 1]", smoothing) self.kwargs = kwargs Loss.__init__(self, model, locals(), attack) self.smoothing = smoothing self.adv_coeff = adv_coeff self.pass_y = pass_y self.attack_params = attack_params def fprop(self, x, y, **kwargs): kwargs.update(self.kwargs) if self.attack is not None: attack_params = copy.copy(self.attack_params) if attack_params is None: attack_params = {} if self.pass_y: attack_params["y"] = y x = x, self.attack.generate(x, **attack_params) coeffs = [1.0 - self.adv_coeff, self.adv_coeff] if self.adv_coeff == 1.0: x = (x[1],) coeffs = (coeffs[1],) else: x = tuple([x]) coeffs = [1.0] assert np.allclose(sum(coeffs), 1.0) # Catching RuntimeError: Variable -= value not supported by tf.eager. try: y -= self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], y.dtype)) except RuntimeError: y.assign_sub(self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], y.dtype))) logits = [self.model.get_logits(x, **kwargs) for x in x] loss = sum( coeff * tf.reduce_mean(softmax_cross_entropy_with_logits(labels=y, logits=logit)) for coeff, logit in safe_zip(coeffs, logits) ) return loss class MixUp(Loss): """Mixup ( https://arxiv.org/abs/1710.09412 ) :param model: Model instance, the model on which to apply the loss. :param beta: float, beta distribution parameter for MixUp. """ def __init__(self, model, beta, **kwargs): del kwargs Loss.__init__(self, model, locals()) self.beta = beta def fprop(self, x, y, **kwargs): with tf.device("/CPU:0"): # Prevent error complaining GPU kernels unavailable for this. mix = tf_distributions.Beta(self.beta, self.beta) mix = mix.sample([tf.shape(x)[0]] + [1] * (len(x.shape) - 1)) mix = tf.maximum(mix, 1 - mix) mix_label = tf.reshape(mix, [-1, 1]) xm = x + mix * (x[::-1] - x) ym = y + mix_label * (y[::-1] - y) logits = self.model.get_logits(xm, **kwargs) loss = tf.reduce_mean( softmax_cross_entropy_with_logits(labels=ym, logits=logits) ) return loss class FeaturePairing(Loss): """Feature pairing loss. :param model: Model instance, the model on which to apply the loss. :param weight: float, with of logic pairing loss. :param attack: function, given an input x, return an attacked x'. """ def __init__(self, model, weight, attack, **kwargs): del kwargs Loss.__init__(self, model, locals(), attack) self.weight = weight def fprop(self, x, y, **kwargs): x_adv = self.attack.generate(x) d1 = self.model.fprop(x, **kwargs) d2 = self.model.fprop(x_adv, **kwargs) pairing_loss = [ tf.reduce_mean(tf.square(a - b)) for a, b in zip(d1[Model.O_FEATURES], d2[Model.O_FEATURES]) ] pairing_loss = tf.reduce_mean(pairing_loss) loss = tf.reduce_mean( softmax_cross_entropy_with_logits(labels=y, logits=d1[Model.O_LOGITS]) ) loss += tf.reduce_mean( softmax_cross_entropy_with_logits(labels=y, logits=d2[Model.O_LOGITS]) ) return loss + self.weight * pairing_loss class WeightDecay(Loss): """Weight decay""" def fprop(self, x, y, **kwargs): terms = [ tf.nn.l2_loss(param) for param in self.model.get_params() if len(param.get_shape()) > 1 ] out = tf.add_n(terms) assert len(out.get_shape()) == 0 return out class LossCrossEntropy(Loss): """ Deprecated version of `CrossEntropy` that returns per-example loss rather than mean loss. """ def __init__(self, model, smoothing=0.0, attack=None, **kwargs): """Constructor. :param model: Model instance, the model on which to apply the loss. :param smoothing: float, amount of label smoothing for cross-entropy. :param attack: function, given an input x, return an attacked x'. """ if smoothing < 0 or smoothing > 1: raise ValueError("Smoothing must be in [0, 1]", smoothing) del kwargs Loss.__init__(self, model, locals(), attack) self.smoothing = smoothing def fprop(self, x, y, **kwargs): if self.attack is not None: x = x, self.attack(x) else: x = tuple([x]) # Catching RuntimeError: Variable -= value not supported by tf.eager. try: y -= self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], tf.float32)) except RuntimeError: y.assign_sub(self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], tf.float32))) logits = [self.model.get_logits(x, **kwargs) for x in x] loss = sum( softmax_cross_entropy_with_logits(labels=y, logits=logit) for logit in logits ) warnings.warn( "LossCrossEntropy is deprecated, switch to " "CrossEntropy. LossCrossEntropy may be removed on " "or after 2019-03-06." ) return loss class LossFeaturePairing(Loss): """Deprecated version of `FeaturePairing` that returns per-example loss rather than mean loss.""" def __init__(self, model, weight, attack, **kwargs): """Constructor. :param model: Model instance, the model on which to apply the loss. :param weight: float, with of logic pairing loss. :param attack: function, given an input x, return an attacked x'. """ del kwargs Loss.__init__(self, model, locals(), attack) self.weight = weight def fprop(self, x, y, **kwargs): x_adv = self.attack(x) d1 = self.model.fprop(x, **kwargs) d2 = self.model.fprop(x_adv, **kwargs) pairing_loss = [ tf.reduce_mean(tf.square(a - b)) for a, b in zip(d1[Model.O_FEATURES], d2[Model.O_FEATURES]) ] pairing_loss = tf.reduce_mean(pairing_loss) loss = softmax_cross_entropy_with_logits(labels=y, logits=d1[Model.O_LOGITS]) loss += softmax_cross_entropy_with_logits(labels=y, logits=d2[Model.O_LOGITS]) warnings.warn( "LossFeaturePairing is deprecated, switch to " "FeaturePairing. LossFeaturePairing may be removed " "on or after 2019-03-06." ) return loss + self.weight * pairing_loss class LossMixUp(Loss): """Deprecated version of `MixUp` that returns per-example loss rather than mean loss.""" def __init__(self, model, beta, **kwargs): """Constructor. :param model: Model instance, the model on which to apply the loss. :param beta: float, beta distribution parameter for MixUp. """ del kwargs Loss.__init__(self, model, locals()) self.beta = beta def fprop(self, x, y, **kwargs): mix = tf_distributions.Beta(self.beta, self.beta) mix = mix.sample([tf.shape(x)[0]] + [1] * (len(x.shape) - 1)) xm = x + mix * (x[::-1] - x) ym = y + mix * (y[::-1] - y) logits = self.model.get_logits(xm, **kwargs) loss = softmax_cross_entropy_with_logits(labels=ym, logits=logits) warnings.warn( "LossMixUp is deprecated, switch to " "MixUp. LossFeaturePairing may be removed " "on or after 2019-03-06." ) return loss class SNNLCrossEntropy(CrossEntropy): """A combination loss of Soft Nearest Neighbor Loss calculated at every layer in the network, and standard cross entropy of the logits. Presented in "Analyzing and Improving Representations with the Soft Nearest Neighbor Loss" by Nicholas Frosst, Nicolas Papernot, and Geoffrey Hinton. arXiv preprint arXiv:1902.01889 (2019).""" STABILITY_EPS = 0.00001 # used to make the calculation of SNNL more stable def __init__( self, model, temperature=100.0, layer_names=None, factor=-10.0, optimize_temperature=True, cos_distance=False, ): """Constructor. :param model: Model instance, the model on which to apply the loss. :param temperature: Temperature used for SNNL. :layer_names: The names of the layers at which to calculate SNNL. If not provided, then SNNL is applied to each internal layer. :factor: The balance factor between SNNL and ross Entropy. If factor is negative, then SNNL will be maximized. :optimize_temperature: Optimize temperature at each calculation to minimize the loss. This makes the loss more stable. :cos_distance: Use cosine distance when calculating SNNL. """ CrossEntropy.__init__(self, model, smoothing=0.0) self.temperature = temperature self.factor = factor self.optimize_temperature = optimize_temperature self.cos_distance = cos_distance self.layer_names = layer_names if not layer_names: # omit the final layer, the classification layer self.layer_names = model.get_layer_names()[:-1] @staticmethod def pairwise_euclid_distance(A, B): """Pairwise Euclidean distance between two matrices. :param A: a matrix. :param B: a matrix. :returns: A tensor for the pairwise Euclidean between A and B. """ batchA = tf.shape(A)[0] batchB = tf.shape(B)[0] sqr_norm_A = tf.reshape(tf.reduce_sum(tf.pow(A, 2), 1), [1, batchA]) sqr_norm_B = tf.reshape(tf.reduce_sum(tf.pow(B, 2), 1), [batchB, 1]) inner_prod = tf.matmul(B, A, transpose_b=True) tile_1 = tf.tile(sqr_norm_A, [batchB, 1]) tile_2 = tf.tile(sqr_norm_B, [1, batchA]) return tile_1 + tile_2 - 2 * inner_prod @staticmethod def pairwise_cos_distance(A, B): """Pairwise cosine distance between two matrices. :param A: a matrix. :param B: a matrix. :returns: A tensor for the pairwise cosine between A and B. """ normalized_A = tf.nn.l2_normalize(A, dim=1) normalized_B = tf.nn.l2_normalize(B, dim=1) prod = tf.matmul(normalized_A, normalized_B, adjoint_b=True) return 1 - prod @staticmethod def fits(A, B, temp, cos_distance): """Exponentiated pairwise distance between each element of A and all those of B. :param A: a matrix. :param B: a matrix. :param temp: Temperature :cos_distance: Boolean for using cosine or Euclidean distance. :returns: A tensor for the exponentiated pairwise distance between each element and A and all those of B. """ if cos_distance: distance_matrix = SNNLCrossEntropy.pairwise_cos_distance(A, B) else: distance_matrix = SNNLCrossEntropy.pairwise_euclid_distance(A, B) return tf.exp(-(distance_matrix / temp)) @staticmethod def pick_probability(x, temp, cos_distance): """Row normalized exponentiated pairwise distance between all the elements of x. Conceptualized as the probability of sampling a neighbor point for every element of x, proportional to the distance between the points. :param x: a matrix :param temp: Temperature :cos_distance: Boolean for using cosine or euclidean distance :returns: A tensor for the row normalized exponentiated pairwise distance between all the elements of x. """ f = SNNLCrossEntropy.fits(x, x, temp, cos_distance) - tf.eye(tf.shape(x)[0]) return f / ( SNNLCrossEntropy.STABILITY_EPS + tf.expand_dims(tf.reduce_sum(f, 1), 1) ) @staticmethod def same_label_mask(y, y2): """Masking matrix such that element i,j is 1 iff y[i] == y2[i]. :param y: a list of labels :param y2: a list of labels :returns: A tensor for the masking matrix. """ return tf.cast(tf.squeeze(tf.equal(y, tf.expand_dims(y2, 1))), tf.float32) @staticmethod def masked_pick_probability(x, y, temp, cos_distance): """The pairwise sampling probabilities for the elements of x for neighbor points which share labels. :param x: a matrix :param y: a list of labels for each element of x :param temp: Temperature :cos_distance: Boolean for using cosine or Euclidean distance :returns: A tensor for the pairwise sampling probabilities. """ return SNNLCrossEntropy.pick_probability( x, temp, cos_distance ) * SNNLCrossEntropy.same_label_mask(y, y) @staticmethod def SNNL(x, y, temp, cos_distance): """Soft Nearest Neighbor Loss :param x: a matrix. :param y: a list of labels for each element of x. :param temp: Temperature. :cos_distance: Boolean for using cosine or Euclidean distance. :returns: A tensor for the Soft Nearest Neighbor Loss of the points in x with labels y. """ summed_masked_pick_prob = tf.reduce_sum( SNNLCrossEntropy.masked_pick_probability(x, y, temp, cos_distance), 1 ) return tf.reduce_mean( -tf.log(SNNLCrossEntropy.STABILITY_EPS + summed_masked_pick_prob) ) @staticmethod def optimized_temp_SNNL(x, y, initial_temp, cos_distance): """The optimized variant of Soft Nearest Neighbor Loss. Every time this tensor is evaluated, the temperature is optimized to minimize the loss value, this results in more numerically stable calculations of the SNNL. :param x: a matrix. :param y: a list of labels for each element of x. :param initial_temp: Temperature. :cos_distance: Boolean for using cosine or Euclidean distance. :returns: A tensor for the Soft Nearest Neighbor Loss of the points in x with labels y, optimized for temperature. """ t = tf.Variable(1, dtype=tf.float32, trainable=False, name="temp") def inverse_temp(t): # pylint: disable=missing-docstring # we use inverse_temp because it was observed to be more stable when optimizing. return tf.div(initial_temp, t) ent_loss = SNNLCrossEntropy.SNNL(x, y, inverse_temp(t), cos_distance) updated_t = tf.assign(t, tf.subtract(t, 0.1 * tf.gradients(ent_loss, t)[0])) inverse_t = inverse_temp(updated_t) return SNNLCrossEntropy.SNNL(x, y, inverse_t, cos_distance) def fprop(self, x, y, **kwargs): cross_entropy = CrossEntropy.fprop(self, x, y, **kwargs) self.layers = [self.model.get_layer(x, name) for name in self.layer_names] loss_fn = self.SNNL if self.optimize_temperature: loss_fn = self.optimized_temp_SNNL layers_SNNL = [ loss_fn( tf.layers.flatten(layer), tf.argmax(y, axis=1), self.temperature, self.cos_distance, ) for layer in self.layers ] return cross_entropy + self.factor * tf.add_n(layers_SNNL) ================================================ FILE: cleverhans_v3.1.0/cleverhans/model.py ================================================ """ The Model class and related functionality. """ from abc import ABCMeta import warnings import tensorflow as tf from cleverhans import utils_tf class Model(object): """ An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them. """ __metaclass__ = ABCMeta O_LOGITS, O_PROBS, O_FEATURES = "logits probs features".split() def __init__( self, scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False ): """ Constructor. :param scope: str, the name of model. :param nb_classes: integer, the number of classes. :param hparams: dict, hyper-parameters for the model. :needs_dummy_fprop: bool, if True the model's parameters are not created until fprop is called. """ self.scope = scope or self.__class__.__name__ self.nb_classes = nb_classes self.hparams = hparams or {} self.needs_dummy_fprop = needs_dummy_fprop def __call__(self, *args, **kwargs): """ For compatibility with functions used as model definitions (taking an input tensor and returning the tensor giving the output of the model on that input). """ warnings.warn( "Model.__call__ is deprecated. " "The call is ambiguous as to whether the output should " "be logits or probabilities, and getting the wrong one " "can cause serious problems. " "The output actually is probabilities, which are a very " "dangerous thing to use as part of any interface for " "cleverhans, because softmax probabilities are prone " "to gradient masking." "On or after 2019-04-24, this method will change to raise " "an exception explaining why Model.__call__ should not be " "used." ) return self.get_probs(*args, **kwargs) def get_logits(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the output logits (i.e., the values fed as inputs to the softmax layer). """ outputs = self.fprop(x, **kwargs) if self.O_LOGITS in outputs: return outputs[self.O_LOGITS] raise NotImplementedError( str(type(self)) + "must implement `get_logits`" " or must define a " + self.O_LOGITS + " output in `fprop`" ) def get_predicted_class(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the predicted label """ return tf.argmax(self.get_logits(x, **kwargs), axis=1) def get_probs(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the output probabilities (i.e., the output values produced by the softmax layer). """ d = self.fprop(x, **kwargs) if self.O_PROBS in d: output = d[self.O_PROBS] min_prob = tf.reduce_min(output) max_prob = tf.reduce_max(output) asserts = [ utils_tf.assert_greater_equal(min_prob, tf.cast(0.0, min_prob.dtype)), utils_tf.assert_less_equal(max_prob, tf.cast(1.0, min_prob.dtype)), ] with tf.control_dependencies(asserts): output = tf.identity(output) return output elif self.O_LOGITS in d: return tf.nn.softmax(logits=d[self.O_LOGITS]) else: raise ValueError("Cannot find probs or logits.") def fprop(self, x, **kwargs): """ Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic representation of their output. """ raise NotImplementedError("`fprop` not implemented.") def get_params(self): """ Provides access to the model's parameters. :return: A list of all Variables defining the model parameters. """ if hasattr(self, "params"): return list(self.params) # Catch eager execution and assert function overload. try: if tf.executing_eagerly(): raise NotImplementedError( "For Eager execution - get_params " "must be overridden." ) except AttributeError: pass # For graph-based execution scope_vars = tf.get_collection( tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/" ) if len(scope_vars) == 0: self.make_params() scope_vars = tf.get_collection( tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/" ) assert len(scope_vars) > 0 # Make sure no parameters have been added or removed if hasattr(self, "num_params"): if self.num_params != len(scope_vars): print("Scope: ", self.scope) print("Expected " + str(self.num_params) + " variables") print("Got " + str(len(scope_vars))) for var in scope_vars: print("\t" + str(var)) assert False else: self.num_params = len(scope_vars) return scope_vars def make_params(self): """ Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set `needs_dummy_fprop=True` in the constructor. """ if self.needs_dummy_fprop: if hasattr(self, "_dummy_input"): return self._dummy_input = self.make_input_placeholder() self.fprop(self._dummy_input) def get_layer_names(self): """Return the list of exposed layers for this model.""" raise NotImplementedError def get_layer(self, x, layer, **kwargs): """Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer `layer` """ return self.fprop(x, **kwargs)[layer] def make_input_placeholder(self): """Create and return a placeholder representing an input to the model. This method should respect context managers (e.g. "with tf.device") and should not just return a reference to a single pre-created placeholder. """ raise NotImplementedError( str(type(self)) + " does not implement " "make_input_placeholder" ) def make_label_placeholder(self): """Create and return a placeholder representing class labels. This method should respect context managers (e.g. "with tf.device") and should not just return a reference to a single pre-created placeholder. """ raise NotImplementedError( str(type(self)) + " does not implement " "make_label_placeholder" ) def __hash__(self): return hash(id(self)) def __eq__(self, other): return self is other class CallableModelWrapper(Model): """A wrapper that turns a callable into a valid Model""" def __init__(self, callable_fn, output_layer): """ Wrap a callable function that takes a tensor as input and returns a tensor as output with the given layer name. :param callable_fn: The callable function taking a tensor and returning a given layer as output. :param output_layer: A string of the output layer returned by the function. (Usually either "probs" or "logits".) """ super(CallableModelWrapper, self).__init__() self.output_layer = output_layer self.callable_fn = callable_fn def fprop(self, x, **kwargs): output = self.callable_fn(x, **kwargs) # Do some sanity checking to reduce the chance that probs are used # as logits accidentally or vice versa if self.output_layer == "probs": assert output.op.type == "Softmax" min_prob = tf.reduce_min(output) max_prob = tf.reduce_max(output) asserts = [ utils_tf.assert_greater_equal(min_prob, tf.cast(0.0, min_prob.dtype)), utils_tf.assert_less_equal(max_prob, tf.cast(1.0, max_prob.dtype)), ] with tf.control_dependencies(asserts): output = tf.identity(output) elif self.output_layer == "logits": assert output.op.type != "Softmax" return {self.output_layer: output} def wrapper_warning(): """ Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer="probs". Using "probs" as any part of the attack interface is dangerous. We can't just change output_layer to logits because: - that would be a silent interface change. We'd have no way of detecting code that still means to use probs. Note that we can't just check whether the final output op is a softmax---for example, Inception puts a reshape after the softmax. - automatically wrapping user-supplied callables with output_layer='logits' is even worse, see `wrapper_warning_logits` Note: this function will be removed at the same time as the code that calls it. """ warnings.warn( "Passing a callable is deprecated, because using" " probabilities is dangerous. It has a high risk " " of causing gradient masking due to loss of precision " " in the softmax op. Passing a callable rather than a " " Model subclass will become an error on or after " " 2019-04-24." ) def wrapper_warning_logits(): """ Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer="logits". This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking. """ warnings.warn( "Passing a callable is deprecated, because it runs the " "risk of accidentally using probabilities in the place " "of logits. Please switch to passing a Model subclass " "so that you clearly specify which values are the logits. " "Passing a callable rather than a Model subclass will become " "an error on or after 2019-04-24." ) class NoSuchLayerError(ValueError): """Raised when a layer that does not exist is requested.""" ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/__init__.py ================================================ """ A module for hosting a variety of models of interest to the adversarial example community. Warning: This module is not nearly as conservative as the rest of CleverHans. Most of CleverHans is used to create rigorous vulnerability benchmarks. For example, the error rate caused by an Attack is considered to be part of the API for that Attack, so we upgrade the major version number whenever it changes. Models in the model zoo can be tweaked regularly to improve accuracy, training speed, robustness, etc. """ ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/all_convolutional.py ================================================ """Extremely simple model where all parameters are from convolutions. """ import math import tensorflow as tf from cleverhans import initializers from cleverhans.serial import NoRefModel class ModelAllConvolutional(NoRefModel): """ A simple model that uses only convolution and downsampling---no batch norm or other techniques that can complicate adversarial training. """ def __init__(self, scope, nb_classes, nb_filters, input_shape, **kwargs): del kwargs NoRefModel.__init__(self, scope, nb_classes, locals()) self.nb_filters = nb_filters self.input_shape = input_shape # Do a dummy run of fprop to create the variables from the start self.fprop(tf.placeholder(tf.float32, [32] + input_shape)) # Put a reference to the params in self so that the params get pickled self.params = self.get_params() def fprop(self, x, **kwargs): del kwargs conv_args = dict( activation=tf.nn.leaky_relu, kernel_initializer=initializers.HeReLuNormalInitializer, kernel_size=3, padding="same", ) y = x with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): log_resolution = int(round(math.log(self.input_shape[0]) / math.log(2))) for scale in range(log_resolution - 2): y = tf.layers.conv2d(y, self.nb_filters << scale, **conv_args) y = tf.layers.conv2d(y, self.nb_filters << (scale + 1), **conv_args) y = tf.layers.average_pooling2d(y, 2, 2) y = tf.layers.conv2d(y, self.nb_classes, **conv_args) logits = tf.reduce_mean(y, [1, 2]) return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits)} ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/basic_cnn.py ================================================ """ A pure TensorFlow implementation of a convolutional neural network. """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import functools import tensorflow as tf from cleverhans import initializers from cleverhans.model import Model class ModelBasicCNN(Model): def __init__(self, scope, nb_classes, nb_filters, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) self.nb_filters = nb_filters # Do a dummy run of fprop to make sure the variables are created from # the start self.fprop(tf.placeholder(tf.float32, [128, 28, 28, 1])) # Put a reference to the params in self so that the params get pickled self.params = self.get_params() def fprop(self, x, **kwargs): del kwargs my_conv = functools.partial( tf.layers.conv2d, activation=tf.nn.relu, kernel_initializer=initializers.HeReLuNormalInitializer, ) with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): y = my_conv(x, self.nb_filters, 8, strides=2, padding="same") y = my_conv(y, 2 * self.nb_filters, 6, strides=2, padding="valid") y = my_conv(y, 2 * self.nb_filters, 5, strides=1, padding="valid") logits = tf.layers.dense( tf.layers.flatten(y), self.nb_classes, kernel_initializer=initializers.HeReLuNormalInitializer, ) return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits)} ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/deep_k_nearest_neighbors/README.md ================================================ # Deep k-Nearest Neighbors Code in `dknn.py` shows how to reproduce one of the results from the following paper, using the MNIST dataset. It can be adapted to use other datasets and any attack supported by CleverHans. The LSH backend used in the paper is FALCONN. **Deep k-Nearest Neighbors: Towards Confident, Interpretable and Robust Deep Learning** *Nicolas Papernot, Patrick McDaniel* Deep neural networks(DNNs) enable innovative applications of machine learning like image recognition, machine translation, or malware detection. However, deep learning is often criticized for its lack of robustness in adversarial settings(e.g., vulnerability to adversarial inputs) and general inability to rationalize its predictions. In this work, we exploit the structure of deep learning to enable new learning-based inference and decision strategies that achieve desirable properties such as robustness and interpretability. We take a first step in this direction and introduce the Deep k-Nearest Neighbors(DkNN). This hybrid classifier combines the k-nearest neighbors algorithm with representations of the data learned by each layer of the DNN: a test input is compared to its neighboring training points according to the distance that separates them in the representations. We show the labels of these neighboring points afford confidence estimates for inputs outside the model's training manifold, including on malicious inputs like adversarial examples--and therein provides protections against inputs that are outside the models understanding. This is because the nearest neighbors can be used to estimate the nonconformity of, i.e., the lack of support for, a prediction in the training data. The neighbors also constitute human-interpretable explanations of predictions. We evaluate the DkNN algorithm on several datasets, and show the confidence estimates accurately identify inputs outside the model, and that the explanations provided by nearest neighbors are intuitive and useful in understanding model failures. ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/deep_k_nearest_neighbors/__init__.py ================================================ ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/deep_k_nearest_neighbors/dknn.py ================================================ """ This code reproduces the MNIST results from the paper Deep k-Nearest Neighbors: Towards Confident, Interpretable and Robust Deep Learning https://arxiv.org/abs/1803.04765 The LSH backend used in the paper is FALCONN. This script also demonstrates how to use an alternative backend called FAISS. """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import copy import os from bisect import bisect_left import matplotlib import matplotlib.pyplot as plt import numpy as np from six.moves import xrange import enum import tensorflow as tf from cleverhans.attacks import FastGradientMethod from cleverhans.loss import CrossEntropy from cleverhans.dataset import MNIST from cleverhans.model import Model from cleverhans.picklable_model import MLP, Conv2D, ReLU, Flatten, Linear, Softmax from cleverhans.train import train from cleverhans.utils_tf import batch_eval, model_eval if "DISPLAY" not in os.environ: matplotlib.use("Agg") FLAGS = tf.flags.FLAGS def make_basic_picklable_cnn( nb_filters=64, nb_classes=10, input_shape=(None, 28, 28, 1) ): """The model for the picklable models tutorial.""" layers = [ Conv2D(nb_filters, (8, 8), (2, 2), "SAME"), ReLU(), Conv2D(nb_filters * 2, (6, 6), (2, 2), "VALID"), ReLU(), Conv2D(nb_filters * 2, (5, 5), (1, 1), "VALID"), ReLU(), Flatten(), Linear(nb_classes), Softmax(), ] model = MLP(layers, input_shape) return model class NearestNeighbor: class BACKEND(enum.Enum): FALCONN = 1 FAISS = 2 def __init__( self, backend, dimension, neighbors, number_bits, nb_tables=None, ): assert backend in NearestNeighbor.BACKEND self._NEIGHBORS = neighbors self._BACKEND = backend if self._BACKEND is NearestNeighbor.BACKEND.FALCONN: self._init_falconn(dimension, number_bits, nb_tables) elif self._BACKEND is NearestNeighbor.BACKEND.FAISS: self._init_faiss( dimension, ) else: raise NotImplementedError def _init_falconn( self, dimension, number_bits, nb_tables, ): import falconn assert nb_tables >= self._NEIGHBORS # LSH parameters params_cp = falconn.LSHConstructionParameters() params_cp.dimension = dimension params_cp.lsh_family = falconn.LSHFamily.CrossPolytope params_cp.distance_function = falconn.DistanceFunction.EuclideanSquared params_cp.l = nb_tables params_cp.num_rotations = ( 2 # for dense set it to 1; for sparse data set it to 2 ) params_cp.seed = 5721840 # we want to use all the available threads to set up params_cp.num_setup_threads = 0 params_cp.storage_hash_table = falconn.StorageHashTable.BitPackedFlatHashTable # we build number_bits-bit hashes so that each table has # 2^number_bits bins; a rule of thumb is to have the number # of bins be the same order of magnitude as the number of data points falconn.compute_number_of_hash_functions(number_bits, params_cp) self._falconn_table = falconn.LSHIndex(params_cp) self._falconn_query_object = None self._FALCONN_NB_TABLES = nb_tables def _init_faiss( self, dimension, ): import faiss res = faiss.StandardGpuResources() self._faiss_index = faiss.GpuIndexFlatL2( res, dimension, ) def _find_knns_falconn(self, x, output): # Late falconn query_object construction # Since I suppose there might be an error # if table.setup() will be called after if self._falconn_query_object is None: self._falconn_query_object = self._falconn_table.construct_query_object() self._falconn_query_object.set_num_probes(self._FALCONN_NB_TABLES) missing_indices = np.zeros(output.shape, dtype=np.bool) for i in range(x.shape[0]): query_res = self._falconn_query_object.find_k_nearest_neighbors( x[i], self._NEIGHBORS ) try: output[i, :] = query_res except: # pylint: disable-msg=W0702 # mark missing indices missing_indices[i, len(query_res) :] = True output[i, : len(query_res)] = query_res return missing_indices def _find_knns_faiss(self, x, output): neighbor_distance, neighbor_index = self._faiss_index.search(x, self._NEIGHBORS) missing_indices = neighbor_distance == -1 d1 = neighbor_index.reshape(-1) output.reshape(-1)[np.logical_not(missing_indices.flatten())] = d1[ np.logical_not(missing_indices.flatten()) ] return missing_indices def add(self, x): if self._BACKEND is NearestNeighbor.BACKEND.FALCONN: self._falconn_table.setup(x) elif self._BACKEND is NearestNeighbor.BACKEND.FAISS: self._faiss_index.add(x) else: raise NotImplementedError def find_knns(self, x, output): if self._BACKEND is NearestNeighbor.BACKEND.FALCONN: return self._find_knns_falconn(x, output) elif self._BACKEND is NearestNeighbor.BACKEND.FAISS: return self._find_knns_faiss(x, output) else: raise NotImplementedError class DkNNModel(Model): def __init__( self, neighbors, layers, get_activations, train_data, train_labels, nb_classes, scope=None, nb_tables=200, number_bits=17, ): """ Implements the DkNN algorithm. See https://arxiv.org/abs/1803.04765 for more details. :param neighbors: number of neighbors to find per layer. :param layers: a list of layer names to include in the DkNN. :param get_activations: a callable that takes a np array and a layer name and returns its activations on the data. :param train_data: a np array of training data. :param train_labels: a np vector of training labels. :param nb_classes: the number of classes in the task. :param scope: a TF scope that was used to create the underlying model. :param nb_tables: number of tables used by FALCONN to perform locality-sensitive hashing. :param number_bits: number of hash bits used by LSH. """ super(DkNNModel, self).__init__(nb_classes=nb_classes, scope=scope) self.neighbors = neighbors self.nb_tables = nb_tables self.layers = layers self.get_activations = get_activations self.nb_cali = -1 self.calibrated = False self.number_bits = number_bits # Compute training data activations self.nb_train = train_labels.shape[0] assert self.nb_train == train_data.shape[0] self.train_activations = get_activations(train_data) self.train_labels = train_labels # Build locality-sensitive hashing tables for training representations self.train_activations_lsh = copy.copy(self.train_activations) self.init_lsh() def init_lsh(self): """ Initializes locality-sensitive hashing with FALCONN to find nearest neighbors in training data. """ self.query_objects = ( {} ) # contains the object that can be queried to find nearest neighbors at each layer. # mean of training data representation per layer (that needs to be substracted before # NearestNeighbor). self.centers = {} for layer in self.layers: # Normalize all the lenghts, since we care about the cosine similarity. self.train_activations_lsh[layer] /= np.linalg.norm( self.train_activations_lsh[layer], axis=1 ).reshape(-1, 1) # Center the dataset and the queries: this improves the performance of LSH quite a bit. center = np.mean(self.train_activations_lsh[layer], axis=0) self.train_activations_lsh[layer] -= center self.centers[layer] = center print("Constructing the NearestNeighbor table") self.query_objects[layer] = NearestNeighbor( backend=FLAGS.nearest_neighbor_backend, dimension=self.train_activations_lsh[layer].shape[1], number_bits=self.number_bits, neighbors=self.neighbors, nb_tables=self.nb_tables, ) self.query_objects[layer].add(self.train_activations_lsh[layer]) def find_train_knns(self, data_activations): """ Given a data_activation dictionary that contains a np array with activations for each layer, find the knns in the training data. """ knns_ind = {} knns_labels = {} for layer in self.layers: # Pre-process representations of data to normalize and remove training data mean. data_activations_layer = copy.copy(data_activations[layer]) nb_data = data_activations_layer.shape[0] data_activations_layer /= np.linalg.norm( data_activations_layer, axis=1 ).reshape(-1, 1) data_activations_layer -= self.centers[layer] # Use FALCONN to find indices of nearest neighbors in training data. knns_ind[layer] = np.zeros( (data_activations_layer.shape[0], self.neighbors), dtype=np.int32 ) knn_errors = 0 knn_missing_indices = self.query_objects[layer].find_knns( data_activations_layer, knns_ind[layer], ) knn_errors += knn_missing_indices.flatten().sum() # Find labels of neighbors found in the training data. knns_labels[layer] = np.zeros((nb_data, self.neighbors), dtype=np.int32) knns_labels[layer].reshape(-1)[ np.logical_not(knn_missing_indices.flatten()) ] = self.train_labels[ knns_ind[layer].reshape(-1)[ np.logical_not(knn_missing_indices.flatten()) ] ] return knns_ind, knns_labels def nonconformity(self, knns_labels): """ Given an dictionary of nb_data x nb_classes dimension, compute the nonconformity of each candidate label for each data point: i.e. the number of knns whose label is different from the candidate label. """ nb_data = knns_labels[self.layers[0]].shape[0] knns_not_in_class = np.zeros((nb_data, self.nb_classes), dtype=np.int32) for i in range(nb_data): # Compute number of nearest neighbors per class knns_in_class = np.zeros( (len(self.layers), self.nb_classes), dtype=np.int32 ) for layer_id, layer in enumerate(self.layers): knns_in_class[layer_id, :] = np.bincount( knns_labels[layer][i], minlength=self.nb_classes ) # Compute number of knns in other class than class_id for class_id in range(self.nb_classes): knns_not_in_class[i, class_id] = np.sum(knns_in_class) - np.sum( knns_in_class[:, class_id] ) return knns_not_in_class def preds_conf_cred(self, knns_not_in_class): """ Given an array of nb_data x nb_classes dimensions, use conformal prediction to compute the DkNN's prediction, confidence and credibility. """ nb_data = knns_not_in_class.shape[0] preds_knn = np.zeros(nb_data, dtype=np.int32) confs = np.zeros((nb_data, self.nb_classes), dtype=np.float32) creds = np.zeros((nb_data, self.nb_classes), dtype=np.float32) for i in range(nb_data): # p-value of test input for each class p_value = np.zeros(self.nb_classes, dtype=np.float32) for class_id in range(self.nb_classes): # p-value of (test point, candidate label) p_value[class_id] = ( float(self.nb_cali) - bisect_left( self.cali_nonconformity, knns_not_in_class[i, class_id] ) ) / float(self.nb_cali) preds_knn[i] = np.argmax(p_value) confs[i, preds_knn[i]] = 1.0 - np.sort(p_value)[-2] creds[i, preds_knn[i]] = p_value[preds_knn[i]] return preds_knn, confs, creds def fprop_np(self, data_np): """ Performs a forward pass through the DkNN on an numpy array of data. """ if not self.calibrated: raise ValueError( "DkNN needs to be calibrated by calling DkNNModel.calibrate method once before inferring." ) data_activations = self.get_activations(data_np) _, knns_labels = self.find_train_knns(data_activations) knns_not_in_class = self.nonconformity(knns_labels) _, _, creds = self.preds_conf_cred(knns_not_in_class) return creds def fprop(self, x): """ Performs a forward pass through the DkNN on a TF tensor by wrapping the fprop_np method. """ logits = tf.py_func(self.fprop_np, [x], tf.float32) return {self.O_LOGITS: logits} def calibrate(self, cali_data, cali_labels): """ Runs the DkNN on holdout data to calibrate the credibility metric. :param cali_data: np array of calibration data. :param cali_labels: np vector of calibration labels. """ self.nb_cali = cali_labels.shape[0] self.cali_activations = self.get_activations(cali_data) self.cali_labels = cali_labels print("Starting calibration of DkNN.") cali_knns_ind, cali_knns_labels = self.find_train_knns(self.cali_activations) assert all( [v.shape == (self.nb_cali, self.neighbors) for v in cali_knns_ind.values()] ) assert all( [ v.shape == (self.nb_cali, self.neighbors) for v in cali_knns_labels.values() ] ) cali_knns_not_in_class = self.nonconformity(cali_knns_labels) cali_knns_not_in_l = np.zeros(self.nb_cali, dtype=np.int32) for i in range(self.nb_cali): cali_knns_not_in_l[i] = cali_knns_not_in_class[i, cali_labels[i]] cali_knns_not_in_l_sorted = np.sort(cali_knns_not_in_l) self.cali_nonconformity = np.trim_zeros(cali_knns_not_in_l_sorted, trim="f") self.nb_cali = self.cali_nonconformity.shape[0] self.calibrated = True print("DkNN calibration complete.") def plot_reliability_diagram(confidence, labels, filepath): """ Takes in confidence values for predictions and correct labels for the data, plots a reliability diagram. :param confidence: nb_samples x nb_classes (e.g., output of softmax) :param labels: vector of nb_samples :param filepath: where to save the diagram :return: """ assert len(confidence.shape) == 2 assert len(labels.shape) == 1 assert confidence.shape[0] == labels.shape[0] print("Saving reliability diagram at: " + str(filepath)) if confidence.max() <= 1.0: # confidence array is output of softmax bins_start = [b / 10.0 for b in xrange(0, 10)] bins_end = [b / 10.0 for b in xrange(1, 11)] bins_center = [(b + 0.5) / 10.0 for b in xrange(0, 10)] preds_conf = np.max(confidence, axis=1) preds_l = np.argmax(confidence, axis=1) else: raise ValueError("Confidence values go above 1.") print(preds_conf.shape, preds_l.shape) # Create var for reliability diagram # Will contain mean accuracies for each bin reliability_diag = [] num_points = [] # keeps the number of points in each bar # Find average accuracy per confidence bin for bin_start, bin_end in zip(bins_start, bins_end): above = preds_conf >= bin_start if bin_end == 1.0: below = preds_conf <= bin_end else: below = preds_conf < bin_end mask = np.multiply(above, below) num_points.append(np.sum(mask)) bin_mean_acc = max(0, np.mean(preds_l[mask] == labels[mask])) reliability_diag.append(bin_mean_acc) # Plot diagram assert len(reliability_diag) == len(bins_center) print(reliability_diag) print(bins_center) print(num_points) fig, ax1 = plt.subplots() _ = ax1.bar(bins_center, reliability_diag, width=0.1, alpha=0.8) plt.xlim([0, 1.0]) ax1.set_ylim([0, 1.0]) ax2 = ax1.twinx() print(sum(num_points)) ax2.plot(bins_center, num_points, color="r", linestyle="-", linewidth=7.0) ax2.set_ylabel("Number of points in the data", fontsize=16, color="r") if len(np.argwhere(confidence[0] != 0.0)) == 1: # This is a DkNN diagram ax1.set_xlabel("Prediction Credibility", fontsize=16) else: # This is a softmax diagram ax1.set_xlabel("Prediction Confidence", fontsize=16) ax1.set_ylabel("Prediction Accuracy", fontsize=16) ax1.tick_params(axis="both", labelsize=14) ax2.tick_params(axis="both", labelsize=14, colors="r") fig.tight_layout() plt.savefig(filepath, bbox_inches="tight") def get_tensorflow_session(): gpu_options = tf.GPUOptions() gpu_options.per_process_gpu_memory_fraction = FLAGS.tensorflow_gpu_memory_fraction sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) return sess def dknn_tutorial(): # Get MNIST data. mnist = MNIST() x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Use Image Parameters. img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] with get_tensorflow_session() as sess: with tf.variable_scope("dknn"): # Define input TF placeholder. x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Define a model. model = make_basic_picklable_cnn() preds = model.get_logits(x) loss = CrossEntropy(model, smoothing=0.0) # Define the test set accuracy evaluation. def evaluate(): acc = model_eval( sess, x, y, preds, x_test, y_test, args={"batch_size": FLAGS.batch_size}, ) print("Test accuracy on test examples: %0.4f" % acc) # Train the model train_params = { "nb_epochs": FLAGS.nb_epochs, "batch_size": FLAGS.batch_size, "learning_rate": FLAGS.lr, } train( sess, loss, x_train, y_train, evaluate=evaluate, args=train_params, var_list=model.get_params(), ) # Define callable that returns a dictionary of all activations for a dataset def get_activations(data): data_activations = {} for layer in layers: layer_sym = tf.layers.flatten(model.get_layer(x, layer)) data_activations[layer] = batch_eval( sess, [x], [layer_sym], [data], args={"batch_size": FLAGS.batch_size}, )[0] return data_activations # Use a holdout of the test set to simulate calibration data for the DkNN. train_data = x_train train_labels = np.argmax(y_train, axis=1) cali_data = x_test[: FLAGS.nb_cali] y_cali = y_test[: FLAGS.nb_cali] cali_labels = np.argmax(y_cali, axis=1) test_data = x_test[FLAGS.nb_cali :] y_test = y_test[FLAGS.nb_cali :] # Extract representations for the training and calibration data at each layer of interest to the DkNN. layers = ["ReLU1", "ReLU3", "ReLU5", "logits"] # Wrap the model into a DkNNModel dknn = DkNNModel( FLAGS.neighbors, layers, get_activations, train_data, train_labels, nb_classes, scope="dknn", number_bits=FLAGS.number_bits, ) dknn.calibrate(cali_data, cali_labels) # Generate adversarial examples fgsm = FastGradientMethod(model, sess=sess) attack_params = {"eps": 0.25, "clip_min": 0.0, "clip_max": 1.0} adv = sess.run(fgsm.generate(x, **attack_params), feed_dict={x: test_data}) # Test the DkNN on clean test data and FGSM test data for data_in, fname in zip([test_data, adv], ["test", "adv"]): dknn_preds = dknn.fprop_np(data_in) print(dknn_preds.shape) print( np.mean(np.argmax(dknn_preds, axis=1) == np.argmax(y_test, axis=1)) ) plot_reliability_diagram( dknn_preds, np.argmax(y_test, axis=1), "/tmp/dknn_" + fname + ".pdf" ) return True def main(argv=None): assert dknn_tutorial() if __name__ == "__main__": tf.flags.DEFINE_integer("number_bits", 17, "number of hash bits used by LSH Index") tf.flags.DEFINE_float( "tensorflow_gpu_memory_fraction", 0.25, "amount of the GPU memory to allocate for a tensorflow Session", ) tf.flags.DEFINE_enum_class( "nearest_neighbor_backend", NearestNeighbor.BACKEND.FALCONN, NearestNeighbor.BACKEND, "NearestNeighbor backend", ) tf.flags.DEFINE_integer("nb_epochs", 6, "Number of epochs to train model") tf.flags.DEFINE_integer("batch_size", 500, "Size of training batches") tf.flags.DEFINE_float("lr", 0.001, "Learning rate for training") tf.flags.DEFINE_integer("nb_cali", 750, "Number of calibration points for the DkNN") tf.flags.DEFINE_integer( "neighbors", 75, "Number of neighbors per layer for the DkNN" ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/madry_lab_challenges/__init__.py ================================================ """ Models from https://github.com/MadryLab/cifar10_challenge """ ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/madry_lab_challenges/cifar10_model.py ================================================ """cleverhans.model.Model implementation of cifar10_challenge.model.Model This re-implementation factors variable creation apart from forward propagation so it is possible to run forward propagation more than once in the same model. based on https://github.com/tensorflow/models/tree/master/resnet """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf from cleverhans.serial import NoRefModel class Layer(object): def get_output_shape(self): return self.output_shape class ResNet(NoRefModel): """ResNet model.""" def __init__(self, layers, input_shape, scope=None): """ResNet constructor. :param layers: a list of layers in CleverHans format each with set_input_shape() and fprop() methods. :param input_shape: 4-tuple describing input shape (e.g None, 32, 32, 3) :param scope: string name of scope for Variables This works in two ways. If scope is None, the variables are not put in a scope, and the model is compatible with Saver.restore from the public downloads for the CIFAR10 Challenge. If the scope is a string, then Saver.restore won't work, but the model functions as a picklable NoRefModels that finds its variables based on the scope. """ super(ResNet, self).__init__(scope, 10, {}, scope is not None) if scope is None: before = list(tf.trainable_variables()) before_vars = list(tf.global_variables()) self.build(layers, input_shape) after = list(tf.trainable_variables()) after_vars = list(tf.global_variables()) self.params = [param for param in after if param not in before] self.vars = [var for var in after_vars if var not in before_vars] else: with tf.variable_scope(self.scope): self.build(layers, input_shape) def get_vars(self): if hasattr(self, "vars"): return self.vars return super(ResNet, self).get_vars() def build(self, layers, input_shape): self.layer_names = [] self.layers = layers self.input_shape = input_shape if isinstance(layers[-1], Softmax): layers[-1].name = "probs" layers[-2].name = "logits" else: layers[-1].name = "logits" for i, layer in enumerate(self.layers): if hasattr(layer, "name"): name = layer.name else: name = layer.__class__.__name__ + str(i) layer.name = name self.layer_names.append(name) layer.set_input_shape(input_shape) input_shape = layer.get_output_shape() def make_input_placeholder(self): return tf.placeholder(tf.float32, (None, 32, 32, 3)) def make_label_placeholder(self): return tf.placeholder(tf.float32, (None, 10)) def fprop(self, x, set_ref=False): if self.scope is not None: with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): return self._fprop(x, set_ref) return self._prop(x, set_ref) def _fprop(self, x, set_ref=False): states = [] for layer in self.layers: if set_ref: layer.ref = x x = layer.fprop(x) assert x is not None states.append(x) states = dict(zip(self.layer_names, states)) return states def add_internal_summaries(self): pass def _stride_arr(stride): """Map a stride scalar to the stride array for tf.nn.conv2d.""" return [1, stride, stride, 1] class Input(Layer): def __init__(self): pass def set_input_shape(self, input_shape): batch_size, rows, cols, input_channels = input_shape # assert self.mode == 'train' or self.mode == 'eval' """Build the core model within the graph.""" input_shape = list(input_shape) input_shape[0] = 1 dummy_batch = tf.zeros(input_shape) dummy_output = self.fprop(dummy_batch) output_shape = [int(e) for e in dummy_output.get_shape()] output_shape[0] = batch_size self.output_shape = tuple(output_shape) def fprop(self, x): with tf.variable_scope("input", reuse=tf.AUTO_REUSE): input_standardized = tf.map_fn( lambda img: tf.image.per_image_standardization(img), x ) return _conv("init_conv", input_standardized, 3, 3, 16, _stride_arr(1)) class Conv2D(Layer): def __init__(self): pass def set_input_shape(self, input_shape): batch_size, rows, cols, input_channels = input_shape # Uncomment the following codes to use w28-10 wide residual network. # It is more memory efficient than very deep residual network and has # comparably good performance. # https://arxiv.org/pdf/1605.07146v1.pdf input_shape = list(input_shape) input_shape[0] = 1 dummy_batch = tf.zeros(input_shape) dummy_output = self.fprop(dummy_batch) output_shape = [int(e) for e in dummy_output.get_shape()] output_shape[0] = batch_size self.output_shape = tuple(output_shape) def fprop(self, x): # Update hps.num_residual_units to 9 strides = [1, 2, 2] activate_before_residual = [True, False, False] filters = [16, 160, 320, 640] res_func = _residual with tf.variable_scope("unit_1_0", reuse=tf.AUTO_REUSE): x = res_func( x, filters[0], filters[1], _stride_arr(strides[0]), activate_before_residual[0], ) for i in range(1, 5): with tf.variable_scope(("unit_1_%d" % i), reuse=tf.AUTO_REUSE): x = res_func(x, filters[1], filters[1], _stride_arr(1), False) with tf.variable_scope(("unit_2_0"), reuse=tf.AUTO_REUSE): x = res_func( x, filters[1], filters[2], _stride_arr(strides[1]), activate_before_residual[1], ) for i in range(1, 5): with tf.variable_scope(("unit_2_%d" % i), reuse=tf.AUTO_REUSE): x = res_func(x, filters[2], filters[2], _stride_arr(1), False) with tf.variable_scope(("unit_3_0"), reuse=tf.AUTO_REUSE): x = res_func( x, filters[2], filters[3], _stride_arr(strides[2]), activate_before_residual[2], ) for i in range(1, 5): with tf.variable_scope(("unit_3_%d" % i), reuse=tf.AUTO_REUSE): x = res_func(x, filters[3], filters[3], _stride_arr(1), False) with tf.variable_scope(("unit_last"), reuse=tf.AUTO_REUSE): x = _batch_norm("final_bn", x) x = _relu(x, 0.1) x = _global_avg_pool(x) return x class Linear(Layer): def __init__(self, num_hid): self.num_hid = num_hid def set_input_shape(self, input_shape): batch_size, dim = input_shape self.input_shape = [batch_size, dim] self.dim = dim self.output_shape = [batch_size, self.num_hid] self.make_vars() def make_vars(self): with tf.variable_scope("logit", reuse=tf.AUTO_REUSE): w = tf.get_variable( "DW", [self.dim, self.num_hid], initializer=tf.initializers.variance_scaling(distribution="uniform"), ) b = tf.get_variable( "biases", [self.num_hid], initializer=tf.initializers.constant() ) return w, b def fprop(self, x): w, b = self.make_vars() return tf.nn.xw_plus_b(x, w, b) def _batch_norm(name, x): """Batch normalization.""" with tf.name_scope(name): return tf.contrib.layers.batch_norm( inputs=x, decay=0.9, center=True, scale=True, activation_fn=None, updates_collections=None, is_training=False, ) def _residual(x, in_filter, out_filter, stride, activate_before_residual=False): """Residual unit with 2 sub layers.""" if activate_before_residual: with tf.variable_scope("shared_activation"): x = _batch_norm("init_bn", x) x = _relu(x, 0.1) orig_x = x else: with tf.variable_scope("residual_only_activation"): orig_x = x x = _batch_norm("init_bn", x) x = _relu(x, 0.1) with tf.variable_scope("sub1"): x = _conv("conv1", x, 3, in_filter, out_filter, stride) with tf.variable_scope("sub2"): x = _batch_norm("bn2", x) x = _relu(x, 0.1) x = _conv("conv2", x, 3, out_filter, out_filter, [1, 1, 1, 1]) with tf.variable_scope("sub_add"): if in_filter != out_filter: orig_x = tf.nn.avg_pool(orig_x, stride, stride, "VALID") orig_x = tf.pad( orig_x, [ [0, 0], [0, 0], [0, 0], [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2], ], ) x += orig_x tf.logging.debug("image after unit %s", x.get_shape()) return x def _decay(): """L2 weight decay loss.""" costs = [] for var in tf.trainable_variables(): if var.op.name.find("DW") > 0: costs.append(tf.nn.l2_loss(var)) return tf.add_n(costs) def _conv(name, x, filter_size, in_filters, out_filters, strides): """Convolution.""" with tf.variable_scope(name, reuse=tf.AUTO_REUSE): n = filter_size * filter_size * out_filters kernel = tf.get_variable( "DW", [filter_size, filter_size, in_filters, out_filters], tf.float32, initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0 / n)), ) return tf.nn.conv2d(x, kernel, strides, padding="SAME") def _relu(x, leakiness=0.0): """Relu, with optional leaky support.""" return tf.where(tf.less(x, 0.0), leakiness * x, x, name="leaky_relu") def _global_avg_pool(x): assert x.get_shape().ndims == 4 return tf.reduce_mean(x, [1, 2]) class Softmax(Layer): def __init__(self): pass def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def fprop(self, x): return tf.nn.softmax(x) class Flatten(Layer): def __init__(self): pass def set_input_shape(self, shape): self.input_shape = shape output_width = 1 for factor in shape[1:]: output_width *= factor self.output_width = output_width self.output_shape = [None, output_width] def fprop(self, x): return tf.reshape(x, [-1, self.output_width]) def make_wresnet(nb_classes=10, input_shape=(None, 32, 32, 3), scope=None): layers = [ Input(), Conv2D(), # the whole ResNet is basically created in this layer Flatten(), Linear(nb_classes), Softmax(), ] model = ResNet(layers, input_shape, scope) return model ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/madry_lab_challenges/make_cifar10_joblib.py ================================================ """Makes a .joblib file containing the trained model """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import sys import time import numpy as np import logging import tensorflow as tf from tensorflow.python.platform import app, flags from cleverhans.utils import set_log_level, to_categorical, safe_zip from cleverhans.utils_tf import model_eval from cleverhans import serial from cleverhans.dataset import CIFAR10, Factory from cleverhans.model_zoo.madry_lab_challenges.cifar10_model import make_wresnet FLAGS = flags.FLAGS def main(argv): model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir) if model_file is None: print("No model found") sys.exit() set_log_level(logging.DEBUG) sess = tf.Session() with sess.as_default(): model = make_wresnet() saver = tf.train.Saver() # Restore the checkpoint saver.restore(sess, model_file) SCOPE = "cifar10_challenge" model2 = make_wresnet(scope=SCOPE) assert len(model.get_vars()) == len(model2.get_vars()) found = [False] * len(model2.get_vars()) for var1 in model.get_vars(): var1_found = False var2_name = SCOPE + "/" + var1.name for idx, var2 in enumerate(model2.get_vars()): if var2.name == var2_name: var1_found = True found[idx] = True sess.run(tf.assign(var2, var1)) break assert var1_found, var1.name assert all(found) model2.dataset_factory = Factory(CIFAR10, {"max_val": 255}) serial.save("model.joblib", model2) if __name__ == "__main__": cifar10_root = os.environ["CIFAR10_CHALLENGE_DIR"] default_ckpt_dir = os.path.join(cifar10_root, "models/model_0") flags.DEFINE_string( "checkpoint_dir", default_ckpt_dir, "Checkpoint directory to load" ) app.run(main) ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/soft_nearest_neighbor_loss/SNNL_regularized_model.py ================================================ """ A Simple Neural Net to optimize with SNNL and Cross Entropy """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import functools import tensorflow as tf from cleverhans import initializers from cleverhans.model import Model class ModelBasicCNN(Model): def __init__(self, scope, nb_classes, nb_filters, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) self.nb_filters = nb_filters self.fprop(self.make_input_placeholder()) self.params = self.get_params() def make_input_placeholder(self): return tf.placeholder(tf.float32, [128, 28, 28, 1]) def get_layer_names(self): return ["conv1", "conv2", "conv3", "logits"] def fprop(self, x, **kwargs): del kwargs my_conv = functools.partial( tf.layers.conv2d, activation=tf.nn.relu, kernel_initializer=initializers.HeReLuNormalInitializer, ) with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): conv1 = my_conv(x, self.nb_filters, 8, strides=2, padding="same") conv2 = my_conv(conv1, 2 * self.nb_filters, 6, strides=2, padding="valid") conv3 = my_conv( conv2, 2 * self.nb_filters, 5, strides=1, padding="valid", ) logits = tf.layers.dense( tf.layers.flatten(conv3), self.nb_classes, kernel_initializer=initializers.HeReLuNormalInitializer, ) return { self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits), "conv1": conv1, "conv2": conv2, "conv3": conv3, } ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/soft_nearest_neighbor_loss/SNNL_regularized_train.py ================================================ """ This model shows how to train a model with Soft Nearest Neighbor Loss regularization. The paper which presents this method can be found at https://arxiv.org/abs/1902.01889 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from matplotlib.offsetbox import OffsetImage, AnnotationBbox from sklearn.manifold import TSNE from cleverhans.compat import flags from cleverhans.loss import SNNLCrossEntropy, CrossEntropy from cleverhans.dataset import MNIST from cleverhans.utils_tf import model_eval from cleverhans.train import train from cleverhans.utils import AccuracyReport, set_log_level from cleverhans.model_zoo.soft_nearest_neighbor_loss.SNNL_regularized_model import ( ModelBasicCNN, ) FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 NB_FILTERS = 64 SNNL_FACTOR = -10.0 OUTPUT_DIR = "/tmp/" def SNNL_example( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, nb_filters=NB_FILTERS, SNNL_factor=SNNL_FACTOR, output_dir=OUTPUT_DIR, ): """ A simple model trained to minimize Cross Entropy and Maximize Soft Nearest Neighbor Loss at each internal layer. This outputs a TSNE of the sign of the adversarial gradients of a trained model. A model with a negative SNNL_factor will show little or no class clusters, while a model with a 0 SNNL_factor will have class clusters in the adversarial gradient direction. :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param SNNL_factor: multiplier for Soft Nearest Neighbor Loss :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.DEBUG) # Create TF session sess = tf.Session() # Get MNIST data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Use Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } eval_params = {"batch_size": batch_size} rng = np.random.RandomState([2017, 8, 30]) def do_eval(preds, x_set, y_set, report_key): acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params) setattr(report, report_key, acc) print("Test accuracy on legitimate examples: %0.4f" % (acc)) model = ModelBasicCNN("model", nb_classes, nb_filters) preds = model.get_logits(x) cross_entropy_loss = CrossEntropy(model) if not SNNL_factor: loss = cross_entropy_loss else: loss = SNNLCrossEntropy(model, factor=SNNL_factor, optimize_temperature=False) def evaluate(): do_eval(preds, x_test, y_test, "clean_train_clean_eval") train( sess, loss, x_train, y_train, evaluate=evaluate, args=train_params, rng=rng, var_list=model.get_params(), ) do_eval(preds, x_train, y_train, "train_clean_train_clean_eval") def imscatter(points, images, ax=None, zoom=1, cmap="hot"): if ax is None: ax = plt.gca() artists = [] i = 0 if not isinstance(cmap, list): cmap = [cmap] * len(points) for x0, y0 in points: transformed = (images[i] - np.min(images[i])) / ( np.max(images[i]) - np.min(images[i]) ) im = OffsetImage(transformed[:, :, 0], zoom=zoom, cmap=cmap[i]) ab = AnnotationBbox(im, (x0, y0), xycoords="data", frameon=False) artists.append(ax.add_artist(ab)) i += 1 ax.update_datalim(np.column_stack(np.transpose(points))) ax.autoscale() ax.get_xaxis().set_ticks([]) ax.get_yaxis().set_ticks([]) return artists adv_grads = tf.sign(tf.gradients(cross_entropy_loss.fprop(x, y), x)) feed_dict = {x: x_test[:batch_size], y: y_test[:batch_size]} adv_grads_val = sess.run(adv_grads, feed_dict=feed_dict) adv_grads_val = np.reshape(adv_grads_val, (batch_size, img_rows * img_cols)) X_embedded = TSNE(n_components=2, verbose=0).fit_transform(adv_grads_val) plt.figure(num=None, figsize=(50, 50), dpi=40, facecolor="w", edgecolor="k") plt.title( "TSNE of Sign of Adv Gradients, SNNLCrossEntropy Model, factor:" + str(FLAGS.SNNL_factor), fontsize=42, ) imscatter(X_embedded, x_test[:batch_size], zoom=2, cmap="Purples") plt.savefig( output_dir + "adversarial_gradients_SNNL_factor_" + str(SNNL_factor) + ".png" ) def main(argv=None): SNNL_example( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, nb_filters=FLAGS.nb_filters, SNNL_factor=FLAGS.SNNL_factor, output_dir=FLAGS.output_dir, ) if __name__ == "__main__": flags.DEFINE_integer("nb_filters", NB_FILTERS, "Model size multiplier") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float( "SNNL_factor", SNNL_FACTOR, "Multiplier for Soft Nearest Neighbor Loss" ) flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_string("output_dir", OUTPUT_DIR, "output directory for saving figures") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans/model_zoo/soft_nearest_neighbor_loss/__init__.py ================================================ """ A model to demonstrate the use of soft nearest neighbor loss presented in Frosst, Nicholas, Nicolas Papernot, and Geoffrey Hinton. "Analyzing and Improving Representations with the Soft Nearest Neighbor Loss." arXiv preprint arXiv:1902.01889 (2019). """ ================================================ FILE: cleverhans_v3.1.0/cleverhans/picklable_model.py ================================================ """Models that support pickling. NOTE: This module is much more free to change than many other modules in CleverHans. CleverHans is very conservative about changes to any code that affects the output of benchmark tests (attacks, evaluation methods, etc.). This module provides *models* not *benchmarks* and thus is free to change rapidly to provide better speed, accuracy, etc. """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf import numpy as np from cleverhans.compat import reduce_mean, reduce_prod from cleverhans.model import Model from cleverhans.serial import PicklableVariable as PV from cleverhans.utils import ordered_union class PicklableModel(Model): """ A Model that supports pickling. Subclasses of this model must use only PicklableVariable and must refer to their variables only by referencing the Python objects, not using TensorFlow names (so no variable scopes). Pickle cannot find variables referenced only by name and thus may fail to save them. Pickle may not be able to get the original name back when restoring the variable so the names should not be relied on. """ def __init__(self): super(PicklableModel, self).__init__() del self.scope # Must not use Variable scopes / names for anything def get_params(self): raise NotImplementedError( str(type(self)) + " does not implement" " get_params." ) class MLP(PicklableModel): """ A picklable multilayer perceptron """ def __hash__(self): return hash(id(self)) def __init__(self, layers, input_shape): super(MLP, self).__init__() if not isinstance(layers, list): raise ValueError("`layers` must be a list.") self.layer_names = [] self.layers = layers self.input_shape = input_shape if isinstance(layers[-1], Softmax): if not hasattr(layers[-1], "name"): layers[-1].name = "probs" if not hasattr(layers[-2], "name"): layers[-2].name = "logits" else: if not hasattr(layers[-1], "name"): layers[-1].name = "logits" for i, layer in enumerate(self.layers): if layer.parent is None: if i == 0: layer.parent = "input" else: layer.parent = layers[i - 1].name if hasattr(layer, "name"): name = layer.name else: name = layer.__class__.__name__ + str(i) layer.name = name self.layer_names.append(name) layer.set_input_shape(input_shape) input_shape = layer.get_output_shape() def get_params(self): out = [] for layer in self.layers: out = ordered_union(out, layer.get_params()) return out def fprop(self, x=None, given=None, **kwargs): # Note: this currently isn't great. # A layer can have any parent it wants, but the parent # must come earlier in the list. # There's no way to have > 1 parent. # This means we can support branched structures that split, # e.g. for multiple output heads, but not structures # that converge. # We can feed a value in the middle using "given" but # only layers after the given one are run using the current # implementation, so the feed must happen before any branch # point. if x is None: if given is None: raise ValueError("One of `x` or `given` must be specified") else: assert given is None given = ("input", x) name, value = given out = {name: value} x = value if name == "input": layers = self.layers else: for i, layer in enumerate(self.layers[:-1]): if layer.name == name: layers = self.layers[i + 1 :] break for layer in layers: x = out[layer.parent] try: x = layer.fprop(x, **kwargs) except TypeError as e: msg = "TypeError in fprop for %s of type %s: %s" msg = msg % (layer.name, str(type(layer)), str(e)) raise TypeError(msg) assert x is not None out[layer.name] = x return out def make_input_placeholder(self): return tf.placeholder(tf.float32, tuple(self.input_shape)) def make_label_placeholder(self): try: return self.layers[-1].make_label_placeholder() except NotImplementedError: return tf.placeholder(tf.float32, self.layers[-1].get_output_shape()) class Layer(PicklableModel): def __init__(self, name=None, parent=None): super(Layer, self).__init__() if name is not None: self.name = name self.parent = parent def get_output_shape(self): return self.output_shape class Linear(Layer): """ Linear, fully connected layer. :param init_mode: string "norm" : the weight vector for each output is initialized to have the same norm, given by `init_scale` "uniform_unit_scaling" : U(-sqrt(3/input_dim), sqrt(3/input_dim)) from https://arxiv.org/abs/1412.6558 """ def __init__( self, num_hid, init_scale=1.0, init_b=0.0, use_bias=True, init_mode="norm", **kwargs ): super(Linear, self).__init__(**kwargs) self.num_hid = num_hid self.init_scale = init_scale self.init_b = init_b self.use_bias = use_bias self.init_mode = init_mode def set_input_shape(self, input_shape): batch_size, dim = input_shape self.input_shape = [batch_size, dim] self.output_shape = [batch_size, self.num_hid] if self.init_mode == "norm": init = tf.random_normal([dim, self.num_hid], dtype=tf.float32) init = init / tf.sqrt( 1e-7 + tf.reduce_sum(tf.square(init), axis=0, keep_dims=True) ) init = init * self.init_scale elif self.init_mode == "uniform_unit_scaling": scale = np.sqrt(3.0 / dim) init = tf.random_uniform( [dim, self.num_hid], dtype=tf.float32, minval=-scale, maxval=scale ) else: raise ValueError(self.init_mode) self.W = PV(init) if self.use_bias: self.b = PV((np.zeros((self.num_hid,)) + self.init_b).astype("float32")) def fprop(self, x, **kwargs): out = tf.matmul(x, self.W.var) if self.use_bias: out = out + self.b.var return out def get_params(self): out = [self.W.var] if self.use_bias: out.append(self.b.var) return out class Conv2D(Layer): """ 2-D Convolution. Uses NHWC format for input and output. :param output_channels: int The number of channels to output :param kernel_shape: tuple of two ints (kernel rows, kernel columns) Do not include input channels or output channels in kernel_shape. :param strides: tuple of two ints (row stride, column stride) Do not include channel or batch strides. :param use_bias: bool If True (default is False) adds a per-channel bias term to the output :param init_mode: string "norm" : each kernel is initialized to have the same norm, given by `init_scale` "inv_sqrt" : Gaussian with standard devation given by sqrt(2/fan_out) "glorot_uniform" : U(+/- sqrt(6/(fan_in+fan_out)) """ def __init__( self, output_channels, kernel_shape, strides, padding, use_bias=False, init_scale=1.0, init_mode="norm", **kwargs ): self.__dict__.update(locals()) del self.self super(Conv2D, self).__init__(**kwargs) def set_input_shape(self, input_shape): _batch_size, _rows, _cols, input_channels = input_shape assert len(self.kernel_shape) == 2 kernel_shape = tuple(self.kernel_shape) + (input_channels, self.output_channels) assert len(kernel_shape) == 4 assert all(isinstance(e, int) for e in kernel_shape), kernel_shape fan_in = self.kernel_shape[0] * self.kernel_shape[1] * input_channels fan_out = self.kernel_shape[0] * self.kernel_shape[1] * self.output_channels if self.init_mode == "norm": init = tf.random_normal(kernel_shape, dtype=tf.float32) squared_norms = tf.reduce_sum(tf.square(init), axis=(0, 1, 2)) denom = tf.sqrt(1e-7 + squared_norms) init = self.init_scale * init / denom elif self.init_mode == "inv_sqrt": init = tf.random_normal( kernel_shape, dtype=tf.float32, stddev=np.sqrt(2.0 / fan_out) ) elif self.init_mode == "glorot_uniform": scale = np.sqrt(6.0 / (fan_in + fan_out)) init = tf.random_uniform( kernel_shape, dtype=tf.float32, minval=-scale, maxval=scale ) else: raise ValueError(self.init_mode) self.kernels = PV(init, name=self.name + "_kernels") if self.use_bias: self.b = PV(np.zeros((self.output_channels,)).astype("float32")) input_shape = list(input_shape) orig_batch_size = input_shape[0] input_shape[0] = 1 dummy_batch = tf.zeros(input_shape) dummy_output = self.fprop(dummy_batch) output_shape = [int(e) for e in dummy_output.get_shape()] output_shape[0] = orig_batch_size self.output_shape = tuple(output_shape) def fprop(self, x, **kwargs): assert len(self.strides) == 2 out = tf.nn.conv2d( x, self.kernels.var, (1,) + tuple(self.strides) + (1,), self.padding ) if self.use_bias: out = out + self.b.var return out def get_params(self): out = [self.kernels.var] if self.use_bias: out.append(self.b.var) return out class ReLU(Layer): def __init__(self, leak=0.0, **kwargs): super(ReLU, self).__init__(**kwargs) self.leak = leak def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_output_shape(self): return self.output_shape def fprop(self, x, **kwargs): out = tf.nn.relu(x) if self.leak != 0.0: # The code commented below resulted in the time per epoch of # an 8-GPU wide resnet increasing by about 5% relative to the # code now in use. # The two different implementations have the same forward prop # down to machine precision on all inputs I have tested, but # sometimes have different derivatives. # Both obtain about the same training accuracy but the faster # version seems to also be slightly more accurate. # The commented code and these performance notes are included to # aid future revision efforts. # # out = out - self.leak * tf.nn.relu(-x) # out = tf.where(tf.less(x, 0.0), self.leak * x, x) return out def get_params(self): return [] class Sigmoid(Layer): def __init__(self, **kwargs): super(Sigmoid, self).__init__(**kwargs) def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_output_shape(self): return self.output_shape def fprop(self, x, **kwargs): return tf.nn.sigmoid(x) def get_params(self): return [] class Tanh(Layer): def __init__(self, **kwargs): super(Tanh, self).__init__(**kwargs) def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_output_shape(self): return self.output_shape def fprop(self, x, **kwargs): return tf.nn.tanh(x) def get_params(self): return [] class LeakyReLU(ReLU): def __init__(self, leak=0.2, **kwargs): super(LeakyReLU, self).__init__(leak=leak, **kwargs) class ELU(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_output_shape(self): return self.output_shape def fprop(self, x, **kwargs): return tf.nn.elu(x) def get_params(self): return [] class SELU(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_output_shape(self): return self.output_shape def fprop(self, x, **kwargs): alpha = 1.6732632423543772848170429916717 scale = 1.0507009873554804934193349852946 mask = tf.to_float(x >= 0.0) out = mask * x + (1.0 - mask) * (alpha * tf.exp((1.0 - mask) * x) - alpha) return scale * out def get_params(self): return [] class TanH(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_output_shape(self): return self.output_shape def fprop(self, x, **kwargs): return tf.nn.tanh(x) class Softmax(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def fprop(self, x, **kwargs): out = tf.nn.softmax(x) return out def get_params(self): return [] def make_label_placeholder(self): return tf.placeholder(tf.float32, self.output_shape) class Flatten(Layer): def set_input_shape(self, shape): self.input_shape = shape output_width = 1 for factor in shape[1:]: output_width *= factor self.output_width = output_width self.output_shape = [None, output_width] def fprop(self, x, **kwargs): return tf.reshape(x, [-1, self.output_width]) def get_params(self): return [] class Print(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_params(self): return [] def fprop(self, x, **kwargs): mean = tf.reduce_mean(x) std = tf.sqrt(tf.reduce_mean(tf.square(x - mean))) return tf.Print( x, [tf.reduce_min(x), mean, tf.reduce_max(x), std], "Print layer" ) class Add(Layer): """ A Layer that adds a function to its input. The function to add is specified in terms of multiple layers, just like in the MLP class. The Add layer is useful for implementing residual networks. """ def __hash__(self): return hash(id(self)) def set_input_shape(self, shape): self.input_shape = shape shapes = {"input": shape} for layer in self.layers: layer.set_input_shape(shapes[layer.parent]) shapes[layer.name] = layer.get_output_shape() self.output_shape = shapes[self.layers[-1].name] def __init__(self, layers): super(Add, self).__init__() self.layer_names = [] self.layers = layers for i, layer in enumerate(self.layers): if layer.parent is None: if i == 0: layer.parent = "input" else: layer.parent = layers[i - 1].name if hasattr(layer, "name"): name = layer.name else: name = layer.__class__.__name__ + str(i) layer.name = name self.layer_names.append(name) def get_params(self): out = [] for layer in self.layers: out = ordered_union(out, layer.get_params()) return out def fprop(self, x, **kwargs): orig_x = x # Note: this currently isn't great. # A layer can have any parent it wants, but the parent # must come earlier in the list. # There's no way to have > 1 parent. # This means we can support branched structures that split, # e.g. for multiple output heads, but not structures # that converge. # We can feed a value in the middle using "given" but # only layers after the given one are run using the current # implementation, so the feed must happen before any branch # point. out = {"input": x} for layer in self.layers: x = out[layer.parent] try: x = layer.fprop(x) except TypeError as e: msg = "TypeError in fprop for layer %s of type %s: %s" msg = msg % (layer.name, str(type(layer)), str(e)) raise TypeError(msg) assert x is not None out[layer.name] = x return orig_x + out[self.layers[-1].name] class PerImageStandardize(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_params(self): return [] def fprop(self, x, **kwargs): axis = [1, 2, 3] mean = reduce_mean(x, axis=axis, keepdims=True) variance = reduce_mean(tf.square(x), axis=axis, keepdims=True) - tf.square(mean) variance = tf.nn.relu(variance) stddev = tf.sqrt(variance) num_pixels = reduce_prod(tf.shape(x)[1:]) min_stddev = tf.rsqrt(tf.to_float(num_pixels)) pixel_value_scale = tf.maximum(stddev, min_stddev) pixel_value_offset = mean x = tf.subtract(x, pixel_value_offset) x = tf.div(x, pixel_value_scale) return x class Dropout(Layer): """Dropout layer. By default, is a no-op. Activate it during training using the kwargs The default use case is that you never specify include_prob anywhere. During evaluation, you don't do anything special regarding dropout, and nothing gets dropped. During training, you pass "dropout=True" to make units get randomly dropped. If you've done nothing else, include_prob defaults to 0.5 in the Dropout class constructor. A slightly more advanced use case is that you want to use different include_probs for some layer. For example, people usually use include_prob=0.8 for the input layer. To do this, you specify include_prob in the constructor arguments for those layers. Other than that, it's the same as the basic use case case. You do nothing special at test time and nothing is dropped. You pass dropout=True at train time and units in each layer are dropped based on their include_prob specified in their layer's constructor. The most advanced use case is if you want to change dropout include probabilities for a specific fprop call. In this case, you pass dropout=True and dropout_dict for that call. Each layer uses the include_prob specified in the dropout_dict for that call.of MLP.fprop. """ def __init__(self, include_prob=0.5, **kwargs): super(Dropout, self).__init__(**kwargs) self.include_prob = include_prob def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def get_params(self): return [] def fprop(self, x, dropout=False, dropout_dict=None, **kwargs): """ Forward propagation as either no-op or dropping random units. :param x: The input to the layer :param dropout: bool specifying whether to drop units :param dropout_dict: dict This dictionary is usually not needed. In rare cases, generally for research purposes, this dictionary makes it possible to run forward propagation with a different dropout include probability. This dictionary should be passed as a named argument to the MLP class, which will then pass it to *all* layers' fprop methods. Other layers will just receive this as an ignored kwargs entry. Each dropout layer looks up its own name in this dictionary to read out its include probability. """ include_prob = self.include_prob if dropout_dict is not None: assert dropout if self.name in dropout_dict: include_prob = dropout_dict[self.name] if dropout: return tf.nn.dropout(x, include_prob) return x class ResidualWithGroupNorm(Layer): """A residual network layer that uses group normalization. :param out_filter: Number of output filters :param stride: int Stride for convolutional layers. Replicated to both row and column. """ def __init__( self, out_filter, stride, activate_before_residual=False, leak=0.1, **kwargs ): assert isinstance(stride, int) self.__dict__.update(locals()) del self.self self.lrelu = LeakyReLU(leak) super(ResidualWithGroupNorm, self).__init__(**kwargs) def set_input_shape(self, shape): self.input_shape = tuple(shape) self.in_filter = shape[-1] self.gn1 = GroupNorm(name=self.name + "_gn1") self.gn1.set_input_shape(shape) strides = (self.stride, self.stride) self.conv1 = Conv2D( self.out_filter, (3, 3), strides, "SAME", name=self.name + "_conv1", init_mode="inv_sqrt", ) self.conv1.set_input_shape(shape) self.gn2 = GroupNorm(name=self.name + "_gn2") self.gn2.set_input_shape(self.conv1.get_output_shape()) self.conv2 = Conv2D( self.out_filter, (3, 3), (1, 1), "SAME", name=self.name + "_conv2", init_mode="inv_sqrt", ) self.conv2.set_input_shape(self.conv1.get_output_shape()) self.output_shape = self.conv2.get_output_shape() def get_params(self): sublayers = [self.conv1, self.conv2, self.gn1, self.gn2] params = [] for sublayer in sublayers: params = params + sublayer.get_params() assert self.conv1.kernels.var in params return params def fprop(self, x, **kwargs): if self.activate_before_residual: x = self.gn1.fprop(x) x = self.lrelu.fprop(x) orig_x = x else: orig_x = x x = self.gn1.fprop(x) x = self.lrelu.fprop(x) x = self.conv1.fprop(x) x = self.gn2.fprop(x) x = self.lrelu.fprop(x) x = self.conv2.fprop(x) if self.stride != 1: stride = [1, self.stride, self.stride, 1] orig_x = tf.nn.avg_pool(orig_x, stride, stride, "VALID") out_filter = self.out_filter in_filter = self.in_filter if in_filter != out_filter: orig_x = tf.pad( orig_x, [ [0, 0], [0, 0], [0, 0], [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2], ], ) x = x + orig_x return x class GlobalAveragePool(Layer): def set_input_shape(self, shape): self.input_shape = shape self.output_shape = [shape[0], shape[-1]] def get_params(self): return [] def fprop(self, x, **kwargs): assert len(list(x.get_shape())) == 4 return tf.reduce_mean(x, [1, 2]) class GroupNorm(Layer): """ Group normalization https://arxiv.org/abs/1803.08494 """ def __init__(self, num_groups=32, eps=1e-3, init_gamma=1.0, **kwargs): self.num_groups = num_groups self.eps = eps self.init_gamma = init_gamma super(GroupNorm, self).__init__(**kwargs) def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape channels = shape[-1] self.channels = channels self.actual_num_groups = min(self.channels, self.num_groups) extra_dims = (self.channels // self.actual_num_groups, self.actual_num_groups) self.expanded_shape = tuple(shape[1:3]) + tuple(extra_dims) init_value = np.ones((channels,), dtype="float32") * self.init_gamma self.gamma = PV(init_value, name=self.name + "_gamma") self.beta = PV( np.zeros((self.channels,), dtype="float32"), name=self.name + "_beta" ) def fprop(self, x, **kwargs): shape = tf.shape(x) batch_size = shape[0] x = tf.reshape(x, (batch_size,) + self.expanded_shape) mean, var = tf.nn.moments(x, [1, 2, 3], keep_dims=True) x = (x - mean) * tf.rsqrt(var + self.eps) x = tf.reshape(x, shape) x = x * self.gamma.var + self.beta.var return x def get_params(self): return [self.gamma.var, self.beta.var] class BatchNorm(Layer): """ This BatchNorm is always run in train mode for now """ def __init__(self, eps=1e-3, init_gamma=1.0, **kwargs): self.eps = eps self.init_gamma = init_gamma super(BatchNorm, self).__init__(**kwargs) def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape channels = shape[-1] init_value = np.ones((channels,), dtype="float32") * self.init_gamma self.gamma = PV(init_value, name=self.name + "_gamma") self.beta = PV(np.zeros((channels,), dtype="float32"), name=self.name + "_beta") def fprop(self, x, **kwargs): mean, var = tf.nn.moments(x, [0, 1, 2], keep_dims=True) x = (x - mean) * tf.rsqrt(var + self.eps) x = x * self.gamma.var + self.beta.var return x def get_params(self): return [self.gamma.var, self.beta.var] class ResidualWithBatchNorm(Layer): """A residual network layer that uses batch normalization. :param out_filter: Number of output filters :param stride: int Stride for convolutional layers. Replicated to both row and column. """ def __init__( self, out_filter, stride, activate_before_residual=False, leak=0.1, **kwargs ): assert isinstance(stride, int) self.__dict__.update(locals()) del self.self self.lrelu = LeakyReLU(leak) super(ResidualWithBatchNorm, self).__init__(**kwargs) def set_input_shape(self, shape): self.input_shape = tuple(shape) self.in_filter = shape[-1] self.bn1 = BatchNorm(name=self.name + "_bn1") self.bn1.set_input_shape(shape) strides = (self.stride, self.stride) self.conv1 = Conv2D( self.out_filter, (3, 3), strides, "SAME", name=self.name + "_conv1", init_mode="inv_sqrt", ) self.conv1.set_input_shape(shape) self.bn2 = BatchNorm(name=self.name + "_bn2") self.bn2.set_input_shape(self.conv1.get_output_shape()) self.conv2 = Conv2D( self.out_filter, (3, 3), (1, 1), "SAME", name=self.name + "_conv2", init_mode="inv_sqrt", ) self.conv2.set_input_shape(self.conv1.get_output_shape()) self.output_shape = self.conv2.get_output_shape() def get_params(self): sublayers = [self.conv1, self.conv2, self.bn1, self.bn2] params = [] for sublayer in sublayers: params = params + sublayer.get_params() assert self.conv1.kernels.var in params return params def fprop(self, x, **kwargs): if self.activate_before_residual: x = self.bn1.fprop(x) x = self.lrelu.fprop(x) orig_x = x else: orig_x = x x = self.bn1.fprop(x) x = self.lrelu.fprop(x) x = self.conv1.fprop(x) x = self.bn2.fprop(x) x = self.lrelu.fprop(x) x = self.conv2.fprop(x) if self.stride != 1: stride = [1, self.stride, self.stride, 1] orig_x = tf.nn.avg_pool(orig_x, stride, stride, "VALID") out_filter = self.out_filter in_filter = self.in_filter if in_filter != out_filter: orig_x = tf.pad( orig_x, [ [0, 0], [0, 0], [0, 0], [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2], ], ) x = x + orig_x return x ================================================ FILE: cleverhans_v3.1.0/cleverhans/plot/__init__.py ================================================ """ Plotting and visualization """ ================================================ FILE: cleverhans_v3.1.0/cleverhans/plot/image.py ================================================ """ Functionality for displaying or saving images. """ from tempfile import mkstemp import os import platform import numpy as np from PIL import Image from cleverhans.utils import shell_call def show(ndarray, min_val=None, max_val=None): """ Display an image. :param ndarray: The image as an ndarray :param min_val: The minimum pixel value in the image format :param max_val: The maximum pixel valie in the image format If min_val and max_val are not specified, attempts to infer whether the image is in any of the common ranges: [0, 1], [-1, 1], [0, 255] This can be ambiguous, so it is better to specify if known. """ # Create a temporary file with the suffix '.png'. fd, path = mkstemp(suffix=".png") os.close(fd) save(path, ndarray, min_val, max_val) shell_call(VIEWER_COMMAND + [path]) def save(path, ndarray, min_val=None, max_val=None): """ Save an image, represented as an ndarray, to the filesystem :param path: string, filepath :param ndarray: The image as an ndarray :param min_val: The minimum pixel value in the image format :param max_val: The maximum pixel valie in the image format If min_val and max_val are not specified, attempts to infer whether the image is in any of the common ranges: [0, 1], [-1, 1], [0, 255] This can be ambiguous, so it is better to specify if known. """ as_pil(ndarray, min_val, max_val).save(path) def as_pil(ndarray, min_val=None, max_val=None): """ Converts an ndarray to a PIL image. :param ndarray: The numpy ndarray to convert :param min_val: The minimum pixel value in the image format :param max_val: The maximum pixel valie in the image format If min_val and max_val are not specified, attempts to infer whether the image is in any of the common ranges: [0, 1], [-1, 1], [0, 255] This can be ambiguous, so it is better to specify if known. """ assert isinstance(ndarray, np.ndarray) # rows x cols for grayscale image # rows x cols x channels for color assert ndarray.ndim in [2, 3] if ndarray.ndim == 3: channels = ndarray.shape[2] # grayscale or RGB assert channels in [1, 3] actual_min = ndarray.min() actual_max = ndarray.max() if min_val is not None: assert actual_min >= min_val assert actual_max <= max_val if np.issubdtype(ndarray.dtype, np.floating): if min_val is None: if actual_min < -1.0: raise ValueError("Unrecognized range") if actual_min < 0: min_val = -1.0 else: min_val = 0.0 if max_val is None: if actual_max > 255.0: raise ValueError("Unrecognized range") if actual_max > 1.0: max_val = 255.0 else: max_val = 1.0 ndarray = ndarray - min_val value_range = max_val - min_val ndarray *= 255.0 / value_range ndarray = np.cast["uint8"](ndarray) elif "int" in str(ndarray.dtype): if min_val is not None: assert min_val == 0 else: assert actual_min >= 0.0 if max_val is not None: assert max_val == 255 else: assert actual_max <= 255.0 else: raise ValueError("Unrecognized dtype") out = Image.fromarray(ndarray) return out def make_grid(image_batch): """ Turns a batch of images into one big image. :param image_batch: ndarray, shape (batch_size, rows, cols, channels) :returns : a big image containing all `batch_size` images in a grid """ m, ir, ic, ch = image_batch.shape pad = 3 padded = np.zeros((m, ir + pad * 2, ic + pad * 2, ch)) padded[:, pad:-pad, pad:-pad, :] = image_batch m, ir, ic, ch = padded.shape pr = int(np.sqrt(m)) pc = int(np.ceil(float(m) / pr)) extra_m = pr * pc assert extra_m > m padded = np.concatenate((padded, np.zeros((extra_m - m, ir, ic, ch))), axis=0) row_content = np.split(padded, pr) row_content = [np.split(content, pc) for content in row_content] rows = [np.concatenate(content, axis=2) for content in row_content] grid = np.concatenate(rows, axis=1) assert grid.shape[0] == 1, grid.shape grid = grid[0] return grid if platform.system() == "Darwin": VIEWER_COMMAND = ["open", "-a", "Preview"] else: VIEWER_COMMAND = ["eog", "--new-instance"] ================================================ FILE: cleverhans_v3.1.0/cleverhans/plot/pyplot_defaults.py ================================================ """Defaults for pyplot Import this file to set some default parameters for pyplot. These are designed to make the plot look good in the context of a LaTeX document. If you have installed the Computer Modern fonts ( ftp://canopus.iacp.dvo.ru/pub/Font/cm_unicode/cm-unicode-0.6.3a-otf.tar.gz ) these defaults will use them, so that text in your pyplot figures will match text in the rest of your document. If you do not have those fonts installed, pyplot commands will still work. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import matplotlib from matplotlib import pyplot matplotlib.rcParams["text.latex.preamble"] = r"\usepackage{bm}" matplotlib.rcParams["text.usetex"] = True pyplot.rcParams["pdf.fonttype"] = 42 pyplot.rcParams["font.family"] = "serif" pyplot.rcParams["font.serif"] = "CMU Serif" pyplot.rcParams["font.size"] = 8 # Note: if you get an error, delete fontList.cache ================================================ FILE: cleverhans_v3.1.0/cleverhans/plot/pyplot_image.py ================================================ """ Functionality for showing images in pyplot. See also cleverhans.plot.image for loading/saving image files, showing images in 3rd party viewers, etc. """ import numpy as np from six.moves import range def pair_visual(original, adversarial, figure=None): """ This function displays two images: the original and the adversarial sample :param original: the original input :param adversarial: the input after perturbations have been applied :param figure: if we've already displayed images, use the same plot :return: the matplot figure to reuse for future samples """ import matplotlib.pyplot as plt # Squeeze the image to remove single-dimensional entries from array shape original = np.squeeze(original) adversarial = np.squeeze(adversarial) # Ensure our inputs are of proper shape assert len(original.shape) == 2 or len(original.shape) == 3 # To avoid creating figures per input sample, reuse the sample plot if figure is None: plt.ion() figure = plt.figure() figure.canvas.set_window_title("Cleverhans: Pair Visualization") # Add the images to the plot perturbations = adversarial - original for index, image in enumerate((original, perturbations, adversarial)): figure.add_subplot(1, 3, index + 1) plt.axis("off") # If the image is 2D, then we have 1 color channel if len(image.shape) == 2: plt.imshow(image, cmap="gray") else: plt.imshow(image) # Give the plot some time to update plt.pause(0.01) # Draw the plot and return plt.show() return figure def grid_visual(data): """ This function displays a grid of images to show full misclassification :param data: grid data of the form; [nb_classes : nb_classes : img_rows : img_cols : nb_channels] :return: if necessary, the matplot figure to reuse """ import matplotlib.pyplot as plt # Ensure interactive mode is disabled and initialize our graph plt.ioff() figure = plt.figure() figure.canvas.set_window_title("Cleverhans: Grid Visualization") # Add the images to the plot num_cols = data.shape[0] num_rows = data.shape[1] num_channels = data.shape[4] for y in range(num_rows): for x in range(num_cols): figure.add_subplot(num_rows, num_cols, (x + 1) + (y * num_cols)) plt.axis("off") if num_channels == 1: plt.imshow(data[x, y, :, :, 0], cmap="gray") else: plt.imshow(data[x, y, :, :, :]) # Draw the plot and return plt.show() return figure def get_logits_over_interval( sess, model, x_data, fgsm_params, min_epsilon=-10.0, max_epsilon=10.0, num_points=21 ): """Get logits when the input is perturbed in an interval in adv direction. Args: sess: Tf session model: Model for which we wish to get logits. x_data: Numpy array corresponding to single data. point of shape [height, width, channels]. fgsm_params: Parameters for generating adversarial examples. min_epsilon: Minimum value of epsilon over the interval. max_epsilon: Maximum value of epsilon over the interval. num_points: Number of points used to interpolate. Returns: Numpy array containing logits. Raises: ValueError if min_epsilon is larger than max_epsilon. """ # Get the height, width and number of channels height = x_data.shape[0] width = x_data.shape[1] channels = x_data.shape[2] x_data = np.expand_dims(x_data, axis=0) import tensorflow as tf from cleverhans.attacks import FastGradientMethod # Define the data placeholder x = tf.placeholder(dtype=tf.float32, shape=[1, height, width, channels], name="x") # Define adv_x fgsm = FastGradientMethod(model, sess=sess) adv_x = fgsm.generate(x, **fgsm_params) if min_epsilon > max_epsilon: raise ValueError("Minimum epsilon is less than maximum epsilon") eta = tf.nn.l2_normalize(adv_x - x, dim=0) epsilon = tf.reshape( tf.lin_space(float(min_epsilon), float(max_epsilon), num_points), (num_points, 1, 1, 1), ) lin_batch = x + epsilon * eta logits = model.get_logits(lin_batch) with sess.as_default(): log_prob_adv_array = sess.run(logits, feed_dict={x: x_data}) return log_prob_adv_array def linear_extrapolation_plot( log_prob_adv_array, y, file_name, min_epsilon=-10, max_epsilon=10, num_points=21 ): """Generate linear extrapolation plot. Args: log_prob_adv_array: Numpy array containing log probabilities y: Tf placeholder for the labels file_name: Plot filename min_epsilon: Minimum value of epsilon over the interval max_epsilon: Maximum value of epsilon over the interval num_points: Number of points used to interpolate """ import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt figure = plt.figure() figure.canvas.set_window_title("Cleverhans: Linear Extrapolation Plot") correct_idx = np.argmax(y, axis=0) fig = plt.figure() plt.xlabel("Epsilon") plt.ylabel("Logits") x_axis = np.linspace(min_epsilon, max_epsilon, num_points) plt.xlim(min_epsilon - 1, max_epsilon + 1) for i in range(y.shape[0]): if i == correct_idx: ls = "-" linewidth = 5 else: ls = "--" linewidth = 2 plt.plot( x_axis, log_prob_adv_array[:, i], ls=ls, linewidth=linewidth, label="{}".format(i), ) plt.legend(loc="best", fontsize=14) plt.show() fig.savefig(file_name) plt.clf() return figure ================================================ FILE: cleverhans_v3.1.0/cleverhans/plot/save_pdf.py ================================================ """ The save_pdf function. """ from matplotlib.backends.backend_pdf import PdfPages from matplotlib import pyplot def save_pdf(path): """ Saves a pdf of the current matplotlib figure. :param path: str, filepath to save to """ pp = PdfPages(path) pp.savefig(pyplot.gcf()) pp.close() ================================================ FILE: cleverhans_v3.1.0/cleverhans/plot/success_fail.py ================================================ """Functions for plotting succes-failure curves Reference: https://openreview.net/forum?id=H1g0piA9tQ """ import warnings import numpy as np from matplotlib import pyplot from cleverhans.serial import load from cleverhans.utils import safe_zip LINEWIDTH = 2 DEFAULT_SUCCESS_NAME = "clean" # This must be a tuple or it is not safe to use as a param default DEFAULT_FAIL_NAMES = ("mc", "bundled") def plot_report_from_path( path, success_name=DEFAULT_SUCCESS_NAME, fail_names=DEFAULT_FAIL_NAMES, label=None, is_max_confidence=True, linewidth=LINEWIDTH, plot_upper_bound=True, ): """ Plots a success-fail curve from a confidence report stored on disk, :param path: string filepath for the stored report. (Should be the output of make_confidence_report*.py) :param success_name: The name (confidence report key) of the data that should be used to measure success rate :param fail_names: A list of names (confidence report keys) of the data that should be used to measure failure rate. *Only one of these keys will be plotted*. Each key will be tried in order until one is found in the report. This is to support both the output of `make_confidence_report` and `make_confidence_report_bundled`. :param label: Optional string. Name to use for this curve in the legend. :param is_max_confidence: bool. If True, when measuring the failure rate, treat the data as the output of a maximum confidence attack procedure. This means that the attack is optimal (assuming the underlying optimizer is good enough, *which is probably false*, so interpret the plot accordingly) for thresholds >= .5 but for lower thresholds the observed failure rate is a lower bound on the true worst failure rate and the observed coverage is an upper bound (assuming good enough optimization) on the true failure rate. The plot thus draws the threshold >= .5 portion of the curve with a solid line and the upper and lower bounds with a dashed line. See https://openreview.net/forum?id=H1g0piA9tQ for details. If False, the attack procedure is regarded as an ad hoc way of obtaining a loose lower bound, and thus the whole curve is drawn with dashed lines. :param linewidth: thickness of the line to draw :param plot_upper_bound: include upper bound on error rate in plot """ report = load(path) plot_report( report, success_name, fail_names, label, is_max_confidence, linewidth, plot_upper_bound, ) def plot_report( report, success_name, fail_names, label=None, is_max_confidence=True, linewidth=LINEWIDTH, plot_upper_bound=True, ): """ Plot a success fail curve from a confidence report :param report: A confidence report (the type of object saved by make_confidence_report.py) :param success_name: see plot_report_from_path :param fail_names: see plot_report_from_path :param label: see plot_report_from_path :param is_max_confidence: see plot_report_from_path :param linewidth: see plot_report_from_path """ ( fail_optimal, success_optimal, fail_lower_bound, fail_upper_bound, success_bounded, ) = make_curve(report, success_name, fail_names) assert len(fail_lower_bound) == len(fail_upper_bound) fail_optimal = np.array(fail_optimal) fail_lower_bound = np.array(fail_lower_bound) fail_upper_bound = np.array(fail_upper_bound) if is_max_confidence: (p,) = pyplot.plot( fail_optimal, success_optimal, label=label, linewidth=linewidth ) color = p.get_color() pyplot.plot(fail_lower_bound, success_bounded, "--", color=color) if plot_upper_bound: pyplot.plot(fail_upper_bound, success_bounded, "--", color=color) else: # If the attack was not MaxConfidence, then this whole curve is just # a loose lower bound all_fail = np.concatenate((fail_optimal, fail_lower_bound), axis=0) pyplot.plot( all_fail, success_optimal + success_bounded, "--", label=label, linewidth=linewidth, ) pyplot.xlabel("Failure rate on adversarial examples") pyplot.ylabel("Success rate on clean examples") gap = fail_upper_bound - fail_lower_bound if gap.size > 0: assert gap.min() >= 0.0 print("Max gap: ", gap.max()) def make_curve(report, success_name, fail_names): """ Make a success-failure curve. :param report: A confidence report (the type of object saved by make_confidence_report.py) :param success_name: see plot_report_from_path :param fail_names: see plot_report_from_path :returns: fail_optimal: list of failure rates on adversarial data for the optimal (t >= .5) part of the curve. Each entry corresponds to a different threshold. Thresholds are chosen to make the smoothest possible curve from the available data, e.g. one threshold between each unique confidence value observed in the data. To make sure that linear interpolation between points in the curve never overestimates the failure rate for a specific success rate, the curve also includes extra points that increment the failure rate prior to any point that increments the success rate, so the curve moves up and to the right in a series of backwards "L" shapes rather than moving up and to the right along diagonal lines. For large datasets these maximally pessimistic points will usually not be visible and the curve will appear smooth. success_optimal: list of success rates on clean data on the optimal part of the curve. Matches up with `fail_optimal`. fail_lower_bound: list of observed failure rates on the t < .5 portion of the curve where MaxConfidence is not optimal. fail_upper_bound: list of upper bounds (assuming good enough optimization, so not a true upper bound) on the failure rates on the t < .5 portion of the curve where MaxConfidence is not optimal. Matches up with `fail_lower_bound`. success_bounded: success rates on the non-optimal part of the curve. Matches up with `fail_lower_bound` and `fail_upper_bound`. """ success_results = report[success_name] fail_name = None # pacify pylint found = False for fail_name in fail_names: if fail_name in report: found = True break if not found: raise ValueError( fail_name + " not in report." "Available keys: " + str(report.keys()) ) fail_results = report[fail_name] # "good" means drawn from the distribution where we measure success rate. # "bad" means drawn from the distribution where we measure failure rate. # From here on out we use those terms, to avoid confusion between examples # that actually failed and examples that were drawn from the distribution # where we measured failure rate. old_all_probs_version = False if isinstance(success_results, dict): # This dictionary key lookup will trigger a deprecation warning if `success_results` is not the old dictionary # style of report, so we don't want to do a dictionary lookup unless we really are using the old version. old_all_probs_version = "all_probs" in success_results if old_all_probs_version: warnings.warn( "The 'all_probs' key is included only to support " " old files from a private development codebase. " "Support for this key can be dropped at any time " " without warning." ) good_probs = success_results["all_probs"] bad_probs = fail_results["all_probs"] bad_corrects = fail_results["correctness_mask"] good_corrects = success_results["correctness_mask"] else: if isinstance(success_results, dict): # Still using dict, but using newer key names warnings.warn( "Support for dictionary confidence reports is deprecated. Switch to using the classes in " "cleverhans.confidence_report. Support for old dictionary-style reports may be removed " "on or after 2019-07-19." ) good_probs = success_results["confidence"] bad_probs = fail_results["confidence"] good_corrects = success_results["correctness"] bad_corrects = fail_results["correctness"] else: # current version good_probs = success_results.confidence bad_probs = fail_results.confidence good_corrects = success_results.correctness bad_corrects = fail_results.correctness good_triplets = [ (prob, correct, True) for prob, correct in safe_zip(good_probs, good_corrects) ] bad_triplets = [ (prob, correct, False) for prob, correct in safe_zip(bad_probs, bad_corrects) ] total_good = len(good_triplets) total_bad = len(bad_triplets) if total_good != 10000: warnings.warn( "Not using full test set? Found " + str(total_good) + " examples for measuring success rate" ) if total_bad != 10000: warnings.warn("Not using full test set for adversarial examples?") all_triplets = good_triplets + bad_triplets all_triplets = sorted(all_triplets, key=lambda x: -x[0]) # Start with the case for threshold t = 1. # Examples are covered only if prob > t (strict inequality) # So initially nothing is covered good_covered_and_correct = 0 bad_covered_and_incorrect = 0 # Number of examples that are bad, incorrect, and covered by # a t >= 0.5, or that were merely covered by a t < 0.5 failure_opportunities = 0 next_idx = 0 fail_optimal = [] success_optimal = [] fail_upper_bound = [] fail_lower_bound = [] success_bounded = [] bounded = False # NOTE: the loop always exits via an internal break statement. # Copied the termination condition to the while statement for ease # of reading. while next_idx < len(all_triplets): gs = float(good_covered_and_correct) / total_good bf = float(bad_covered_and_incorrect) / total_bad # Add results for current threshold to the list if not bounded: # Sometimes when there are big jumps the failure rate it makes # artifacts in the plot, where there's a long linear track. # This implies the real success-fail curve is linear when # actually it just isn't sampled by the data. # To avoid implying that the model reaches a higher success # rate than it actually does, we avoid these plotting artifacts # by introducing extra points that make the graph move horizontally # to the right first, then vertically. if len(fail_optimal) > 0: prev_bf = fail_optimal[-1] prev_gs = success_optimal[-1] if gs > prev_gs and bf > prev_bf: fail_optimal.append(bf) success_optimal.append(prev_gs) success_optimal.append(gs) fail_optimal.append(bf) else: success_bounded.append(gs) fail_lower_bound.append(bf) fail_upper_bound.append(float(failure_opportunities) / total_bad) if next_idx == len(all_triplets): break # next_prob_to_include is not quite the same thing as the threshold. # The threshold is infinitesimally smaller than this value. next_prob_to_include = all_triplets[next_idx][0] # Process all ties while next_prob_to_include == all_triplets[next_idx][0]: _prob, correct, is_good = all_triplets[next_idx] if is_good: good_covered_and_correct += correct else: if next_prob_to_include <= 0.5: failure_opportunities += 1 else: failure_opportunities += 1 - correct bad_covered_and_incorrect += 1 - correct next_idx += 1 if next_idx == len(all_triplets): break if next_prob_to_include <= 0.5: bounded = True out = ( fail_optimal, success_optimal, fail_lower_bound, fail_upper_bound, success_bounded, ) return out ================================================ FILE: cleverhans_v3.1.0/cleverhans/serial.py ================================================ """Serialization functionality. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import warnings import joblib import tensorflow as tf from cleverhans.model import Model from cleverhans.utils import ordered_union from cleverhans.utils import safe_zip class PicklableVariable(object): """ A wrapper around a Variable that makes it picklable. The name of the Variable will not be reliable, only the value. Models intended to be picklable should identify variables by referencing Python objects rather than by using TensorFlow's names. TensorFlow Variables have different values associated with each Session. For this class, the value associated with the default Session will be used for both saving and loading, so both operations require that a default Session has been selected. Pickle is not secure. Unpickle only files you made yourself. See cleverhans_tutorials/mnist_tutorial_picklable.py for examples of a complete model training, pickling, and unpickling process using PicklableVariable. See cleverhans.picklable_model for models built using PicklableVariable. """ def __init__(self, *args, **kwargs): self.var = tf.Variable(*args, **kwargs) def __getstate__(self): sess = tf.get_default_session() if sess is None: raise RuntimeError( "PicklableVariable requires a default " "TensorFlow session" ) return {"var": sess.run(self.var)} def __setstate__(self, d): self.var = tf.Variable(d["var"]) sess = tf.get_default_session() if sess is None: raise RuntimeError( "PicklableVariable requires a default " "TensorFlow session" ) sess.run(self.var.initializer) class NoRefModel(Model): """ A Model that can be pickled because it contains no references to any Variables (e.g. it identifies Variables only by name). The Model must be able to find all of its Variables via get_vars for them to be pickled. Note that NoRefModel may have different Variable names after it is restored, e.g. if the unpickling is run with a different enclosing scope. NoRefModel will still work in these circumstances as long as get_params returns the same order of Variables after unpickling as it did before pickling. See also cleverhans.picklable_model for a different, complementary pickling strategy: models that can be pickled because they use *only* references to Variables and work regardless of Variable names. """ def __getstate__(self): # Serialize everything except the Variables out = self.__dict__.copy() # The base Model class adds this tf reference to self # We mustn't pickle anything tf, this will need to be # regenerated after the model is reloaded. if "_dummy_input" in out: del out["_dummy_input"] # Add the Variables sess = tf.get_default_session() if sess is None: raise RuntimeError("NoRefModel requires a default " "TensorFlow session") tf_variables = self.get_vars() out[VARS] = sess.run(tf_variables) out[VAR_NAMES] = [var.name for var in tf_variables] return out def __setstate__(self, d): tf_variables = d[VARS] del d[VARS] tf_variable_names = None # older joblib files may not have "_tf_variable_names" if VAR_NAMES in d: tf_variable_names = d[VAR_NAMES] del d[VAR_NAMES] else: warnings.warn( "This joblib file has no " + VAR_NAMES + " field. " "The field may become required on or after 2019-04-11." "You can make your file compatible with the new format by" " loading the file and re-saving it." ) # Deserialize everything except the Variables self.__dict__ = d # Deserialize the Variables sess = tf.get_default_session() if sess is None: raise RuntimeError("NoRefModel requires a default " "TensorFlow session") cur_vars = self.get_vars() if len(cur_vars) != len(tf_variables): print("Model format mismatch") print("Current model has " + str(len(cur_vars)) + " variables") print("Saved model has " + str(len(tf_variables)) + " variables") print("Names of current vars:") for var in cur_vars: print("\t" + var.name) if tf_variable_names is not None: print("Names of saved vars:") for name in tf_variable_names: print("\t" + name) else: print("Saved vars use old format, no names available for them") assert False found = [False] * len(cur_vars) if tf_variable_names is not None: # New version using the names to handle changes in ordering for value, name in safe_zip(tf_variables, tf_variable_names): value_found = False for idx, cur_var in enumerate(cur_vars): if cur_var.name == name: assert not found[idx] value_found = True found[idx] = True cur_var.load(value, sess) break assert value_found assert all(found) else: # Old version that works if and only if the order doesn't change for var, value in safe_zip(cur_vars, tf_variables): var.load(value, sess) def get_vars(self): """ Provides access to the model's Variables. This may include Variables that are not parameters, such as batch norm running moments. :return: A list of all Variables defining the model. """ # Catch eager execution and assert function overload. try: if tf.executing_eagerly(): raise NotImplementedError( "For Eager execution - get_vars " "must be overridden." ) except AttributeError: pass done = False tried_to_make_params = False while not done: # Most models in cleverhans use only trainable variables and do not # make sure the other collections are updated correctly. trainable_vars = tf.get_collection( tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/" ) # When wrapping other code, such as the CIFAR 10 challenge models, # we need to make sure we get the batch norm running averages as well # as the trainable variables. model_vars = tf.get_collection( tf.GraphKeys.MODEL_VARIABLES, self.scope + "/" ) scope_vars = ordered_union(trainable_vars, model_vars) if len(scope_vars) > 0: done = True else: assert not tried_to_make_params tried_to_make_params = True self.make_params() # Make sure no variables have been added or removed if hasattr(self, "num_vars"): assert self.num_vars == len(scope_vars) else: self.num_vars = len(scope_vars) return scope_vars def save(filepath, obj): """Saves an object to the specified filepath using joblib. joblib is like pickle but will save NumPy arrays as separate files for greater efficiency. :param filepath: str, path to save to :obj filepath: object to save """ joblib.dump(obj, filepath) def load(filepath): """Returns an object stored via `save`""" obj = joblib.load(filepath) return obj VARS = "_tf_variables" VAR_NAMES = "_tf_variable_names" ================================================ FILE: cleverhans_v3.1.0/cleverhans/train.py ================================================ """ Multi-replica synchronous training NOTE: This module is much more free to change than many other modules in CleverHans. CleverHans is very conservative about changes to any code that affects the output of benchmark tests (attacks, evaluation methods, etc.). This module provides *model training* functionality not *benchmarks* and thus is free to change rapidly to provide better speed, accuracy, etc. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import os import time import warnings import math import numpy as np from six.moves import xrange import tensorflow as tf from cleverhans import canary from cleverhans.utils import _ArgsWrapper, create_logger from cleverhans.utils import safe_zip from cleverhans.utils_tf import infer_devices from cleverhans.utils_tf import initialize_uninitialized_global_variables _logger = create_logger("train") _logger.setLevel(logging.INFO) def train( sess, loss, x_train, y_train, init_all=False, evaluate=None, feed=None, args=None, rng=None, var_list=None, fprop_args=None, optimizer=None, devices=None, x_batch_preprocessor=None, use_ema=False, ema_decay=0.998, run_canary=None, loss_threshold=1e5, dataset_train=None, dataset_size=None, ): """ Run (optionally multi-replica, synchronous) training to minimize `loss` :param sess: TF session to use when training the graph :param loss: tensor, the loss to minimize :param x_train: numpy array with training inputs or tf Dataset :param y_train: numpy array with training outputs or tf Dataset :param init_all: (boolean) If set to true, all TF variables in the session are (re)initialized, otherwise only previously uninitialized variables are initialized before training. :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Should contain `nb_epochs`, `learning_rate`, `batch_size` :param rng: Instance of numpy.random.RandomState :param var_list: Optional list of parameters to train. :param fprop_args: dict, extra arguments to pass to fprop (loss and model). :param optimizer: Optimizer to be used for training :param devices: list of device names to use for training If None, defaults to: all GPUs, if GPUs are available all devices, if no GPUs are available :param x_batch_preprocessor: callable Takes a single tensor containing an x_train batch as input Returns a single tensor containing an x_train batch as output Called to preprocess the data before passing the data to the Loss :param use_ema: bool If true, uses an exponential moving average of the model parameters :param ema_decay: float or callable The decay parameter for EMA, if EMA is used If a callable rather than a float, this is a callable that takes the epoch and batch as arguments and returns the ema_decay for the current batch. :param loss_threshold: float Raise an exception if the loss exceeds this value. This is intended to rapidly detect numerical problems. Sometimes the loss may legitimately be higher than this value. In such cases, raise the value. If needed it can be np.inf. :param dataset_train: tf Dataset instance. Used as a replacement for x_train, y_train for faster performance. :param dataset_size: integer, the size of the dataset_train. :return: True if model trained """ # Check whether the hardware is working correctly canary.run_canary() if run_canary is not None: warnings.warn( "The `run_canary` argument is deprecated. The canary " "is now much cheaper and thus runs all the time. The " "canary now uses its own loss function so it is not " "necessary to turn off the canary when training with " " a stochastic loss. Simply quit passing `run_canary`." "Passing `run_canary` may become an error on or after " "2019-10-16." ) args = _ArgsWrapper(args or {}) fprop_args = fprop_args or {} # Check that necessary arguments were given (see doc above) # Be sure to support 0 epochs for debugging purposes if args.nb_epochs is None: raise ValueError("`args` must specify number of epochs") if optimizer is None: if args.learning_rate is None: raise ValueError("Learning rate was not given in args dict") assert args.batch_size, "Batch size was not given in args dict" if rng is None: rng = np.random.RandomState() if optimizer is None: optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate) else: if not isinstance(optimizer, tf.train.Optimizer): raise ValueError( "optimizer object must be from a child class of " "tf.train.Optimizer" ) grads = [] xs = [] preprocessed_xs = [] ys = [] if dataset_train is not None: assert x_train is None and y_train is None and x_batch_preprocessor is None if dataset_size is None: raise ValueError("You must provide a dataset size") data_iterator = dataset_train.make_one_shot_iterator().get_next() x_train, y_train = sess.run(data_iterator) devices = infer_devices(devices) for device in devices: with tf.device(device): x = tf.placeholder(x_train.dtype, (None,) + x_train.shape[1:]) y = tf.placeholder(y_train.dtype, (None,) + y_train.shape[1:]) xs.append(x) ys.append(y) if x_batch_preprocessor is not None: x = x_batch_preprocessor(x) # We need to keep track of these so that the canary can feed # preprocessed values. If the canary had to feed raw values, # stochastic preprocessing could make the canary fail. preprocessed_xs.append(x) loss_value = loss.fprop(x, y, **fprop_args) grads.append(optimizer.compute_gradients(loss_value, var_list=var_list)) num_devices = len(devices) print("num_devices: ", num_devices) grad = avg_grads(grads) # Trigger update operations within the default graph (such as batch_norm). with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)): train_step = optimizer.apply_gradients(grad) epoch_tf = tf.placeholder(tf.int32, []) batch_tf = tf.placeholder(tf.int32, []) if use_ema: if callable(ema_decay): ema_decay = ema_decay(epoch_tf, batch_tf) ema = tf.train.ExponentialMovingAverage(decay=ema_decay) with tf.control_dependencies([train_step]): train_step = ema.apply(var_list) # Get pointers to the EMA's running average variables avg_params = [ema.average(param) for param in var_list] # Make temporary buffers used for swapping the live and running average # parameters tmp_params = [tf.Variable(param, trainable=False) for param in var_list] # Define the swapping operation param_to_tmp = [ tf.assign(tmp, param) for tmp, param in safe_zip(tmp_params, var_list) ] with tf.control_dependencies(param_to_tmp): avg_to_param = [ tf.assign(param, avg) for param, avg in safe_zip(var_list, avg_params) ] with tf.control_dependencies(avg_to_param): tmp_to_avg = [ tf.assign(avg, tmp) for avg, tmp in safe_zip(avg_params, tmp_params) ] swap = tmp_to_avg batch_size = args.batch_size assert batch_size % num_devices == 0 device_batch_size = batch_size // num_devices if init_all: sess.run(tf.global_variables_initializer()) else: initialize_uninitialized_global_variables(sess) for epoch in xrange(args.nb_epochs): if dataset_train is not None: nb_batches = int(math.ceil(float(dataset_size) / batch_size)) else: # Indices to shuffle training set index_shuf = list(range(len(x_train))) # Randomly repeat a few training examples each epoch to avoid # having a too-small batch while len(index_shuf) % batch_size != 0: index_shuf.append(rng.randint(len(x_train))) nb_batches = len(index_shuf) // batch_size rng.shuffle(index_shuf) # Shuffling here versus inside the loop doesn't seem to affect # timing very much, but shuffling here makes the code slightly # easier to read x_train_shuffled = x_train[index_shuf] y_train_shuffled = y_train[index_shuf] prev = time.time() for batch in range(nb_batches): if dataset_train is not None: x_train_shuffled, y_train_shuffled = sess.run(data_iterator) start, end = 0, batch_size else: # Compute batch start and end indices start = batch * batch_size end = (batch + 1) * batch_size # Perform one training step diff = end - start assert diff == batch_size feed_dict = {epoch_tf: epoch, batch_tf: batch} for dev_idx in xrange(num_devices): cur_start = start + dev_idx * device_batch_size cur_end = start + (dev_idx + 1) * device_batch_size feed_dict[xs[dev_idx]] = x_train_shuffled[cur_start:cur_end] feed_dict[ys[dev_idx]] = y_train_shuffled[cur_start:cur_end] if cur_end != end and dataset_train is None: msg = ( "batch_size (%d) must be a multiple of num_devices " "(%d).\nCUDA_VISIBLE_DEVICES: %s" "\ndevices: %s" ) args = ( batch_size, num_devices, os.environ["CUDA_VISIBLE_DEVICES"], str(devices), ) raise ValueError(msg % args) if feed is not None: feed_dict.update(feed) _, loss_numpy = sess.run([train_step, loss_value], feed_dict=feed_dict) if np.abs(loss_numpy) > loss_threshold: raise ValueError("Extreme loss during training: ", loss_numpy) if np.isnan(loss_numpy) or np.isinf(loss_numpy): raise ValueError("NaN/Inf loss during training") assert dataset_train is not None or end == len( index_shuf ) # Check that all examples were used cur = time.time() _logger.info("Epoch " + str(epoch) + " took " + str(cur - prev) + " seconds") if evaluate is not None: if use_ema: # Before running evaluation, load the running average # parameters into the live slot, so we can see how well # the EMA parameters are performing sess.run(swap) evaluate() if use_ema: # Swap the parameters back, so that we continue training # on the live parameters sess.run(swap) if use_ema: # When training is done, swap the running average parameters into # the live slot, so that we use them when we deploy the model sess.run(swap) return True def avg_grads(tower_grads): """Calculate the average gradient for each shared variable across all towers. Note that this function provides a synchronization point across all towers. Args: tower_grads: List of lists of (gradient, variable) tuples. The outer list is over individual gradients. The inner list is over the gradient calculation for each tower. Returns: List of pairs of (gradient, variable) where the gradient has been averaged across all towers. Modified from this tutorial: https://tinyurl.com/n3jr2vm """ if len(tower_grads) == 1: return tower_grads[0] average_grads = [] for grad_and_vars in zip(*tower_grads): # Note that each grad_and_vars looks like the following: # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) grads = [g for g, _ in grad_and_vars] # Average over the 'tower' dimension. grad = tf.add_n(grads) / len(grads) # Keep in mind that the Variables are redundant because they are shared # across towers. So .. we will just return the first tower's pointer to # the Variable. v = grad_and_vars[0][1] assert all(v is grad_and_var[1] for grad_and_var in grad_and_vars) grad_and_var = (grad, v) average_grads.append(grad_and_var) return average_grads ================================================ FILE: cleverhans_v3.1.0/cleverhans/utils.py ================================================ """ Generic utility functions useful for writing Python code in general """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from collections import OrderedDict import warnings import logging import os import re import subprocess import numpy as np from six.moves import xrange known_number_types = ( int, float, np.float16, np.float32, np.float64, np.int8, np.int16, np.int32, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64, ) CLEVERHANS_ROOT = os.path.dirname(os.path.dirname(__file__)) class _ArgsWrapper(object): """ Wrapper that allows attribute access to dictionaries """ def __init__(self, args): if not isinstance(args, dict): args = vars(args) self.args = args def __getattr__(self, name): return self.args.get(name) class AccuracyReport(object): """ An object summarizing the accuracy results for experiments involving training on clean examples or adversarial examples, then evaluating on clean or adversarial examples. """ def __init__(self): self.clean_train_clean_eval = 0.0 self.clean_train_adv_eval = 0.0 self.adv_train_clean_eval = 0.0 self.adv_train_adv_eval = 0.0 # Training data accuracy results to be used by tutorials self.train_clean_train_clean_eval = 0.0 self.train_clean_train_adv_eval = 0.0 self.train_adv_train_clean_eval = 0.0 self.train_adv_train_adv_eval = 0.0 def batch_indices(batch_nb, data_length, batch_size): """ This helper function computes a batch start and end index :param batch_nb: the batch number :param data_length: the total length of the data being parsed by batches :param batch_size: the number of inputs in each batch :return: pair of (start, end) indices """ # Batch start and end index start = int(batch_nb * batch_size) end = int((batch_nb + 1) * batch_size) # When there are not enough inputs left, we reuse some to complete the # batch if end > data_length: shift = end - data_length start -= shift end -= shift return start, end def other_classes(nb_classes, class_ind): """ Returns a list of class indices excluding the class indexed by class_ind :param nb_classes: number of classes in the task :param class_ind: the class index to be omitted :return: list of class indices excluding the class indexed by class_ind """ if class_ind < 0 or class_ind >= nb_classes: error_str = "class_ind must be within the range (0, nb_classes - 1)" raise ValueError(error_str) other_classes_list = list(range(nb_classes)) other_classes_list.remove(class_ind) return other_classes_list def to_categorical(y, nb_classes, num_classes=None): """ Converts a class vector (integers) to binary class matrix. This is adapted from the Keras function with the same name. :param y: class vector to be converted into a matrix (integers from 0 to nb_classes). :param nb_classes: nb_classes: total number of classes. :param num_classses: depricated version of nb_classes :return: A binary matrix representation of the input. """ if num_classes is not None: if nb_classes is not None: raise ValueError( "Should not specify both nb_classes and its deprecated " "alias, num_classes" ) warnings.warn( "`num_classes` is deprecated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23." ) nb_classes = num_classes del num_classes y = np.array(y, dtype="int").ravel() n = y.shape[0] categorical = np.zeros((n, nb_classes)) categorical[np.arange(n), y] = 1 return categorical def random_targets(gt, nb_classes): """ Take in an array of correct labels and randomly select a different label for each label in the array. This is typically used to randomly select a target class in targeted adversarial examples attacks (i.e., when the search algorithm takes in both a source class and target class to compute the adversarial example). :param gt: the ground truth (correct) labels. They can be provided as a 1D vector or 2D array of one-hot encoded labels. :param nb_classes: The number of classes for this task. The random class will be chosen between 0 and nb_classes such that it is different from the correct class. :return: A numpy array holding the randomly-selected target classes encoded as one-hot labels. """ # If the ground truth labels are encoded as one-hot, convert to labels. if len(gt.shape) == 2: gt = np.argmax(gt, axis=1) # This vector will hold the randomly selected labels. result = np.zeros(gt.shape, dtype=np.int32) for class_ind in xrange(nb_classes): # Compute all indices in that class. in_cl = gt == class_ind size = np.sum(in_cl) # Compute the set of potential targets for this class. potential_targets = other_classes(nb_classes, class_ind) # Draw with replacement random targets among the potential targets. result[in_cl] = np.random.choice(potential_targets, size=size) # Encode vector of random labels as one-hot labels. result = to_categorical(result, nb_classes) result = result.astype(np.int32) return result def pair_visual(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`pair_visual` has moved to `cleverhans.plot.pyplot_image`. " "cleverhans.utils.pair_visual may be removed on or after " "2019-04-24." ) from cleverhans.plot.pyplot_image import pair_visual as new_pair_visual return new_pair_visual(*args, **kwargs) def grid_visual(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`grid_visual` has moved to `cleverhans.plot.pyplot_image`. " "cleverhans.utils.grid_visual may be removed on or after " "2019-04-24." ) from cleverhans.plot.pyplot_image import grid_visual as new_grid_visual return new_grid_visual(*args, **kwargs) def get_logits_over_interval(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`get_logits_over_interval` has moved to " "`cleverhans.plot.pyplot_image`. " "cleverhans.utils.get_logits_over_interval may be removed on " "or after 2019-04-24." ) # pylint:disable=line-too-long from cleverhans.plot.pyplot_image import ( get_logits_over_interval as new_get_logits_over_interval, ) return new_get_logits_over_interval(*args, **kwargs) def linear_extrapolation_plot(*args, **kwargs): """Deprecation wrapper""" warnings.warn( "`linear_extrapolation_plot` has moved to " "`cleverhans.plot.pyplot_image`. " "cleverhans.utils.linear_extrapolation_plot may be removed on " "or after 2019-04-24." ) # pylint:disable=line-too-long from cleverhans.plot.pyplot_image import ( linear_extrapolation_plot as new_linear_extrapolation_plot, ) return new_linear_extrapolation_plot(*args, **kwargs) def set_log_level(level, name="cleverhans"): """ Sets the threshold for the cleverhans logger to level :param level: the logger threshold. You can find values here: https://docs.python.org/2/library/logging.html#levels :param name: the name used for the cleverhans logger """ logging.getLogger(name).setLevel(level) def get_log_level(name="cleverhans"): """ Gets the current threshold for the cleverhans logger :param name: the name used for the cleverhans logger """ return logging.getLogger(name).getEffectiveLevel() class TemporaryLogLevel(object): """ A ContextManager that changes a log level temporarily. Note that the log level will be set back to its original value when the context manager exits, even if the log level has been changed again in the meantime. """ def __init__(self, level, name): self.name = name self.level = level def __enter__(self): self.old_level = get_log_level(self.name) set_log_level(self.level, self.name) def __exit__(self, type, value, traceback): set_log_level(self.old_level, self.name) return True def create_logger(name): """ Create a logger object with the given name. If this is the first time that we call this method, then initialize the formatter. """ base = logging.getLogger("cleverhans") if len(base.handlers) == 0: ch = logging.StreamHandler() formatter = logging.Formatter( "[%(levelname)s %(asctime)s %(name)s] " + "%(message)s" ) ch.setFormatter(formatter) base.addHandler(ch) return base def deterministic_dict(normal_dict): """ Returns a version of `normal_dict` whose iteration order is always the same """ out = OrderedDict() for key in sorted(normal_dict.keys()): out[key] = normal_dict[key] return out def ordered_union(l1, l2): """ Return the union of l1 and l2, with a deterministic ordering. (Union of python sets does not necessarily have a consisten iteration order) :param l1: list of items :param l2: list of items :returns: list containing one copy of each item that is in l1 or in l2 """ out = [] for e in l1 + l2: if e not in out: out.append(e) return out def safe_zip(*args): """like zip but with these properties: - returns a list, rather than an iterator. This is the old Python2 zip behavior. - a guarantee that all arguments are the same length. (normal zip silently drops entries to make them the same length) """ length = len(args[0]) if not all(len(arg) == length for arg in args): raise ValueError( "Lengths of arguments do not match: " + str([len(arg) for arg in args]) ) return list(zip(*args)) def shell_call(command, **kwargs): """Calls shell command with argument substitution. Args: command: command represented as a list. Each element of the list is one token of the command. For example "cp a b" becomes ['cp', 'a', 'b'] If any element of the list looks like '${NAME}' then it will be replaced by value from **kwargs with key 'NAME'. **kwargs: dictionary with argument substitution Returns: output of the command Raises: subprocess.CalledProcessError if command return value is not zero This function is useful when you need to do variable substitution prior running the command. Below are few examples of how it works: shell_call(['cp', 'a', 'b'], a='asd') calls command 'cp a b' shell_call(['cp', '${a}', 'b'], a='asd') calls command 'cp asd b', '${a}; was replaced with 'asd' before calling the command """ # Regular expression to find instances of '${NAME}' in a string CMD_VARIABLE_RE = re.compile("^\\$\\{(\\w+)\\}$") command = list(command) for i in range(len(command)): m = CMD_VARIABLE_RE.match(command[i]) if m: var_id = m.group(1) if var_id in kwargs: command[i] = kwargs[var_id] str_command = " ".join(command) logging.debug("Executing shell command: %s" % str_command) return subprocess.check_output(command) def deep_copy(numpy_dict): """ Returns a copy of a dictionary whose values are numpy arrays. Copies their values rather than copying references to them. """ out = {} for key in numpy_dict: out[key] = numpy_dict[key].copy() return out ================================================ FILE: cleverhans_v3.1.0/cleverhans/utils_keras.py ================================================ """ Model construction utilities based on keras """ from distutils.version import LooseVersion import warnings import tensorflow as tf from .model import Model, NoSuchLayerError # Assignment rather than import because direct import from within Keras # doesn't work in tf 1.8 Sequential = tf.keras.models.Sequential Conv2D = tf.keras.layers.Conv2D Dense = tf.keras.layers.Dense Activation = tf.keras.layers.Activation Flatten = tf.keras.layers.Flatten KerasModel = tf.keras.models.Model def conv_2d(filters, kernel_shape, strides, padding, input_shape=None): """ Defines the right convolutional layer according to the version of Keras that is installed. :param filters: (required integer) the dimensionality of the output space (i.e. the number output of filters in the convolution) :param kernel_shape: (required tuple or list of 2 integers) specifies the kernel shape of the convolution :param strides: (required tuple or list of 2 integers) specifies the strides of the convolution along the width and height. :param padding: (required string) can be either 'valid' (no padding around input or feature map) or 'same' (pad to ensure that the output feature map size is identical to the layer input) :param input_shape: (optional) give input shape if this is the first layer of the model :return: the Keras layer """ if input_shape is not None: return Conv2D( filters=filters, kernel_size=kernel_shape, strides=strides, padding=padding, input_shape=input_shape, ) else: return Conv2D( filters=filters, kernel_size=kernel_shape, strides=strides, padding=padding ) def cnn_model( logits=False, input_ph=None, img_rows=28, img_cols=28, channels=1, nb_filters=64, nb_classes=10, ): """ Defines a CNN model using Keras sequential model :param logits: If set to False, returns a Keras model, otherwise will also return logits tensor :param input_ph: The TensorFlow tensor for the input (needed if returning logits) ("ph" stands for placeholder but it need not actually be a placeholder) :param img_rows: number of row in the image :param img_cols: number of columns in the image :param channels: number of color channels (e.g., 1 for MNIST) :param nb_filters: number of convolutional filters per layer :param nb_classes: the number of output classes :return: """ model = Sequential() # Define the layers successively (convolution layers are version dependent) if tf.keras.backend.image_data_format() == "channels_first": input_shape = (channels, img_rows, img_cols) else: assert tf.keras.backend.image_data_format() == "channels_last" input_shape = (img_rows, img_cols, channels) layers = [ conv_2d(nb_filters, (8, 8), (2, 2), "same", input_shape=input_shape), Activation("relu"), conv_2d((nb_filters * 2), (6, 6), (2, 2), "valid"), Activation("relu"), conv_2d((nb_filters * 2), (5, 5), (1, 1), "valid"), Activation("relu"), Flatten(), Dense(nb_classes), ] for layer in layers: model.add(layer) if logits: logits_tensor = model(input_ph) model.add(Activation("softmax")) if logits: return model, logits_tensor else: return model class KerasModelWrapper(Model): """ An implementation of `Model` that wraps a Keras model. It specifically exposes the hidden features of a model by creating new models. The symbolic graph is reused and so there is little overhead. Splitting in-place operations can incur an overhead. """ def __init__(self, model): """ Create a wrapper for a Keras model :param model: A Keras model """ super(KerasModelWrapper, self).__init__(None, None, {}) if model is None: raise ValueError("model argument must be supplied.") self.model = model self.keras_model = None def _get_softmax_name(self): """ Looks for the name of the softmax layer. :return: Softmax layer name """ for layer in self.model.layers: cfg = layer.get_config() if "activation" in cfg and cfg["activation"] == "softmax": return layer.name raise Exception("No softmax layers found") def _get_abstract_layer_name(self): """ Looks for the name of abstracted layer. Usually these layers appears when model is stacked. :return: List of abstracted layers """ abstract_layers = [] for layer in self.model.layers: if "layers" in layer.get_config(): abstract_layers.append(layer.name) return abstract_layers def _get_logits_name(self): """ Looks for the name of the layer producing the logits. :return: name of layer producing the logits """ softmax_name = self._get_softmax_name() softmax_layer = self.model.get_layer(softmax_name) if not isinstance(softmax_layer, Activation): # In this case, the activation is part of another layer return softmax_name if not hasattr(softmax_layer, "_inbound_nodes"): raise RuntimeError("Please update keras to version >= 2.1.3") node = softmax_layer._inbound_nodes[0] if LooseVersion(tf.__version__) < LooseVersion("1.14.0"): logits_name = node.inbound_layers[0].name else: logits_name = node.inbound_layers.name return logits_name def get_logits(self, x): """ :param x: A symbolic representation of the network input. :return: A symbolic representation of the logits """ logits_name = self._get_logits_name() logits_layer = self.get_layer(x, logits_name) # Need to deal with the case where softmax is part of the # logits layer if logits_name == self._get_softmax_name(): softmax_logit_layer = self.get_layer(x, logits_name) # The final op is the softmax. Return its input logits_layer = softmax_logit_layer._op.inputs[0] return logits_layer def get_probs(self, x): """ :param x: A symbolic representation of the network input. :return: A symbolic representation of the probs """ name = self._get_softmax_name() return self.get_layer(x, name) def get_layer_names(self): """ :return: Names of all the layers kept by Keras """ layer_names = [x.name for x in self.model.layers] return layer_names def fprop(self, x): """ Exposes all the layers of the model returned by get_layer_names. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic representation of their output. """ if self.keras_model is None: # Get the input layer new_input = self.model.get_input_at(0) # Make a new model that returns each of the layers as output abstract_layers = self._get_abstract_layer_name() if abstract_layers: warnings.warn( "Abstract layer detected, picking last ouput node as default." "This could happen due to using of stacked model." ) layer_outputs = [] # For those abstract model layers, return their last output node as # default. for x_layer in self.model.layers: if x_layer.name not in abstract_layers: layer_outputs.append(x_layer.output) else: layer_outputs.append(x_layer.get_output_at(-1)) self.keras_model = KerasModel(new_input, layer_outputs) # and get the outputs for that model on the input x outputs = self.keras_model(x) # Keras only returns a list for outputs of length >= 1, if the model # is only one layer, wrap a list if len(self.model.layers) == 1: outputs = [outputs] # compute the dict to return fprop_dict = dict(zip(self.get_layer_names(), outputs)) return fprop_dict def get_layer(self, x, layer): """ Expose the hidden features of a model given a layer name. :param x: A symbolic representation of the network input :param layer: The name of the hidden layer to return features at. :return: A symbolic representation of the hidden features :raise: NoSuchLayerError if `layer` is not in the model. """ # Return the symbolic representation for this layer. output = self.fprop(x) try: requested = output[layer] except KeyError: raise NoSuchLayerError() return requested ================================================ FILE: cleverhans_v3.1.0/cleverhans/utils_mnist.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import os import tempfile import warnings from cleverhans import dataset utils_mnist_warning = ( "cleverhans.utils_mnist is deprecrated and will be " "removed on or after 2019-03-26. Switch to " "cleverhans.dataset instead." ) def maybe_download_mnist_file(file_name, datadir=None, force=False): warnings.warn(utils_mnist_warning) url = os.path.join('https://storage.googleapis.com/cvdf-datasets/mnist/', file_name) return dataset.maybe_download_file(url, datadir=None, force=False) def download_and_parse_mnist_file(file_name, datadir=None, force=False): warnings.warn(utils_mnist_warning) return dataset.download_and_parse_mnist_file(file_name, datadir=None, force=False) def data_mnist( datadir=tempfile.gettempdir(), train_start=0, train_end=60000, test_start=0, test_end=10000, ): warnings.warn(utils_mnist_warning) mnist = dataset.MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, center=False, ) return mnist.get_set("train") + mnist.get_set("test") ================================================ FILE: cleverhans_v3.1.0/cleverhans/utils_pytorch.py ================================================ """Basic utilities for pytorch code""" import warnings from random import getrandbits import numpy as np import tensorflow as tf import torch from torch.autograd import Variable # https://gist.github.com/kingspp/3ec7d9958c13b94310c1a365759aa3f4 # Pyfunc Gradient Function def _py_func_with_gradient(func, inp, Tout, stateful=True, name=None, grad_func=None): """ PyFunc defined as given by Tensorflow :param func: Custom Function :param inp: Function Inputs :param Tout: Ouput Type of out Custom Function :param stateful: Calculate Gradients when stateful is True :param name: Name of the PyFunction :param grad: Custom Gradient Function :return: """ # Generate random name in order to avoid conflicts with inbuilt names rnd_name = "PyFuncGrad-" + "%0x" % getrandbits(30 * 4) # Register Tensorflow Gradient tf.RegisterGradient(rnd_name)(grad_func) # Get current graph g = tf.get_default_graph() # Add gradient override map with g.gradient_override_map({"PyFunc": rnd_name, "PyFuncStateless": rnd_name}): return tf.py_func(func, inp, Tout, stateful=stateful, name=name) def convert_pytorch_model_to_tf(model, out_dims=None): """ Convert a pytorch model into a tensorflow op that allows backprop :param model: A pytorch nn.Module object :param out_dims: The number of output dimensions (classes) for the model :return: A model function that maps an input (tf.Tensor) to the output of the model (tf.Tensor) """ warnings.warn( "convert_pytorch_model_to_tf is deprecated, switch to" + " dedicated PyTorch support provided by CleverHans v4." ) torch_state = { "logits": None, "x": None, } if not out_dims: out_dims = list(model.modules())[-1].out_features def _fprop_fn(x_np): """TODO: write this""" x_tensor = torch.Tensor(x_np) if torch.cuda.is_available(): x_tensor = x_tensor.cuda() torch_state["x"] = Variable(x_tensor, requires_grad=True) torch_state["logits"] = model(torch_state["x"]) return torch_state["logits"].data.cpu().numpy() def _bprop_fn(x_np, grads_in_np): """TODO: write this""" _fprop_fn(x_np) grads_in_tensor = torch.Tensor(grads_in_np) if torch.cuda.is_available(): grads_in_tensor = grads_in_tensor.cuda() # Run our backprop through our logits to our xs loss = torch.sum(torch_state["logits"] * grads_in_tensor) loss.backward() return torch_state["x"].grad.cpu().data.numpy() def _tf_gradient_fn(op, grads_in): """TODO: write this""" return tf.py_func(_bprop_fn, [op.inputs[0], grads_in], Tout=[tf.float32]) def tf_model_fn(x_op): """TODO: write this""" out = _py_func_with_gradient( _fprop_fn, [x_op], Tout=[tf.float32], stateful=True, grad_func=_tf_gradient_fn, )[0] out.set_shape([None, out_dims]) return out return tf_model_fn ================================================ FILE: cleverhans_v3.1.0/cleverhans/utils_tf.py ================================================ """Utility functions for writing TensorFlow code""" from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import math import os import time import warnings import numpy as np import six from six.moves import xrange import tensorflow as tf from cleverhans.compat import device_lib from cleverhans.compat import reduce_sum, reduce_mean from cleverhans.compat import reduce_max from cleverhans.compat import softmax_cross_entropy_with_logits from cleverhans.utils import batch_indices, _ArgsWrapper, create_logger _logger = create_logger("cleverhans.utils.tf") _logger.setLevel(logging.INFO) def model_loss(y, model, mean=True): """ Define loss of TF graph :param y: correct labels :param model: output of the model :param mean: boolean indicating whether should return mean of loss or vector of losses for each input of the batch :return: return mean of loss if True, otherwise return vector with per sample loss """ warnings.warn( "This function is deprecated and will be removed on or after" " 2019-04-05. Switch to cleverhans.train.train." ) op = model.op if op.type == "Softmax": (logits,) = op.inputs else: logits = model out = softmax_cross_entropy_with_logits(logits=logits, labels=y) if mean: out = reduce_mean(out) return out def initialize_uninitialized_global_variables(sess): """ Only initializes the variables of a TensorFlow session that were not already initialized. :param sess: the TensorFlow session :return: """ # List all global variables global_vars = tf.global_variables() # Find initialized status for all variables is_var_init = [tf.is_variable_initialized(var) for var in global_vars] is_initialized = sess.run(is_var_init) # List all variables that were not initialized previously not_initialized_vars = [ var for (var, init) in zip(global_vars, is_initialized) if not init ] # Initialize all uninitialized variables found, if any if len(not_initialized_vars): sess.run(tf.variables_initializer(not_initialized_vars)) def train( sess, loss, x, y, X_train, Y_train, save=False, init_all=False, evaluate=None, feed=None, args=None, rng=None, var_list=None, fprop_args=None, optimizer=None, ): """ Train a TF graph. This function is deprecated. Prefer cleverhans.train.train when possible. cleverhans.train.train supports multiple GPUs but this function is still needed to support legacy models that do not support calling fprop more than once. :param sess: TF session to use when training the graph :param loss: tensor, the model training loss. :param x: input placeholder :param y: output placeholder (for labels) :param X_train: numpy array with training inputs :param Y_train: numpy array with training outputs :param save: boolean controlling the save operation :param init_all: (boolean) If set to true, all TF variables in the session are (re)initialized, otherwise only previously uninitialized variables are initialized before training. :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Should contain `nb_epochs`, `learning_rate`, `batch_size` If save is True, should also contain 'train_dir' and 'filename' :param rng: Instance of numpy.random.RandomState :param var_list: Optional list of parameters to train. :param fprop_args: dict, extra arguments to pass to fprop (loss and model). :param optimizer: Optimizer to be used for training :return: True if model trained """ warnings.warn( "This function is deprecated and will be removed on or after" " 2019-04-05. Switch to cleverhans.train.train." ) args = _ArgsWrapper(args or {}) fprop_args = fprop_args or {} # Check that necessary arguments were given (see doc above) assert args.nb_epochs, "Number of epochs was not given in args dict" if optimizer is None: assert args.learning_rate is not None, ( "Learning rate was not given " "in args dict" ) assert args.batch_size, "Batch size was not given in args dict" if save: assert args.train_dir, "Directory for save was not given in args dict" assert args.filename, "Filename for save was not given in args dict" if rng is None: rng = np.random.RandomState() # Define optimizer loss_value = loss.fprop(x, y, **fprop_args) if optimizer is None: optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate) else: if not isinstance(optimizer, tf.train.Optimizer): raise ValueError( "optimizer object must be from a child class of " "tf.train.Optimizer" ) # Trigger update operations within the default graph (such as batch_norm). with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)): train_step = optimizer.minimize(loss_value, var_list=var_list) with sess.as_default(): if hasattr(tf, "global_variables_initializer"): if init_all: tf.global_variables_initializer().run() else: initialize_uninitialized_global_variables(sess) else: warnings.warn( "Update your copy of tensorflow; future versions of " "CleverHans may drop support for this version." ) sess.run(tf.initialize_all_variables()) for epoch in xrange(args.nb_epochs): # Compute number of batches nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_train) # Indices to shuffle training set index_shuf = list(range(len(X_train))) rng.shuffle(index_shuf) prev = time.time() for batch in range(nb_batches): # Compute batch start and end indices start, end = batch_indices(batch, len(X_train), args.batch_size) # Perform one training step feed_dict = { x: X_train[index_shuf[start:end]], y: Y_train[index_shuf[start:end]], } if feed is not None: feed_dict.update(feed) train_step.run(feed_dict=feed_dict) assert end >= len(X_train) # Check that all examples were used cur = time.time() _logger.info( "Epoch " + str(epoch) + " took " + str(cur - prev) + " seconds" ) if evaluate is not None: evaluate() if save: save_path = os.path.join(args.train_dir, args.filename) saver = tf.train.Saver() saver.save(sess, save_path) _logger.info("Completed model training and saved at: " + str(save_path)) else: _logger.info("Completed model training.") return True def model_eval(sess, x, y, predictions, X_test=None, Y_test=None, feed=None, args=None): """ Compute the accuracy of a TF model on some data :param sess: TF session to use :param x: input placeholder :param y: output placeholder (for labels) :param predictions: model output predictions :param X_test: numpy array with training inputs :param Y_test: numpy array with training outputs :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Should contain `batch_size` :return: a float with the accuracy value """ global _model_eval_cache args = _ArgsWrapper(args or {}) assert args.batch_size, "Batch size was not given in args dict" if X_test is None or Y_test is None: raise ValueError("X_test argument and Y_test argument " "must be supplied.") # Define accuracy symbolically key = (y, predictions) if key in _model_eval_cache: correct_preds = _model_eval_cache[key] else: correct_preds = tf.equal(tf.argmax(y, axis=-1), tf.argmax(predictions, axis=-1)) _model_eval_cache[key] = correct_preds # Init result var accuracy = 0.0 with sess.as_default(): # Compute number of batches nb_batches = int(math.ceil(float(len(X_test)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_test) X_cur = np.zeros((args.batch_size,) + X_test.shape[1:], dtype=X_test.dtype) Y_cur = np.zeros((args.batch_size,) + Y_test.shape[1:], dtype=Y_test.dtype) for batch in range(nb_batches): if batch % 100 == 0 and batch > 0: _logger.debug("Batch " + str(batch)) # Must not use the `batch_indices` function here, because it # repeats some examples. # It's acceptable to repeat during training, but not eval. start = batch * args.batch_size end = min(len(X_test), start + args.batch_size) # The last batch may be smaller than all others. This should not # affect the accuarcy disproportionately. cur_batch_size = end - start X_cur[:cur_batch_size] = X_test[start:end] Y_cur[:cur_batch_size] = Y_test[start:end] feed_dict = {x: X_cur, y: Y_cur} if feed is not None: feed_dict.update(feed) cur_corr_preds = correct_preds.eval(feed_dict=feed_dict) accuracy += cur_corr_preds[:cur_batch_size].sum() assert end >= len(X_test) # Divide by number of examples to get final value accuracy /= len(X_test) return accuracy _model_eval_cache = {} def tf_model_load(sess, file_path=None): """ :param sess: the session object to restore :param file_path: path to the restored session, if None is taken from FLAGS.train_dir and FLAGS.filename :return: """ with sess.as_default(): saver = tf.train.Saver() if file_path is None: error = "file_path argument is missing." raise ValueError(error) saver.restore(sess, file_path) return True def batch_eval(*args, **kwargs): """ Wrapper around deprecated function. """ # Inside function to avoid circular import from cleverhans.evaluation import batch_eval as new_batch_eval warnings.warn( "batch_eval has moved to cleverhans.evaluation. " "batch_eval will be removed from utils_tf on or after " "2019-03-09." ) return new_batch_eval(*args, **kwargs) def model_argmax(sess, x, predictions, samples, feed=None): """ Helper function that computes the current class prediction :param sess: TF session :param x: the input placeholder :param predictions: the model's symbolic output :param samples: numpy array with input samples (dims must match x) :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :return: the argmax output of predictions, i.e. the current predicted class """ feed_dict = {x: samples} if feed is not None: feed_dict.update(feed) probabilities = sess.run(predictions, feed_dict) if samples.shape[0] == 1: return np.argmax(probabilities) else: return np.argmax(probabilities, axis=1) def l2_batch_normalize(x, epsilon=1e-12, scope=None): """ Helper function to normalize a batch of vectors. :param x: the input placeholder :param epsilon: stabilizes division :return: the batch of l2 normalized vector """ with tf.name_scope(scope, "l2_batch_normalize") as name_scope: x_shape = tf.shape(x) x = tf.contrib.layers.flatten(x) x /= epsilon + reduce_max(tf.abs(x), 1, keepdims=True) square_sum = reduce_sum(tf.square(x), 1, keepdims=True) x_inv_norm = tf.rsqrt(np.sqrt(epsilon) + square_sum) x_norm = tf.multiply(x, x_inv_norm) return tf.reshape(x_norm, x_shape, name_scope) def kl_with_logits( p_logits, q_logits, scope=None, loss_collection=tf.GraphKeys.REGULARIZATION_LOSSES ): """Helper function to compute kl-divergence KL(p || q)""" with tf.name_scope(scope, "kl_divergence") as name: p = tf.nn.softmax(p_logits) p_log = tf.nn.log_softmax(p_logits) q_log = tf.nn.log_softmax(q_logits) loss = reduce_mean(reduce_sum(p * (p_log - q_log), axis=1), name=name) tf.losses.add_loss(loss, loss_collection) return loss def clip_eta(eta, ord, eps): """ Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, bound of the perturbation. """ # Clipping perturbation eta to self.ord norm ball if ord not in [np.inf, 1, 2]: raise ValueError("ord must be np.inf, 1, or 2.") reduc_ind = list(xrange(1, len(eta.get_shape()))) avoid_zero_div = 1e-12 if ord == np.inf: eta = clip_by_value(eta, -eps, eps) elif ord == 1: # Implements a projection algorithm onto the l1-ball from # (Duchi et al. 2008) that runs in time O(d*log(d)) where d is the # input dimension. # Paper link (Duchi et al. 2008): https://dl.acm.org/citation.cfm?id=1390191 eps = tf.cast(eps, eta.dtype) dim = tf.reduce_prod(tf.shape(eta)[1:]) eta_flat = tf.reshape(eta, (-1, dim)) abs_eta = tf.abs(eta_flat) if "sort" in dir(tf): mu = -tf.sort(-abs_eta, axis=-1) else: # `tf.sort` is only available in TF 1.13 onwards mu = tf.nn.top_k(abs_eta, k=dim, sorted=True)[0] cumsums = tf.cumsum(mu, axis=-1) js = tf.cast(tf.divide(1, tf.range(1, dim + 1)), eta.dtype) t = tf.cast(tf.greater(mu - js * (cumsums - eps), 0), eta.dtype) rho = tf.argmax(t * cumsums, axis=-1) rho_val = tf.reduce_max(t * cumsums, axis=-1) theta = tf.divide(rho_val - eps, tf.cast(1 + rho, eta.dtype)) eta_sgn = tf.sign(eta_flat) eta_proj = eta_sgn * tf.maximum(abs_eta - theta[:, tf.newaxis], 0) eta_proj = tf.reshape(eta_proj, tf.shape(eta)) norm = tf.reduce_sum(tf.abs(eta), reduc_ind) eta = tf.where(tf.greater(norm, eps), eta_proj, eta) elif ord == 2: # avoid_zero_div must go inside sqrt to avoid a divide by zero # in the gradient through this operation norm = tf.sqrt( tf.maximum( avoid_zero_div, reduce_sum(tf.square(eta), reduc_ind, keepdims=True) ) ) # We must *clip* to within the norm ball, not *normalize* onto the # surface of the ball factor = tf.minimum(1.0, div(eps, norm)) eta = eta * factor return eta def zero_out_clipped_grads(grad, x, clip_min, clip_max): """ Helper function to erase entries in the gradient where the update would be clipped. :param grad: The gradient :param x: The current input :param clip_min: Minimum input component value :param clip_max: Maximum input component value """ signed_grad = tf.sign(grad) # Find input components that lie at the boundary of the input range, and # where the gradient points in the wrong direction. clip_low = tf.logical_and( tf.less_equal(x, tf.cast(clip_min, x.dtype)), tf.less(signed_grad, 0) ) clip_high = tf.logical_and( tf.greater_equal(x, tf.cast(clip_max, x.dtype)), tf.greater(signed_grad, 0) ) clip = tf.logical_or(clip_low, clip_high) grad = tf.where(clip, mul(grad, 0), grad) return grad def random_exponential(shape, rate=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the exponential distribution, which is not included in core TensorFlow. :shape: shape of the sampled tensor. :rate: (optional) rate parameter of the exponential distribution, defaults to 1.0. :dtype: (optional) data type of the sempled tensor, defaults to tf.float32. :seed: (optional) custom seed to be used for sampling. """ return tf.random_gamma(shape, alpha=1, beta=1.0 / rate, dtype=dtype, seed=seed) def random_laplace(shape, loc=0.0, scale=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the Laplace distribution, which is not included in core TensorFlow. :shape: shape of the sampled tensor. :loc: (optional) mean of the laplace distribution, defaults to 0.0. :scale: (optional) scale parameter of the laplace diustribution, defaults to 1.0. :dtype: (optional) data type of the sempled tensor, defaults to tf.float32. :seed: (optional) custom seed to be used for sampling. """ z1 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed) z2 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed) return z1 - z2 + loc def random_lp_vector(shape, ord, eps, dtype=tf.float32, seed=None): """ Helper function to generate uniformly random vectors from a norm ball of radius epsilon. :param shape: Output shape of the random sample. The shape is expected to be of the form `(n, d1, d2, ..., dn)` where `n` is the number of i.i.d. samples that will be drawn from a norm ball of dimension `d1*d1*...*dn`. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, radius of the norm ball. """ if ord not in [np.inf, 1, 2]: raise ValueError("ord must be np.inf, 1, or 2.") if ord == np.inf: r = tf.random_uniform(shape, -eps, eps, dtype=dtype, seed=seed) else: # For ord=1 and ord=2, we use the generic technique from # (Calafiore et al. 1998) to sample uniformly from a norm ball. # Paper link (Calafiore et al. 1998): # https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&tag=1 # We first sample from the surface of the norm ball, and then scale by # a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable # and `d` is the dimension of the ball. In high dimensions, this is roughly # equivalent to sampling from the surface of the ball. dim = tf.reduce_prod(shape[1:]) if ord == 1: x = random_laplace( (shape[0], dim), loc=1.0, scale=1.0, dtype=dtype, seed=seed ) norm = tf.reduce_sum(tf.abs(x), axis=-1, keepdims=True) elif ord == 2: x = tf.random_normal((shape[0], dim), dtype=dtype, seed=seed) norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=-1, keepdims=True)) else: raise ValueError("ord must be np.inf, 1, or 2.") w = tf.pow( tf.random.uniform((shape[0], 1), dtype=dtype, seed=seed), 1.0 / tf.cast(dim, dtype), ) r = eps * tf.reshape(w * x / norm, shape) return r def model_train( sess, x, y, predictions, X_train, Y_train, save=False, predictions_adv=None, init_all=True, evaluate=None, feed=None, args=None, rng=None, var_list=None, ): """ Train a TF graph :param sess: TF session to use when training the graph :param x: input placeholder :param y: output placeholder (for labels) :param predictions: model output predictions :param X_train: numpy array with training inputs :param Y_train: numpy array with training outputs :param save: boolean controlling the save operation :param predictions_adv: if set with the adversarial example tensor, will run adversarial training :param init_all: (boolean) If set to true, all TF variables in the session are (re)initialized, otherwise only previously uninitialized variables are initialized before training. :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Should contain `nb_epochs`, `learning_rate`, `batch_size` If save is True, should also contain 'train_dir' and 'filename' :param rng: Instance of numpy.random.RandomState :param var_list: Optional list of parameters to train. :return: True if model trained """ warnings.warn( "This function is deprecated and will be removed on or after" " 2019-04-05. Switch to cleverhans.train.train." ) args = _ArgsWrapper(args or {}) # Check that necessary arguments were given (see doc above) assert args.nb_epochs, "Number of epochs was not given in args dict" assert args.learning_rate, "Learning rate was not given in args dict" assert args.batch_size, "Batch size was not given in args dict" if save: assert args.train_dir, "Directory for save was not given in args dict" assert args.filename, "Filename for save was not given in args dict" if rng is None: rng = np.random.RandomState() # Define loss loss = model_loss(y, predictions) if predictions_adv is not None: loss = (loss + model_loss(y, predictions_adv)) / 2 train_step = tf.train.AdamOptimizer(learning_rate=args.learning_rate) train_step = train_step.minimize(loss, var_list=var_list) with sess.as_default(): if hasattr(tf, "global_variables_initializer"): if init_all: tf.global_variables_initializer().run() else: initialize_uninitialized_global_variables(sess) else: warnings.warn( "Update your copy of tensorflow; future versions of " "CleverHans may drop support for this version." ) sess.run(tf.initialize_all_variables()) for epoch in xrange(args.nb_epochs): # Compute number of batches nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_train) # Indices to shuffle training set index_shuf = list(range(len(X_train))) rng.shuffle(index_shuf) prev = time.time() for batch in range(nb_batches): # Compute batch start and end indices start, end = batch_indices(batch, len(X_train), args.batch_size) # Perform one training step feed_dict = { x: X_train[index_shuf[start:end]], y: Y_train[index_shuf[start:end]], } if feed is not None: feed_dict.update(feed) train_step.run(feed_dict=feed_dict) assert end >= len(X_train) # Check that all examples were used cur = time.time() _logger.info( "Epoch " + str(epoch) + " took " + str(cur - prev) + " seconds" ) if evaluate is not None: evaluate() if save: save_path = os.path.join(args.train_dir, args.filename) saver = tf.train.Saver() saver.save(sess, save_path) _logger.info("Completed model training and saved at: " + str(save_path)) else: _logger.info("Completed model training.") return True def infer_devices(devices=None): """ Returns the list of devices that multi-replica code should use. :param devices: list of string device names, e.g. ["/GPU:0"] If the user specifies this, `infer_devices` checks that it is valid, and then uses this user-specified list. If the user does not specify this, infer_devices uses: - All available GPUs, if there are any - CPU otherwise """ if devices is None: devices = get_available_gpus() if len(devices) == 0: warnings.warn("No GPUS, running on CPU") # Set device to empy string, tf will figure out whether to use # XLA or not, etc., automatically devices = [""] else: assert len(devices) > 0 for device in devices: assert isinstance(device, six.string_types), type(device) return devices def get_available_gpus(): """ Returns a list of string names of all available GPUs """ local_device_protos = device_lib.list_local_devices() return [x.name for x in local_device_protos if x.device_type == "GPU"] def silence(): """ Silences tensorflaw's default printed messages """ os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" def clip_by_value(t, clip_value_min, clip_value_max, name=None): """ A wrapper for clip_by_value that casts the clipping range if needed. """ def cast_clip(clip): """ Cast clipping range argument if needed. """ if t.dtype in (tf.float32, tf.float64): if hasattr(clip, "dtype"): # Convert to tf dtype in case this is a numpy dtype clip_dtype = tf.as_dtype(clip.dtype) if clip_dtype != t.dtype: return tf.cast(clip, t.dtype) return clip clip_value_min = cast_clip(clip_value_min) clip_value_max = cast_clip(clip_value_max) return tf.clip_by_value(t, clip_value_min, clip_value_max, name) def mul(a, b): """ A wrapper around tf multiplication that does more automatic casting of the input. """ def multiply(a, b): """Multiplication""" return a * b return op_with_scalar_cast(a, b, multiply) def div(a, b): """ A wrapper around tf division that does more automatic casting of the input. """ def divide(a, b): """Division""" return a / b return op_with_scalar_cast(a, b, divide) def op_with_scalar_cast(a, b, f): """ Builds the graph to compute f(a, b). If only one of the two arguments is a scalar and the operation would cause a type error without casting, casts the scalar to match the tensor. :param a: a tf-compatible array or scalar :param b: a tf-compatible array or scalar """ try: return f(a, b) except (TypeError, ValueError): pass def is_scalar(x): """Return True if `x` is a scalar""" if hasattr(x, "get_shape"): shape = x.get_shape() return shape.ndims == 0 if hasattr(x, "ndim"): return x.ndim == 0 assert isinstance(x, (int, float)) return True a_scalar = is_scalar(a) b_scalar = is_scalar(b) if a_scalar and b_scalar: raise TypeError("Trying to apply " + str(f) + " with mixed types") if a_scalar and not b_scalar: a = tf.cast(a, b.dtype) if b_scalar and not a_scalar: b = tf.cast(b, a.dtype) return f(a, b) def assert_less_equal(*args, **kwargs): """ Wrapper for tf.assert_less_equal Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_less_equal(*args, **kwargs) def assert_greater_equal(*args, **kwargs): """ Wrapper for tf.assert_greater_equal. Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_greater_equal(*args, **kwargs) def assert_equal(*args, **kwargs): """ Wrapper for tf.assert_equal. Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_equal(*args, **kwargs) def jacobian_graph(predictions, x, nb_classes): """ Create the Jacobian graph to be ran later in a TF session :param predictions: the model's symbolic output (linear output, pre-softmax) :param x: the input placeholder :param nb_classes: the number of classes the model has :return: """ # This function will return a list of TF gradients list_derivatives = [] # Define the TF graph elements to compute our derivatives for each class for class_ind in xrange(nb_classes): (derivatives,) = tf.gradients(predictions[:, class_ind], x) list_derivatives.append(derivatives) return list_derivatives def jacobian_augmentation( sess, x, X_sub_prev, Y_sub, grads, lmbda, aug_batch_size=512, feed=None ): """ Augment an adversary's substitute training set using the Jacobian of a substitute model to generate new synthetic inputs. See https://arxiv.org/abs/1602.02697 for more details. See cleverhans_tutorials/mnist_blackbox.py for example use case :param sess: TF session in which the substitute model is defined :param x: input TF placeholder for the substitute model :param X_sub_prev: substitute training data available to the adversary at the previous iteration :param Y_sub: substitute training labels available to the adversary at the previous iteration :param grads: Jacobian symbolic graph for the substitute (should be generated using utils_tf.jacobian_graph) :return: augmented substitute data (will need to be labeled by oracle) """ assert len(x.get_shape()) == len(np.shape(X_sub_prev)) assert len(grads) >= np.max(Y_sub) + 1 assert len(X_sub_prev) == len(Y_sub) aug_batch_size = min(aug_batch_size, X_sub_prev.shape[0]) # Prepare input_shape (outside loop) for feeding dictionary below input_shape = list(x.get_shape()) input_shape[0] = 1 # Create new numpy array for adversary training data # with twice as many components on the first dimension. X_sub = np.vstack([X_sub_prev, X_sub_prev]) num_samples = X_sub_prev.shape[0] # Creating and processing as batch for p_idxs in range(0, num_samples, aug_batch_size): X_batch = X_sub_prev[p_idxs : p_idxs + aug_batch_size, ...] feed_dict = {x: X_batch} if feed is not None: feed_dict.update(feed) # Compute sign matrix grad_val = sess.run([tf.sign(grads)], feed_dict=feed_dict)[0] # Create new synthetic point in adversary substitute training set for (indx, ind) in zip( range(p_idxs, p_idxs + X_batch.shape[0]), range(X_batch.shape[0]) ): X_sub[num_samples + indx] = ( X_batch[ind] + lmbda * grad_val[Y_sub[indx], ind, ...] ) # Return augmented training data (needs to be labeled afterwards) return X_sub ================================================ FILE: cleverhans_v3.1.0/cleverhans/utils_tfe.py ================================================ """ Utility functions for writing tf eager code """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import math import os import time import numpy as np import tensorflow as tf from six.moves import xrange from cleverhans.loss import LossCrossEntropy from cleverhans.model import Model from .utils import batch_indices, _ArgsWrapper, create_logger _logger = create_logger("cleverhans.utils.tfe") def train( model, X_train=None, Y_train=None, save=False, predictions_adv=None, evaluate=None, args=None, rng=None, var_list=None, attack=None, attack_args=None, ): """ Train a TF Eager model :param model: cleverhans.model.Model :param X_train: numpy array with training inputs :param Y_train: numpy array with training outputs :param save: boolean controlling the save operation :param predictions_adv: if set with the adversarial example tensor, will run adversarial training :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). :param args: dict or argparse `Namespace` object. Should contain `nb_epochs`, `learning_rate`, `batch_size` If save is True, should also contain 'train_dir' and 'filename' :param rng: Instance of numpy.random.RandomState :param var_list: List of variables to train. :param attack: Instance of the class cleverhans.attacks.attacks_eager :param attack_args: Parameters required for the attack. :return: True if model trained """ assert isinstance(model, Model) args = _ArgsWrapper(args or {}) if (attack is None) != (attack_args is None): raise ValueError("attack and attack_args must be " "passed together.") if X_train is None or Y_train is None: raise ValueError("X_train argument and Y_train argument " "must be supplied.") # Check that necessary arguments were given (see doc above) assert args.nb_epochs, "Number of epochs was not given in args dict" assert args.learning_rate, "Learning rate was not given in args dict" assert args.batch_size, "Batch size was not given in args dict" if save: assert args.train_dir, "Directory for save was not given in args dict" assert args.filename, "Filename for save was not given in args dict" if rng is None: rng = np.random.RandomState() # Optimizer tfe = tf.contrib.eager optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate) batch_x = tfe.Variable(X_train[0 : args.batch_size], dtype=tf.float32) batch_y = tfe.Variable(Y_train[0 : args.batch_size], dtype=tf.float32) # One epoch of training. for epoch in xrange(args.nb_epochs): # Compute number of batches nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_train) # Indices to shuffle training set index_shuf = list(range(len(X_train))) rng.shuffle(index_shuf) prev = time.time() for batch in range(nb_batches): # Compute batch start and end indices start, end = batch_indices(batch, len(X_train), args.batch_size) # Perform one training step tf.assign(batch_x, X_train[index_shuf[start:end]]) tf.assign(batch_y, Y_train[index_shuf[start:end]]) # Compute grads with tf.GradientTape() as tape: # Define loss loss_clean_obj = LossCrossEntropy(model, smoothing=0.0) loss_clean = loss_clean_obj.fprop(x=batch_x, y=batch_y) loss = loss_clean # Adversarial training if attack is not None: batch_adv_x = attack.generate(batch_x, **attack_args) loss_adv_obj = LossCrossEntropy(model, smoothing=0.0) loss_adv = loss_adv_obj.fprop(x=batch_adv_x, y=batch_y) loss = (loss_clean + loss_adv) / 2.0 # Apply grads model_variables = model.get_params() grads = tape.gradient(loss, model_variables) optimizer.apply_gradients(zip(grads, model_variables)) assert end >= len(X_train) # Check that all examples were used cur = time.time() _logger.info("Epoch " + str(epoch) + " took " + str(cur - prev) + " seconds") if evaluate is not None: evaluate() if save: save_path = os.path.join(args.train_dir, args.filename) saver = tf.train.Saver() saver.save(save_path, model_variables) _logger.info("Completed model training and saved at: " + str(save_path)) else: _logger.info("Completed model training.") return True def model_eval( model, X_test=None, Y_test=None, args=None, attack=None, attack_args=None ): """ Compute the accuracy of a TF Eager model on some data :param model: instance of cleverhans.model.Model_Eager with pretrained weights for evaluation. :param X_test: numpy array with training inputs :param Y_test: numpy array with training outputs :param args: dict or argparse `Namespace` object. Should contain `batch_size` :param attack: instance of the class cleverhans.attacks.attacks_eager :param attack_args: parameters required for the attack. :return: a float with the accuracy value """ args = _ArgsWrapper(args or {}) if (attack is None) != (attack_args is None): raise ValueError("attack and attack_args must be " "passed together.") assert args.batch_size, "Batch size was not given in args dict" if X_test is None or Y_test is None: raise ValueError("X_test argument and Y_test argument " "must be supplied.") # Init result var accuracy = 0.0 # Compute number of batches nb_batches = int(math.ceil(float(len(X_test)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_test) X_cur = np.zeros((args.batch_size,) + X_test.shape[1:], dtype=X_test.dtype) Y_cur = np.zeros((args.batch_size,) + Y_test.shape[1:], dtype=Y_test.dtype) tfe = tf.contrib.eager batch_x = tfe.Variable(X_test[0 : args.batch_size], dtype=tf.float32) batch_y = tfe.Variable(Y_test[0 : args.batch_size], dtype=tf.float32) for batch in range(nb_batches): if batch % 100 == 0 and batch > 0: _logger.debug("Batch " + str(batch)) # Must not use the `batch_indices` function here, because it # repeats some examples. # It's acceptable to repeat during training, but not eval. start = batch * args.batch_size end = min(len(X_test), start + args.batch_size) # The last batch may be smaller than all others. This should not # affect the accuarcy disproportionately. cur_batch_size = end - start X_cur[:cur_batch_size] = X_test[start:end] Y_cur[:cur_batch_size] = Y_test[start:end] tf.assign(batch_x, X_cur) tf.assign(batch_y, Y_cur) if attack is not None: batch_adv_x = attack.generate(batch_x, **attack_args) predictions = model.get_probs(batch_adv_x) else: predictions = model.get_probs(batch_x) cur_corr_preds = tf.equal( tf.argmax(batch_y, axis=-1), tf.argmax(predictions, axis=-1) ) accuracy += cur_corr_preds.numpy()[:cur_batch_size].sum() assert end >= len(X_test) # Divide by number of examples to get final value accuracy /= len(X_test) return accuracy def model_argmax(model, samples): """ Helper function that computes the current class prediction :param samples: numpy array with input samples (dims must match x) :return: the argmax output of predictions, i.e. the current predicted class """ tfe = tf.contrib.eager tf_samples = tfe.Variable(samples) probabilities = model.get_probs(tf_samples) if samples.shape[0] == 1: return tf.argmax(probabilities) else: return tf.argmax(probabilities, axis=1) ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/__init__.py ================================================ """ The CleverHans tutorials. While mostly designed to be run as standalone scripts, the tutorials together also form an importable module. Module importation is mostly intended to support writing unit tests of the tutorials themselves, etc. The tutorial code is not part of our API contract and can change rapidly without warning. """ import os import warnings import cleverhans def check_installation(cur_file): """Warn user if running cleverhans from a different directory than tutorial.""" cur_dir = os.path.split(os.path.dirname(os.path.abspath(cur_file)))[0] ch_dir = os.path.split(cleverhans.__path__[0])[0] if cur_dir != ch_dir: warnings.warn( "It appears that you have at least two versions of " "cleverhans installed, one at %s and one at" " %s. You are running the tutorial script from the " "former but python imported the library module from the " "latter. This may cause errors, for example if the tutorial" " version is newer than the library version and attempts to" " call new features." % (cur_dir, ch_dir) ) ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/cifar10_tutorial_tf.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM and train a model using adversarial training with TensorFlow. The original paper can be found at: https://arxiv.org/abs/1412.6572 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np import tensorflow as tf from cleverhans.attacks import FastGradientMethod from cleverhans.augmentation import random_horizontal_flip, random_shift from cleverhans.compat import flags from cleverhans.dataset import CIFAR10 from cleverhans.loss import CrossEntropy from cleverhans.model_zoo.all_convolutional import ModelAllConvolutional from cleverhans.train import train from cleverhans.utils import AccuracyReport, set_log_level from cleverhans.utils_tf import model_eval FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 CLEAN_TRAIN = True BACKPROP_THROUGH_ATTACK = False NB_FILTERS = 64 def cifar10_tutorial( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, clean_train=CLEAN_TRAIN, testing=False, backprop_through_attack=BACKPROP_THROUGH_ATTACK, nb_filters=NB_FILTERS, num_threads=None, label_smoothing=0.1, ): """ CIFAR10 cleverhans tutorial :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param clean_train: perform normal training on clean examples only before performing adversarial training. :param testing: if true, complete an AccuracyReport for unit tests to verify that performance is adequate :param backprop_through_attack: If True, backprop through adversarial example construction process during adversarial training. :param label_smoothing: float, amount of label smoothing for cross entropy :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.DEBUG) # Create TF session if num_threads: config_args = dict(intra_op_parallelism_threads=1) else: config_args = {} sess = tf.Session(config=tf.ConfigProto(**config_args)) # Get CIFAR10 data data = CIFAR10( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) dataset_size = data.x_train.shape[0] dataset_train = data.to_tensorflow()[0] dataset_train = dataset_train.map( lambda x, y: (random_shift(random_horizontal_flip(x)), y), 4 ) dataset_train = dataset_train.batch(batch_size) dataset_train = dataset_train.prefetch(16) x_train, y_train = data.get_set("train") x_test, y_test = data.get_set("test") # Use Image Parameters img_rows, img_cols, nchannels = x_test.shape[1:4] nb_classes = y_test.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } eval_params = {"batch_size": batch_size} fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} rng = np.random.RandomState([2017, 8, 30]) def do_eval(preds, x_set, y_set, report_key, is_adv=None): acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params) setattr(report, report_key, acc) if is_adv is None: report_text = None elif is_adv: report_text = "adversarial" else: report_text = "legitimate" if report_text: print("Test accuracy on %s examples: %0.4f" % (report_text, acc)) if clean_train: model = ModelAllConvolutional( "model1", nb_classes, nb_filters, input_shape=[32, 32, 3] ) preds = model.get_logits(x) loss = CrossEntropy(model, smoothing=label_smoothing) def evaluate(): do_eval(preds, x_test, y_test, "clean_train_clean_eval", False) train( sess, loss, None, None, dataset_train=dataset_train, dataset_size=dataset_size, evaluate=evaluate, args=train_params, rng=rng, var_list=model.get_params(), ) # Calculate training error if testing: do_eval(preds, x_train, y_train, "train_clean_train_clean_eval") # Initialize the Fast Gradient Sign Method (FGSM) attack object and # graph fgsm = FastGradientMethod(model, sess=sess) adv_x = fgsm.generate(x, **fgsm_params) preds_adv = model.get_logits(adv_x) # Evaluate the accuracy of the MNIST model on adversarial examples do_eval(preds_adv, x_test, y_test, "clean_train_adv_eval", True) # Calculate training error if testing: do_eval(preds_adv, x_train, y_train, "train_clean_train_adv_eval") print("Repeating the process, using adversarial training") # Create a new model and train it to be robust to FastGradientMethod model2 = ModelAllConvolutional( "model2", nb_classes, nb_filters, input_shape=[32, 32, 3] ) fgsm2 = FastGradientMethod(model2, sess=sess) def attack(x): return fgsm2.generate(x, **fgsm_params) loss2 = CrossEntropy(model2, smoothing=label_smoothing, attack=attack) preds2 = model2.get_logits(x) adv_x2 = attack(x) if not backprop_through_attack: # For the fgsm attack used in this tutorial, the attack has zero # gradient so enabling this flag does not change the gradient. # For some other attacks, enabling this flag increases the cost of # training, but gives the defender the ability to anticipate how # the atacker will change their strategy in response to updates to # the defender's parameters. adv_x2 = tf.stop_gradient(adv_x2) preds2_adv = model2.get_logits(adv_x2) def evaluate2(): # Accuracy of adversarially trained model on legitimate test inputs do_eval(preds2, x_test, y_test, "adv_train_clean_eval", False) # Accuracy of the adversarially trained model on adversarial examples do_eval(preds2_adv, x_test, y_test, "adv_train_adv_eval", True) # Perform and evaluate adversarial training train( sess, loss2, None, None, dataset_train=dataset_train, dataset_size=dataset_size, evaluate=evaluate2, args=train_params, rng=rng, var_list=model2.get_params(), ) # Calculate training errors if testing: do_eval(preds2, x_train, y_train, "train_adv_train_clean_eval") do_eval(preds2_adv, x_train, y_train, "train_adv_train_adv_eval") return report def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) cifar10_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, clean_train=FLAGS.clean_train, backprop_through_attack=FLAGS.backprop_through_attack, nb_filters=FLAGS.nb_filters, ) if __name__ == "__main__": flags.DEFINE_integer("nb_filters", NB_FILTERS, "Model size multiplier") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_bool("clean_train", CLEAN_TRAIN, "Train on clean examples") flags.DEFINE_bool( "backprop_through_attack", BACKPROP_THROUGH_ATTACK, ( "If True, backprop through adversarial example " "construction process during adversarial training" ), ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/evaluate_pickled_model.py ================================================ """ This script evaluates trained models that have been saved to the filesystem. See mnist_tutorial_picklable.py for instructions. """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import tensorflow as tf from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.attacks import FastGradientMethod from cleverhans.utils import set_log_level from cleverhans.utils_tf import model_eval, silence from cleverhans.serial import load silence() FLAGS = flags.FLAGS def evaluate_model( filepath, train_start=0, train_end=60000, test_start=0, test_end=10000, batch_size=128, testing=False, num_threads=None, ): """ Run evaluation on a saved model :param filepath: path to model to evaluate :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param batch_size: size of evaluation batches """ # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.INFO) # Create TF session if num_threads: config_args = dict(intra_op_parallelism_threads=1) else: config_args = {} sess = tf.Session(config=tf.ConfigProto(**config_args)) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Use Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) eval_params = {"batch_size": batch_size} fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} def do_eval(preds, x_set, y_set, report_key, is_adv=None): acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params) if is_adv is None: report_text = None elif is_adv: report_text = "adversarial" else: report_text = "legitimate" if report_text: print("Test accuracy on %s examples: %0.4f" % (report_text, acc)) with sess.as_default(): model = load(filepath) assert len(model.get_params()) > 0 # Initialize the Fast Gradient Sign Method (FGSM) attack object and # graph fgsm = FastGradientMethod(model, sess=sess) adv_x = fgsm.generate(x, **fgsm_params) preds_adv = model.get_logits(adv_x) preds = model.get_logits(x) # Evaluate the accuracy of the MNIST model on adversarial examples do_eval(preds, x_test, y_test, "train_clean_train_clean_eval", False) do_eval(preds_adv, x_test, y_test, "clean_train_adv_eval", True) def main(argv=None): _, filepath = argv evaluate_model(filepath=filepath) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_blackbox.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM in black-box setting. The original paper can be found at: https://arxiv.org/abs/1602.02697 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import functools import logging import numpy as np from six.moves import xrange import tensorflow as tf from cleverhans.attacks import FastGradientMethod from cleverhans.utils_tf import jacobian_graph, jacobian_augmentation from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.initializers import HeReLuNormalInitializer from cleverhans.loss import CrossEntropy from cleverhans.model import Model from cleverhans.train import train from cleverhans.utils import set_log_level from cleverhans.utils import TemporaryLogLevel from cleverhans.utils import to_categorical from cleverhans.utils_tf import model_eval, batch_eval from cleverhans.model_zoo.basic_cnn import ModelBasicCNN FLAGS = flags.FLAGS NB_CLASSES = 10 BATCH_SIZE = 128 LEARNING_RATE = 0.001 NB_EPOCHS = 10 HOLDOUT = 150 DATA_AUG = 6 NB_EPOCHS_S = 10 LMBDA = 0.1 AUG_BATCH_SIZE = 512 def setup_tutorial(): """ Helper function to check correct configuration of tf for tutorial :return: True if setup checks completed """ # Set TF random seed to improve reproducibility tf.set_random_seed(1234) return True def prep_bbox( sess, x, y, x_train, y_train, x_test, y_test, nb_epochs, batch_size, learning_rate, rng, nb_classes=10, img_rows=28, img_cols=28, nchannels=1, ): """ Define and train a model that simulates the "remote" black-box oracle described in the original paper. :param sess: the TF session :param x: the input placeholder for MNIST :param y: the ouput placeholder for MNIST :param x_train: the training data for the oracle :param y_train: the training labels for the oracle :param x_test: the testing data for the oracle :param y_test: the testing labels for the oracle :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param rng: numpy.random.RandomState :return: """ # Define TF model graph (for the black-box model) nb_filters = 64 model = ModelBasicCNN("model1", nb_classes, nb_filters) loss = CrossEntropy(model, smoothing=0.1) predictions = model.get_logits(x) print("Defined TensorFlow model graph.") # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } train(sess, loss, x_train, y_train, args=train_params, rng=rng) # Print out the accuracy on legitimate data eval_params = {"batch_size": batch_size} accuracy = model_eval(sess, x, y, predictions, x_test, y_test, args=eval_params) print("Test accuracy of black-box on legitimate test " "examples: " + str(accuracy)) return model, predictions, accuracy class ModelSubstitute(Model): def __init__(self, scope, nb_classes, nb_filters=200, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) self.nb_filters = nb_filters def fprop(self, x, **kwargs): del kwargs my_dense = functools.partial( tf.layers.dense, kernel_initializer=HeReLuNormalInitializer ) with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): y = tf.layers.flatten(x) y = my_dense(y, self.nb_filters, activation=tf.nn.relu) y = my_dense(y, self.nb_filters, activation=tf.nn.relu) logits = my_dense(y, self.nb_classes) return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits)} def train_sub( sess, x, y, bbox_preds, x_sub, y_sub, nb_classes, nb_epochs_s, batch_size, learning_rate, data_aug, lmbda, aug_batch_size, rng, img_rows=28, img_cols=28, nchannels=1, ): """ This function creates the substitute by alternatively augmenting the training data and training the substitute. :param sess: TF session :param x: input TF placeholder :param y: output TF placeholder :param bbox_preds: output of black-box model predictions :param x_sub: initial substitute training data :param y_sub: initial substitute training labels :param nb_classes: number of output classes :param nb_epochs_s: number of epochs to train substitute model :param batch_size: size of training batches :param learning_rate: learning rate for training :param data_aug: number of times substitute training data is augmented :param lmbda: lambda from arxiv.org/abs/1602.02697 :param rng: numpy.random.RandomState instance :return: """ # Define TF model graph (for the black-box model) model_sub = ModelSubstitute("model_s", nb_classes) preds_sub = model_sub.get_logits(x) loss_sub = CrossEntropy(model_sub, smoothing=0) print("Defined TensorFlow model graph for the substitute.") # Define the Jacobian symbolically using TensorFlow grads = jacobian_graph(preds_sub, x, nb_classes) # Train the substitute and augment dataset alternatively for rho in xrange(data_aug): print("Substitute training epoch #" + str(rho)) train_params = { "nb_epochs": nb_epochs_s, "batch_size": batch_size, "learning_rate": learning_rate, } with TemporaryLogLevel(logging.WARNING, "cleverhans.utils.tf"): train( sess, loss_sub, x_sub, to_categorical(y_sub, nb_classes), init_all=False, args=train_params, rng=rng, var_list=model_sub.get_params(), ) # If we are not at last substitute training iteration, augment dataset if rho < data_aug - 1: print("Augmenting substitute training data.") # Perform the Jacobian augmentation lmbda_coef = 2 * int(int(rho / 3) % 2 == 0) - 1 x_sub = jacobian_augmentation( sess, x, x_sub, y_sub, grads, lmbda_coef * lmbda, aug_batch_size ) print("Labeling substitute training data.") # Label the newly generated synthetic points using the black-box y_sub = np.hstack([y_sub, y_sub]) x_sub_prev = x_sub[int(len(x_sub) / 2) :] eval_params = {"batch_size": batch_size} bbox_val = batch_eval( sess, [x], [bbox_preds], [x_sub_prev], args=eval_params )[0] # Note here that we take the argmax because the adversary # only has access to the label (not the probabilities) output # by the black-box model y_sub[int(len(x_sub) / 2) :] = np.argmax(bbox_val, axis=1) return model_sub, preds_sub def mnist_blackbox( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_classes=NB_CLASSES, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, nb_epochs=NB_EPOCHS, holdout=HOLDOUT, data_aug=DATA_AUG, nb_epochs_s=NB_EPOCHS_S, lmbda=LMBDA, aug_batch_size=AUG_BATCH_SIZE, ): """ MNIST tutorial for the black-box attack from arxiv.org/abs/1602.02697 :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :return: a dictionary with: * black-box model accuracy on test set * substitute model accuracy on test set * black-box model accuracy on adversarial examples transferred from the substitute model """ # Set logging level to see debug information set_log_level(logging.DEBUG) # Dictionary used to keep track and return key accuracies accuracies = {} # Perform tutorial setup assert setup_tutorial() # Create TF session sess = tf.Session() # Get MNIST data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Initialize substitute training set reserved for adversary x_sub = x_test[:holdout] y_sub = np.argmax(y_test[:holdout], axis=1) # Redefine test set as remaining samples unavailable to adversaries x_test = x_test[holdout:] y_test = y_test[holdout:] # Obtain Image parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Seed random number generator so tutorial is reproducible rng = np.random.RandomState([2017, 8, 30]) # Simulate the black-box model locally # You could replace this by a remote labeling API for instance print("Preparing the black-box model.") prep_bbox_out = prep_bbox( sess, x, y, x_train, y_train, x_test, y_test, nb_epochs, batch_size, learning_rate, rng, nb_classes, img_rows, img_cols, nchannels, ) model, bbox_preds, accuracies["bbox"] = prep_bbox_out # Train substitute using method from https://arxiv.org/abs/1602.02697 print("Training the substitute model.") train_sub_out = train_sub( sess, x, y, bbox_preds, x_sub, y_sub, nb_classes, nb_epochs_s, batch_size, learning_rate, data_aug, lmbda, aug_batch_size, rng, img_rows, img_cols, nchannels, ) model_sub, preds_sub = train_sub_out # Evaluate the substitute model on clean test examples eval_params = {"batch_size": batch_size} acc = model_eval(sess, x, y, preds_sub, x_test, y_test, args=eval_params) accuracies["sub"] = acc # Initialize the Fast Gradient Sign Method (FGSM) attack object. fgsm_par = {"eps": 0.3, "ord": np.inf, "clip_min": 0.0, "clip_max": 1.0} fgsm = FastGradientMethod(model_sub, sess=sess) # Craft adversarial examples using the substitute eval_params = {"batch_size": batch_size} x_adv_sub = fgsm.generate(x, **fgsm_par) # Evaluate the accuracy of the "black-box" model on adversarial examples accuracy = model_eval( sess, x, y, model.get_logits(x_adv_sub), x_test, y_test, args=eval_params ) print( "Test accuracy of oracle on adversarial examples generated " "using the substitute: " + str(accuracy) ) accuracies["bbox_on_sub_adv_ex"] = accuracy return accuracies def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_blackbox( nb_classes=FLAGS.nb_classes, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, nb_epochs=FLAGS.nb_epochs, holdout=FLAGS.holdout, data_aug=FLAGS.data_aug, nb_epochs_s=FLAGS.nb_epochs_s, lmbda=FLAGS.lmbda, aug_batch_size=FLAGS.data_aug_batch_size, ) if __name__ == "__main__": # General flags flags.DEFINE_integer("nb_classes", NB_CLASSES, "Number of classes in problem") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") # Flags related to oracle flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") # Flags related to substitute flags.DEFINE_integer("holdout", HOLDOUT, "Test set holdout for adversary") flags.DEFINE_integer( "data_aug", DATA_AUG, "Number of substitute data augmentations" ) flags.DEFINE_integer("nb_epochs_s", NB_EPOCHS_S, "Training epochs for substitute") flags.DEFINE_float("lmbda", LMBDA, "Lambda from arxiv.org/abs/1602.02697") flags.DEFINE_integer( "data_aug_batch_size", AUG_BATCH_SIZE, "Batch size for augmentation" ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_cw.py ================================================ """ This tutorial shows how to generate adversarial examples using C&W attack in white-box setting. The original paper can be found at: https://nicholas.carlini.com/papers/2017_sp_nnrobustattacks.pdf """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import os import numpy as np import tensorflow as tf from cleverhans.attacks import CarliniWagnerL2 from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.loss import CrossEntropy from cleverhans.utils import grid_visual, AccuracyReport from cleverhans.utils import set_log_level from cleverhans.utils_tf import model_eval, tf_model_load from cleverhans.train import train from cleverhans.model_zoo.basic_cnn import ModelBasicCNN FLAGS = flags.FLAGS VIZ_ENABLED = True BATCH_SIZE = 128 NB_EPOCHS = 6 SOURCE_SAMPLES = 10 LEARNING_RATE = 0.001 CW_LEARNING_RATE = 0.2 ATTACK_ITERATIONS = 100 MODEL_PATH = os.path.join("models", "mnist") TARGETED = True def mnist_tutorial_cw( train_start=0, train_end=60000, test_start=0, test_end=10000, viz_enabled=VIZ_ENABLED, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, source_samples=SOURCE_SAMPLES, learning_rate=LEARNING_RATE, attack_iterations=ATTACK_ITERATIONS, model_path=MODEL_PATH, targeted=TARGETED, ): """ MNIST tutorial for Carlini and Wagner's attack :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param viz_enabled: (boolean) activate plots of adversarial examples :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param nb_classes: number of output classes :param source_samples: number of test inputs to attack :param learning_rate: learning rate for training :param model_path: path to the model file :param targeted: should we run a targeted attack? or untargeted? :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Create TF session sess = tf.Session() print("Created TensorFlow session.") set_log_level(logging.DEBUG) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Obtain Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) nb_filters = 64 # Define TF model graph model = ModelBasicCNN("model1", nb_classes, nb_filters) preds = model.get_logits(x) loss = CrossEntropy(model, smoothing=0.1) print("Defined TensorFlow model graph.") ########################################################################### # Training the model using TensorFlow ########################################################################### # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, "filename": os.path.split(model_path)[-1], } rng = np.random.RandomState([2017, 8, 30]) # check if we've trained before, and if we have, use that pre-trained model if os.path.exists(model_path + ".meta"): tf_model_load(sess, model_path) else: train(sess, loss, x_train, y_train, args=train_params, rng=rng) saver = tf.train.Saver() saver.save(sess, model_path) # Evaluate the accuracy of the MNIST model on legitimate test examples eval_params = {"batch_size": batch_size} accuracy = model_eval(sess, x, y, preds, x_test, y_test, args=eval_params) assert x_test.shape[0] == test_end - test_start, x_test.shape print("Test accuracy on legitimate test examples: {0}".format(accuracy)) report.clean_train_clean_eval = accuracy ########################################################################### # Craft adversarial examples using Carlini and Wagner's approach ########################################################################### nb_adv_per_sample = str(nb_classes - 1) if targeted else "1" print( "Crafting " + str(source_samples) + " * " + nb_adv_per_sample + " adversarial examples" ) print("This could take some time ...") # Instantiate a CW attack object cw = CarliniWagnerL2(model, sess=sess) if viz_enabled: assert source_samples == nb_classes idxs = [ np.where(np.argmax(y_test, axis=1) == i)[0][0] for i in range(nb_classes) ] if targeted: if viz_enabled: # Initialize our array for grid visualization grid_shape = (nb_classes, nb_classes, img_rows, img_cols, nchannels) grid_viz_data = np.zeros(grid_shape, dtype="f") adv_inputs = np.array( [[instance] * nb_classes for instance in x_test[idxs]], dtype=np.float32 ) else: adv_inputs = np.array( [[instance] * nb_classes for instance in x_test[:source_samples]], dtype=np.float32, ) one_hot = np.zeros((nb_classes, nb_classes)) one_hot[np.arange(nb_classes), np.arange(nb_classes)] = 1 adv_inputs = adv_inputs.reshape( (source_samples * nb_classes, img_rows, img_cols, nchannels) ) adv_ys = np.array([one_hot] * source_samples, dtype=np.float32).reshape( (source_samples * nb_classes, nb_classes) ) yname = "y_target" else: if viz_enabled: # Initialize our array for grid visualization grid_shape = (nb_classes, 2, img_rows, img_cols, nchannels) grid_viz_data = np.zeros(grid_shape, dtype="f") adv_inputs = x_test[idxs] else: adv_inputs = x_test[:source_samples] adv_ys = None yname = "y" if targeted: cw_params_batch_size = source_samples * nb_classes else: cw_params_batch_size = source_samples cw_params = { "binary_search_steps": 1, yname: adv_ys, "max_iterations": attack_iterations, "learning_rate": CW_LEARNING_RATE, "batch_size": cw_params_batch_size, "initial_const": 10, } adv = cw.generate_np(adv_inputs, **cw_params) eval_params = {"batch_size": np.minimum(nb_classes, source_samples)} if targeted: adv_accuracy = model_eval(sess, x, y, preds, adv, adv_ys, args=eval_params) else: if viz_enabled: err = model_eval(sess, x, y, preds, adv, y_test[idxs], args=eval_params) adv_accuracy = 1 - err else: err = model_eval( sess, x, y, preds, adv, y_test[:source_samples], args=eval_params ) adv_accuracy = 1 - err if viz_enabled: for j in range(nb_classes): if targeted: for i in range(nb_classes): grid_viz_data[i, j] = adv[i * nb_classes + j] else: grid_viz_data[j, 0] = adv_inputs[j] grid_viz_data[j, 1] = adv[j] print(grid_viz_data.shape) print("--------------------------------------") # Compute the number of adversarial examples that were successfully found print("Avg. rate of successful adv. examples {0:.4f}".format(adv_accuracy)) report.clean_train_adv_eval = 1.0 - adv_accuracy # Compute the average distortion introduced by the algorithm percent_perturbed = np.mean(np.sum((adv - adv_inputs) ** 2, axis=(1, 2, 3)) ** 0.5) print("Avg. L_2 norm of perturbations {0:.4f}".format(percent_perturbed)) # Close TF session sess.close() # Finally, block & display a grid of all the adversarial examples if viz_enabled: _ = grid_visual(grid_viz_data) return report def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial_cw( viz_enabled=FLAGS.viz_enabled, nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, source_samples=FLAGS.source_samples, learning_rate=FLAGS.learning_rate, attack_iterations=FLAGS.attack_iterations, model_path=FLAGS.model_path, targeted=FLAGS.targeted, ) if __name__ == "__main__": flags.DEFINE_boolean("viz_enabled", VIZ_ENABLED, "Visualize adversarial ex.") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_integer( "source_samples", SOURCE_SAMPLES, "Number of test inputs to attack" ) flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_string("model_path", MODEL_PATH, "Path to save or load the model file") flags.DEFINE_integer( "attack_iterations", ATTACK_ITERATIONS, "Number of iterations to run attack; 1000 is good", ) flags.DEFINE_boolean("targeted", TARGETED, "Run the tutorial in targeted mode?") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_jsma.py ================================================ """ This tutorial shows how to generate adversarial examples using JSMA in white-box setting. The original paper can be found at: https://arxiv.org/abs/1511.07528 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np from six.moves import xrange import tensorflow as tf from cleverhans.attacks import SaliencyMapMethod from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.loss import CrossEntropy from cleverhans.utils import other_classes, set_log_level from cleverhans.utils import pair_visual, grid_visual, AccuracyReport from cleverhans.utils_tf import model_eval, model_argmax from cleverhans.train import train from cleverhans.model_zoo.basic_cnn import ModelBasicCNN FLAGS = flags.FLAGS VIZ_ENABLED = True NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 SOURCE_SAMPLES = 10 def mnist_tutorial_jsma( train_start=0, train_end=60000, test_start=0, test_end=10000, viz_enabled=VIZ_ENABLED, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, source_samples=SOURCE_SAMPLES, learning_rate=LEARNING_RATE, ): """ MNIST tutorial for the Jacobian-based saliency map approach (JSMA) :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param viz_enabled: (boolean) activate plots of adversarial examples :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param nb_classes: number of output classes :param source_samples: number of test inputs to attack :param learning_rate: learning rate for training :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Create TF session and set as Keras backend session sess = tf.Session() print("Created TensorFlow session.") set_log_level(logging.DEBUG) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Obtain Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) nb_filters = 64 # Define TF model graph model = ModelBasicCNN("model1", nb_classes, nb_filters) preds = model.get_logits(x) loss = CrossEntropy(model, smoothing=0.1) print("Defined TensorFlow model graph.") ########################################################################### # Training the model using TensorFlow ########################################################################### # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } sess.run(tf.global_variables_initializer()) rng = np.random.RandomState([2017, 8, 30]) train(sess, loss, x_train, y_train, args=train_params, rng=rng) # Evaluate the accuracy of the MNIST model on legitimate test examples eval_params = {"batch_size": batch_size} accuracy = model_eval(sess, x, y, preds, x_test, y_test, args=eval_params) assert x_test.shape[0] == test_end - test_start, x_test.shape print("Test accuracy on legitimate test examples: {0}".format(accuracy)) report.clean_train_clean_eval = accuracy ########################################################################### # Craft adversarial examples using the Jacobian-based saliency map approach ########################################################################### print( "Crafting " + str(source_samples) + " * " + str(nb_classes - 1) + " adversarial examples" ) # Keep track of success (adversarial example classified in target) results = np.zeros((nb_classes, source_samples), dtype="i") # Rate of perturbed features for each test set example and target class perturbations = np.zeros((nb_classes, source_samples), dtype="f") # Initialize our array for grid visualization grid_shape = (nb_classes, nb_classes, img_rows, img_cols, nchannels) grid_viz_data = np.zeros(grid_shape, dtype="f") # Instantiate a SaliencyMapMethod attack object jsma = SaliencyMapMethod(model, sess=sess) jsma_params = { "theta": 1.0, "gamma": 0.1, "clip_min": 0.0, "clip_max": 1.0, "y_target": None, } figure = None # Loop over the samples we want to perturb into adversarial examples for sample_ind in xrange(0, source_samples): print("--------------------------------------") print("Attacking input %i/%i" % (sample_ind + 1, source_samples)) sample = x_test[sample_ind : (sample_ind + 1)] # We want to find an adversarial example for each possible target class # (i.e. all classes that differ from the label given in the dataset) current_class = int(np.argmax(y_test[sample_ind])) target_classes = other_classes(nb_classes, current_class) # For the grid visualization, keep original images along the diagonal grid_viz_data[current_class, current_class, :, :, :] = np.reshape( sample, (img_rows, img_cols, nchannels) ) # Loop over all target classes for target in target_classes: print("Generating adv. example for target class %i" % target) # This call runs the Jacobian-based saliency map approach one_hot_target = np.zeros((1, nb_classes), dtype=np.float32) one_hot_target[0, target] = 1 jsma_params["y_target"] = one_hot_target adv_x = jsma.generate_np(sample, **jsma_params) # Check if success was achieved res = int(model_argmax(sess, x, preds, adv_x) == target) # Compute number of modified features adv_x_reshape = adv_x.reshape(-1) test_in_reshape = x_test[sample_ind].reshape(-1) nb_changed = np.where(adv_x_reshape != test_in_reshape)[0].shape[0] percent_perturb = float(nb_changed) / adv_x.reshape(-1).shape[0] # Display the original and adversarial images side-by-side if viz_enabled: figure = pair_visual( np.reshape(sample, (img_rows, img_cols, nchannels)), np.reshape(adv_x, (img_rows, img_cols, nchannels)), figure, ) # Add our adversarial example to our grid data grid_viz_data[target, current_class, :, :, :] = np.reshape( adv_x, (img_rows, img_cols, nchannels) ) # Update the arrays for later analysis results[target, sample_ind] = res perturbations[target, sample_ind] = percent_perturb print("--------------------------------------") # Compute the number of adversarial examples that were successfully found nb_targets_tried = (nb_classes - 1) * source_samples succ_rate = float(np.sum(results)) / nb_targets_tried print("Avg. rate of successful adv. examples {0:.4f}".format(succ_rate)) report.clean_train_adv_eval = 1.0 - succ_rate # Compute the average distortion introduced by the algorithm percent_perturbed = np.mean(perturbations[np.where(perturbations != 0)]) print("Avg. rate of perturbed features {0:.4f}".format(percent_perturbed)) # Compute the average distortion introduced for successful samples only percent_perturb_succ = np.mean( perturbations[np.where(perturbations != 0)] * (results[np.where(perturbations != 0)] == 1) ) print( "Avg. rate of perturbed features for successful " "adversarial examples {0:.4f}".format(percent_perturb_succ) ) # Close TF session sess.close() # Finally, block & display a grid of all the adversarial examples if viz_enabled: import matplotlib.pyplot as plt plt.close(figure) _ = grid_visual(grid_viz_data) return report def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial_jsma( viz_enabled=FLAGS.viz_enabled, nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, source_samples=FLAGS.source_samples, learning_rate=FLAGS.learning_rate, ) if __name__ == "__main__": flags.DEFINE_boolean("viz_enabled", VIZ_ENABLED, "Visualize adversarial ex.") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_integer( "source_samples", SOURCE_SAMPLES, "Nb of test inputs to attack" ) flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_keras.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM and train a model using adversarial training with Keras. The original paper can be found at: https://arxiv.org/abs/1412.6572 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import tensorflow as tf from tensorflow import keras from cleverhans.attacks import FastGradientMethod from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.utils import AccuracyReport from cleverhans.utils_keras import cnn_model from cleverhans.utils_keras import KerasModelWrapper FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 def mnist_tutorial( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, testing=False, label_smoothing=0.1, ): """ MNIST CleverHans tutorial :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param testing: if true, training error is calculated :param label_smoothing: float, amount of label smoothing for cross entropy :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Force TensorFlow to use single thread to improve reproducibility config = tf.ConfigProto( intra_op_parallelism_threads=1, inter_op_parallelism_threads=1 ) if keras.backend.image_data_format() != "channels_last": raise NotImplementedError( "this tutorial requires keras to be configured to channels_last format" ) # Create TF session and set as Keras backend session sess = tf.Session(config=config) keras.backend.set_session(sess) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Obtain Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Label smoothing y_train -= label_smoothing * (y_train - 1.0 / nb_classes) # Define Keras model model = cnn_model( img_rows=img_rows, img_cols=img_cols, channels=nchannels, nb_filters=64, nb_classes=nb_classes, ) print("Defined Keras model.") # To be able to call the model in the custom loss, we need to call it once # before, see https://github.com/tensorflow/tensorflow/issues/23769 model(model.input) # Initialize the Fast Gradient Sign Method (FGSM) attack object wrap = KerasModelWrapper(model) fgsm = FastGradientMethod(wrap, sess=sess) fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} adv_acc_metric = get_adversarial_acc_metric(model, fgsm, fgsm_params) model.compile( optimizer=keras.optimizers.Adam(learning_rate), loss="categorical_crossentropy", metrics=["accuracy", adv_acc_metric], ) # Train an MNIST model model.fit( x_train, y_train, batch_size=batch_size, epochs=nb_epochs, validation_data=(x_test, y_test), verbose=2, ) # Evaluate the accuracy on legitimate and adversarial test examples _, acc, adv_acc = model.evaluate(x_test, y_test, batch_size=batch_size, verbose=0) report.clean_train_clean_eval = acc report.clean_train_adv_eval = adv_acc print("Test accuracy on legitimate examples: %0.4f" % acc) print("Test accuracy on adversarial examples: %0.4f\n" % adv_acc) # Calculate training error if testing: _, train_acc, train_adv_acc = model.evaluate( x_train, y_train, batch_size=batch_size, verbose=0 ) report.train_clean_train_clean_eval = train_acc report.train_clean_train_adv_eval = train_adv_acc print("Repeating the process, using adversarial training") # Redefine Keras model model_2 = cnn_model( img_rows=img_rows, img_cols=img_cols, channels=nchannels, nb_filters=64, nb_classes=nb_classes, ) model_2(model_2.input) wrap_2 = KerasModelWrapper(model_2) fgsm_2 = FastGradientMethod(wrap_2, sess=sess) # Use a loss function based on legitimate and adversarial examples adv_loss_2 = get_adversarial_loss(model_2, fgsm_2, fgsm_params) adv_acc_metric_2 = get_adversarial_acc_metric(model_2, fgsm_2, fgsm_params) model_2.compile( optimizer=keras.optimizers.Adam(learning_rate), loss=adv_loss_2, metrics=["accuracy", adv_acc_metric_2], ) # Train an MNIST model model_2.fit( x_train, y_train, batch_size=batch_size, epochs=nb_epochs, validation_data=(x_test, y_test), verbose=2, ) # Evaluate the accuracy on legitimate and adversarial test examples _, acc, adv_acc = model_2.evaluate(x_test, y_test, batch_size=batch_size, verbose=0) report.adv_train_clean_eval = acc report.adv_train_adv_eval = adv_acc print("Test accuracy on legitimate examples: %0.4f" % acc) print("Test accuracy on adversarial examples: %0.4f\n" % adv_acc) # Calculate training error if testing: _, train_acc, train_adv_acc = model_2.evaluate( x_train, y_train, batch_size=batch_size, verbose=0 ) report.train_adv_train_clean_eval = train_acc report.train_adv_train_adv_eval = train_adv_acc return report def get_adversarial_acc_metric(model, fgsm, fgsm_params): def adv_acc(y, _): # Generate adversarial examples x_adv = fgsm.generate(model.input, **fgsm_params) # Consider the attack to be constant x_adv = tf.stop_gradient(x_adv) # Accuracy on the adversarial examples preds_adv = model(x_adv) return keras.metrics.categorical_accuracy(y, preds_adv) return adv_acc def get_adversarial_loss(model, fgsm, fgsm_params): def adv_loss(y, preds): # Cross-entropy on the legitimate examples cross_ent = keras.losses.categorical_crossentropy(y, preds) # Generate adversarial examples x_adv = fgsm.generate(model.input, **fgsm_params) # Consider the attack to be constant x_adv = tf.stop_gradient(x_adv) # Cross-entropy on the adversarial examples preds_adv = model(x_adv) cross_ent_adv = keras.losses.categorical_crossentropy(y, preds_adv) return 0.5 * cross_ent + 0.5 * cross_ent_adv return adv_loss def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_keras_tf.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM and train a model using adversarial training with Keras. It is very similar to mnist_tutorial_tf.py, which does the same thing but without a dependence on keras. The original paper can be found at: https://arxiv.org/abs/1412.6572 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import os import tensorflow as tf from tensorflow import keras import numpy as np from cleverhans.attacks import FastGradientMethod from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.loss import CrossEntropy from cleverhans.train import train from cleverhans.utils import AccuracyReport from cleverhans.utils_keras import cnn_model from cleverhans.utils_keras import KerasModelWrapper from cleverhans.utils_tf import model_eval FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 TRAIN_DIR = "train_dir" FILENAME = "mnist.ckpt" LOAD_MODEL = False def mnist_tutorial( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, train_dir=TRAIN_DIR, filename=FILENAME, load_model=LOAD_MODEL, testing=False, label_smoothing=0.1, ): """ MNIST CleverHans tutorial :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param train_dir: Directory storing the saved model :param filename: Filename to save model under :param load_model: True for load, False for not load :param testing: if true, test error is calculated :param label_smoothing: float, amount of label smoothing for cross entropy :return: an AccuracyReport object """ tf.keras.backend.set_learning_phase(0) # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) if keras.backend.image_data_format() != "channels_last": raise NotImplementedError( "this tutorial requires keras to be configured to channels_last format" ) # Create TF session and set as Keras backend session sess = tf.Session() keras.backend.set_session(sess) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Obtain Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Define TF model graph model = cnn_model( img_rows=img_rows, img_cols=img_cols, channels=nchannels, nb_filters=64, nb_classes=nb_classes, ) preds = model(x) print("Defined TensorFlow model graph.") def evaluate(): # Evaluate the accuracy of the MNIST model on legitimate test examples eval_params = {"batch_size": batch_size} acc = model_eval(sess, x, y, preds, x_test, y_test, args=eval_params) report.clean_train_clean_eval = acc # assert X_test.shape[0] == test_end - test_start, X_test.shape print("Test accuracy on legitimate examples: %0.4f" % acc) # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, "train_dir": train_dir, "filename": filename, } rng = np.random.RandomState([2017, 8, 30]) if not os.path.exists(train_dir): os.mkdir(train_dir) ckpt = tf.train.get_checkpoint_state(train_dir) print(train_dir, ckpt) ckpt_path = False if ckpt is None else ckpt.model_checkpoint_path wrap = KerasModelWrapper(model) if load_model and ckpt_path: saver = tf.train.Saver() print(ckpt_path) saver.restore(sess, ckpt_path) print("Model loaded from: {}".format(ckpt_path)) evaluate() else: print("Model was not loaded, training from scratch.") loss = CrossEntropy(wrap, smoothing=label_smoothing) train( sess, loss, x_train, y_train, evaluate=evaluate, args=train_params, rng=rng ) # Calculate training error if testing: eval_params = {"batch_size": batch_size} acc = model_eval(sess, x, y, preds, x_train, y_train, args=eval_params) report.train_clean_train_clean_eval = acc # Initialize the Fast Gradient Sign Method (FGSM) attack object and graph fgsm = FastGradientMethod(wrap, sess=sess) fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} adv_x = fgsm.generate(x, **fgsm_params) # Consider the attack to be constant adv_x = tf.stop_gradient(adv_x) preds_adv = model(adv_x) # Evaluate the accuracy of the MNIST model on adversarial examples eval_par = {"batch_size": batch_size} acc = model_eval(sess, x, y, preds_adv, x_test, y_test, args=eval_par) print("Test accuracy on adversarial examples: %0.4f\n" % acc) report.clean_train_adv_eval = acc # Calculating train error if testing: eval_par = {"batch_size": batch_size} acc = model_eval(sess, x, y, preds_adv, x_train, y_train, args=eval_par) report.train_clean_train_adv_eval = acc print("Repeating the process, using adversarial training") # Redefine TF model graph model_2 = cnn_model( img_rows=img_rows, img_cols=img_cols, channels=nchannels, nb_filters=64, nb_classes=nb_classes, ) wrap_2 = KerasModelWrapper(model_2) preds_2 = model_2(x) fgsm2 = FastGradientMethod(wrap_2, sess=sess) def attack(x): return fgsm2.generate(x, **fgsm_params) preds_2_adv = model_2(attack(x)) loss_2 = CrossEntropy(wrap_2, smoothing=label_smoothing, attack=attack) def evaluate_2(): # Accuracy of adversarially trained model on legitimate test inputs eval_params = {"batch_size": batch_size} accuracy = model_eval(sess, x, y, preds_2, x_test, y_test, args=eval_params) print("Test accuracy on legitimate examples: %0.4f" % accuracy) report.adv_train_clean_eval = accuracy # Accuracy of the adversarially trained model on adversarial examples accuracy = model_eval(sess, x, y, preds_2_adv, x_test, y_test, args=eval_params) print("Test accuracy on adversarial examples: %0.4f" % accuracy) report.adv_train_adv_eval = accuracy # Perform and evaluate adversarial training train( sess, loss_2, x_train, y_train, evaluate=evaluate_2, args=train_params, rng=rng ) # Calculate training errors if testing: eval_params = {"batch_size": batch_size} accuracy = model_eval(sess, x, y, preds_2, x_train, y_train, args=eval_params) report.train_adv_train_clean_eval = accuracy accuracy = model_eval( sess, x, y, preds_2_adv, x_train, y_train, args=eval_params ) report.train_adv_train_adv_eval = accuracy return report def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, train_dir=FLAGS.train_dir, filename=FLAGS.filename, load_model=FLAGS.load_model, ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_string("train_dir", TRAIN_DIR, "Directory where to save model.") flags.DEFINE_string("filename", FILENAME, "Checkpoint filename.") flags.DEFINE_boolean("load_model", LOAD_MODEL, "Load saved model or train.") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_picklable.py ================================================ """ This tutorial shows how to use cleverhans.picklable_model to create models that can be saved for evaluation later. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np import tensorflow as tf from cleverhans.attacks import FastGradientMethod from cleverhans.compat import flags from cleverhans.dataset import MNIST from cleverhans.loss import CrossEntropy from cleverhans.serial import save from cleverhans.utils_tf import model_eval, silence from cleverhans.train import train from cleverhans.utils import AccuracyReport, set_log_level from cleverhans_tutorials.tutorial_models import make_basic_picklable_cnn silence() FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 NB_FILTERS = 64 CLEAN_TRAIN = True BACKPROP_THROUGH_ATTACK = False def mnist_tutorial( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, clean_train=CLEAN_TRAIN, testing=False, backprop_through_attack=BACKPROP_THROUGH_ATTACK, nb_filters=NB_FILTERS, num_threads=None, label_smoothing=0.1, ): """ MNIST cleverhans tutorial :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param clean_train: perform normal training on clean examples only before performing adversarial training. :param testing: if true, complete an AccuracyReport for unit tests to verify that performance is adequate :param backprop_through_attack: If True, backprop through adversarial example construction process during adversarial training. :param label_smoothing: float, amount of label smoothing for cross entropy :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.DEBUG) # Create TF session if num_threads: config_args = dict(intra_op_parallelism_threads=1) else: config_args = {} sess = tf.Session(config=tf.ConfigProto(**config_args)) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Use Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } eval_params = {"batch_size": batch_size} fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} rng = np.random.RandomState([2017, 8, 30]) def do_eval(preds, x_set, y_set, report_key, is_adv=None): """ Run the evaluation and print the results. """ acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params) setattr(report, report_key, acc) if is_adv is None: report_text = None elif is_adv: report_text = "adversarial" else: report_text = "legitimate" if report_text: print("Test accuracy on %s examples: %0.4f" % (report_text, acc)) if clean_train: model = make_basic_picklable_cnn() # Tag the model so that when it is saved to disk, future scripts will # be able to tell what data it was trained on model.dataset_factory = mnist.get_factory() preds = model.get_logits(x) assert len(model.get_params()) > 0 loss = CrossEntropy(model, smoothing=label_smoothing) def evaluate(): """ Run evaluation for the naively trained model on clean examples. """ do_eval(preds, x_test, y_test, "clean_train_clean_eval", False) train( sess, loss, x_train, y_train, evaluate=evaluate, args=train_params, rng=rng, var_list=model.get_params(), ) with sess.as_default(): save("clean_model.joblib", model) print( "Now that the model has been saved, you can evaluate it in a" " separate process using `evaluate_pickled_model.py`. " "You should get exactly the same result for both clean and " "adversarial accuracy as you get within this program." ) # Calculate training error if testing: do_eval(preds, x_train, y_train, "train_clean_train_clean_eval") # Initialize the Fast Gradient Sign Method (FGSM) attack object and # graph fgsm = FastGradientMethod(model, sess=sess) adv_x = fgsm.generate(x, **fgsm_params) preds_adv = model.get_logits(adv_x) # Evaluate the accuracy of the MNIST model on adversarial examples do_eval(preds_adv, x_test, y_test, "clean_train_adv_eval", True) # Calculate training error if testing: do_eval(preds_adv, x_train, y_train, "train_clean_train_adv_eval") print("Repeating the process, using adversarial training") # Create a new model and train it to be robust to FastGradientMethod model2 = make_basic_picklable_cnn() # Tag the model so that when it is saved to disk, future scripts will # be able to tell what data it was trained on model2.dataset_factory = mnist.get_factory() fgsm2 = FastGradientMethod(model2, sess=sess) def attack(x): """Return an adversarial example near clean example `x`""" return fgsm2.generate(x, **fgsm_params) loss2 = CrossEntropy(model2, smoothing=label_smoothing, attack=attack) preds2 = model2.get_logits(x) adv_x2 = attack(x) if not backprop_through_attack: # For the fgsm attack used in this tutorial, the attack has zero # gradient so enabling this flag does not change the gradient. # For some other attacks, enabling this flag increases the cost of # training, but gives the defender the ability to anticipate how # the atacker will change their strategy in response to updates to # the defender's parameters. adv_x2 = tf.stop_gradient(adv_x2) preds2_adv = model2.get_logits(adv_x2) def evaluate_adv(): """ Evaluate the adversarially trained model. """ # Accuracy of adversarially trained model on legitimate test inputs do_eval(preds2, x_test, y_test, "adv_train_clean_eval", False) # Accuracy of the adversarially trained model on adversarial examples do_eval(preds2_adv, x_test, y_test, "adv_train_adv_eval", True) # Perform and evaluate adversarial training train( sess, loss2, x_train, y_train, evaluate=evaluate_adv, args=train_params, rng=rng, var_list=model2.get_params(), ) with sess.as_default(): save("adv_model.joblib", model2) print( "Now that the model has been saved, you can evaluate it in a " "separate process using " "`python evaluate_pickled_model.py adv_model.joblib`. " "You should get exactly the same result for both clean and " "adversarial accuracy as you get within this program." " You can also move beyond the tutorials directory and run the " " real `compute_accuracy.py` script (make sure cleverhans/scripts " "is in your PATH) to see that this FGSM-trained " "model is actually not very robust---it's just a model that trains " " quickly so the tutorial does not take a long time" ) # Calculate training errors if testing: do_eval(preds2, x_train, y_train, "train_adv_train_clean_eval") do_eval(preds2_adv, x_train, y_train, "train_adv_train_adv_eval") return report def main(argv=None): """ Run the tutorial using command line flags """ from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, clean_train=FLAGS.clean_train, backprop_through_attack=FLAGS.backprop_through_attack, nb_filters=FLAGS.nb_filters, ) if __name__ == "__main__": flags.DEFINE_integer("nb_filters", NB_FILTERS, "Model size multiplier") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_bool("clean_train", CLEAN_TRAIN, "Train on clean examples") flags.DEFINE_bool( "backprop_through_attack", BACKPROP_THROUGH_ATTACK, ( "If True, backprop through adversarial example " "construction process during adversarial training" ), ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_pytorch.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM and train a model using adversarial training with TensorFlow. It is very similar to mnist_tutorial_keras_tf.py, which does the same thing but with a dependence on keras. The original paper can be found at: https://arxiv.org/abs/1412.6572 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import warnings import numpy as np import tensorflow as tf import torch from torch import nn import torch.nn.functional as F from torch import optim from torch.autograd import Variable from torchvision import datasets, transforms from cleverhans.attacks import FastGradientMethod from cleverhans.compat import flags from cleverhans.model import CallableModelWrapper from cleverhans.utils import AccuracyReport from cleverhans.utils_pytorch import convert_pytorch_model_to_tf FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 warnings.warn( "convert_pytorch_model_to_tf is deprecated, switch to" + " dedicated PyTorch support provided by CleverHans v4." ) class PytorchMnistModel(nn.Module): """Basic MNIST model from github https://github.com/rickiepark/pytorch-examples/blob/master/mnist.ipynb """ def __init__(self): super(PytorchMnistModel, self).__init__() # input is 28x28 # padding=2 for same padding self.conv1 = nn.Conv2d(1, 32, 5, padding=2) # feature map size is 14*14 by pooling # padding=2 for same padding self.conv2 = nn.Conv2d(32, 64, 5, padding=2) # feature map size is 7*7 by pooling self.fc1 = nn.Linear(64 * 7 * 7, 1024) self.fc2 = nn.Linear(1024, 10) def forward(self, x): x = F.max_pool2d(F.relu(self.conv1(x)), 2) x = F.max_pool2d(F.relu(self.conv2(x)), 2) x = x.view(-1, 64 * 7 * 7) # reshape Variable x = F.relu(self.fc1(x)) x = self.fc2(x) return F.log_softmax(x, dim=-1) def mnist_tutorial( nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, train_end=-1, test_end=-1, learning_rate=LEARNING_RATE, ): """ MNIST cleverhans tutorial :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :return: an AccuracyReport object """ # Train a pytorch MNIST model torch_model = PytorchMnistModel() if torch.cuda.is_available(): torch_model = torch_model.cuda() report = AccuracyReport() train_loader = torch.utils.data.DataLoader( datasets.MNIST( "data", train=True, download=True, transform=transforms.ToTensor() ), batch_size=batch_size, shuffle=True, ) test_loader = torch.utils.data.DataLoader( datasets.MNIST("data", train=False, transform=transforms.ToTensor()), batch_size=batch_size, ) # Truncate the datasets so that our test run more quickly train_loader.dataset.train_data = train_loader.dataset.train_data[:train_end] test_loader.dataset.test_data = test_loader.dataset.test_data[:test_end] # Train our model optimizer = optim.Adam(torch_model.parameters(), lr=learning_rate) train_loss = [] total = 0 correct = 0 step = 0 for _epoch in range(nb_epochs): for xs, ys in train_loader: xs, ys = Variable(xs), Variable(ys) if torch.cuda.is_available(): xs, ys = xs.cuda(), ys.cuda() optimizer.zero_grad() preds = torch_model(xs) loss = F.nll_loss(preds, ys) loss.backward() # calc gradients train_loss.append(loss.data.item()) optimizer.step() # update gradients preds_np = preds.cpu().detach().numpy() correct += (np.argmax(preds_np, axis=1) == ys.cpu().detach().numpy()).sum() total += train_loader.batch_size step += 1 if total % 1000 == 0: acc = float(correct) / total print("[%s] Training accuracy: %.2f%%" % (step, acc * 100)) total = 0 correct = 0 # Evaluate on clean data total = 0 correct = 0 for xs, ys in test_loader: xs, ys = Variable(xs), Variable(ys) if torch.cuda.is_available(): xs, ys = xs.cuda(), ys.cuda() preds = torch_model(xs) preds_np = preds.cpu().detach().numpy() correct += (np.argmax(preds_np, axis=1) == ys.cpu().detach().numpy()).sum() total += len(xs) acc = float(correct) / total report.clean_train_clean_eval = acc print("[%s] Clean accuracy: %.2f%%" % (step, acc * 100)) # We use tf for evaluation on adversarial data sess = tf.Session() x_op = tf.placeholder( tf.float32, shape=( None, 1, 28, 28, ), ) # Convert pytorch model to a tf_model and wrap it in cleverhans tf_model_fn = convert_pytorch_model_to_tf(torch_model) cleverhans_model = CallableModelWrapper(tf_model_fn, output_layer="logits") # Create an FGSM attack fgsm_op = FastGradientMethod(cleverhans_model, sess=sess) fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} adv_x_op = fgsm_op.generate(x_op, **fgsm_params) adv_preds_op = tf_model_fn(adv_x_op) # Run an evaluation of our model against fgsm total = 0 correct = 0 for xs, ys in test_loader: adv_preds = sess.run(adv_preds_op, feed_dict={x_op: xs}) correct += (np.argmax(adv_preds, axis=1) == ys.cpu().detach().numpy()).sum() total += test_loader.batch_size acc = float(correct) / total print("Adv accuracy: {:.3f}".format(acc * 100)) report.clean_train_adv_eval = acc return report def main(_=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_tf.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM and train a model using adversarial training with TensorFlow. It is very similar to mnist_tutorial_keras_tf.py, which does the same thing but with a dependence on keras. The original paper can be found at: https://arxiv.org/abs/1412.6572 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np import tensorflow as tf from cleverhans.compat import flags from cleverhans.loss import CrossEntropy from cleverhans.dataset import MNIST from cleverhans.utils_tf import model_eval from cleverhans.train import train from cleverhans.attacks import FastGradientMethod from cleverhans.utils import AccuracyReport, set_log_level from cleverhans.model_zoo.basic_cnn import ModelBasicCNN FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 CLEAN_TRAIN = True BACKPROP_THROUGH_ATTACK = False NB_FILTERS = 64 def mnist_tutorial( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, clean_train=CLEAN_TRAIN, testing=False, backprop_through_attack=BACKPROP_THROUGH_ATTACK, nb_filters=NB_FILTERS, num_threads=None, label_smoothing=0.1, ): """ MNIST cleverhans tutorial :param train_start: index of first training set example :param train_end: index of last training set example :param test_start: index of first test set example :param test_end: index of last test set example :param nb_epochs: number of epochs to train model :param batch_size: size of training batches :param learning_rate: learning rate for training :param clean_train: perform normal training on clean examples only before performing adversarial training. :param testing: if true, complete an AccuracyReport for unit tests to verify that performance is adequate :param backprop_through_attack: If True, backprop through adversarial example construction process during adversarial training. :param label_smoothing: float, amount of label smoothing for cross entropy :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.DEBUG) # Create TF session if num_threads: config_args = dict(intra_op_parallelism_threads=1) else: config_args = {} sess = tf.Session(config=tf.ConfigProto(**config_args)) # Get MNIST data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) x_train, y_train = mnist.get_set("train") x_test, y_test = mnist.get_set("test") # Use Image Parameters img_rows, img_cols, nchannels = x_train.shape[1:4] nb_classes = y_train.shape[1] # Define input TF placeholder x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels)) y = tf.placeholder(tf.float32, shape=(None, nb_classes)) # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } eval_params = {"batch_size": batch_size} fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} rng = np.random.RandomState([2017, 8, 30]) def do_eval(preds, x_set, y_set, report_key, is_adv=None): acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params) setattr(report, report_key, acc) if is_adv is None: report_text = None elif is_adv: report_text = "adversarial" else: report_text = "legitimate" if report_text: print("Test accuracy on %s examples: %0.4f" % (report_text, acc)) if clean_train: model = ModelBasicCNN("model1", nb_classes, nb_filters) preds = model.get_logits(x) loss = CrossEntropy(model, smoothing=label_smoothing) def evaluate(): do_eval(preds, x_test, y_test, "clean_train_clean_eval", False) train( sess, loss, x_train, y_train, evaluate=evaluate, args=train_params, rng=rng, var_list=model.get_params(), ) # Calculate training error if testing: do_eval(preds, x_train, y_train, "train_clean_train_clean_eval") # Initialize the Fast Gradient Sign Method (FGSM) attack object and # graph fgsm = FastGradientMethod(model, sess=sess) adv_x = fgsm.generate(x, **fgsm_params) preds_adv = model.get_logits(adv_x) # Evaluate the accuracy of the MNIST model on adversarial examples do_eval(preds_adv, x_test, y_test, "clean_train_adv_eval", True) # Calculate training error if testing: do_eval(preds_adv, x_train, y_train, "train_clean_train_adv_eval") print("Repeating the process, using adversarial training") # Create a new model and train it to be robust to FastGradientMethod model2 = ModelBasicCNN("model2", nb_classes, nb_filters) fgsm2 = FastGradientMethod(model2, sess=sess) def attack(x): return fgsm2.generate(x, **fgsm_params) loss2 = CrossEntropy(model2, smoothing=label_smoothing, attack=attack) preds2 = model2.get_logits(x) adv_x2 = attack(x) if not backprop_through_attack: # For the fgsm attack used in this tutorial, the attack has zero # gradient so enabling this flag does not change the gradient. # For some other attacks, enabling this flag increases the cost of # training, but gives the defender the ability to anticipate how # the atacker will change their strategy in response to updates to # the defender's parameters. adv_x2 = tf.stop_gradient(adv_x2) preds2_adv = model2.get_logits(adv_x2) def evaluate2(): # Accuracy of adversarially trained model on legitimate test inputs do_eval(preds2, x_test, y_test, "adv_train_clean_eval", False) # Accuracy of the adversarially trained model on adversarial examples do_eval(preds2_adv, x_test, y_test, "adv_train_adv_eval", True) # Perform and evaluate adversarial training train( sess, loss2, x_train, y_train, evaluate=evaluate2, args=train_params, rng=rng, var_list=model2.get_params(), ) # Calculate training errors if testing: do_eval(preds2, x_train, y_train, "train_adv_train_clean_eval") do_eval(preds2_adv, x_train, y_train, "train_adv_train_adv_eval") return report def main(argv=None): """ Run the tutorial using command line flags. """ from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, clean_train=FLAGS.clean_train, backprop_through_attack=FLAGS.backprop_through_attack, nb_filters=FLAGS.nb_filters, ) if __name__ == "__main__": flags.DEFINE_integer("nb_filters", NB_FILTERS, "Model size multiplier") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_bool("clean_train", CLEAN_TRAIN, "Train on clean examples") flags.DEFINE_bool( "backprop_through_attack", BACKPROP_THROUGH_ATTACK, ( "If True, backprop through adversarial example " "construction process during adversarial training" ), ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_tfe.py ================================================ """ This tutorial shows how to generate adversarial examples using FGSM and train a model using adversarial training with TensorFlow Eager. It is similar to mnist_tutorial_tf.py. mnist_tutorial_tf - dynaminc eager execution. mnist_tutorial_tf - graph based execution. The original paper can be found at: https://arxiv.org/abs/1412.6572 """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np import tensorflow as tf from cleverhans.compat import flags from cleverhans.utils import AccuracyReport from cleverhans.utils_tfe import train, model_eval from cleverhans.attacks_tfe import BasicIterativeMethod from cleverhans.attacks_tfe import FastGradientMethod from cleverhans.dataset import MNIST from cleverhans.utils import set_log_level from cleverhans_tutorials.tutorial_models_tfe import ModelBasicCNNTFE if tf.executing_eagerly() is True: print("TF Eager Activated.") else: raise Exception("Error Enabling Eager Execution.") tfe = tf.contrib.eager FLAGS = flags.FLAGS NB_EPOCHS = 6 BATCH_SIZE = 128 LEARNING_RATE = 0.001 NB_FILTERS = 64 # Keeps track of implemented attacks. # Maps attack string taken from bash to attack class # -- 'fgsm' : FastGradientMethod # -- 'bim': BasicIterativeMethod AVAILABLE_ATTACKS = {"fgsm": FastGradientMethod, "bim": BasicIterativeMethod} def attack_selection(attack_string): """ Selects the Attack Class using string input. :param attack_string: adversarial attack name in string format :return: attack class defined in cleverhans.attacks_eager """ # List of Implemented attacks attacks_list = AVAILABLE_ATTACKS.keys() # Checking for requested attack in list of available attacks. if attack_string is None: raise AttributeError( "Attack type is not specified, " "list of available attacks\t".join(attacks_list) ) if attack_string not in attacks_list: raise AttributeError( "Attack not available " "list of available attacks\t".join(attacks_list) ) # Mapping attack from string to class. attack_class = AVAILABLE_ATTACKS[attack_string] return attack_class def mnist_tutorial( train_start=0, train_end=60000, test_start=0, test_end=10000, nb_epochs=NB_EPOCHS, batch_size=BATCH_SIZE, learning_rate=LEARNING_RATE, clean_train=True, testing=False, backprop_through_attack=False, nb_filters=NB_FILTERS, num_threads=None, attack_string=None, ): """ MNIST cleverhans tutorial :param train_start: index of first training set example. :param train_end: index of last training set example. :param test_start: index of first test set example. :param test_end: index of last test set example. :param nb_epochs: number of epochs to train model. :param batch_size: size of training batches. :param learning_rate: learning rate for training. :param clean_train: perform normal training on clean examples only before performing adversarial training. :param testing: if true, complete an AccuracyReport for unit tests to verify that performance is adequate. :param backprop_through_attack: If True, backprop through adversarial example construction process during adversarial training. :param nb_filters: number of filters in the CNN used for training. :param num_threads: number of threads used for running the process. :param attack_string: attack name for crafting adversarial attacks and adversarial training, in string format. :return: an AccuracyReport object """ # Object used to keep track of (and return) key accuracies report = AccuracyReport() # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.DEBUG) # Get MNIST test data mnist = MNIST( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) X_train, Y_train = mnist.get_set("train") X_test, Y_test = mnist.get_set("test") # Use label smoothing assert Y_train.shape[1] == 10 label_smooth = 0.1 Y_train = Y_train.clip(label_smooth / 9.0, 1.0 - label_smooth) # Train an MNIST model train_params = { "nb_epochs": nb_epochs, "batch_size": batch_size, "learning_rate": learning_rate, } # Initialize the attack object attack_class = attack_selection(attack_string) attack_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} rng = np.random.RandomState([2018, 6, 18]) if clean_train: model = ModelBasicCNNTFE(nb_filters=nb_filters) def evaluate_clean(): """Evaluate the accuracy of the MNIST model on legitimate test examples """ eval_params = {"batch_size": batch_size} acc = model_eval(model, X_test, Y_test, args=eval_params) report.clean_train_clean_eval = acc assert X_test.shape[0] == test_end - test_start, X_test.shape print("Test accuracy on legitimate examples: %0.4f" % acc) train( model, X_train, Y_train, evaluate=evaluate_clean, args=train_params, rng=rng, var_list=model.get_params(), ) if testing: # Calculate training error eval_params = {"batch_size": batch_size} acc = model_eval(model, X_train, Y_train, args=eval_params) report.train_clean_train_clean_eval = acc # Evaluate the accuracy of the MNIST model on adversarial examples eval_par = {"batch_size": batch_size} attack = attack_class(model) acc = model_eval( model, X_test, Y_test, args=eval_par, attack=attack, attack_args=attack_params, ) print("Test accuracy on adversarial examples: %0.4f\n" % acc) report.clean_train_adv_eval = acc # Calculate training error if testing: eval_par = {"batch_size": batch_size} acc = model_eval( model, X_train, Y_train, args=eval_par, attack=attack, attack_args=attack_params, ) print("Train accuracy on adversarial examples: %0.4f\n" % acc) report.train_clean_train_adv_eval = acc attack = None print("Repeating the process, using adversarial training") model_adv_train = ModelBasicCNNTFE(nb_filters=nb_filters) attack = attack_class(model_adv_train) def evaluate_adv(): # Accuracy of adversarially trained model on legitimate test inputs eval_params = {"batch_size": batch_size} accuracy = model_eval(model_adv_train, X_test, Y_test, args=eval_params) print("Test accuracy on legitimate examples: %0.4f" % accuracy) report.adv_train_clean_eval = accuracy # Accuracy of the adversarially trained model on adversarial examples accuracy = model_eval( model_adv_train, X_test, Y_test, args=eval_params, attack=attack, attack_args=attack_params, ) print("Test accuracy on adversarial examples: %0.4f" % accuracy) report.adv_train_adv_eval = accuracy # Perform and evaluate adversarial training train( model_adv_train, X_train, Y_train, evaluate=evaluate_adv, args=train_params, rng=rng, var_list=model_adv_train.get_params(), attack=attack, attack_args=attack_params, ) # Calculate training errors if testing: eval_params = {"batch_size": batch_size} accuracy = model_eval( model_adv_train, X_train, Y_train, args=eval_params, attack=None, attack_args=None, ) report.train_adv_train_clean_eval = accuracy accuracy = model_eval( model_adv_train, X_train, Y_train, args=eval_params, attack=attack, attack_args=attack_params, ) report.train_adv_train_adv_eval = accuracy return report def main(argv=None): from cleverhans_tutorials import check_installation check_installation(__file__) mnist_tutorial( nb_epochs=FLAGS.nb_epochs, batch_size=FLAGS.batch_size, learning_rate=FLAGS.learning_rate, clean_train=FLAGS.clean_train, backprop_through_attack=FLAGS.backprop_through_attack, nb_filters=FLAGS.nb_filters, attack_string=FLAGS.attack, ) if __name__ == "__main__": flags.DEFINE_integer("nb_filters", NB_FILTERS, "Model size multiplier") flags.DEFINE_integer("nb_epochs", NB_EPOCHS, "Number of epochs to train model") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Size of training batches") flags.DEFINE_float("learning_rate", LEARNING_RATE, "Learning rate for training") flags.DEFINE_bool("clean_train", True, "Train on clean examples") flags.DEFINE_bool( "backprop_through_attack", False, ( "If True, backprop through adversarial example " "construction process during adversarial training" ), ) flags.DEFINE_string( "attack", "fgsm", "Adversarial attack crafted and used for training" ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/tutorial_models.py ================================================ """ A pure TensorFlow implementation of a neural network. This can be used as a drop-in replacement for a Keras model. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from cleverhans.picklable_model import MLP, Conv2D, ReLU, Flatten, Linear from cleverhans.picklable_model import Softmax def make_basic_picklable_cnn( nb_filters=64, nb_classes=10, input_shape=(None, 28, 28, 1) ): """The model for the picklable models tutorial.""" layers = [ Conv2D(nb_filters, (8, 8), (2, 2), "SAME"), ReLU(), Conv2D(nb_filters * 2, (6, 6), (2, 2), "VALID"), ReLU(), Conv2D(nb_filters * 2, (5, 5), (1, 1), "VALID"), ReLU(), Flatten(), Linear(nb_classes), Softmax(), ] model = MLP(layers, input_shape) return model ================================================ FILE: cleverhans_v3.1.0/cleverhans_tutorials/tutorial_models_tfe.py ================================================ """ A TensorFlow Eager implementation of a neural network. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import tensorflow as tf from cleverhans.model import Model class ModelBasicCNNTFE(Model): """ Basic CNN model for tensorflow eager execution. """ def __init__( self, nb_classes=10, nb_filters=64, dummy_input=tf.zeros((32, 28, 28, 1)) ): Model.__init__(self, nb_classes=nb_classes) # Parametes # number of filters, number of classes. self.nb_filters = nb_filters self.nb_classes = nb_classes # Lists for layers attributes. # layer names , layers, layer activations self.layer_names = ["input", "conv_1", "conv_2", "conv_3", "flatten", "logits"] self.layers = {} self.layer_acts = {} # layer definitions self.layers["conv_1"] = tf.layers.Conv2D( filters=self.nb_filters, kernel_size=8, strides=2, padding="same", activation=tf.nn.relu, ) self.layers["conv_2"] = tf.layers.Conv2D( filters=self.nb_filters * 2, kernel_size=6, strides=2, padding="valid", activation=tf.nn.relu, ) self.layers["conv_3"] = tf.layers.Conv2D( filters=self.nb_filters * 2, kernel_size=5, strides=1, padding="valid", activation=tf.nn.relu, ) self.layers["flatten"] = tf.layers.Flatten() self.layers["logits"] = tf.layers.Dense(self.nb_classes, activation=None) # Dummy fprop to activate the network. self.fprop(dummy_input) def fprop(self, x): """ Forward propagation throught the network :return: dictionary with layer names mapping to activation values. """ # Feed forward through the network layers for layer_name in self.layer_names: if layer_name == "input": prev_layer_act = x continue else: self.layer_acts[layer_name] = self.layers[layer_name](prev_layer_act) prev_layer_act = self.layer_acts[layer_name] # Adding softmax values to list of activations. self.layer_acts["probs"] = tf.nn.softmax(logits=self.layer_acts["logits"]) return self.layer_acts def get_layer_params(self, layer_name): """ Provides access to the parameters of the given layer. Works arounds the non-availability of graph collections in eager mode. :layer_name: name of the layer for which parameters are required, must be one of the string in the list layer_names :return: list of parameters corresponding to the given layer. """ assert layer_name in self.layer_names out = [] layer = self.layers[layer_name] layer_variables = layer.variables # For each parameter in a layer. for param in layer_variables: if param not in out: out.append(param) return out def get_params(self): """ Provides access to the model's parameters. Works arounds the non-availability of graph collections in eager mode. :return: A list of all Variables defining the model parameters. """ assert tf.executing_eagerly() out = [] # Collecting params from each layer. for layer_name in self.layers: out += self.get_layer_params(layer_name) return out def get_layer_names(self): """:return: the list of exposed layers for this model.""" return self.layer_names ================================================ FILE: cleverhans_v3.1.0/docs/.nojekyll ================================================ ================================================ FILE: cleverhans_v3.1.0/docs/README.html ================================================ <no title> — CleverHans documentation

# Generate documentation

To generate the documentation do: make github

The documentation files will be copied to the cleverhans/docs directory.

### Preparation

Please do: pip install sphinx

Add a .nojekyll file in the cleverhans/docs directory. When GitHub sees a .nojekyll file, it serves the root index.html file. The .nojekyll file indicates that we are not using Jekyll as our static site generator in this repository.

### Enable GitHub Pages for the GitHub repository

  1. Go to the repository on the GitHub website and make sure you are logged in.

  2. Add a /docs directory to the master branch. Otherwise you do not get the master branch /docs folder for the Source option in the drop-down list.

  3. Click the Settings tab. You first go to the Options section.

  4. Scroll down to the GitHub Pages section and choose the drop-down list under Source. Note: Your choices will differ based on whether you’re in a User repo or an Org repository.

  5. To keep source and output HTML separate, choose master branch /docs folder for Source.

### Build Sphinx locally and publish on GitHub Pages

We keep the source docsource and output docs separate, but still are able to publish on GitHub Pages and preview builds locally.

We have the following option in the Makefile:

```
github:

@make html @cp -a _build/html/. ../docs

```

Thus, we can run make github from the docsource directory to generate a local preview and move the docs where GitHub wants to serve them from.

### Hacks

If you cannot build the docs for attacks, uncomment import tensorflow_addons as tfa in cleverhans/attacks/spsa.py.

Otherwise:

`angular2html WARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised: cannot import name 'keras_tensor' `

It is convenient to create a virtual environment to install all the specific libraries (e.g. virutalen cleverhans).

================================================ FILE: cleverhans_v3.1.0/docs/_modules/abc.html ================================================ abc — CleverHans documentation

Source code for abc

# Copyright 2007 Google, Inc. All Rights Reserved.
# Licensed to PSF under a Contributor Agreement.

"""Abstract Base Classes (ABCs) according to PEP 3119."""

from _weakrefset import WeakSet


def abstractmethod(funcobj):
    """A decorator indicating abstract methods.

    Requires that the metaclass is ABCMeta or derived from it.  A
    class that has a metaclass derived from ABCMeta cannot be
    instantiated unless all of its abstract methods are overridden.
    The abstract methods can be called using any of the normal
    'super' call mechanisms.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractmethod
            def my_abstract_method(self, ...):
                ...
    """
    funcobj.__isabstractmethod__ = True
    return funcobj


class abstractclassmethod(classmethod):
    """
    A decorator indicating abstract classmethods.

    Similar to abstractmethod.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractclassmethod
            def my_abstract_classmethod(cls, ...):
                ...

    'abstractclassmethod' is deprecated. Use 'classmethod' with
    'abstractmethod' instead.
    """

    __isabstractmethod__ = True

    def __init__(self, callable):
        callable.__isabstractmethod__ = True
        super().__init__(callable)


class abstractstaticmethod(staticmethod):
    """
    A decorator indicating abstract staticmethods.

    Similar to abstractmethod.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractstaticmethod
            def my_abstract_staticmethod(...):
                ...

    'abstractstaticmethod' is deprecated. Use 'staticmethod' with
    'abstractmethod' instead.
    """

    __isabstractmethod__ = True

    def __init__(self, callable):
        callable.__isabstractmethod__ = True
        super().__init__(callable)


class abstractproperty(property):
    """
    A decorator indicating abstract properties.

    Requires that the metaclass is ABCMeta or derived from it.  A
    class that has a metaclass derived from ABCMeta cannot be
    instantiated unless all of its abstract properties are overridden.
    The abstract properties can be called using any of the normal
    'super' call mechanisms.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractproperty
            def my_abstract_property(self):
                ...

    This defines a read-only property; you can also define a read-write
    abstract property using the 'long' form of property declaration:

        class C(metaclass=ABCMeta):
            def getx(self): ...
            def setx(self, value): ...
            x = abstractproperty(getx, setx)

    'abstractproperty' is deprecated. Use 'property' with 'abstractmethod'
    instead.
    """

    __isabstractmethod__ = True


[docs]class ABCMeta(type): """Metaclass for defining Abstract Base Classes (ABCs). Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in class. You can also register unrelated concrete classes (even built-in classes) and unrelated ABCs as 'virtual subclasses' -- these and their descendants will be considered subclasses of the registering ABC by the built-in issubclass() function, but the registering ABC won't show up in their MRO (Method Resolution Order) nor will method implementations defined by the registering ABC be callable (not even via super()). """ # A global counter that is incremented each time a class is # registered as a virtual subclass of anything. It forces the # negative cache to be cleared before its next use. # Note: this counter is private. Use `abc.get_cache_token()` for # external code. _abc_invalidation_counter = 0 def __new__(mcls, name, bases, namespace, **kwargs): cls = super().__new__(mcls, name, bases, namespace, **kwargs) # Compute set of abstract method names abstracts = {name for name, value in namespace.items() if getattr(value, "__isabstractmethod__", False)} for base in bases: for name in getattr(base, "__abstractmethods__", set()): value = getattr(cls, name, None) if getattr(value, "__isabstractmethod__", False): abstracts.add(name) cls.__abstractmethods__ = frozenset(abstracts) # Set up inheritance registry cls._abc_registry = WeakSet() cls._abc_cache = WeakSet() cls._abc_negative_cache = WeakSet() cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter return cls
[docs] def register(cls, subclass): """Register a virtual subclass of an ABC. Returns the subclass, to allow usage as a class decorator. """ if not isinstance(subclass, type): raise TypeError("Can only register classes") if issubclass(subclass, cls): return subclass # Already a subclass # Subtle: test for cycles *after* testing for "already a subclass"; # this means we allow X.register(X) and interpret it as a no-op. if issubclass(cls, subclass): # This would create a cycle, which is bad for the algorithm below raise RuntimeError("Refusing to create an inheritance cycle") cls._abc_registry.add(subclass) ABCMeta._abc_invalidation_counter += 1 # Invalidate negative cache return subclass
def _dump_registry(cls, file=None): """Debug helper to print the ABC registry.""" print("Class: %s.%s" % (cls.__module__, cls.__qualname__), file=file) print("Inv.counter: %s" % ABCMeta._abc_invalidation_counter, file=file) for name in sorted(cls.__dict__): if name.startswith("_abc_"): value = getattr(cls, name) if isinstance(value, WeakSet): value = set(value) print("%s: %r" % (name, value), file=file) def __instancecheck__(cls, instance): """Override for isinstance(instance, cls).""" # Inline the cache checking subclass = instance.__class__ if subclass in cls._abc_cache: return True subtype = type(instance) if subtype is subclass: if (cls._abc_negative_cache_version == ABCMeta._abc_invalidation_counter and subclass in cls._abc_negative_cache): return False # Fall back to the subclass check. return cls.__subclasscheck__(subclass) return any(cls.__subclasscheck__(c) for c in {subclass, subtype}) def __subclasscheck__(cls, subclass): """Override for issubclass(subclass, cls).""" # Check cache if subclass in cls._abc_cache: return True # Check negative cache; may have to invalidate if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter: # Invalidate the negative cache cls._abc_negative_cache = WeakSet() cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter elif subclass in cls._abc_negative_cache: return False # Check the subclass hook ok = cls.__subclasshook__(subclass) if ok is not NotImplemented: assert isinstance(ok, bool) if ok: cls._abc_cache.add(subclass) else: cls._abc_negative_cache.add(subclass) return ok # Check if it's a direct subclass if cls in getattr(subclass, '__mro__', ()): cls._abc_cache.add(subclass) return True # Check if it's a subclass of a registered class (recursive) for rcls in cls._abc_registry: if issubclass(subclass, rcls): cls._abc_cache.add(subclass) return True # Check if it's a subclass of a subclass (recursive) for scls in cls.__subclasses__(): if issubclass(subclass, scls): cls._abc_cache.add(subclass) return True # No dice; update negative cache cls._abc_negative_cache.add(subclass) return False
class ABC(metaclass=ABCMeta): """Helper class that provides a standard way to create an ABC using inheritance. """ pass def get_cache_token(): """Returns the current ABC cache token. The token is an opaque object (supporting equality testing) identifying the current version of the ABC cache for virtual subclasses. The token changes with every call to ``register()`` on any ABC. """ return ABCMeta._abc_invalidation_counter
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/attack.html ================================================ cleverhans.attacks.attack — CleverHans documentation

Source code for cleverhans.attacks.attack

"""
The Attack interface.
"""

from abc import ABCMeta
import collections
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.compat import reduce_max
from cleverhans.model import Model
from cleverhans import utils

_logger = utils.create_logger("cleverhans.attacks.attack")


[docs]class Attack(object): """ Abstract base class for all attack classes. """ __metaclass__ = ABCMeta def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ :param model: An instance of the cleverhans.model.Model class. :param sess: The (possibly optional) tf.Session to run graphs in. :param dtypestr: Floating point precision to use (change to float64 to avoid numerical instabilities). :param back: (deprecated and will be removed on or after 2019-03-26). The backend to use. Currently 'tf' is the only option. """ if 'back' in kwargs: if kwargs['back'] == 'tf': warnings.warn("Argument back to attack constructors is not needed" " anymore and will be removed on or after 2019-03-26." " All attacks are implemented using TensorFlow.") else: raise ValueError("Backend argument must be 'tf' and is now deprecated" "It will be removed on or after 2019-03-26.") self.tf_dtype = tf.as_dtype(dtypestr) self.np_dtype = np.dtype(dtypestr) if sess is not None and not isinstance(sess, tf.Session): raise TypeError("sess is not an instance of tf.Session") from cleverhans import attacks_tf attacks_tf.np_dtype = self.np_dtype attacks_tf.tf_dtype = self.tf_dtype if not isinstance(model, Model): raise TypeError("The model argument should be an instance of" " the cleverhans.model.Model class.") # Prepare attributes self.model = model self.sess = sess self.dtypestr = dtypestr # We are going to keep track of old graphs and cache them. self.graphs = {} # When calling generate_np, arguments in the following set should be # fed into the graph, as they are not structural items that require # generating a new graph. # This dict should map names of arguments to the types they should # have. # (Usually, the target class will be a feedable keyword argument.) self.feedable_kwargs = tuple() # When calling generate_np, arguments in the following set should NOT # be fed into the graph, as they ARE structural items that require # generating a new graph. # This list should contain the names of the structural arguments. self.structural_kwargs = []
[docs] def generate(self, x, **kwargs): """ Generate the attack's symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator. :param x: The model's symbolic inputs. :param **kwargs: optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names: clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified. If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input. For other concepts, it's generally a good idea to read other classes and check for name consistency. :return: A symbolic representation of the adversarial examples. """ error = "Sub-classes must implement generate." raise NotImplementedError(error) # Include an unused return so pylint understands the method signature return x
[docs] def construct_graph(self, fixed, feedable, x_val, hash_key): """ Construct the graph required to run the attack through generate_np. :param fixed: Structural elements that require defining a new graph. :param feedable: Arguments that can be fed to the same graph when they take different values. :param x_val: symbolic adversarial example :param hash_key: the key used to store this graph in our cache """ # try our very best to create a TF placeholder for each of the # feedable keyword arguments, and check the types are one of # the allowed types class_name = str(self.__class__).split(".")[-1][:-2] _logger.info("Constructing new graph for attack " + class_name) # remove the None arguments, they are just left blank for k in list(feedable.keys()): if feedable[k] is None: del feedable[k] # process all of the rest and create placeholders for them new_kwargs = dict(x for x in fixed.items()) for name, value in feedable.items(): given_type = value.dtype if isinstance(value, np.ndarray): if value.ndim == 0: # This is pretty clearly not a batch of data new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name) else: # Assume that this is a batch of data, make the first axis variable # in size new_shape = [None] + list(value.shape[1:]) new_kwargs[name] = tf.placeholder(given_type, new_shape, name=name) elif isinstance(value, utils.known_number_types): new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name) else: raise ValueError("Could not identify type of argument " + name + ": " + str(value)) # x is a special placeholder we always want to have x_shape = [None] + list(x_val.shape)[1:] x = tf.placeholder(self.tf_dtype, shape=x_shape) # now we generate the graph that we want x_adv = self.generate(x, **new_kwargs) self.graphs[hash_key] = (x, new_kwargs, x_adv) if len(self.graphs) >= 10: warnings.warn("Calling generate_np() with multiple different " "structural parameters is inefficient and should" " be avoided. Calling generate() is preferred.")
[docs] def generate_np(self, x_val, **kwargs): """ Generate adversarial examples and return them as a NumPy array. Sub-classes *should not* implement this method unless they must perform special handling of arguments. :param x_val: A NumPy array with the original inputs. :param **kwargs: optional parameters used by child classes. :return: A NumPy array holding the adversarial examples. """ if self.sess is None: raise ValueError("Cannot use `generate_np` when no `sess` was" " provided") packed = self.construct_variables(kwargs) fixed, feedable, _, hash_key = packed if hash_key not in self.graphs: self.construct_graph(fixed, feedable, x_val, hash_key) else: # remove the None arguments, they are just left blank for k in list(feedable.keys()): if feedable[k] is None: del feedable[k] x, new_kwargs, x_adv = self.graphs[hash_key] feed_dict = {x: x_val} for name in feedable: feed_dict[new_kwargs[name]] = feedable[name] return self.sess.run(x_adv, feed_dict)
[docs] def construct_variables(self, kwargs): """ Construct the inputs to the attack graph to be used by generate_np. :param kwargs: Keyword arguments to generate_np. :return: Structural arguments Feedable arguments Output of `arg_type` describing feedable arguments A unique key """ if isinstance(self.feedable_kwargs, dict): warnings.warn("Using a dict for `feedable_kwargs is deprecated." "Switch to using a tuple." "It is not longer necessary to specify the types " "of the arguments---we build a different graph " "for each received type." "Using a dict may become an error on or after " "2019-04-18.") feedable_names = tuple(sorted(self.feedable_kwargs.keys())) else: feedable_names = self.feedable_kwargs if not isinstance(feedable_names, tuple): raise TypeError("Attack.feedable_kwargs should be a tuple, but " "for subclass " + str(type(self)) + " it is " + str(self.feedable_kwargs) + " of type " + str(type(self.feedable_kwargs))) # the set of arguments that are structural properties of the attack # if these arguments are different, we must construct a new graph fixed = dict( (k, v) for k, v in kwargs.items() if k in self.structural_kwargs) # the set of arguments that are passed as placeholders to the graph # on each call, and can change without constructing a new graph feedable = {k: v for k, v in kwargs.items() if k in feedable_names} for k in feedable: if isinstance(feedable[k], (float, int)): feedable[k] = np.array(feedable[k]) for key in kwargs: if key not in fixed and key not in feedable: raise ValueError(str(type(self)) + ": Undeclared argument: " + key) feed_arg_type = arg_type(feedable_names, feedable) if not all(isinstance(value, collections.Hashable) for value in fixed.values()): # we have received a fixed value that isn't hashable # this means we can't cache this graph for later use, # and it will have to be discarded later hash_key = None else: # create a unique key for this set of fixed paramaters hash_key = tuple(sorted(fixed.items())) + tuple([feed_arg_type]) return fixed, feedable, feed_arg_type, hash_key
[docs] def get_or_guess_labels(self, x, kwargs): """ Get the label to use in generating an adversarial example for x. The kwargs are fed directly from the kwargs of the attack. If 'y' is in kwargs, then assume it's an untargeted attack and use that as the label. If 'y_target' is in kwargs and is not none, then assume it's a targeted attack and use that as the label. Otherwise, use the model's prediction as the label and perform an untargeted attack. """ if 'y' in kwargs and 'y_target' in kwargs: raise ValueError("Can not set both 'y' and 'y_target'.") elif 'y' in kwargs: labels = kwargs['y'] elif 'y_target' in kwargs and kwargs['y_target'] is not None: labels = kwargs['y_target'] else: preds = self.model.get_probs(x) preds_max = reduce_max(preds, 1, keepdims=True) original_predictions = tf.to_float(tf.equal(preds, preds_max)) labels = tf.stop_gradient(original_predictions) del preds if isinstance(labels, np.ndarray): nb_classes = labels.shape[1] else: nb_classes = labels.get_shape().as_list()[1] return labels, nb_classes
[docs] def parse_params(self, params=None): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param params: a dictionary of attack-specific parameters :return: True when parsing was successful """ if params is not None: warnings.warn("`params` is unused and will be removed " " on or after 2019-04-26.") return True
def arg_type(arg_names, kwargs): """ Returns a hashable summary of the types of arg_names within kwargs. :param arg_names: tuple containing names of relevant arguments :param kwargs: dict mapping string argument names to values. These must be values for which we can create a tf placeholder. Currently supported: numpy darray or something that can ducktype it returns: API contract is to return a hashable object describing all structural consequences of argument values that can otherwise be fed into a graph of fixed structure. Currently this is implemented as a tuple of tuples that track: - whether each argument was passed - whether each argument was passed and not None - the dtype of each argument Callers shouldn't rely on the exact structure of this object, just its hashability and one-to-one mapping between graph structures. """ assert isinstance(arg_names, tuple) passed = tuple(name in kwargs for name in arg_names) passed_and_not_none = [] for name in arg_names: if name in kwargs: passed_and_not_none.append(kwargs[name] is not None) else: passed_and_not_none.append(False) passed_and_not_none = tuple(passed_and_not_none) dtypes = [] for name in arg_names: if name not in kwargs: dtypes.append(None) continue value = kwargs[name] if value is None: dtypes.append(None) continue assert hasattr(value, 'dtype'), type(value) dtype = value.dtype if not isinstance(dtype, np.dtype): dtype = dtype.as_np_dtype assert isinstance(dtype, np.dtype) dtypes.append(dtype) dtypes = tuple(dtypes) return (passed, passed_and_not_none, dtypes)
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/basic_iterative_method.html ================================================ cleverhans.attacks.basic_iterative_method — CleverHans documentation

Source code for cleverhans.attacks.basic_iterative_method

"""
The BasicIterativeMethod attack.
"""

from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent


[docs]class BasicIterativeMethod(ProjectedGradientDescent): """ The BasicIterativeMethod attack. """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(BasicIterativeMethod, self).__init__(model, sess=sess, dtypestr=dtypestr, default_rand_init=False, **kwargs)
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/carlini_wagner_l2.html ================================================ cleverhans.attacks.carlini_wagner_l2 — CleverHans documentation

Source code for cleverhans.attacks.carlini_wagner_l2

"""The CarliniWagnerL2 attack
"""
# pylint: disable=missing-docstring
import logging

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, reduce_max
from cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits
from cleverhans import utils

np_dtype = np.dtype('float32')
tf_dtype = tf.as_dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.carlini_wagner_l2")
_logger.setLevel(logging.INFO)


[docs]class CarliniWagnerL2(Attack): """ This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644 At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(CarliniWagnerL2, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y', 'y_target') self.structural_kwargs = [ 'batch_size', 'confidence', 'targeted', 'learning_rate', 'binary_search_steps', 'max_iterations', 'abort_early', 'initial_const', 'clip_min', 'clip_max' ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' self.parse_params(**kwargs) labels, nb_classes = self.get_or_guess_labels(x, kwargs) attack = CWL2(self.sess, self.model, self.batch_size, self.confidence, 'y_target' in kwargs, self.learning_rate, self.binary_search_steps, self.max_iterations, self.abort_early, self.initial_const, self.clip_min, self.clip_max, nb_classes, x.get_shape().as_list()[1:]) def cw_wrap(x_val, y_val): return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(cw_wrap, [x, labels], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, y=None, y_target=None, batch_size=1, confidence=0, learning_rate=5e-3, binary_search_steps=5, max_iterations=1000, abort_early=True, initial_const=1e-2, clip_min=0, clip_max=1): """ :param y: (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns. :param y_target: (optional) A tensor with the target labels for a targeted attack. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param batch_size: Number of attacks to run simultaneously. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.batch_size = batch_size self.confidence = confidence self.learning_rate = learning_rate self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max
def ZERO(): return np.asarray(0., dtype=np_dtype) class CWL2(object): def __init__(self, sess, model, batch_size, confidence, targeted, learning_rate, binary_search_steps, max_iterations, abort_early, initial_const, clip_min, clip_max, num_labels, shape): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param model: a cleverhans.model.Model object. :param batch_size: Number of attacks to run simultaneously. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param targeted: boolean controlling the behavior of the adversarial examples produced. If set to False, they will be misclassified in any wrong class. If set to True, they will be misclassified in a chosen target class. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the pururbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param clip_min: (optional float) Minimum input component value. :param clip_max: (optional float) Maximum input component value. :param num_labels: the number of classes in the model's output. :param shape: the shape of the model's input tensor. """ self.sess = sess self.TARGETED = targeted self.LEARNING_RATE = learning_rate self.MAX_ITERATIONS = max_iterations self.BINARY_SEARCH_STEPS = binary_search_steps self.ABORT_EARLY = abort_early self.CONFIDENCE = confidence self.initial_const = initial_const self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.model = model self.repeat = binary_search_steps >= 10 self.shape = shape = tuple([batch_size] + list(shape)) # the variable we're going to optimize over modifier = tf.Variable(np.zeros(shape, dtype=np_dtype)) # these are variables to be more efficient in sending data to tf self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name='timg') self.tlab = tf.Variable( np.zeros((batch_size, num_labels)), dtype=tf_dtype, name='tlab') self.const = tf.Variable( np.zeros(batch_size), dtype=tf_dtype, name='const') # and here's what we use to assign them self.assign_timg = tf.placeholder(tf_dtype, shape, name='assign_timg') self.assign_tlab = tf.placeholder( tf_dtype, (batch_size, num_labels), name='assign_tlab') self.assign_const = tf.placeholder( tf_dtype, [batch_size], name='assign_const') # the resulting instance, tanh'd to keep bounded from clip_min # to clip_max self.newimg = (tf.tanh(modifier + self.timg) + 1) / 2 self.newimg = self.newimg * (clip_max - clip_min) + clip_min # prediction BEFORE-SOFTMAX of the model self.output = model.get_logits(self.newimg) # distance to the input data self.other = (tf.tanh(self.timg) + 1) / \ 2 * (clip_max - clip_min) + clip_min self.l2dist = reduce_sum( tf.square(self.newimg - self.other), list(range(1, len(shape)))) # compute the probability of the label class versus the maximum other real = reduce_sum((self.tlab) * self.output, 1) other = reduce_max((1 - self.tlab) * self.output - self.tlab * 10000, 1) if self.TARGETED: # if targeted, optimize for making the other class most likely loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE) else: # if untargeted, optimize for making this class least likely. loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE) # sum up the losses self.loss2 = reduce_sum(self.l2dist) self.loss1 = reduce_sum(self.const * loss1) self.loss = self.loss1 + self.loss2 # Setup the adam optimizer and keep track of variables we're creating start_vars = set(x.name for x in tf.global_variables()) optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE) self.train = optimizer.minimize(self.loss, var_list=[modifier]) end_vars = tf.global_variables() new_vars = [x for x in end_vars if x.name not in start_vars] # these are the variables to initialize when we run self.setup = [] self.setup.append(self.timg.assign(self.assign_timg)) self.setup.append(self.tlab.assign(self.assign_tlab)) self.setup.append(self.const.assign(self.assign_const)) self.init = tf.variables_initializer(var_list=[modifier] + new_vars) def attack(self, imgs, targets): """ Perform the L_2 attack on the given instance for the given targets. If self.targeted is true, then the targets represents the target labels If self.targeted is false, then targets are the original class labels """ r = [] for i in range(0, len(imgs), self.batch_size): _logger.debug( ("Running CWL2 attack on instance %s of %s", i, len(imgs))) r.extend( self.attack_batch(imgs[i:i + self.batch_size], targets[i:i + self.batch_size])) return np.array(r) def attack_batch(self, imgs, labs): """ Run the attack on a batch of instance and labels. """ def compare(x, y): if not isinstance(x, (float, int, np.int64)): x = np.copy(x) if self.TARGETED: x[y] -= self.CONFIDENCE else: x[y] += self.CONFIDENCE x = np.argmax(x) if self.TARGETED: return x == y else: return x != y batch_size = self.batch_size oimgs = np.clip(imgs, self.clip_min, self.clip_max) # re-scale instances to be within range [0, 1] imgs = (imgs - self.clip_min) / (self.clip_max - self.clip_min) imgs = np.clip(imgs, 0, 1) # now convert to [-1, 1] imgs = (imgs * 2) - 1 # convert to tanh-space imgs = np.arctanh(imgs * .999999) # set the lower and upper bounds accordingly lower_bound = np.zeros(batch_size) CONST = np.ones(batch_size) * self.initial_const upper_bound = np.ones(batch_size) * 1e10 # placeholders for the best l2, score, and instance attack found so far o_bestl2 = [1e10] * batch_size o_bestscore = [-1] * batch_size o_bestattack = np.copy(oimgs) for outer_step in range(self.BINARY_SEARCH_STEPS): # completely reset adam's internal state. self.sess.run(self.init) batch = imgs[:batch_size] batchlab = labs[:batch_size] bestl2 = [1e10] * batch_size bestscore = [-1] * batch_size _logger.debug(" Binary search step %s of %s", outer_step, self.BINARY_SEARCH_STEPS) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1: CONST = upper_bound # set the variables so that we don't have to send them over again self.sess.run( self.setup, { self.assign_timg: batch, self.assign_tlab: batchlab, self.assign_const: CONST }) prev = 1e6 for iteration in range(self.MAX_ITERATIONS): # perform the attack _, l, l2s, scores, nimg = self.sess.run([ self.train, self.loss, self.l2dist, self.output, self.newimg ]) if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: _logger.debug((" Iteration {} of {}: loss={:.3g} " + "l2={:.3g} f={:.3g}").format( iteration, self.MAX_ITERATIONS, l, np.mean(l2s), np.mean(scores))) # check if we should abort search if we're getting nowhere. if self.ABORT_EARLY and \ iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: if l > prev * .9999: msg = " Failed to make progress; stop early" _logger.debug(msg) break prev = l # adjust the best result found so far for e, (l2, sc, ii) in enumerate(zip(l2s, scores, nimg)): lab = np.argmax(batchlab[e]) if l2 < bestl2[e] and compare(sc, lab): bestl2[e] = l2 bestscore[e] = np.argmax(sc) if l2 < o_bestl2[e] and compare(sc, lab): o_bestl2[e] = l2 o_bestscore[e] = np.argmax(sc) o_bestattack[e] = ii # adjust the constant as needed for e in range(batch_size): if compare(bestscore[e], np.argmax(batchlab[e])) and \ bestscore[e] != -1: # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug(" Successfully generated adversarial examples " + "on {} of {} instances.".format( sum(upper_bound < 1e9), batch_size)) o_bestl2 = np.array(o_bestl2) mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9])) _logger.debug(" Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestl2 = np.array(o_bestl2) return o_bestattack
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/deep_fool.html ================================================ cleverhans.attacks.deep_fool — CleverHans documentation

Source code for cleverhans.attacks.deep_fool

"""The DeepFool attack

"""
import copy
import logging
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.model import Model, wrapper_warning_logits, CallableModelWrapper
from cleverhans import utils
from cleverhans import utils_tf

np_dtype = np.dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.deep_fool")
_logger.setLevel(logging.INFO)

[docs]class DeepFool(Attack): """ DeepFool is an untargeted & iterative attack which is based on an iterative linearization of the classifier. The implementation here is w.r.t. the L2 norm. Paper link: "https://arxiv.org/pdf/1511.04599.pdf" :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Create a DeepFool instance. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(DeepFool, self).__init__(model, sess, dtypestr, **kwargs) self.structural_kwargs = [ 'overshoot', 'max_iter', 'clip_max', 'clip_min', 'nb_candidate' ]
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' from cleverhans.utils_tf import jacobian_graph # Parse and save attack-specific parameters assert self.parse_params(**kwargs) # Define graph wrt to this input placeholder logits = self.model.get_logits(x) self.nb_classes = logits.get_shape().as_list()[-1] assert self.nb_candidate <= self.nb_classes, \ 'nb_candidate should not be greater than nb_classes' preds = tf.reshape( tf.nn.top_k(logits, k=self.nb_candidate)[0], [-1, self.nb_candidate]) # grads will be the shape [batch_size, nb_candidate, image_size] grads = tf.stack(jacobian_graph(preds, x, self.nb_candidate), axis=1) # Define graph def deepfool_wrap(x_val): """deepfool function for py_func""" return deepfool_batch(self.sess, x, preds, logits, grads, x_val, self.nb_candidate, self.overshoot, self.max_iter, self.clip_min, self.clip_max, self.nb_classes) wrap = tf.py_func(deepfool_wrap, [x], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, nb_candidate=10, overshoot=0.02, max_iter=50, clip_min=0., clip_max=1., **kwargs): """ :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for deepfool :param clip_min: Minimum component value for clipping :param clip_max: Maximum component value for clipping """ self.nb_candidate = nb_candidate self.overshoot = overshoot self.max_iter = max_iter self.clip_min = clip_min self.clip_max = clip_max if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
def deepfool_batch(sess, x, pred, logits, grads, X, nb_candidate, overshoot, max_iter, clip_min, clip_max, nb_classes, feed=None): """ Applies DeepFool to a batch of inputs :param sess: TF session :param x: The input placeholder :param pred: The model's sorted symbolic output of logits, only the top nb_candidate classes are contained :param logits: The model's unnormalized output tensor (the input to the softmax layer) :param grads: Symbolic gradients of the top nb_candidate classes, procuded from gradient_graph :param X: Numpy array with sample inputs :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for DeepFool :param clip_min: Minimum value for components of the example returned :param clip_max: Maximum value for components of the example returned :param nb_classes: Number of model output classes :return: Adversarial examples """ X_adv = deepfool_attack( sess, x, pred, logits, grads, X, nb_candidate, overshoot, max_iter, clip_min, clip_max, feed=feed) return np.asarray(X_adv, dtype=np_dtype) def deepfool_attack(sess, x, predictions, logits, grads, sample, nb_candidate, overshoot, max_iter, clip_min, clip_max, feed=None): """ TensorFlow implementation of DeepFool. Paper link: see https://arxiv.org/pdf/1511.04599.pdf :param sess: TF session :param x: The input placeholder :param predictions: The model's sorted symbolic output of logits, only the top nb_candidate classes are contained :param logits: The model's unnormalized output tensor (the input to the softmax layer) :param grads: Symbolic gradients of the top nb_candidate classes, procuded from gradient_graph :param sample: Numpy array with sample input :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for DeepFool :param clip_min: Minimum value for components of the example returned :param clip_max: Maximum value for components of the example returned :return: Adversarial examples """ adv_x = copy.copy(sample) # Initialize the loop variables iteration = 0 current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed) if current.shape == (): current = np.array([current]) w = np.squeeze(np.zeros(sample.shape[1:])) # same shape as original image r_tot = np.zeros(sample.shape) original = current # use original label as the reference _logger.debug( "Starting DeepFool attack up to %s iterations", max_iter) # Repeat this main loop until we have achieved misclassification while (np.any(current == original) and iteration < max_iter): if iteration % 5 == 0 and iteration > 0: _logger.info("Attack result at iteration %s is %s", iteration, current) gradients = sess.run(grads, feed_dict={x: adv_x}) predictions_val = sess.run(predictions, feed_dict={x: adv_x}) for idx in range(sample.shape[0]): pert = np.inf if current[idx] != original[idx]: continue for k in range(1, nb_candidate): w_k = gradients[idx, k, ...] - gradients[idx, 0, ...] f_k = predictions_val[idx, k] - predictions_val[idx, 0] # adding value 0.00001 to prevent f_k = 0 pert_k = (abs(f_k) + 0.00001) / np.linalg.norm(w_k.flatten()) if pert_k < pert: pert = pert_k w = w_k r_i = pert * w / np.linalg.norm(w) r_tot[idx, ...] = r_tot[idx, ...] + r_i adv_x = np.clip(r_tot + sample, clip_min, clip_max) current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed) if current.shape == (): current = np.array([current]) # Update loop variables iteration = iteration + 1 # need more revision, including info like how many succeed _logger.info("Attack result at iteration %s is %s", iteration, current) _logger.info("%s out of %s become adversarial examples at iteration %s", sum(current != original), sample.shape[0], iteration) # need to clip this image into the given range adv_x = np.clip((1 + overshoot) * r_tot + sample, clip_min, clip_max) return adv_x
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/elastic_net_method.html ================================================ cleverhans.attacks.elastic_net_method — CleverHans documentation

Source code for cleverhans.attacks.elastic_net_method

"""The ElasticNetMethod attack.
"""
# pylint: disable=missing-docstring
import logging

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, reduce_max
from cleverhans.model import Model, CallableModelWrapper, wrapper_warning_logits
from cleverhans import utils

np_dtype = np.dtype('float32')
tf_dtype = tf.as_dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.elastic_net_method")
_logger.setLevel(logging.INFO)


def ZERO():
  return np.asarray(0., dtype=np_dtype)


[docs]class ElasticNetMethod(Attack): """ This attack features L1-oriented adversarial examples and includes the C&W L2 attack as a special case (when beta is set to 0). Adversarial examples attain similar performance to those generated by the C&W L2 attack in the white-box case, and more importantly, have improved transferability properties and complement adversarial training. Paper link: https://arxiv.org/abs/1709.04114 :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(ElasticNetMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y', 'y_target') self.structural_kwargs = [ 'beta', 'decision_rule', 'batch_size', 'confidence', 'targeted', 'learning_rate', 'binary_search_steps', 'max_iterations', 'abort_early', 'initial_const', 'clip_min', 'clip_max' ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' self.parse_params(**kwargs) labels, nb_classes = self.get_or_guess_labels(x, kwargs) attack = EAD(self.sess, self.model, self.beta, self.decision_rule, self.batch_size, self.confidence, 'y_target' in kwargs, self.learning_rate, self.binary_search_steps, self.max_iterations, self.abort_early, self.initial_const, self.clip_min, self.clip_max, nb_classes, x.get_shape().as_list()[1:]) def ead_wrap(x_val, y_val): return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(ead_wrap, [x, labels], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, y=None, y_target=None, beta=1e-2, decision_rule='EN', batch_size=1, confidence=0, learning_rate=1e-2, binary_search_steps=9, max_iterations=1000, abort_early=False, initial_const=1e-3, clip_min=0, clip_max=1): """ :param y: (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns. :param y_target: (optional) A tensor with the target labels for a targeted attack. :param beta: Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion :param decision_rule: EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param batch_size: Number of attacks to run simultaneously. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set 'initial_const' to a large value and fix this param to 1 for speed. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet) :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.beta = beta self.decision_rule = decision_rule self.batch_size = batch_size self.confidence = confidence self.learning_rate = learning_rate self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max
class EAD(object): def __init__(self, sess, model, beta, decision_rule, batch_size, confidence, targeted, learning_rate, binary_search_steps, max_iterations, abort_early, initial_const, clip_min, clip_max, num_labels, shape): """ EAD Attack Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param model: a cleverhans.model.Model object. :param beta: Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion :param decision_rule: EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion. :param batch_size: Number of attacks to run simultaneously. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param targeted: boolean controlling the behavior of the adversarial examples produced. If set to False, they will be misclassified in any wrong class. If set to True, they will be misclassified in a chosen target class. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set 'initial_const' to a large value and fix this param to 1 for speed. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet) :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value. :param clip_min: (optional float) Minimum input component value. :param clip_max: (optional float) Maximum input component value. :param num_labels: the number of classes in the model's output. :param shape: the shape of the model's input tensor. """ self.sess = sess self.TARGETED = targeted self.LEARNING_RATE = learning_rate self.MAX_ITERATIONS = max_iterations self.BINARY_SEARCH_STEPS = binary_search_steps self.ABORT_EARLY = abort_early self.CONFIDENCE = confidence self.initial_const = initial_const self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.model = model self.decision_rule = decision_rule self.beta = beta self.beta_t = tf.cast(self.beta, tf_dtype) self.repeat = binary_search_steps >= 10 self.shape = shape = tuple([batch_size] + list(shape)) # these are variables to be more efficient in sending data to tf self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name='timg') self.newimg = tf.Variable( np.zeros(shape), dtype=tf_dtype, name='newimg') self.slack = tf.Variable( np.zeros(shape), dtype=tf_dtype, name='slack') self.tlab = tf.Variable( np.zeros((batch_size, num_labels)), dtype=tf_dtype, name='tlab') self.const = tf.Variable( np.zeros(batch_size), dtype=tf_dtype, name='const') # and here's what we use to assign them self.assign_timg = tf.placeholder(tf_dtype, shape, name='assign_timg') self.assign_newimg = tf.placeholder( tf_dtype, shape, name='assign_newimg') self.assign_slack = tf.placeholder( tf_dtype, shape, name='assign_slack') self.assign_tlab = tf.placeholder( tf_dtype, (batch_size, num_labels), name='assign_tlab') self.assign_const = tf.placeholder( tf_dtype, [batch_size], name='assign_const') self.global_step = tf.Variable(0, trainable=False) self.global_step_t = tf.cast(self.global_step, tf_dtype) # Fast Iterative Shrinkage Thresholding self.zt = tf.divide(self.global_step_t, self.global_step_t + tf.cast(3, tf_dtype)) cond1 = tf.cast(tf.greater(tf.subtract(self.slack, self.timg), self.beta_t), tf_dtype) cond2 = tf.cast(tf.less_equal(tf.abs(tf.subtract(self.slack, self.timg)), self.beta_t), tf_dtype) cond3 = tf.cast(tf.less(tf.subtract(self.slack, self.timg), tf.negative(self.beta_t)), tf_dtype) upper = tf.minimum(tf.subtract(self.slack, self.beta_t), tf.cast(self.clip_max, tf_dtype)) lower = tf.maximum(tf.add(self.slack, self.beta_t), tf.cast(self.clip_min, tf_dtype)) self.assign_newimg = tf.multiply(cond1, upper) self.assign_newimg += tf.multiply(cond2, self.timg) self.assign_newimg += tf.multiply(cond3, lower) self.assign_slack = self.assign_newimg self.assign_slack += tf.multiply(self.zt, self.assign_newimg - self.newimg) # -------------------------------- self.setter = tf.assign(self.newimg, self.assign_newimg) self.setter_y = tf.assign(self.slack, self.assign_slack) # prediction BEFORE-SOFTMAX of the model self.output = model.get_logits(self.newimg) self.output_y = model.get_logits(self.slack) # distance to the input data self.l2dist = reduce_sum(tf.square(self.newimg-self.timg), list(range(1, len(shape)))) self.l2dist_y = reduce_sum(tf.square(self.slack-self.timg), list(range(1, len(shape)))) self.l1dist = reduce_sum(tf.abs(self.newimg-self.timg), list(range(1, len(shape)))) self.l1dist_y = reduce_sum(tf.abs(self.slack-self.timg), list(range(1, len(shape)))) self.elasticdist = self.l2dist + tf.multiply(self.l1dist, self.beta_t) self.elasticdist_y = self.l2dist_y + tf.multiply(self.l1dist_y, self.beta_t) if self.decision_rule == 'EN': self.crit = self.elasticdist self.crit_p = 'Elastic' else: self.crit = self.l1dist self.crit_p = 'L1' # compute the probability of the label class versus the maximum other real = reduce_sum((self.tlab) * self.output, 1) real_y = reduce_sum((self.tlab) * self.output_y, 1) other = reduce_max((1 - self.tlab) * self.output - (self.tlab * 10000), 1) other_y = reduce_max((1 - self.tlab) * self.output_y - (self.tlab * 10000), 1) if self.TARGETED: # if targeted, optimize for making the other class most likely loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE) loss1_y = tf.maximum(ZERO(), other_y - real_y + self.CONFIDENCE) else: # if untargeted, optimize for making this class least likely. loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE) loss1_y = tf.maximum(ZERO(), real_y - other_y + self.CONFIDENCE) # sum up the losses self.loss21 = reduce_sum(self.l1dist) self.loss21_y = reduce_sum(self.l1dist_y) self.loss2 = reduce_sum(self.l2dist) self.loss2_y = reduce_sum(self.l2dist_y) self.loss1 = reduce_sum(self.const * loss1) self.loss1_y = reduce_sum(self.const * loss1_y) self.loss_opt = self.loss1_y + self.loss2_y self.loss = self.loss1+self.loss2+tf.multiply(self.beta_t, self.loss21) self.learning_rate = tf.train.polynomial_decay( self.LEARNING_RATE, self.global_step, self.MAX_ITERATIONS, 0, power=0.5) # Setup the optimizer and keep track of variables we're creating start_vars = set(x.name for x in tf.global_variables()) optimizer = tf.train.GradientDescentOptimizer(self.learning_rate) self.train = optimizer.minimize(self.loss_opt, var_list=[self.slack], global_step=self.global_step) end_vars = tf.global_variables() new_vars = [x for x in end_vars if x.name not in start_vars] # these are the variables to initialize when we run self.setup = [] self.setup.append(self.timg.assign(self.assign_timg)) self.setup.append(self.tlab.assign(self.assign_tlab)) self.setup.append(self.const.assign(self.assign_const)) var_list = [self.global_step]+[self.slack]+[self.newimg]+new_vars self.init = tf.variables_initializer(var_list=var_list) def attack(self, imgs, targets): """ Perform the EAD attack on the given instance for the given targets. If self.targeted is true, then the targets represents the target labels If self.targeted is false, then targets are the original class labels """ batch_size = self.batch_size r = [] for i in range(0, len(imgs) // batch_size): _logger.debug( ("Running EAD attack on instance %s of %s", i * batch_size, len(imgs))) r.extend( self.attack_batch( imgs[i * batch_size:(i + 1) * batch_size], targets[i * batch_size:(i + 1) * batch_size])) if len(imgs) % batch_size != 0: last_elements = len(imgs) - (len(imgs) % batch_size) _logger.debug( ("Running EAD attack on instance %s of %s", last_elements, len(imgs))) temp_imgs = np.zeros((batch_size, ) + imgs.shape[2:]) temp_targets = np.zeros((batch_size, ) + targets.shape[2:]) temp_imgs[:(len(imgs) % batch_size)] = imgs[last_elements:] temp_targets[:(len(imgs) % batch_size)] = targets[last_elements:] temp_data = self.attack_batch(temp_imgs, temp_targets) r.extend(temp_data[:(len(imgs) % batch_size)], targets[last_elements:]) return np.array(r) def attack_batch(self, imgs, labs): """ Run the attack on a batch of instance and labels. """ def compare(x, y): if not isinstance(x, (float, int, np.int64)): x = np.copy(x) if self.TARGETED: x[y] -= self.CONFIDENCE else: x[y] += self.CONFIDENCE x = np.argmax(x) if self.TARGETED: return x == y else: return x != y batch_size = self.batch_size imgs = np.clip(imgs, self.clip_min, self.clip_max) # set the lower and upper bounds accordingly lower_bound = np.zeros(batch_size) CONST = np.ones(batch_size) * self.initial_const upper_bound = np.ones(batch_size) * 1e10 # placeholders for the best en, score, and instance attack found so far o_bestdst = [1e10] * batch_size o_bestscore = [-1] * batch_size o_bestattack = np.copy(imgs) for outer_step in range(self.BINARY_SEARCH_STEPS): # completely reset the optimizer's internal state. self.sess.run(self.init) batch = imgs[:batch_size] batchlab = labs[:batch_size] bestdst = [1e10] * batch_size bestscore = [-1] * batch_size _logger.debug(" Binary search step %s of %s", outer_step, self.BINARY_SEARCH_STEPS) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1: CONST = upper_bound # set the variables so that we don't have to send them over again self.sess.run( self.setup, { self.assign_timg: batch, self.assign_tlab: batchlab, self.assign_const: CONST }) self.sess.run(self.setter, {self.assign_newimg: batch}) self.sess.run(self.setter_y, {self.assign_slack: batch}) prev = 1e6 for iteration in range(self.MAX_ITERATIONS): # perform the attack self.sess.run([self.train]) self.sess.run([self.setter, self.setter_y]) l, l2s, l1s, crit, scores, nimg = self.sess.run([self.loss, self.l2dist, self.l1dist, self.crit, self.output, self.newimg]) if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: _logger.debug((" Iteration {} of {}: loss={:.3g} " + "l2={:.3g} l1={:.3g} f={:.3g}").format( iteration, self.MAX_ITERATIONS, l, np.mean(l2s), np.mean(l1s), np.mean(scores))) # check if we should abort search if we're getting nowhere. if self.ABORT_EARLY and \ iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: if l > prev * .9999: msg = " Failed to make progress; stop early" _logger.debug(msg) break prev = l # adjust the best result found so far for e, (dst, sc, ii) in enumerate(zip(crit, scores, nimg)): lab = np.argmax(batchlab[e]) if dst < bestdst[e] and compare(sc, lab): bestdst[e] = dst bestscore[e] = np.argmax(sc) if dst < o_bestdst[e] and compare(sc, lab): o_bestdst[e] = dst o_bestscore[e] = np.argmax(sc) o_bestattack[e] = ii # adjust the constant as needed for e in range(batch_size): if compare(bestscore[e], np.argmax(batchlab[e])) and \ bestscore[e] != -1: # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug(" Successfully generated adversarial examples " + "on {} of {} instances.".format( sum(upper_bound < 1e9), batch_size)) o_bestdst = np.array(o_bestdst) mean = np.mean(np.sqrt(o_bestdst[o_bestdst < 1e9])) _logger.debug(self.crit_p + " Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestdst = np.array(o_bestdst) return o_bestattack
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/fast_feature_adversaries.html ================================================ cleverhans.attacks.fast_feature_adversaries — CleverHans documentation

Source code for cleverhans.attacks.fast_feature_adversaries

"""
The FastFeatureAdversaries attack
"""
# pylint: disable=missing-docstring
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum
from cleverhans.model import Model
from cleverhans.utils_tf import clip_eta


[docs]class FastFeatureAdversaries(Attack): """ This is a fast implementation of "Feature Adversaries", an attack against a target internal representation of a model. "Feature adversaries" were originally introduced in (Sabour et al. 2016), where the optimization was done using LBFGS. Paper link: https://arxiv.org/abs/1511.05122 This implementation is similar to "Basic Iterative Method" (Kurakin et al. 2016) but applied to the internal representations. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a FastFeatureAdversaries instance. """ super(FastFeatureAdversaries, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'clip_min', 'clip_max') self.structural_kwargs = ['ord', 'nb_iter', 'layer'] assert isinstance(self.model, Model)
[docs] def parse_params(self, layer=None, eps=0.3, eps_iter=0.05, nb_iter=10, ord=np.inf, clip_min=None, clip_max=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param layer: (required str) name of the layer to target. :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.layer = layer self.eps = eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.ord = ord self.clip_min = clip_min self.clip_max = clip_max # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs] def attack_single_step(self, x, eta, g_feat): """ TensorFlow implementation of the Fast Feature Gradient. This is a single step attack similar to Fast Gradient Method that attacks an internal representation. :param x: the input placeholder :param eta: A tensor the same shape as x that holds the perturbation. :param g_feat: model's internal tensor for guide :return: a tensor for the adversarial example """ adv_x = x + eta a_feat = self.model.fprop(adv_x)[self.layer] # feat.shape = (batch, c) or (batch, w, h, c) axis = list(range(1, len(a_feat.shape))) # Compute loss # This is a targeted attack, hence the negative sign loss = -reduce_sum(tf.square(a_feat - g_feat), axis) # Define gradient of loss wrt input grad, = tf.gradients(loss, adv_x) # Multiply by constant epsilon scaled_signed_grad = self.eps_iter * tf.sign(grad) # Add perturbation to original example to obtain adversarial example adv_x = adv_x + scaled_signed_grad # If clipping is needed, # reset all values outside of [clip_min, clip_max] if (self.clip_min is not None) and (self.clip_max is not None): adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) adv_x = tf.stop_gradient(adv_x) eta = adv_x - x eta = clip_eta(eta, self.ord, self.eps) return eta
[docs] def generate(self, x, g, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param g: The target value of the symbolic representation :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) g_feat = self.model.fprop(g)[self.layer] # Initialize loop variables eta = tf.random_uniform( tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype) eta = clip_eta(eta, self.ord, self.eps) def cond(i, _): return tf.less(i, self.nb_iter) def body(i, e): new_eta = self.attack_single_step(x, e, g_feat) return i + 1, new_eta _, eta = tf.while_loop(cond, body, (tf.zeros([]), eta), back_prop=True, maximum_iterations=self.nb_iter) # Define adversarial example (and clip if necessary) adv_x = x + eta if self.clip_min is not None and self.clip_max is not None: adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/fast_gradient_method.html ================================================ cleverhans.attacks.fast_gradient_method — CleverHans documentation

Source code for cleverhans.attacks.fast_gradient_method

"""
The FastGradientMethod attack.
"""

import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_max, reduce_sum, softmax_cross_entropy_with_logits
from cleverhans import utils_tf


[docs]class FastGradientMethod(Attack): """ This attack was originally implemented by Goodfellow et al. (2014) with the infinity norm (and is known as the "Fast Gradient Sign Method"). This implementation extends the attack to other norms, and is therefore called the Fast Gradient Method. Paper link: https://arxiv.org/abs/1412.6572 :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a FastGradientMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(FastGradientMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'y', 'y_target', 'clip_min', 'clip_max') self.structural_kwargs = ['ord', 'sanity_checks', 'clip_grad', 'loss_fn']
[docs] def generate(self, x, **kwargs): """ Returns the graph for Fast Gradient Method adversarial examples. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) return fgm( x, self.model.get_logits(x), y=labels, eps=self.eps, ord=self.ord, loss_fn=self.loss_fn, clip_min=self.clip_min, clip_max=self.clip_max, clip_grad=self.clip_grad, targeted=(self.y_target is not None), sanity_checks=self.sanity_checks)
[docs] def parse_params(self, eps=0.3, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, y=None, y_target=None, clip_min=None, clip_max=None, clip_grad=False, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) attack step size (input variation) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param y: (optional) A tensor with the true labels. Only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) """ # Save attack-specific parameters self.eps = eps self.ord = ord self.loss_fn = loss_fn self.y = y self.y_target = y_target self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad self.sanity_checks = sanity_checks if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, int(1), int(2)]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs]def fgm(x, logits, y=None, eps=0.3, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True): """ TensorFlow implementation of the Fast Gradient Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param eps: the epsilon (input variation parameter) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param clip_min: Minimum float value for adversarial example components :param clip_max: Maximum float value for adversarial example components :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(utils_tf.assert_greater_equal( x, tf.cast(clip_min, x.dtype))) if clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype))) # Make sure the caller has not passed probs by accident assert logits.op.type != 'Softmax' if y is None: # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(logits, 1, keepdims=True) y = tf.to_float(tf.equal(logits, preds_max)) y = tf.stop_gradient(y) y = y / reduce_sum(y, 1, keepdims=True) # Compute loss loss = loss_fn(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input grad, = tf.gradients(loss, x) if clip_grad: grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max) optimal_perturbation = optimize_linear(grad, eps, ord) # Add perturbation to original example to obtain adversarial example adv_x = x + optimal_perturbation # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs]def optimize_linear(grad, eps, ord=np.inf): """ Solves for the optimal input to a linear function under a norm constraint. Optimal_perturbation = argmax_{eta, ||eta||_{ord} < eps} dot(eta, grad) :param grad: tf tensor containing a batch of gradients :param eps: float scalar specifying size of constraint region :param ord: int specifying order of norm :returns: tf tensor containing optimal perturbation """ # In Python 2, the `list` call in the following line is redundant / harmless. # In Python 3, the `list` call is needed to convert the iterator returned by `range` into a list. red_ind = list(range(1, len(grad.get_shape()))) avoid_zero_div = 1e-12 if ord == np.inf: # Take sign of gradient optimal_perturbation = tf.sign(grad) # The following line should not change the numerical results. # It applies only because `optimal_perturbation` is the output of # a `sign` op, which has zero derivative anyway. # It should not be applied for the other norms, where the # perturbation has a non-zero derivative. optimal_perturbation = tf.stop_gradient(optimal_perturbation) elif ord == 1: abs_grad = tf.abs(grad) sign = tf.sign(grad) max_abs_grad = tf.reduce_max(abs_grad, red_ind, keepdims=True) tied_for_max = tf.to_float(tf.equal(abs_grad, max_abs_grad)) num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True) optimal_perturbation = sign * tied_for_max / num_ties elif ord == 2: square = tf.maximum(avoid_zero_div, reduce_sum(tf.square(grad), reduction_indices=red_ind, keepdims=True)) optimal_perturbation = grad / tf.sqrt(square) else: raise NotImplementedError("Only L-inf, L1 and L2 norms are " "currently implemented.") # Scale perturbation to be the solution for the norm=eps rather than # norm=1 problem scaled_perturbation = utils_tf.mul(eps, optimal_perturbation) return scaled_perturbation
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/hop_skip_jump_attack.html ================================================ cleverhans.attacks.hop_skip_jump_attack — CleverHans documentation

Source code for cleverhans.attacks.hop_skip_jump_attack

""" Boundary Attack++
"""
import logging
import numpy as np
import tensorflow as tf
from warnings import warn
from cleverhans.attacks import Attack
from cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits
from cleverhans import utils, utils_tf

np_dtype = np.dtype('float32')
tf_dtype = tf.as_dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.hop_skip_jump_attack")
_logger.setLevel(logging.INFO)


[docs]class HopSkipJumpAttack(Attack): """ HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright. It is a decision-based attack that requires access to output labels of a model alone. Paper link: https://arxiv.org/abs/1904.02144 At a high level, this attack is an iterative attack composed of three steps: Binary search to approach the boundary; gradient estimation; stepsize search. HopSkipJumpAttack requires fewer model queries than Boundary Attack which was based on rejective sampling. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor. see parse_params for details. """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(HopSkipJumpAttack, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y_target', 'image_target') self.structural_kwargs = [ 'stepsize_search', 'clip_min', 'clip_max', 'constraint', 'num_iterations', 'initial_num_evals', 'max_num_evals', 'batch_size', 'verbose', 'gamma', ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See `parse_params` """ self.parse_params(**kwargs) shape = [int(i) for i in x.get_shape().as_list()[1:]] assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' _check_first_dimension(x, 'input') if self.y_target is not None: _check_first_dimension(self.y_target, 'y_target') assert self.image_target is not None, \ 'Require a target image for targeted attack.' _check_first_dimension(self.image_target, 'image_target') # Set shape and d. self.shape = shape self.d = int(np.prod(shape)) # Set binary search threshold. if self.constraint == 'l2': self.theta = self.gamma / (np.sqrt(self.d) * self.d) else: self.theta = self.gamma / (self.d * self.d) # Construct input placeholder and output for decision function. self.input_ph = tf.placeholder( tf_dtype, [None] + list(self.shape), name='input_image') self.logits = self.model.get_logits(self.input_ph) def hsja_wrap(x, target_label, target_image): """ Wrapper to use tensors as input and output. """ return np.array(self._hsja(x, target_label, target_image), dtype=self.np_dtype) if self.y_target is not None: # targeted attack that requires target label and image. wrap = tf.py_func(hsja_wrap, [x[0], self.y_target[0], self.image_target[0]], self.tf_dtype) else: if self.image_target is not None: # untargeted attack with an initialized image. wrap = tf.py_func(lambda x, target_image: hsja_wrap(x, None, target_image), [x[0], self.image_target[0]], self.tf_dtype) else: # untargeted attack without an initialized image. wrap = tf.py_func(lambda x: hsja_wrap(x, None, None), [x[0]], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def generate_np(self, x, **kwargs): """ Generate adversarial images in a for loop. :param y: An array of shape (n, nb_classes) for true labels. :param y_target: An array of shape (n, nb_classes) for target labels. Required for targeted attack. :param image_target: An array of shape (n, **image shape) for initial target images. Required for targeted attack. See parse_params for other kwargs. """ x_adv = [] if 'image_target' in kwargs and kwargs['image_target'] is not None: image_target = np.copy(kwargs['image_target']) else: image_target = None if 'y_target' in kwargs and kwargs['y_target'] is not None: y_target = np.copy(kwargs['y_target']) else: y_target = None for i, x_single in enumerate(x): img = np.expand_dims(x_single, axis=0) if image_target is not None: single_img_target = np.expand_dims(image_target[i], axis=0) kwargs['image_target'] = single_img_target if y_target is not None: single_y_target = np.expand_dims(y_target[i], axis=0) kwargs['y_target'] = single_y_target adv_img = super(HopSkipJumpAttack, self).generate_np(img, **kwargs) x_adv.append(adv_img) return np.concatenate(x_adv, axis=0)
[docs] def parse_params(self, y_target=None, image_target=None, initial_num_evals=100, max_num_evals=10000, stepsize_search='geometric_progression', num_iterations=64, gamma=1.0, constraint='l2', batch_size=128, verbose=True, clip_min=0, clip_max=1): """ :param y: A tensor of shape (1, nb_classes) for true labels. :param y_target: A tensor of shape (1, nb_classes) for target labels. Required for targeted attack. :param image_target: A tensor of shape (1, **image shape) for initial target images. Required for targeted attack. :param initial_num_evals: initial number of evaluations for gradient estimation. :param max_num_evals: maximum number of evaluations for gradient estimation. :param stepsize_search: How to search for stepsize; choices are 'geometric_progression', 'grid_search'. 'geometric progression' initializes the stepsize by ||x_t - x||_p / sqrt(iteration), and keep decreasing by half until reaching the target side of the boundary. 'grid_search' chooses the optimal epsilon over a grid, in the scale of ||x_t - x||_p. :param num_iterations: The number of iterations. :param gamma: The binary search threshold theta is gamma / d^{3/2} for l2 attack and gamma / d^2 for linf attack. :param constraint: The distance to optimize; choices are 'l2', 'linf'. :param batch_size: batch_size for model prediction. :param verbose: (boolean) Whether distance at each step is printed. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.y_target = y_target self.image_target = image_target self.initial_num_evals = initial_num_evals self.max_num_evals = max_num_evals self.stepsize_search = stepsize_search self.num_iterations = num_iterations self.gamma = gamma self.constraint = constraint self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.verbose = verbose
def _hsja(self, sample, target_label, target_image): """ Main algorithm for HopSkipJumpAttack. Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sample: input image. Without the batchsize dimension. :param target_label: integer for targeted attack, None for nontargeted attack. Without the batchsize dimension. :param target_image: an array with the same size as sample, or None. Without the batchsize dimension. Output: perturbed image. """ # Original label required for untargeted attack. if target_label is None: original_label = np.argmax( self.sess.run(self.logits, feed_dict={self.input_ph: sample[None]}) ) else: target_label = np.argmax(target_label) def decision_function(images): """ Decision function output 1 on the desired side of the boundary, 0 otherwise. """ images = clip_image(images, self.clip_min, self.clip_max) prob = [] for i in range(0, len(images), self.batch_size): batch = images[i:i+self.batch_size] prob_i = self.sess.run(self.logits, feed_dict={self.input_ph: batch}) prob.append(prob_i) prob = np.concatenate(prob, axis=0) if target_label is None: return np.argmax(prob, axis=1) != original_label else: return np.argmax(prob, axis=1) == target_label # Initialize. if target_image is None: perturbed = initialize(decision_function, sample, self.shape, self.clip_min, self.clip_max) else: perturbed = target_image # Project the initialization to the boundary. perturbed, dist_post_update = binary_search_batch(sample, np.expand_dims(perturbed, 0), decision_function, self.shape, self.constraint, self.theta) dist = compute_distance(perturbed, sample, self.constraint) for j in np.arange(self.num_iterations): current_iteration = j + 1 # Choose delta. delta = select_delta(dist_post_update, current_iteration, self.clip_max, self.clip_min, self.d, self.theta, self.constraint) # Choose number of evaluations. num_evals = int(min([self.initial_num_evals * np.sqrt(j+1), self.max_num_evals])) # approximate gradient. gradf = approximate_gradient(decision_function, perturbed, num_evals, delta, self.constraint, self.shape, self.clip_min, self.clip_max) if self.constraint == 'linf': update = np.sign(gradf) else: update = gradf # search step size. if self.stepsize_search == 'geometric_progression': # find step size. epsilon = geometric_progression_for_stepsize(perturbed, update, dist, decision_function, current_iteration) # Update the sample. perturbed = clip_image(perturbed + epsilon * update, self.clip_min, self.clip_max) # Binary search to return to the boundary. perturbed, dist_post_update = binary_search_batch(sample, perturbed[None], decision_function, self.shape, self.constraint, self.theta) elif self.stepsize_search == 'grid_search': # Grid search for stepsize. epsilons = np.logspace(-4, 0, num=20, endpoint=True) * dist epsilons_shape = [20] + len(self.shape) * [1] perturbeds = perturbed + epsilons.reshape(epsilons_shape) * update perturbeds = clip_image(perturbeds, self.clip_min, self.clip_max) idx_perturbed = decision_function(perturbeds) if np.sum(idx_perturbed) > 0: # Select the perturbation that yields the minimum distance # after binary search. perturbed, dist_post_update = binary_search_batch(sample, perturbeds[idx_perturbed], decision_function, self.shape, self.constraint, self.theta) # compute new distance. dist = compute_distance(perturbed, sample, self.constraint) if self.verbose: print('iteration: {:d}, {:s} distance {:.4E}'.format( j+1, self.constraint, dist)) perturbed = np.expand_dims(perturbed, 0) return perturbed
[docs]def BoundaryAttackPlusPlus(model, sess, dtypestr='float32', **kwargs): """ A previous name used for HopSkipJumpAttack. """ warn("BoundaryAttackPlusPlus will be removed after 2019-12-08; use HopSkipJumpAttack.") return HopSkipJumpAttack(model, sess, dtypestr, **kwargs)
def _check_first_dimension(x, tensor_name): message = "Tensor {} should have batch_size of 1.".format(tensor_name) if x.get_shape().as_list()[0] is None: check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1, message=message) with tf.control_dependencies([check_batch]): x = tf.identity(x) elif x.get_shape().as_list()[0] != 1: raise ValueError(message) def clip_image(image, clip_min, clip_max): """ Clip an image, or an image batch, with upper and lower threshold. """ return np.minimum(np.maximum(clip_min, image), clip_max) def compute_distance(x_ori, x_pert, constraint='l2'): """ Compute the distance between two images. """ if constraint == 'l2': dist = np.linalg.norm(x_ori - x_pert) elif constraint == 'linf': dist = np.max(abs(x_ori - x_pert)) return dist def approximate_gradient(decision_function, sample, num_evals, delta, constraint, shape, clip_min, clip_max): """ Gradient direction estimation """ # Generate random vectors. noise_shape = [num_evals] + list(shape) if constraint == 'l2': rv = np.random.randn(*noise_shape) elif constraint == 'linf': rv = np.random.uniform(low=-1, high=1, size=noise_shape) axis = tuple(range(1, 1 + len(shape))) rv = rv / np.sqrt(np.sum(rv ** 2, axis=axis, keepdims=True)) perturbed = sample + delta * rv perturbed = clip_image(perturbed, clip_min, clip_max) rv = (perturbed - sample) / delta # query the model. decisions = decision_function(perturbed) decision_shape = [len(decisions)] + [1] * len(shape) fval = 2 * decisions.astype(np_dtype).reshape(decision_shape) - 1.0 # Baseline subtraction (when fval differs) if np.mean(fval) == 1.0: # label changes. gradf = np.mean(rv, axis=0) elif np.mean(fval) == -1.0: # label not change. gradf = - np.mean(rv, axis=0) else: fval = fval - np.mean(fval) gradf = np.mean(fval * rv, axis=0) # Get the gradient direction. gradf = gradf / np.linalg.norm(gradf) return gradf def project(original_image, perturbed_images, alphas, shape, constraint): """ Projection onto given l2 / linf balls in a batch. """ alphas_shape = [len(alphas)] + [1] * len(shape) alphas = alphas.reshape(alphas_shape) if constraint == 'l2': projected = (1-alphas) * original_image + alphas * perturbed_images elif constraint == 'linf': projected = clip_image( perturbed_images, original_image - alphas, original_image + alphas ) return projected def binary_search_batch(original_image, perturbed_images, decision_function, shape, constraint, theta): """ Binary search to approach the boundary. """ # Compute distance between each of perturbed image and original image. dists_post_update = np.array([ compute_distance( original_image, perturbed_image, constraint ) for perturbed_image in perturbed_images]) # Choose upper thresholds in binary searchs based on constraint. if constraint == 'linf': highs = dists_post_update # Stopping criteria. thresholds = np.minimum(dists_post_update * theta, theta) else: highs = np.ones(len(perturbed_images)) thresholds = theta lows = np.zeros(len(perturbed_images)) while np.max((highs - lows) / thresholds) > 1: # projection to mids. mids = (highs + lows) / 2.0 mid_images = project(original_image, perturbed_images, mids, shape, constraint) # Update highs and lows based on model decisions. decisions = decision_function(mid_images) lows = np.where(decisions == 0, mids, lows) highs = np.where(decisions == 1, mids, highs) out_images = project(original_image, perturbed_images, highs, shape, constraint) # Compute distance of the output image to select the best choice. # (only used when stepsize_search is grid_search.) dists = np.array([ compute_distance( original_image, out_image, constraint ) for out_image in out_images]) idx = np.argmin(dists) dist = dists_post_update[idx] out_image = out_images[idx] return out_image, dist def initialize(decision_function, sample, shape, clip_min, clip_max): """ Efficient Implementation of BlendedUniformNoiseAttack in Foolbox. """ success = 0 num_evals = 0 # Find a misclassified random noise. while True: random_noise = np.random.uniform(clip_min, clip_max, size=shape) success = decision_function(random_noise[None])[0] if success: break num_evals += 1 message = "Initialization failed! Try to use a misclassified image as `target_image`" assert num_evals < 1e4, message # Binary search to minimize l2 distance to original image. low = 0.0 high = 1.0 while high - low > 0.001: mid = (high + low) / 2.0 blended = (1 - mid) * sample + mid * random_noise success = decision_function(blended[None])[0] if success: high = mid else: low = mid initialization = (1 - high) * sample + high * random_noise return initialization def geometric_progression_for_stepsize(x, update, dist, decision_function, current_iteration): """ Geometric progression to search for stepsize. Keep decreasing stepsize by half until reaching the desired side of the boundary. """ epsilon = dist / np.sqrt(current_iteration) while True: updated = x + epsilon * update success = decision_function(updated[None])[0] if success: break else: epsilon = epsilon / 2.0 return epsilon def select_delta(dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint): """ Choose the delta at the scale of distance between x and perturbed sample. """ if current_iteration == 1: delta = 0.1 * (clip_max - clip_min) else: if constraint == 'l2': delta = np.sqrt(d) * theta * dist_post_update elif constraint == 'linf': delta = d * theta * dist_post_update return delta
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/lbfgs.html ================================================ cleverhans.attacks.lbfgs — CleverHans documentation

Source code for cleverhans.attacks.lbfgs

"""The LBFGS attack
"""

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, softmax_cross_entropy_with_logits
from cleverhans.model import CallableModelWrapper, Model, wrapper_warning
from cleverhans import utils
from cleverhans import utils_tf

_logger = utils.create_logger("cleverhans.attacks.lbfgs")
tf_dtype = tf.as_dtype('float32')


[docs]class LBFGS(Attack): """ LBFGS is the first adversarial attack for convolutional neural networks, and is a target & iterative attack. Paper link: "https://arxiv.org/pdf/1312.6199.pdf" :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): if not isinstance(model, Model): wrapper_warning() model = CallableModelWrapper(model, 'probs') super(LBFGS, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y_target',) self.structural_kwargs = [ 'batch_size', 'binary_search_steps', 'max_iterations', 'initial_const', 'clip_min', 'clip_max' ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' self.parse_params(**kwargs) if self.y_target is None: self.y_target, nb_classes = self.get_or_guess_labels(x, kwargs) self.targeted_attack = False else: _, nb_classes = self.get_or_guess_labels(x, kwargs) self.targeted_attack = True attack = LBFGS_impl( self.sess, x, self.model.get_logits(x), self.y_target, self.targeted_attack, self.binary_search_steps, self.max_iterations, self.initial_const, self.clip_min, self.clip_max, nb_classes, self.batch_size) def lbfgs_wrap(x_val, y_val): """ Wrapper creating TensorFlow interface for use with py_func """ return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(lbfgs_wrap, [x, self.y_target], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, y_target=None, batch_size=1, binary_search_steps=5, max_iterations=1000, initial_const=1e-2, clip_min=0, clip_max=1): """ :param y_target: (optional) A tensor with the one-hot target labels. :param batch_size: The number of inputs to include in a batch and process simultaneously. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification. :param max_iterations: The maximum number of iterations. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and cross-entropy loss of the classification. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ self.y_target = y_target self.batch_size = batch_size self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max
class LBFGS_impl(object): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param x: A tensor with the inputs. :param logits: A tensor with model's output logits. :param targeted_label: A tensor with the target labels. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification. :param max_iterations: The maximum number of iterations. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the purturbation and cross-entropy loss of the classification. :param clip_min: Minimum input component value :param clip_max: Maximum input component value :param num_labels: The number of classes in the model's output. :param batch_size: Number of attacks to run simultaneously. """ def __init__(self, sess, x, logits, targeted_label, targeted_attack, binary_search_steps, max_iterations, initial_const, clip_min, clip_max, nb_classes, batch_size): self.sess = sess self.x = x self.logits = logits assert logits.op.type != 'Softmax' self.targeted_label = targeted_label self.targeted_attack = targeted_attack self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max self.batch_size = batch_size self.repeat = self.binary_search_steps >= 10 self.shape = tuple([self.batch_size] + list(self.x.get_shape().as_list()[1:])) self.ori_img = tf.Variable( np.zeros(self.shape), dtype=tf_dtype, name='ori_img') self.const = tf.Variable( np.zeros(self.batch_size), dtype=tf_dtype, name='const') self.score = softmax_cross_entropy_with_logits( labels=self.targeted_label, logits=self.logits) self.l2dist = reduce_sum(tf.square(self.x - self.ori_img)) # small self.const will result small adversarial perturbation # targeted attack aims at minimize loss against target label # untargeted attack aims at maximize loss against True label if self.targeted_attack: self.loss = reduce_sum(self.score * self.const) + self.l2dist else: self.loss = -reduce_sum(self.score * self.const) + self.l2dist self.grad, = tf.gradients(self.loss, self.x) def attack(self, x_val, targets): """ Perform the attack on the given instance for the given targets. """ def lbfgs_objective(adv_x, self, targets, oimgs, CONST): """ returns the function value and the gradient for fmin_l_bfgs_b """ loss = self.sess.run( self.loss, feed_dict={ self.x: adv_x.reshape(oimgs.shape), self.targeted_label: targets, self.ori_img: oimgs, self.const: CONST }) grad = self.sess.run( self.grad, feed_dict={ self.x: adv_x.reshape(oimgs.shape), self.targeted_label: targets, self.ori_img: oimgs, self.const: CONST }) return loss, grad.flatten().astype(float) def attack_success(out, target, targeted_attack): """ returns attack result """ if targeted_attack: return out == target else: return out != target # begin the main part for the attack from scipy.optimize import fmin_l_bfgs_b oimgs = np.clip(x_val, self.clip_min, self.clip_max) CONST = np.ones(self.batch_size) * self.initial_const # set the lower and upper bounds accordingly lower_bound = np.zeros(self.batch_size) upper_bound = np.ones(self.batch_size) * 1e10 # set the box constraints for the optimization function clip_min = self.clip_min * np.ones(oimgs.shape[:]) clip_max = self.clip_max * np.ones(oimgs.shape[:]) clip_bound = list(zip(clip_min.flatten(), clip_max.flatten())) # placeholders for the best l2 and instance attack found so far o_bestl2 = [1e10] * self.batch_size o_bestattack = np.copy(oimgs) for outer_step in range(self.binary_search_steps): _logger.debug(" Binary search step %s of %s", outer_step, self.binary_search_steps) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.binary_search_steps - 1: CONST = upper_bound # optimization function adv_x, _, __ = fmin_l_bfgs_b( lbfgs_objective, oimgs.flatten().astype(float), args=(self, targets, oimgs, CONST), bounds=clip_bound, maxiter=self.max_iterations, iprint=0) adv_x = adv_x.reshape(oimgs.shape) assert np.amax(adv_x) <= self.clip_max and \ np.amin(adv_x) >= self.clip_min, \ 'fmin_l_bfgs_b returns are invalid' # adjust the best result (i.e., the adversarial example with the # smallest perturbation in terms of L_2 norm) found so far preds = np.atleast_1d( utils_tf.model_argmax(self.sess, self.x, self.logits, adv_x)) _logger.debug("predicted labels are %s", preds) l2s = np.zeros(self.batch_size) for i in range(self.batch_size): l2s[i] = np.sum(np.square(adv_x[i] - oimgs[i])) for e, (l2, pred, ii) in enumerate(zip(l2s, preds, adv_x)): if l2 < o_bestl2[e] and attack_success(pred, np.argmax(targets[e]), self.targeted_attack): o_bestl2[e] = l2 o_bestattack[e] = ii # adjust the constant as needed for e in range(self.batch_size): if attack_success(preds[e], np.argmax(targets[e]), self.targeted_attack): # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug(" Successfully generated adversarial examples " "on %s of %s instances.", sum(upper_bound < 1e9), self.batch_size) o_bestl2 = np.array(o_bestl2) mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9])) _logger.debug(" Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestl2 = np.array(o_bestl2) return o_bestattack
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/madry_et_al.html ================================================ cleverhans.attacks.madry_et_al — CleverHans documentation

Source code for cleverhans.attacks.madry_et_al

"""
The MadryEtAl attack
"""

from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent


[docs]class MadryEtAl(ProjectedGradientDescent): """ The attack from Madry et al 2017 """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(MadryEtAl, self).__init__(model, sess=sess, dtypestr=dtypestr, default_rand_init=True, **kwargs)
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/max_confidence.html ================================================ cleverhans.attacks.max_confidence — CleverHans documentation

Source code for cleverhans.attacks.max_confidence

"""The MaxConfidence attack.
"""
import warnings

import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent
from cleverhans.model import Model


[docs]class MaxConfidence(Attack): """ The MaxConfidence attack. An attack designed for use against models that use confidence thresholding as a defense. If the underlying optimizer is optimal, this attack procedure gives the optimal failure rate for every confidence threshold t > 0.5. Publication: https://openreview.net/forum?id=H1g0piA9tQ :param model: cleverhans.model.Model :param sess: optional tf.session.Session :param base_attacker: cleverhans.attacks.Attack """ def __init__(self, model, sess=None, base_attacker=None): if not isinstance(model, Model): raise TypeError("Model must be cleverhans.model.Model, got " + str(type(model))) super(MaxConfidence, self).__init__(model, sess) if base_attacker is None: self.base_attacker = ProjectedGradientDescent(model, sess=sess) else: self.base_attacker = base_attacker self.structural_kwargs = self.base_attacker.structural_kwargs self.feedable_kwargs = self.base_attacker.feedable_kwargs
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: Keyword arguments for the base attacker """ assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) adv_x = self.attack(x, labels) return adv_x
[docs] def parse_params(self, y=None, nb_classes=10, **kwargs): self.y = y self.nb_classes = nb_classes self.params = kwargs if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs] def attack(self, x, true_y): """ Runs the untargeted attack. :param x: The input :param true_y: The correct label for `x`. This attack aims to produce misclassification. """ adv_x_cls = [] prob_cls = [] m = tf.shape(x)[0] true_y_idx = tf.argmax(true_y, axis=1) expanded_x = tf.concat([x] * self.nb_classes, axis=0) target_ys = [tf.to_float(tf.one_hot(tf.ones(m, dtype=tf.int32) * cls, self.nb_classes)) for cls in range(self.nb_classes)] target_y = tf.concat(target_ys, axis=0) adv_x_cls = self.attack_class(expanded_x, target_y) expanded_all_probs = self.model.get_probs(adv_x_cls) adv_x_list = tf.split(adv_x_cls, self.nb_classes) all_probs_list = tf.split(expanded_all_probs, self.nb_classes) for cls in range(self.nb_classes): target_y = target_ys[cls] all_probs = all_probs_list[cls] # We don't actually care whether we hit the target class. # We care about the probability of the most likely wrong class cur_prob_cls = tf.reduce_max(all_probs - true_y, axis=1) # Knock out examples that are correctly classified. # This is not needed to be optimal for t >= 0.5, but may as well do it # to get better failure rate at lower thresholds. chosen_cls = tf.argmax(all_probs, axis=1) eligible = tf.to_float(tf.not_equal(true_y_idx, chosen_cls)) cur_prob_cls = cur_prob_cls * eligible prob_cls.append(cur_prob_cls) probs = tf.concat([tf.expand_dims(e, 1) for e in prob_cls], axis=1) # Don't need to censor here because we knocked out the true class above # probs = probs - true_y most_confident = tf.argmax(probs, axis=1) fused_mask = tf.one_hot(most_confident, self.nb_classes) masks = tf.split(fused_mask, num_or_size_splits=self.nb_classes, axis=1) shape = [m] + [1] * (len(x.get_shape()) - 1) reshaped_masks = [tf.reshape(mask, shape) for mask in masks] out = sum(adv_x * rmask for adv_x, rmask in zip(adv_x_list, reshaped_masks)) return out
[docs] def attack_class(self, x, target_y): """ Run the attack on a specific target class. :param x: tf Tensor. The input example. :param target_y: tf Tensor. The attacker's desired target class. Returns: A targeted adversarial example, intended to be classified as the target class. """ adv = self.base_attacker.generate(x, y_target=target_y, **self.params) return adv
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/momentum_iterative_method.html ================================================ cleverhans.attacks.momentum_iterative_method — CleverHans documentation

Source code for cleverhans.attacks.momentum_iterative_method

"""The MomentumIterativeMethod attack.
"""

import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.attacks.fast_gradient_method import optimize_linear
from cleverhans.compat import reduce_sum, reduce_mean, softmax_cross_entropy_with_logits
from cleverhans import utils_tf


[docs]class MomentumIterativeMethod(Attack): """ The Momentum Iterative Method (Dong et al. 2017). This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks and Targeted Adversarial Attacks. The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1710.06081.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a MomentumIterativeMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(MomentumIterativeMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'y', 'y_target', 'clip_min', 'clip_max') self.structural_kwargs = [ 'ord', 'nb_iter', 'decay_factor', 'sanity_checks', 'clip_grad']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: Keyword arguments. See `parse_params` for documentation. """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))) if self.clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))) # Initialize loop variables momentum = tf.zeros_like(x) adv_x = x # Fix labels to the first model predictions for loss computation y, _nb_classes = self.get_or_guess_labels(x, kwargs) y = y / reduce_sum(y, 1, keepdims=True) targeted = (self.y_target is not None) def cond(i, _, __): """Iterate until number of iterations completed""" return tf.less(i, self.nb_iter) def body(i, ax, m): """Do a momentum step""" logits = self.model.get_logits(ax) loss = softmax_cross_entropy_with_logits(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input grad, = tf.gradients(loss, ax) # Normalize current gradient and add it to the accumulated gradient red_ind = list(range(1, len(grad.get_shape()))) avoid_zero_div = tf.cast(1e-12, grad.dtype) grad = grad / tf.maximum( avoid_zero_div, reduce_mean(tf.abs(grad), red_ind, keepdims=True)) m = self.decay_factor * m + grad optimal_perturbation = optimize_linear(m, self.eps_iter, self.ord) if self.ord == 1: raise NotImplementedError("This attack hasn't been tested for ord=1." "It's not clear that FGM makes a good inner " "loop step for iterative optimization since " "it updates just one coordinate at a time.") # Update and clip adversarial example in current iteration ax = ax + optimal_perturbation ax = x + utils_tf.clip_eta(ax - x, self.ord, self.eps) if self.clip_min is not None and self.clip_max is not None: ax = utils_tf.clip_by_value(ax, self.clip_min, self.clip_max) ax = tf.stop_gradient(ax) return i + 1, ax, m _, adv_x, _ = tf.while_loop( cond, body, (tf.zeros([]), adv_x, momentum), back_prop=True, maximum_iterations=self.nb_iter) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs] def parse_params(self, eps=0.3, eps_iter=0.06, nb_iter=10, y=None, ord=np.inf, decay_factor=1.0, clip_min=None, clip_max=None, y_target=None, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param decay_factor: (optional) Decay factor for the momentum term. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.eps = eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.ord = ord self.decay_factor = decay_factor self.clip_min = clip_min self.clip_max = clip_max self.sanity_checks = sanity_checks if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/noise.html ================================================ cleverhans.attacks.noise — CleverHans documentation

Source code for cleverhans.attacks.noise

"""The Noise attack

"""
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack


[docs]class Noise(Attack): """ A weak attack that just picks a random point in the attacker's action space. When combined with an attack bundling function, this can be used to implement random search. References: https://arxiv.org/abs/1802.00420 recommends random search to help identify gradient masking. https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part of an attack bundling recipe combining many different optimizers to yield a stronger optimizer. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(Noise, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'clip_min', 'clip_max') self.structural_kwargs = ['ord']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) if self.ord != np.inf: raise NotImplementedError(self.ord) eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: assert self.clip_min is not None and self.clip_max is not None adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x
[docs] def parse_params(self, eps=0.3, ord=np.inf, clip_min=None, clip_max=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.eps = eps self.ord = ord self.clip_min = clip_min self.clip_max = clip_max # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf]: raise ValueError("Norm order must be np.inf") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/projected_gradient_descent.html ================================================ cleverhans.attacks.projected_gradient_descent — CleverHans documentation

Source code for cleverhans.attacks.projected_gradient_descent

"""
The ProjectedGradientDescent attack.
"""

import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.attacks.fast_gradient_method import FastGradientMethod
from cleverhans import utils_tf
from cleverhans.compat import softmax_cross_entropy_with_logits
from cleverhans.utils_tf import clip_eta, random_lp_vector


[docs]class ProjectedGradientDescent(Attack): """ This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param default_rand_init: whether to use random initialization by default :param kwargs: passed through to super constructor """ FGM_CLASS = FastGradientMethod def __init__(self, model, sess=None, dtypestr='float32', default_rand_init=True, **kwargs): """ Create a ProjectedGradientDescent instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(ProjectedGradientDescent, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'y', 'y_target', 'clip_min', 'clip_max') self.structural_kwargs = ['ord', 'nb_iter', 'rand_init', 'clip_grad', 'sanity_checks', 'loss_fn'] self.default_rand_init = default_rand_init
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))) if self.clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))) # Initialize loop variables if self.rand_init: eta = random_lp_vector(tf.shape(x), self.ord, tf.cast(self.rand_init_eps, x.dtype), dtype=x.dtype) else: eta = tf.zeros(tf.shape(x)) # Clip eta eta = clip_eta(eta, self.ord, self.eps) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) if self.y_target is not None: y = self.y_target targeted = True elif self.y is not None: y = self.y targeted = False else: model_preds = self.model.get_probs(x) preds_max = tf.reduce_max(model_preds, 1, keepdims=True) y = tf.to_float(tf.equal(model_preds, preds_max)) y = tf.stop_gradient(y) targeted = False del model_preds y_kwarg = 'y_target' if targeted else 'y' fgm_params = { 'eps': self.eps_iter, y_kwarg: y, 'ord': self.ord, 'loss_fn': self.loss_fn, 'clip_min': self.clip_min, 'clip_max': self.clip_max, 'clip_grad': self.clip_grad } if self.ord == 1: raise NotImplementedError("FGM is not a good inner loop step for PGD " " when ord=1, because ord=1 FGM changes only " " one pixel at a time. Use the SparseL1Descent " " attack instead, which allows fine-grained " " control over the sparsity of the gradient " " updates.") # Use getattr() to avoid errors in eager execution attacks FGM = self.FGM_CLASS( self.model, sess=getattr(self, 'sess', None), dtypestr=self.dtypestr) def cond(i, _): """Iterate until requested number of iterations is completed""" return tf.less(i, self.nb_iter) def body(i, adv_x): """Do a projected gradient step""" adv_x = FGM.generate(adv_x, **fgm_params) # Clipping perturbation eta to self.ord norm ball eta = adv_x - x eta = clip_eta(eta, self.ord, self.eps) adv_x = x + eta # Redo the clipping. # FGM already did it, but subtracting and re-adding eta can add some # small numerical error. if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return i + 1, adv_x _, adv_x = tf.while_loop(cond, body, (tf.zeros([]), adv_x), back_prop=True, maximum_iterations=self.nb_iter) # Asserts run only on CPU. # When multi-GPU eval code tries to force all PGD ops onto GPU, this # can cause an error. common_dtype = tf.float32 asserts.append(utils_tf.assert_less_equal(tf.cast(self.eps_iter, dtype=common_dtype), tf.cast(self.eps, dtype=common_dtype))) if self.ord == np.inf and self.clip_min is not None: # The 1e-6 is needed to compensate for numerical error. # Without the 1e-6 this fails when e.g. eps=.2, clip_min=.5, # clip_max=.7 asserts.append(utils_tf.assert_less_equal(tf.cast(self.eps, x.dtype), 1e-6 + tf.cast(self.clip_max, x.dtype) - tf.cast(self.clip_min, x.dtype))) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs] def parse_params(self, eps=0.3, eps_iter=0.05, nb_iter=10, y=None, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, clip_min=None, clip_max=None, y_target=None, rand_init=None, rand_init_eps=None, clip_grad=False, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param rand_init: (optional) Start the gradient descent from a point chosen uniformly at random in the norm ball of radius rand_init_eps :param rand_init_eps: (optional float) size of the norm ball from which the initial starting point is chosen. Defaults to eps :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param sanity_checks: bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the tests intentionally configure the attack strangely) """ # Save attack-specific parameters self.eps = eps if rand_init is None: rand_init = self.default_rand_init self.rand_init = rand_init if rand_init_eps is None: rand_init_eps = self.eps self.rand_init_eps = rand_init_eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.ord = ord self.loss_fn = loss_fn self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad if isinstance(eps, float) and isinstance(eps_iter, float): # If these are both known at compile time, we can check before anything # is run. If they are tf, we can't check them yet. assert eps_iter <= eps, (eps_iter, eps) if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") self.sanity_checks = sanity_checks if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/saliency_map_method.html ================================================ cleverhans.attacks.saliency_map_method — CleverHans documentation

Source code for cleverhans.attacks.saliency_map_method

"""The SalienceMapMethod attack
"""
# pylint: disable=missing-docstring
import warnings

import numpy as np
from six.moves import xrange
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, reduce_max, reduce_any

tf_dtype = tf.as_dtype('float32')


[docs]class SaliencyMapMethod(Attack): """ The Jacobian-based Saliency Map Method (Papernot et al. 2016). Paper link: https://arxiv.org/pdf/1511.07528.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor :note: When not using symbolic implementation in `generate`, `sess` should be provided """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a SaliencyMapMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(SaliencyMapMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y_target',) self.structural_kwargs = [ 'theta', 'gamma', 'clip_max', 'clip_min', 'symbolic_impl' ]
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) if self.symbolic_impl: # Create random targets if y_target not provided if self.y_target is None: from random import randint def random_targets(gt): result = gt.copy() nb_s = gt.shape[0] nb_classes = gt.shape[1] for i in range(nb_s): result[i, :] = np.roll(result[i, :], randint(1, nb_classes - 1)) return result labels, nb_classes = self.get_or_guess_labels(x, kwargs) self.y_target = tf.py_func(random_targets, [labels], self.tf_dtype) self.y_target.set_shape([None, nb_classes]) x_adv = jsma_symbolic( x, model=self.model, y_target=self.y_target, theta=self.theta, gamma=self.gamma, clip_min=self.clip_min, clip_max=self.clip_max) else: raise NotImplementedError("The jsma_batch function has been removed." " The symbolic_impl argument to SaliencyMapMethod will be removed" " on 2019-07-18 or after. Any code that depends on the non-symbolic" " implementation of the JSMA should be revised. Consider using" " SaliencyMapMethod.generate_np() instead.") return x_adv
[docs] def parse_params(self, theta=1., gamma=1., clip_min=0., clip_max=1., y_target=None, symbolic_impl=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param theta: (optional float) Perturbation introduced to modified components (can be positive or negative) :param gamma: (optional float) Maximum percentage of perturbed features :param clip_min: (optional float) Minimum component value for clipping :param clip_max: (optional float) Maximum component value for clipping :param y_target: (optional) Target tensor if the attack is targeted """ self.theta = theta self.gamma = gamma self.clip_min = clip_min self.clip_max = clip_max self.y_target = y_target self.symbolic_impl = symbolic_impl if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
def jsma_batch(*args, **kwargs): raise NotImplementedError( "The jsma_batch function has been removed. Any code that depends on it should be revised.") def jsma_symbolic(x, y_target, model, theta, gamma, clip_min, clip_max): """ TensorFlow implementation of the JSMA (see https://arxiv.org/abs/1511.07528 for details about the algorithm design choices). :param x: the input placeholder :param y_target: the target tensor :param model: a cleverhans.model.Model object. :param theta: delta for each feature adjustment :param gamma: a float between 0 - 1 indicating the maximum distortion percentage :param clip_min: minimum value for components of the example returned :param clip_max: maximum value for components of the example returned :return: a tensor for the adversarial example """ nb_classes = int(y_target.shape[-1].value) nb_features = int(np.product(x.shape[1:]).value) if x.dtype == tf.float32 and y_target.dtype == tf.int64: y_target = tf.cast(y_target, tf.int32) if x.dtype == tf.float32 and y_target.dtype == tf.float64: warnings.warn("Downcasting labels---this should be harmless unless" " they are smoothed") y_target = tf.cast(y_target, tf.float32) max_iters = np.floor(nb_features * gamma / 2) increase = bool(theta > 0) tmp = np.ones((nb_features, nb_features), int) np.fill_diagonal(tmp, 0) zero_diagonal = tf.constant(tmp, tf_dtype) # Compute our initial search domain. We optimize the initial search domain # by removing all features that are already at their maximum values (if # increasing input features---otherwise, at their minimum value). if increase: search_domain = tf.reshape( tf.cast(x < clip_max, tf_dtype), [-1, nb_features]) else: search_domain = tf.reshape( tf.cast(x > clip_min, tf_dtype), [-1, nb_features]) # Loop variables # x_in: the tensor that holds the latest adversarial outputs that are in # progress. # y_in: the tensor for target labels # domain_in: the tensor that holds the latest search domain # cond_in: the boolean tensor to show if more iteration is needed for # generating adversarial samples def condition(x_in, y_in, domain_in, i_in, cond_in): # Repeat the loop until we have achieved misclassification or # reaches the maximum iterations return tf.logical_and(tf.less(i_in, max_iters), cond_in) # Same loop variables as above def body(x_in, y_in, domain_in, i_in, cond_in): # Create graph for model logits and predictions logits = model.get_logits(x_in) preds = tf.nn.softmax(logits) preds_onehot = tf.one_hot(tf.argmax(preds, axis=1), depth=nb_classes) # create the Jacobian graph list_derivatives = [] for class_ind in xrange(nb_classes): derivatives = tf.gradients(logits[:, class_ind], x_in) list_derivatives.append(derivatives[0]) grads = tf.reshape( tf.stack(list_derivatives), shape=[nb_classes, -1, nb_features]) # Compute the Jacobian components # To help with the computation later, reshape the target_class # and other_class to [nb_classes, -1, 1]. # The last dimention is added to allow broadcasting later. target_class = tf.reshape( tf.transpose(y_in, perm=[1, 0]), shape=[nb_classes, -1, 1]) other_classes = tf.cast(tf.not_equal(target_class, 1), tf_dtype) grads_target = reduce_sum(grads * target_class, axis=0) grads_other = reduce_sum(grads * other_classes, axis=0) # Remove the already-used input features from the search space # Subtract 2 times the maximum value from those value so that # they won't be picked later increase_coef = (4 * int(increase) - 2) \ * tf.cast(tf.equal(domain_in, 0), tf_dtype) target_tmp = grads_target target_tmp -= increase_coef \ * reduce_max(tf.abs(grads_target), axis=1, keepdims=True) target_sum = tf.reshape(target_tmp, shape=[-1, nb_features, 1]) \ + tf.reshape(target_tmp, shape=[-1, 1, nb_features]) other_tmp = grads_other other_tmp += increase_coef \ * reduce_max(tf.abs(grads_other), axis=1, keepdims=True) other_sum = tf.reshape(other_tmp, shape=[-1, nb_features, 1]) \ + tf.reshape(other_tmp, shape=[-1, 1, nb_features]) # Create a mask to only keep features that match conditions if increase: scores_mask = ((target_sum > 0) & (other_sum < 0)) else: scores_mask = ((target_sum < 0) & (other_sum > 0)) # Create a 2D numpy array of scores for each pair of candidate features scores = tf.cast(scores_mask, tf_dtype) \ * (-target_sum * other_sum) * zero_diagonal # Extract the best two pixels best = tf.argmax( tf.reshape(scores, shape=[-1, nb_features * nb_features]), axis=1) p1 = tf.mod(best, nb_features) p2 = tf.floordiv(best, nb_features) p1_one_hot = tf.one_hot(p1, depth=nb_features) p2_one_hot = tf.one_hot(p2, depth=nb_features) # Check if more modification is needed for each sample mod_not_done = tf.equal(reduce_sum(y_in * preds_onehot, axis=1), 0) cond = mod_not_done & (reduce_sum(domain_in, axis=1) >= 2) # Update the search domain cond_float = tf.reshape(tf.cast(cond, tf_dtype), shape=[-1, 1]) to_mod = (p1_one_hot + p2_one_hot) * cond_float domain_out = domain_in - to_mod # Apply the modification to the images to_mod_reshape = tf.reshape( to_mod, shape=([-1] + x_in.shape[1:].as_list())) if increase: x_out = tf.minimum(clip_max, x_in + to_mod_reshape * theta) else: x_out = tf.maximum(clip_min, x_in - to_mod_reshape * theta) # Increase the iterator, and check if all misclassifications are done i_out = tf.add(i_in, 1) cond_out = reduce_any(cond) return x_out, y_in, domain_out, i_out, cond_out # Run loop to do JSMA x_adv, _, _, _, _ = tf.while_loop( condition, body, [x, y_target, search_domain, 0, True], parallel_iterations=1) return x_adv
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/semantic.html ================================================ cleverhans.attacks.semantic — CleverHans documentation

Source code for cleverhans.attacks.semantic

"""Semantic adversarial examples
"""

from cleverhans.attacks.attack import Attack


[docs]class Semantic(Attack): """ Semantic adversarial examples https://arxiv.org/abs/1703.06857 Note: data must either be centered (so that the negative image can be made by simple negation) or must be in the interval [-1, 1] :param model: cleverhans.model.Model :param center: bool If True, assumes data has 0 mean so the negative image is just negation. If False, assumes data is in the interval [0, max_val] :param max_val: float Maximum value allowed in the input data :param sess: optional tf.Session :param dtypestr: dtype of data :param kwargs: passed through to the super constructor """ def __init__(self, model, center, max_val=1., sess=None, dtypestr='float32', **kwargs): super(Semantic, self).__init__(model, sess, dtypestr, **kwargs) self.center = center self.max_val = max_val if hasattr(model, 'dataset_factory'): if 'center' in model.dataset_factory.kwargs: assert center == model.dataset_factory.kwargs['center']
[docs] def generate(self, x, **kwargs): if self.center: return -x return self.max_val - x
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/sparse_l1_descent.html ================================================ cleverhans.attacks.sparse_l1_descent — CleverHans documentation

Source code for cleverhans.attacks.sparse_l1_descent

"""
The SparseL1Descent attack.
"""

import warnings
from distutils.version import LooseVersion

import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans import utils_tf
from cleverhans.utils_tf import clip_eta, random_lp_vector
from cleverhans.compat import reduce_max, reduce_sum, \
  softmax_cross_entropy_with_logits


[docs]class SparseL1Descent(Attack): """ This class implements a variant of Projected Gradient Descent for the l1-norm (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2 cases covered by the ProjectedGradientDescent class, because the steepest descent direction for the l1-norm is too sparse (it updates a single coordinate in the adversarial perturbation in each step). This attack has an additional parameter that controls the sparsity of the update step. For moderately sparse update steps, the attack vastly outperforms Projected Steepest Descent and is competitive with other attacks targeted at the l1-norm such as the ElasticNetMethod attack (which is much more computationally expensive). Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a SparseL1Descent instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(SparseL1Descent, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'y', 'y_target', 'clip_min', 'clip_max', 'grad_sparsity') self.structural_kwargs = ['nb_iter', 'rand_init', 'clip_grad', 'sanity_checks']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))) if self.clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))) # Initialize loop variables if self.rand_init: eta = random_lp_vector(tf.shape(x), ord=1, eps=tf.cast(self.eps, x.dtype), dtype=x.dtype) else: eta = tf.zeros(tf.shape(x)) # Clip eta eta = clip_eta(eta, ord=1, eps=self.eps) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) if self.y_target is not None: y = self.y_target targeted = True elif self.y is not None: y = self.y targeted = False else: model_preds = self.model.get_probs(x) preds_max = tf.reduce_max(model_preds, 1, keepdims=True) y = tf.to_float(tf.equal(model_preds, preds_max)) y = tf.stop_gradient(y) targeted = False del model_preds y_kwarg = 'y_target' if targeted else 'y' def cond(i, _): """Iterate until requested number of iterations is completed""" return tf.less(i, self.nb_iter) def body(i, adv_x): """Do a projected gradient step""" labels, _ = self.get_or_guess_labels(adv_x, {y_kwarg: y}) logits = self.model.get_logits(adv_x) adv_x = sparse_l1_descent(adv_x, logits, y=labels, eps=self.eps_iter, q=self.grad_sparsity, clip_min=self.clip_min, clip_max=self.clip_max, clip_grad=self.clip_grad, targeted=(self.y_target is not None), sanity_checks=self.sanity_checks) # Clipping perturbation eta to the l1-ball eta = adv_x - x eta = clip_eta(eta, ord=1, eps=self.eps) adv_x = x + eta # Redo the clipping. # Subtracting and re-adding eta can add some small numerical error. if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return i + 1, adv_x _, adv_x = tf.while_loop(cond, body, (tf.zeros([]), adv_x), back_prop=True, maximum_iterations=self.nb_iter) # Asserts run only on CPU. # When multi-GPU eval code tries to force all PGD ops onto GPU, this # can cause an error. common_dtype = tf.float32 asserts.append(utils_tf.assert_less_equal(tf.cast(self.eps_iter, dtype=common_dtype), tf.cast(self.eps, dtype=common_dtype))) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs] def parse_params(self, eps=10.0, eps_iter=1.0, nb_iter=20, y=None, clip_min=None, clip_max=None, y_target=None, rand_init=False, clip_grad=False, grad_sparsity=99, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param grad_sparsity (optional) Relative sparsity of the gradient update step, in percent. Only gradient values larger than this percentile are retained. This parameter can be a scalar, or a vector of the same length as the input batch dimension. :param sanity_checks: bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the tests intentionally configure the attack strangely) """ # Save attack-specific parameters self.eps = eps self.rand_init = rand_init self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad self.grad_sparsity = grad_sparsity if isinstance(eps, float) and isinstance(eps_iter, float): # If these are both known at compile time, we can check before anything # is run. If they are tf, we can't check them yet. assert eps_iter <= eps, (eps_iter, eps) if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") # The grad_sparsity argument governs the sparsity of the gradient # update. It indicates the percentile value above which gradient entries # are retained. It can be specified as a scalar or as a 1-dimensional # vector of the same size as the input's batch dimension. if isinstance(self.grad_sparsity, int) or \ isinstance(self.grad_sparsity, float): if not 0 < self.grad_sparsity < 100: raise ValueError("grad_sparsity should be in (0, 100)") else: self.grad_sparsity = tf.convert_to_tensor(self.grad_sparsity) if len(self.grad_sparsity.shape) > 1: raise ValueError("grad_sparsity should either be a scalar or a vector") self.sanity_checks = sanity_checks if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
def sparse_l1_descent(x, logits, y=None, eps=1.0, q=99, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True): """ TensorFlow implementation of the Dense L1 Descent Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param eps: the epsilon (input variation parameter) :param q: the percentile above which gradient values are retained. Either a scalar or a vector of same length as the input batch dimension. :param clip_min: Minimum float value for adversarial example components :param clip_max: Maximum float value for adversarial example components :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(utils_tf.assert_greater_equal( x, tf.cast(clip_min, x.dtype))) if clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype))) # Make sure the caller has not passed probs by accident assert logits.op.type != 'Softmax' if y is None: # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(logits, 1, keepdims=True) y = tf.to_float(tf.equal(logits, preds_max)) y = tf.stop_gradient(y) y = y / reduce_sum(y, 1, keepdims=True) # Compute loss loss = softmax_cross_entropy_with_logits(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input grad, = tf.gradients(loss, x) if clip_grad: grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max) red_ind = list(range(1, len(grad.get_shape()))) dim = tf.reduce_prod(tf.shape(x)[1:]) abs_grad = tf.reshape(tf.abs(grad), (-1, dim)) # if q is a scalar, broadcast it to a vector of same length as the batch dim q = tf.cast(tf.broadcast_to(q, tf.shape(x)[0:1]), tf.float32) k = tf.cast(tf.floor(q / 100 * tf.cast(dim, tf.float32)), tf.int32) # `tf.sort` is much faster than `tf.contrib.distributions.percentile`. # For TF <= 1.12, use `tf.nn.top_k` as `tf.sort` is not implemented. if LooseVersion(tf.__version__) <= LooseVersion('1.12.0'): # `tf.sort` is only available in TF 1.13 onwards sorted_grad = -tf.nn.top_k(-abs_grad, k=dim, sorted=True)[0] else: sorted_grad = tf.sort(abs_grad, axis=-1) idx = tf.stack((tf.range(tf.shape(abs_grad)[0]), k), -1) percentiles = tf.gather_nd(sorted_grad, idx) tied_for_max = tf.greater_equal(abs_grad, tf.expand_dims(percentiles, -1)) tied_for_max = tf.reshape(tf.cast(tied_for_max, x.dtype), tf.shape(grad)) num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True) optimal_perturbation = tf.sign(grad) * tied_for_max / num_ties # Add perturbation to original example to obtain adversarial example adv_x = x + utils_tf.mul(eps, optimal_perturbation) # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/spatial_transformation_method.html ================================================ cleverhans.attacks.spatial_transformation_method — CleverHans documentation

Source code for cleverhans.attacks.spatial_transformation_method

"""The SpatialTransformationMethod attack
"""
import warnings

from cleverhans.attacks.attack import Attack


[docs]class SpatialTransformationMethod(Attack): """ Spatial transformation attack """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a SpatialTransformationMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ super(SpatialTransformationMethod, self).__init__( model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('n_samples', 'dx_min', 'dx_max', 'n_dxs', 'dy_min', 'dy_max', 'n_dys', 'angle_min', 'angle_max', 'n_angles', 'black_border_size')
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) from cleverhans.attacks_tf import spm labels, _ = self.get_or_guess_labels(x, kwargs) return spm( x, self.model, y=labels, n_samples=self.n_samples, dx_min=self.dx_min, dx_max=self.dx_max, n_dxs=self.n_dxs, dy_min=self.dy_min, dy_max=self.dy_max, n_dys=self.n_dys, angle_min=self.angle_min, angle_max=self.angle_max, n_angles=self.n_angles, black_border_size=self.black_border_size)
[docs] def parse_params(self, n_samples=None, dx_min=-0.1, dx_max=0.1, n_dxs=2, dy_min=-0.1, dy_max=0.1, n_dys=2, angle_min=-30, angle_max=30, n_angles=6, black_border_size=0, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param n_samples: (optional) The number of transformations sampled to construct the attack. Set it to None to run full grid attack. :param dx_min: (optional float) Minimum translation ratio along x-axis. :param dx_max: (optional float) Maximum translation ratio along x-axis. :param n_dxs: (optional int) Number of discretized translation ratios along x-axis. :param dy_min: (optional float) Minimum translation ratio along y-axis. :param dy_max: (optional float) Maximum translation ratio along y-axis. :param n_dys: (optional int) Number of discretized translation ratios along y-axis. :param angle_min: (optional float) Largest counter-clockwise rotation angle. :param angle_max: (optional float) Largest clockwise rotation angle. :param n_angles: (optional int) Number of discretized angles. :param black_border_size: (optional int) size of the black border in pixels. """ self.n_samples = n_samples self.dx_min = dx_min self.dx_max = dx_max self.n_dxs = n_dxs self.dy_min = dy_min self.dy_max = dy_max self.n_dys = n_dys self.angle_min = angle_min self.angle_max = angle_max self.n_angles = n_angles self.black_border_size = black_border_size if self.dx_min < -1 or self.dy_min < -1 or \ self.dx_max > 1 or self.dy_max > 1: raise ValueError("The value of translation must be bounded " "within [-1, 1]") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/spsa.html ================================================ cleverhans.attacks.spsa — CleverHans documentation

Source code for cleverhans.attacks.spsa

"""The SPSA attack
"""
# pylint: disable=missing-docstring
import warnings

import numpy as np
from six.moves import xrange
import tensorflow as tf
# import tensorflow_addons as tfa

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_mean, reduce_sum, reduce_max
from cleverhans.model import Model
from cleverhans import utils_tf

tf_dtype = tf.as_dtype('float32')


[docs]class SPSA(Attack): """ This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ DEFAULT_SPSA_SAMPLES = 128 DEFAULT_SPSA_ITERS = 1 DEFAULT_DELTA = 0.01 DEFAULT_LEARNING_RATE = 0.01 def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(SPSA, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'clip_min', 'clip_max', 'y', 'y_target') self.structural_kwargs = [ 'nb_iter', 'spsa_samples', 'spsa_iters', 'early_stop_loss_threshold', 'is_debug', 'is_targeted', ] assert isinstance(self.model, Model)
[docs] def generate(self, x, y=None, y_target=None, eps=None, clip_min=None, clip_max=None, nb_iter=None, is_targeted=None, early_stop_loss_threshold=None, learning_rate=DEFAULT_LEARNING_RATE, delta=DEFAULT_DELTA, spsa_samples=DEFAULT_SPSA_SAMPLES, batch_size=None, spsa_iters=DEFAULT_SPSA_ITERS, is_debug=False, epsilon=None, num_steps=None): """ Generate symbolic graph for adversarial examples. :param x: The model's symbolic inputs. Must be a batch of size 1. :param y: A Tensor or None. The index of the correct label. :param y_target: A Tensor or None. The index of the target label in a targeted attack. :param eps: The size of the maximum perturbation, measured in the L-infinity norm. :param clip_min: If specified, the minimum input value :param clip_max: If specified, the maximum input value :param nb_iter: The number of optimization steps. :param early_stop_loss_threshold: A float or None. If specified, the attack will end as soon as the loss is below `early_stop_loss_threshold`. :param learning_rate: Learning rate of ADAM optimizer. :param delta: Perturbation size used for SPSA approximation. :param spsa_samples: Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is `spsa_samples * spsa_iters` :param batch_size: Deprecated param that is an alias for spsa_samples :param spsa_iters: Number of model evaluations before performing an update, where each evaluation is on `spsa_samples` different inputs. :param is_debug: If True, print the adversarial loss after each update. :param epsilon: Deprecated alias for `eps` :param num_steps: Deprecated alias for `nb_iter`. :param is_targeted: Deprecated argument. Ignored. """ if epsilon is not None: if eps is not None: raise ValueError("Should not specify both eps and its deprecated " "alias, epsilon") warnings.warn("`epsilon` is deprecated. Switch to `eps`. `epsilon` may " "be removed on or after 2019-04-15.") eps = epsilon del epsilon if num_steps is not None: if nb_iter is not None: raise ValueError("Should not specify both nb_iter and its deprecated " "alias, num_steps") warnings.warn("`num_steps` is deprecated. Switch to `nb_iter`. " "`num_steps` may be removed on or after 2019-04-15.") nb_iter = num_steps del num_steps assert nb_iter is not None if (y is not None) + (y_target is not None) != 1: raise ValueError("Must specify exactly one of y (untargeted attack, " "cause the input not to be classified as this true " "label) and y_target (targeted attack, cause the " "input to be classified as this target label).") if is_targeted is not None: warnings.warn("`is_targeted` is deprecated. Simply do not specify it." " It may become an error to specify it on or after " "2019-04-15.") assert is_targeted == y_target is not None is_targeted = y_target is not None if x.get_shape().as_list()[0] is None: check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1) with tf.control_dependencies([check_batch]): x = tf.identity(x) elif x.get_shape().as_list()[0] != 1: raise ValueError("For SPSA, input tensor x must have batch_size of 1.") if batch_size is not None: warnings.warn( 'The "batch_size" argument to SPSA is deprecated, and will ' 'be removed on 2019-03-17. ' 'Please use spsa_samples instead.') spsa_samples = batch_size optimizer = SPSAAdam( lr=learning_rate, delta=delta, num_samples=spsa_samples, num_iters=spsa_iters) def loss_fn(x, label): """ Margin logit loss, with correct sign for targeted vs untargeted loss. """ logits = self.model.get_logits(x) loss_multiplier = 1 if is_targeted else -1 return loss_multiplier * margin_logit_loss( logits, label, nb_classes=self.model.nb_classes or logits.get_shape()[-1]) y_attack = y_target if is_targeted else y adv_x = projected_optimization( loss_fn, x, y_attack, eps, num_steps=nb_iter, optimizer=optimizer, early_stop_loss_threshold=early_stop_loss_threshold, is_debug=is_debug, clip_min=clip_min, clip_max=clip_max ) return adv_x
[docs] def generate_np(self, x_val, **kwargs): if "epsilon" in kwargs: warnings.warn("Using deprecated argument: see `generate`") assert "eps" not in kwargs kwargs["eps"] = kwargs["epsilon"] del kwargs["epsilon"] assert "eps" in kwargs if "num_steps" in kwargs: warnings.warn("Using deprecated argument: see `generate`") assert "nb_iter" not in kwargs kwargs["nb_iter"] = kwargs["num_steps"] del kwargs["num_steps"] if 'y' in kwargs and kwargs['y'] is not None: assert kwargs['y'].dtype in [np.int32, np.int64] if 'y_target' in kwargs and kwargs['y_target'] is not None: assert kwargs['y_target'].dtype in [np.int32, np.int64] # Call self.generate() sequentially for each image in the batch x_adv = [] batch_size = x_val.shape[0] y = kwargs.pop('y', [None] * batch_size) assert len(x_val) == len(y), '# of images and labels should match' for x_single, y_single in zip(x_val, y): x = np.expand_dims(x_single, axis=0) adv_img = super(SPSA, self).generate_np(x, y=y_single, **kwargs) x_adv.append(adv_img) return np.concatenate(x_adv, axis=0)
def _project_perturbation(perturbation, epsilon, input_image, clip_min=None, clip_max=None): """Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into hypercube such that the resulting adversarial example is between clip_min and clip_max, if applicable. """ if clip_min is None or clip_max is None: raise NotImplementedError("_project_perturbation currently has clipping " "hard-coded in.") # Ensure inputs are in the correct range with tf.control_dependencies([ utils_tf.assert_less_equal(input_image, tf.cast(clip_max, input_image.dtype)), utils_tf.assert_greater_equal(input_image, tf.cast(clip_min, input_image.dtype)) ]): clipped_perturbation = utils_tf.clip_by_value( perturbation, -epsilon, epsilon) new_image = utils_tf.clip_by_value( input_image + clipped_perturbation, clip_min, clip_max) return new_image - input_image class TensorOptimizer(object): """Optimizer for Tensors rather than tf.Variables. TensorOptimizers implement optimizers where the values being optimized are ordinary Tensors, rather than Variables. TF Variables can have strange behaviors when being assigned multiple times within a single sess.run() call, particularly in Distributed TF, so this avoids thinking about those issues. These are helper classes for the `projected_optimization` method. Apart from not using Variables, they follow an interface very similar to tf.Optimizer. """ def _compute_gradients(self, loss_fn, x, unused_optim_state): """Compute a new value of `x` to minimize `loss_fn`. Args: loss_fn: a callable that takes `x`, a batch of images, and returns a batch of loss values. `x` will be optimized to minimize `loss_fn(x)`. x: A list of Tensors, the values to be updated. This is analogous to the `var_list` argument in standard TF Optimizer. unused_optim_state: A (possibly nested) dict, containing any state info needed for the optimizer. Returns: new_x: A list of Tensors, the same length as `x`, which are updated new_optim_state: A dict, with the same structure as `optim_state`, which have been updated. """ # Assumes `x` is a list, # and contains a tensor representing a batch of images assert len(x) == 1 and isinstance(x, list), \ 'x should be a list and contain only one image tensor' x = x[0] loss = reduce_mean(loss_fn(x), axis=0) return tf.gradients(loss, x) def _apply_gradients(self, grads, x, optim_state): """ Given a gradient, make one optimization step. :param grads: list of tensors, same length as `x`, containing the corresponding gradients :param x: list of tensors to update :param optim_state: dict Returns: new_x: list of tensors, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ raise NotImplementedError( "_apply_gradients should be defined in each subclass") def minimize(self, loss_fn, x, optim_state): """ Analogous to tf.Optimizer.minimize :param loss_fn: tf Tensor, representing the loss to minimize :param x: list of Tensor, analogous to tf.Optimizer's var_list :param optim_state: A possibly nested dict, containing any optimizer state. Returns: new_x: list of Tensor, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ grads = self._compute_gradients(loss_fn, x, optim_state) return self._apply_gradients(grads, x, optim_state) def init_state(self, x): """Returns the initial state of the optimizer. Args: x: A list of Tensors, which will be optimized. Returns: A dictionary, representing the initial state of the optimizer. """ raise NotImplementedError( "init_state should be defined in each subclass") class TensorGradientDescent(TensorOptimizer): """Vanilla Gradient Descent TensorOptimizer.""" def __init__(self, lr): self._lr = lr def init_state(self, x): return {} def _apply_gradients(self, grads, x, optim_state): new_x = [None] * len(x) for i in xrange(len(x)): new_x[i] = x[i] - self._lr * grads[i] return new_x, optim_state class TensorAdam(TensorOptimizer): """The Adam optimizer defined in https://arxiv.org/abs/1412.6980.""" def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-9): self._lr = lr self._beta1 = beta1 self._beta2 = beta2 self._epsilon = epsilon def init_state(self, x): """ Initialize t, m, and u """ optim_state = {} optim_state["t"] = 0. optim_state["m"] = [tf.zeros_like(v) for v in x] optim_state["u"] = [tf.zeros_like(v) for v in x] return optim_state def _apply_gradients(self, grads, x, optim_state): """Refer to parent class documentation.""" new_x = [None] * len(x) new_optim_state = { "t": optim_state["t"] + 1., "m": [None] * len(x), "u": [None] * len(x) } t = new_optim_state["t"] for i in xrange(len(x)): g = grads[i] m_old = optim_state["m"][i] u_old = optim_state["u"][i] new_optim_state["m"][i] = ( self._beta1 * m_old + (1. - self._beta1) * g) new_optim_state["u"][i] = ( self._beta2 * u_old + (1. - self._beta2) * g * g) m_hat = new_optim_state["m"][i] / (1. - tf.pow(self._beta1, t)) u_hat = new_optim_state["u"][i] / (1. - tf.pow(self._beta2, t)) new_x[i] = ( x[i] - self._lr * m_hat / (tf.sqrt(u_hat) + self._epsilon)) return new_x, new_optim_state class SPSAAdam(TensorAdam): """Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666. Gradients estimates are computed using Simultaneous Perturbation Stochastic Approximation (SPSA), combined with the ADAM update rule. """ def __init__(self, lr=0.01, delta=0.01, num_samples=128, num_iters=1, compare_to_analytic_grad=False): super(SPSAAdam, self).__init__(lr=lr) assert num_samples % 2 == 0, "number of samples must be even" self._delta = delta self._num_samples = num_samples // 2 # Since we mirror +/- delta later self._num_iters = num_iters self._compare_to_analytic_grad = compare_to_analytic_grad def _get_delta(self, x, delta): x_shape = x.get_shape().as_list() delta_x = delta * tf.sign( tf.random_uniform( [self._num_samples] + x_shape[1:], minval=-1., maxval=1., dtype=tf_dtype)) return delta_x def _compute_gradients(self, loss_fn, x, unused_optim_state): """Compute gradient estimates using SPSA.""" # Assumes `x` is a list, containing a [1, H, W, C] image # If static batch dimension is None, tf.reshape to batch size 1 # so that static shape can be inferred assert len(x) == 1 static_x_shape = x[0].get_shape().as_list() if static_x_shape[0] is None: x[0] = tf.reshape(x[0], [1] + static_x_shape[1:]) assert x[0].get_shape().as_list()[0] == 1 x = x[0] x_shape = x.get_shape().as_list() def body(i, grad_array): delta = self._delta delta_x = self._get_delta(x, delta) delta_x = tf.concat([delta_x, -delta_x], axis=0) loss_vals = tf.reshape( loss_fn(x + delta_x), [2 * self._num_samples] + [1] * (len(x_shape) - 1)) avg_grad = reduce_mean(loss_vals * delta_x, axis=0) / delta avg_grad = tf.expand_dims(avg_grad, axis=0) new_grad_array = grad_array.write(i, avg_grad) return i + 1, new_grad_array def cond(i, _): return i < self._num_iters _, all_grads = tf.while_loop( cond, body, loop_vars=[ 0, tf.TensorArray(size=self._num_iters, dtype=tf_dtype) ], back_prop=False, parallel_iterations=1) avg_grad = reduce_sum(all_grads.stack(), axis=0) return [avg_grad] def margin_logit_loss(model_logits, label, nb_classes=10, num_classes=None): """Computes difference between logit for `label` and next highest logit. The loss is high when `label` is unlikely (targeted by default). This follows the same interface as `loss_fn` for TensorOptimizer and projected_optimization, i.e. it returns a batch of loss values. """ if num_classes is not None: warnings.warn("`num_classes` is depreciated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23.") nb_classes = num_classes del num_classes if 'int' in str(label.dtype): logit_mask = tf.one_hot(label, depth=nb_classes, axis=-1) else: logit_mask = label if 'int' in str(logit_mask.dtype): logit_mask = tf.to_float(logit_mask) try: label_logits = reduce_sum(logit_mask * model_logits, axis=-1) except TypeError: raise TypeError("Could not take row-wise dot product between " "logit mask, of dtype " + str(logit_mask.dtype) + " and model_logits, of dtype " + str(model_logits.dtype)) logits_with_target_label_neg_inf = model_logits - logit_mask * 99999 highest_nonlabel_logits = reduce_max( logits_with_target_label_neg_inf, axis=-1) loss = highest_nonlabel_logits - label_logits return loss def _apply_black_border(x, border_size): orig_height = x.get_shape().as_list()[1] orig_width = x.get_shape().as_list()[2] x = tf.image.resize_images(x, (orig_width - 2*border_size, orig_height - 2*border_size)) return tf.pad(x, [[0, 0], [border_size, border_size], [border_size, border_size], [0, 0]], 'CONSTANT') def _apply_transformation(inputs): x, trans = inputs[0], inputs[1] dx, dy, angle = trans[0], trans[1], trans[2] height = x.get_shape().as_list()[1] width = x.get_shape().as_list()[2] # Pad the image to prevent two-step rotation / translation from truncating # corners max_dist_from_center = np.sqrt(height**2+width**2) / 2 min_edge_from_center = float(np.min([height, width])) / 2 padding = np.ceil(max_dist_from_center - min_edge_from_center).astype(np.int32) x = tf.pad(x, [[0, 0], [padding, padding], [padding, padding], [0, 0]], 'CONSTANT') # Apply rotation angle *= np.pi / 180 x = tfa.image.rotate(x, angle, interpolation='BILINEAR') # Apply translation dx_in_px = -dx * height dy_in_px = -dy * width translation = tf.convert_to_tensor([dx_in_px, dy_in_px]) try: x = tfa.image.translate(x, translation, interpolation='BILINEAR') except AttributeError as e: print("WARNING: SpatialAttack requires tf 1.6 or higher") raise e x = tfa.image.translate(x, translation, interpolation='BILINEAR') return tf.image.resize_image_with_crop_or_pad(x, height, width) def spm(x, model, y=None, n_samples=None, dx_min=-0.1, dx_max=0.1, n_dxs=5, dy_min=-0.1, dy_max=0.1, n_dys=5, angle_min=-30, angle_max=30, n_angles=31, black_border_size=0): """ TensorFlow implementation of the Spatial Transformation Method. :return: a tensor for the adversarial example """ if y is None: preds = model.get_probs(x) # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(preds, 1, keepdims=True) y = tf.to_float(tf.equal(preds, preds_max)) y = tf.stop_gradient(y) del preds y = y / reduce_sum(y, 1, keepdims=True) # Define the range of transformations dxs = np.linspace(dx_min, dx_max, n_dxs) dys = np.linspace(dy_min, dy_max, n_dys) angles = np.linspace(angle_min, angle_max, n_angles) if n_samples is None: import itertools transforms = list(itertools.product(*[dxs, dys, angles])) else: sampled_dxs = np.random.choice(dxs, n_samples) sampled_dys = np.random.choice(dys, n_samples) sampled_angles = np.random.choice(angles, n_samples) transforms = zip(sampled_dxs, sampled_dys, sampled_angles) transformed_ims = parallel_apply_transformations( x, transforms, black_border_size) def _compute_xent(x): preds = model.get_logits(x) return tf.nn.softmax_cross_entropy_with_logits_v2( labels=y, logits=preds) all_xents = tf.map_fn( _compute_xent, transformed_ims, parallel_iterations=1) # Must be 1 to avoid keras race conditions # Return the adv_x with worst accuracy # all_xents is n_total_samples x batch_size (SB) all_xents = tf.stack(all_xents) # SB # We want the worst case sample, with the largest xent_loss worst_sample_idx = tf.argmax(all_xents, axis=0) # B batch_size = tf.shape(x)[0] keys = tf.stack([ tf.range(batch_size, dtype=tf.int32), tf.cast(worst_sample_idx, tf.int32) ], axis=1) transformed_ims_bshwc = tf.einsum('sbhwc->bshwc', transformed_ims) after_lookup = tf.gather_nd(transformed_ims_bshwc, keys) # BHWC return after_lookup def parallel_apply_transformations(x, transforms, black_border_size=0): """ Apply image transformations in parallel. :param transforms: TODO :param black_border_size: int, size of black border to apply Returns: Transformed images """ transforms = tf.convert_to_tensor(transforms, dtype=tf.float32) x = _apply_black_border(x, black_border_size) num_transforms = transforms.get_shape().as_list()[0] im_shape = x.get_shape().as_list()[1:] # Pass a copy of x and a transformation to each iteration of the map_fn # callable tiled_x = tf.reshape( tf.tile(x, [num_transforms, 1, 1, 1]), [num_transforms, -1] + im_shape) elems = [tiled_x, transforms] transformed_ims = tf.map_fn( _apply_transformation, elems, dtype=tf.float32, parallel_iterations=1, # Must be 1 to avoid keras race conditions ) return transformed_ims
[docs]def projected_optimization(loss_fn, input_image, label, epsilon, num_steps, clip_min=None, clip_max=None, optimizer=TensorAdam(), project_perturbation=_project_perturbation, early_stop_loss_threshold=None, is_debug=False): """Generic projected optimization, generalized to work with approximate gradients. Used for e.g. the SPSA attack. Args: :param loss_fn: A callable which takes `input_image` and `label` as arguments, and returns a batch of loss values. Same interface as TensorOptimizer. :param input_image: Tensor, a batch of images :param label: Tensor, a batch of labels :param epsilon: float, the L-infinity norm of the maximum allowable perturbation :param num_steps: int, the number of steps of gradient descent :param clip_min: float, minimum pixel value :param clip_max: float, maximum pixel value :param optimizer: A `TensorOptimizer` object :param project_perturbation: A function, which will be used to enforce some constraint. It should have the same signature as `_project_perturbation`. :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below `early_stop_loss_threshold`. Enabling this option can have several different effects: - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned. This increases the attack success rate, because without early stopping the optimizer can accidentally bounce back to a point where the attack fails. - Early stopping can make the attack run faster because it may run for fewer steps. - Early stopping can make the attack run slower because the loss must be calculated at each step. The loss is not calculated as part of the normal SPSA optimization procedure. For most reasonable choices of hyperparameters, early stopping makes the attack much faster because it decreases the number of steps dramatically. :param is_debug: A bool. If True, print debug info for attack progress. Returns: adversarial version of `input_image`, with L-infinity difference less than epsilon, which tries to minimize loss_fn. Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper function which you can use to write your own attack methods. The method uses a tf.while_loop to optimize a loss function in a single sess.run() call. """ assert num_steps is not None if is_debug: with tf.device("/cpu:0"): input_image = tf.Print( input_image, [], "Starting PGD attack with epsilon: %s" % epsilon) init_perturbation = tf.random_uniform( tf.shape(input_image), minval=tf.cast(-epsilon, input_image.dtype), maxval=tf.cast(epsilon, input_image.dtype), dtype=input_image.dtype) init_perturbation = project_perturbation(init_perturbation, epsilon, input_image, clip_min=clip_min, clip_max=clip_max) init_optim_state = optimizer.init_state([init_perturbation]) nest = tf.nest def loop_body(i, perturbation, flat_optim_state): """Update perturbation to input image.""" optim_state = nest.pack_sequence_as( structure=init_optim_state, flat_sequence=flat_optim_state) def wrapped_loss_fn(x): return loss_fn(input_image + x, label) new_perturbation_list, new_optim_state = optimizer.minimize( wrapped_loss_fn, [perturbation], optim_state) projected_perturbation = project_perturbation(new_perturbation_list[0], epsilon, input_image, clip_min=clip_min, clip_max=clip_max) # Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we must explicitly # check whether the value is None. early_stop = early_stop_loss_threshold is not None compute_loss = is_debug or early_stop # Don't waste time building the loss graph if we're not going to use it if compute_loss: # NOTE: this step is not actually redundant with the optimizer step. # SPSA calculates the loss at randomly perturbed points but doesn't calculate the loss at the current point. loss = reduce_mean(wrapped_loss_fn(projected_perturbation), axis=0) if is_debug: with tf.device("/cpu:0"): loss = tf.Print(loss, [loss], "Total batch loss") if early_stop: i = tf.cond(tf.less(loss, early_stop_loss_threshold), lambda: float(num_steps), lambda: i) return i + 1, projected_perturbation, nest.flatten(new_optim_state) def cond(i, *_): return tf.less(i, num_steps) flat_init_optim_state = nest.flatten(init_optim_state) _, final_perturbation, _ = tf.while_loop( cond, loop_body, loop_vars=(tf.constant(0.), init_perturbation, flat_init_optim_state), parallel_iterations=1, back_prop=False, maximum_iterations=num_steps) if project_perturbation is _project_perturbation: # TODO: this assert looks totally wrong. # Not bothering to fix it now because it's only an assert. # 1) Multiplying by 1.1 gives a huge margin of error. This should probably # take the difference and allow a tolerance of 1e-6 or something like # that. # 2) I think it should probably check the *absolute value* of # final_perturbation perturbation_max = epsilon * 1.1 check_diff = utils_tf.assert_less_equal( final_perturbation, tf.cast(perturbation_max, final_perturbation.dtype), message="final_perturbation must change no pixel by more than " "%s" % perturbation_max) else: # TODO: let caller pass in a check_diff function as well as # project_perturbation check_diff = tf.no_op() if clip_min is None or clip_max is None: raise NotImplementedError("This function only supports clipping for now") check_range = [utils_tf.assert_less_equal(input_image, tf.cast(clip_max, input_image.dtype)), utils_tf.assert_greater_equal(input_image, tf.cast(clip_min, input_image.dtype))] with tf.control_dependencies([check_diff] + check_range): adversarial_image = input_image + final_perturbation return tf.stop_gradient(adversarial_image)
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/virtual_adversarial_method.html ================================================ cleverhans.attacks.virtual_adversarial_method — CleverHans documentation

Source code for cleverhans.attacks.virtual_adversarial_method

"""The VirtualAdversarialMethod attack

"""

import warnings

import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.model import Model, CallableModelWrapper
from cleverhans.model import wrapper_warning_logits
from cleverhans import utils_tf

tf_dtype = tf.as_dtype('float32')

[docs]class VirtualAdversarialMethod(Attack): """ This attack was originally proposed by Miyato et al. (2016) and was used for virtual adversarial training. Paper link: https://arxiv.org/abs/1507.00677 :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(VirtualAdversarialMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'xi', 'clip_min', 'clip_max') self.structural_kwargs = ['num_iterations']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) return vatm( self.model, x, self.model.get_logits(x), eps=self.eps, num_iterations=self.num_iterations, xi=self.xi, clip_min=self.clip_min, clip_max=self.clip_max)
[docs] def parse_params(self, eps=2.0, nb_iter=None, xi=1e-6, clip_min=None, clip_max=None, num_iterations=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float )the epsilon (input variation parameter) :param nb_iter: (optional) the number of iterations Defaults to 1 if not specified :param xi: (optional float) the finite difference parameter :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param num_iterations: Deprecated alias for `nb_iter` """ # Save attack-specific parameters self.eps = eps if num_iterations is not None: warnings.warn("`num_iterations` is deprecated. Switch to `nb_iter`." " The old name will be removed on or after 2019-04-26.") # Note: when we remove the deprecated alias, we can put the default # value of 1 for nb_iter back in the method signature assert nb_iter is None nb_iter = num_iterations del num_iterations if nb_iter is None: nb_iter = 1 self.num_iterations = nb_iter self.xi = xi self.clip_min = clip_min self.clip_max = clip_max if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs]def vatm(model, x, logits, eps, num_iterations=1, xi=1e-6, clip_min=None, clip_max=None, scope=None): """ Tensorflow implementation of the perturbation method used for virtual adversarial training: https://arxiv.org/abs/1507.00677 :param model: the model which returns the network unnormalized logits :param x: the input placeholder :param logits: the model's unnormalized output tensor (the input to the softmax layer) :param eps: the epsilon (input variation parameter) :param num_iterations: the number of iterations :param xi: the finite difference parameter :param clip_min: optional parameter that can be used to set a minimum value for components of the example returned :param clip_max: optional parameter that can be used to set a maximum value for components of the example returned :param seed: the seed for random generator :return: a tensor for the adversarial example """ with tf.name_scope(scope, "virtual_adversarial_perturbation"): d = tf.random_normal(tf.shape(x), dtype=tf_dtype) for _ in range(num_iterations): d = xi * utils_tf.l2_batch_normalize(d) logits_d = model.get_logits(x + d) kl = utils_tf.kl_with_logits(logits, logits_d) Hd = tf.gradients(kl, d)[0] d = tf.stop_gradient(Hd) d = eps * utils_tf.l2_batch_normalize(d) adv_x = x + d if (clip_min is not None) and (clip_max is not None): adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) return adv_x
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/compat.html ================================================ cleverhans.compat — CleverHans documentation

Source code for cleverhans.compat

"""
Wrapper functions for writing code that is compatible with many versions
of TensorFlow.
"""
import warnings
import tensorflow as tf
# The following 2 imports are not used in this module. They are imported so that users of cleverhans.compat can
# get access to device_lib, app, and flags. A pylint bug makes these imports cause errors when using python3+tf1.8.
# Doing the sanitized import here once makes it possible to do "from cleverhans.compat import flags" throughout the
# library without needing to repeat the pylint boilerplate.
from tensorflow.python.client import device_lib # pylint: disable=no-name-in-module,unused-import
from tensorflow.python.platform import app, flags # pylint: disable=no-name-in-module,unused-import

def _wrap(f):
  """
  Wraps a callable `f` in a function that warns that the function is deprecated.
  """
  def wrapper(*args, **kwargs):
    """
    Issues a deprecation warning and passes through the arguments.
    """
    warnings.warn(str(f) + " is deprecated. Switch to calling the equivalent function in tensorflow. "
                  " This function was originally needed as a compatibility layer for old versions of tensorflow, "
                  " but support for those versions has now been dropped.")
    return f(*args, **kwargs)
  return wrapper

reduce_sum = _wrap(tf.reduce_sum)
reduce_max = _wrap(tf.reduce_max)
reduce_min = _wrap(tf.reduce_min)
reduce_mean = _wrap(tf.reduce_mean)
reduce_prod = _wrap(tf.reduce_prod)
reduce_any = _wrap(tf.reduce_any)

def reduce_function(op_func, input_tensor, axis=None, keepdims=None,
                    name=None, reduction_indices=None):
  """
  This function used to be needed to support tf 1.4 and early, but support for tf 1.4 and earlier is now dropped.
  :param op_func: expects the function to handle eg: tf.reduce_sum.
  :param input_tensor: The tensor to reduce. Should have numeric type.
  :param axis: The dimensions to reduce. If None (the default),
          reduces all dimensions. Must be in the range
          [-rank(input_tensor), rank(input_tensor)).
  :param keepdims: If true, retains reduced dimensions with length 1.
  :param name: A name for the operation (optional).
  :param reduction_indices: The old (deprecated) name for axis.
  :return: outputs same value as op_func.
  """

  warnings.warn("`reduce_function` is deprecated and may be removed on or after 2019-09-08.")

  out = op_func(input_tensor, axis=axis, keepdims=keepdims, name=name, reduction_indices=reduction_indices)

  return out

[docs]def softmax_cross_entropy_with_logits(sentinel=None, labels=None, logits=None, dim=-1): """ Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle deprecated warning """ # Make sure that all arguments were passed as named arguments. if sentinel is not None: name = "softmax_cross_entropy_with_logits" raise ValueError("Only call `%s` with " "named arguments (labels=..., logits=..., ...)" % name) if labels is None or logits is None: raise ValueError("Both labels and logits must be provided.") try: f = tf.nn.softmax_cross_entropy_with_logits_v2 except AttributeError: raise RuntimeError("This version of TensorFlow is no longer supported. See cleverhans/README.md") labels = tf.stop_gradient(labels) loss = f(labels=labels, logits=logits, dim=dim) return loss
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/model.html ================================================ cleverhans.model — CleverHans documentation

Source code for cleverhans.model

"""
The Model class and related functionality.
"""
from abc import ABCMeta
import warnings

import tensorflow as tf

from cleverhans import utils_tf


[docs]class Model(object): """ An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them. """ __metaclass__ = ABCMeta O_LOGITS, O_PROBS, O_FEATURES = 'logits probs features'.split() def __init__(self, scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False): """ Constructor. :param scope: str, the name of model. :param nb_classes: integer, the number of classes. :param hparams: dict, hyper-parameters for the model. :needs_dummy_fprop: bool, if True the model's parameters are not created until fprop is called. """ self.scope = scope or self.__class__.__name__ self.nb_classes = nb_classes self.hparams = hparams or {} self.needs_dummy_fprop = needs_dummy_fprop def __call__(self, *args, **kwargs): """ For compatibility with functions used as model definitions (taking an input tensor and returning the tensor giving the output of the model on that input). """ warnings.warn("Model.__call__ is deprecated. " "The call is ambiguous as to whether the output should " "be logits or probabilities, and getting the wrong one " "can cause serious problems. " "The output actually is probabilities, which are a very " "dangerous thing to use as part of any interface for " "cleverhans, because softmax probabilities are prone " "to gradient masking." "On or after 2019-04-24, this method will change to raise " "an exception explaining why Model.__call__ should not be " "used.") return self.get_probs(*args, **kwargs)
[docs] def get_logits(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the output logits (i.e., the values fed as inputs to the softmax layer). """ outputs = self.fprop(x, **kwargs) if self.O_LOGITS in outputs: return outputs[self.O_LOGITS] raise NotImplementedError(str(type(self)) + "must implement `get_logits`" " or must define a " + self.O_LOGITS + " output in `fprop`")
[docs] def get_predicted_class(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the predicted label """ return tf.argmax(self.get_logits(x, **kwargs), axis=1)
[docs] def get_probs(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the output probabilities (i.e., the output values produced by the softmax layer). """ d = self.fprop(x, **kwargs) if self.O_PROBS in d: output = d[self.O_PROBS] min_prob = tf.reduce_min(output) max_prob = tf.reduce_max(output) asserts = [utils_tf.assert_greater_equal(min_prob, tf.cast(0., min_prob.dtype)), utils_tf.assert_less_equal(max_prob, tf.cast(1., min_prob.dtype))] with tf.control_dependencies(asserts): output = tf.identity(output) return output elif self.O_LOGITS in d: return tf.nn.softmax(logits=d[self.O_LOGITS]) else: raise ValueError('Cannot find probs or logits.')
[docs] def fprop(self, x, **kwargs): """ Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic representation of their output. """ raise NotImplementedError('`fprop` not implemented.')
[docs] def get_params(self): """ Provides access to the model's parameters. :return: A list of all Variables defining the model parameters. """ if hasattr(self, 'params'): return list(self.params) # Catch eager execution and assert function overload. try: if tf.executing_eagerly(): raise NotImplementedError("For Eager execution - get_params " "must be overridden.") except AttributeError: pass # For graph-based execution scope_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/") if len(scope_vars) == 0: self.make_params() scope_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/") assert len(scope_vars) > 0 # Make sure no parameters have been added or removed if hasattr(self, "num_params"): if self.num_params != len(scope_vars): print("Scope: ", self.scope) print("Expected " + str(self.num_params) + " variables") print("Got " + str(len(scope_vars))) for var in scope_vars: print("\t" + str(var)) assert False else: self.num_params = len(scope_vars) return scope_vars
[docs] def make_params(self): """ Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set `needs_dummy_fprop=True` in the constructor. """ if self.needs_dummy_fprop: if hasattr(self, "_dummy_input"): return self._dummy_input = self.make_input_placeholder() self.fprop(self._dummy_input)
[docs] def get_layer_names(self): """Return the list of exposed layers for this model.""" raise NotImplementedError
[docs] def get_layer(self, x, layer, **kwargs): """Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer `layer` """ return self.fprop(x, **kwargs)[layer]
[docs] def make_input_placeholder(self): """Create and return a placeholder representing an input to the model. This method should respect context managers (e.g. "with tf.device") and should not just return a reference to a single pre-created placeholder. """ raise NotImplementedError(str(type(self)) + " does not implement " "make_input_placeholder")
[docs] def make_label_placeholder(self): """Create and return a placeholder representing class labels. This method should respect context managers (e.g. "with tf.device") and should not just return a reference to a single pre-created placeholder. """ raise NotImplementedError(str(type(self)) + " does not implement " "make_label_placeholder")
def __hash__(self): return hash(id(self)) def __eq__(self, other): return self is other
[docs]class CallableModelWrapper(Model): """A wrapper that turns a callable into a valid Model""" def __init__(self, callable_fn, output_layer): """ Wrap a callable function that takes a tensor as input and returns a tensor as output with the given layer name. :param callable_fn: The callable function taking a tensor and returning a given layer as output. :param output_layer: A string of the output layer returned by the function. (Usually either "probs" or "logits".) """ super(CallableModelWrapper, self).__init__() self.output_layer = output_layer self.callable_fn = callable_fn
[docs] def fprop(self, x, **kwargs): output = self.callable_fn(x, **kwargs) # Do some sanity checking to reduce the chance that probs are used # as logits accidentally or vice versa if self.output_layer == 'probs': assert output.op.type == "Softmax" min_prob = tf.reduce_min(output) max_prob = tf.reduce_max(output) asserts = [utils_tf.assert_greater_equal(min_prob, tf.cast(0., min_prob.dtype)), utils_tf.assert_less_equal(max_prob, tf.cast(1., max_prob.dtype))] with tf.control_dependencies(asserts): output = tf.identity(output) elif self.output_layer == 'logits': assert output.op.type != 'Softmax' return {self.output_layer: output}
[docs]def wrapper_warning(): """ Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer="probs". Using "probs" as any part of the attack interface is dangerous. We can't just change output_layer to logits because: - that would be a silent interface change. We'd have no way of detecting code that still means to use probs. Note that we can't just check whether the final output op is a softmax---for example, Inception puts a reshape after the softmax. - automatically wrapping user-supplied callables with output_layer='logits' is even worse, see `wrapper_warning_logits` Note: this function will be removed at the same time as the code that calls it. """ warnings.warn("Passing a callable is deprecated, because using" " probabilities is dangerous. It has a high risk " " of causing gradient masking due to loss of precision " " in the softmax op. Passing a callable rather than a " " Model subclass will become an error on or after " " 2019-04-24.")
[docs]def wrapper_warning_logits(): """ Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer="logits". This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking. """ warnings.warn("Passing a callable is deprecated, because it runs the " "risk of accidentally using probabilities in the place " "of logits. Please switch to passing a Model subclass " "so that you clearly specify which values are the logits. " "Passing a callable rather than a Model subclass will become " "an error on or after 2019-04-24.")
[docs]class NoSuchLayerError(ValueError): """Raised when a layer that does not exist is requested."""
================================================ FILE: cleverhans_v3.1.0/docs/_modules/cleverhans/utils_tf.html ================================================ cleverhans.utils_tf — CleverHans documentation

Source code for cleverhans.utils_tf

"""Utility functions for writing TensorFlow code"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import logging
import math
import os
import time
import warnings

import numpy as np
import six
from six.moves import xrange
import tensorflow as tf

from cleverhans.compat import device_lib
from cleverhans.compat import reduce_sum, reduce_mean
from cleverhans.compat import reduce_max
from cleverhans.compat import softmax_cross_entropy_with_logits
from cleverhans.utils import batch_indices, _ArgsWrapper, create_logger

_logger = create_logger("cleverhans.utils.tf")
_logger.setLevel(logging.INFO)


def model_loss(y, model, mean=True):
  """
  Define loss of TF graph
  :param y: correct labels
  :param model: output of the model
  :param mean: boolean indicating whether should return mean of loss
               or vector of losses for each input of the batch
  :return: return mean of loss if True, otherwise return vector with per
           sample loss
  """
  warnings.warn("This function is deprecated and will be removed on or after"
                " 2019-04-05. Switch to cleverhans.train.train.")
  op = model.op
  if op.type == "Softmax":
    logits, = op.inputs
  else:
    logits = model

  out = softmax_cross_entropy_with_logits(logits=logits, labels=y)

  if mean:
    out = reduce_mean(out)
  return out


def initialize_uninitialized_global_variables(sess):
  """
  Only initializes the variables of a TensorFlow session that were not
  already initialized.
  :param sess: the TensorFlow session
  :return:
  """
  # List all global variables
  global_vars = tf.global_variables()

  # Find initialized status for all variables
  is_var_init = [tf.is_variable_initialized(var) for var in global_vars]
  is_initialized = sess.run(is_var_init)

  # List all variables that were not initialized previously
  not_initialized_vars = [var for (var, init) in
                          zip(global_vars, is_initialized) if not init]

  # Initialize all uninitialized variables found, if any
  if len(not_initialized_vars):
    sess.run(tf.variables_initializer(not_initialized_vars))


def train(sess, loss, x, y, X_train, Y_train, save=False,
          init_all=False, evaluate=None, feed=None, args=None,
          rng=None, var_list=None, fprop_args=None, optimizer=None):
  """
  Train a TF graph.
  This function is deprecated. Prefer cleverhans.train.train when possible.
  cleverhans.train.train supports multiple GPUs but this function is still
  needed to support legacy models that do not support calling fprop more
  than once.

  :param sess: TF session to use when training the graph
  :param loss: tensor, the model training loss.
  :param x: input placeholder
  :param y: output placeholder (for labels)
  :param X_train: numpy array with training inputs
  :param Y_train: numpy array with training outputs
  :param save: boolean controlling the save operation
  :param init_all: (boolean) If set to true, all TF variables in the session
                   are (re)initialized, otherwise only previously
                   uninitialized variables are initialized before training.
  :param evaluate: function that is run after each training iteration
                   (typically to display the test/validation accuracy).
  :param feed: An optional dictionary that is appended to the feeding
               dictionary before the session runs. Can be used to feed
               the learning phase of a Keras model for instance.
  :param args: dict or argparse `Namespace` object.
               Should contain `nb_epochs`, `learning_rate`,
               `batch_size`
               If save is True, should also contain 'train_dir'
               and 'filename'
  :param rng: Instance of numpy.random.RandomState
  :param var_list: Optional list of parameters to train.
  :param fprop_args: dict, extra arguments to pass to fprop (loss and model).
  :param optimizer: Optimizer to be used for training
  :return: True if model trained
  """
  warnings.warn("This function is deprecated and will be removed on or after"
                " 2019-04-05. Switch to cleverhans.train.train.")

  args = _ArgsWrapper(args or {})
  fprop_args = fprop_args or {}

  # Check that necessary arguments were given (see doc above)
  assert args.nb_epochs, "Number of epochs was not given in args dict"
  if optimizer is None:
    assert args.learning_rate is not None, ("Learning rate was not given "
                                            "in args dict")
  assert args.batch_size, "Batch size was not given in args dict"

  if save:
    assert args.train_dir, "Directory for save was not given in args dict"
    assert args.filename, "Filename for save was not given in args dict"

  if rng is None:
    rng = np.random.RandomState()

  # Define optimizer
  loss_value = loss.fprop(x, y, **fprop_args)
  if optimizer is None:
    optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate)
  else:
    if not isinstance(optimizer, tf.train.Optimizer):
      raise ValueError("optimizer object must be from a child class of "
                       "tf.train.Optimizer")
  # Trigger update operations within the default graph (such as batch_norm).
  with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
    train_step = optimizer.minimize(loss_value, var_list=var_list)

  with sess.as_default():
    if hasattr(tf, "global_variables_initializer"):
      if init_all:
        tf.global_variables_initializer().run()
      else:
        initialize_uninitialized_global_variables(sess)
    else:
      warnings.warn("Update your copy of tensorflow; future versions of "
                    "CleverHans may drop support for this version.")
      sess.run(tf.initialize_all_variables())

    for epoch in xrange(args.nb_epochs):
      # Compute number of batches
      nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size))
      assert nb_batches * args.batch_size >= len(X_train)

      # Indices to shuffle training set
      index_shuf = list(range(len(X_train)))
      rng.shuffle(index_shuf)

      prev = time.time()
      for batch in range(nb_batches):

        # Compute batch start and end indices
        start, end = batch_indices(
            batch, len(X_train), args.batch_size)

        # Perform one training step
        feed_dict = {x: X_train[index_shuf[start:end]],
                     y: Y_train[index_shuf[start:end]]}
        if feed is not None:
          feed_dict.update(feed)
        train_step.run(feed_dict=feed_dict)
      assert end >= len(X_train)  # Check that all examples were used
      cur = time.time()
      _logger.info("Epoch " + str(epoch) + " took " +
                   str(cur - prev) + " seconds")
      if evaluate is not None:
        evaluate()

    if save:
      save_path = os.path.join(args.train_dir, args.filename)
      saver = tf.train.Saver()
      saver.save(sess, save_path)
      _logger.info("Completed model training and saved at: " +
                   str(save_path))
    else:
      _logger.info("Completed model training.")

  return True


def model_eval(sess, x, y, predictions, X_test=None, Y_test=None,
               feed=None, args=None):
  """
  Compute the accuracy of a TF model on some data
  :param sess: TF session to use
  :param x: input placeholder
  :param y: output placeholder (for labels)
  :param predictions: model output predictions
  :param X_test: numpy array with training inputs
  :param Y_test: numpy array with training outputs
  :param feed: An optional dictionary that is appended to the feeding
           dictionary before the session runs. Can be used to feed
           the learning phase of a Keras model for instance.
  :param args: dict or argparse `Namespace` object.
               Should contain `batch_size`
  :return: a float with the accuracy value
  """
  global _model_eval_cache
  args = _ArgsWrapper(args or {})

  assert args.batch_size, "Batch size was not given in args dict"
  if X_test is None or Y_test is None:
    raise ValueError("X_test argument and Y_test argument "
                     "must be supplied.")

  # Define accuracy symbolically
  key = (y, predictions)
  if key in _model_eval_cache:
    correct_preds = _model_eval_cache[key]
  else:
    correct_preds = tf.equal(tf.argmax(y, axis=-1),
                             tf.argmax(predictions, axis=-1))
    _model_eval_cache[key] = correct_preds

  # Init result var
  accuracy = 0.0

  with sess.as_default():
    # Compute number of batches
    nb_batches = int(math.ceil(float(len(X_test)) / args.batch_size))
    assert nb_batches * args.batch_size >= len(X_test)

    X_cur = np.zeros((args.batch_size,) + X_test.shape[1:],
                     dtype=X_test.dtype)
    Y_cur = np.zeros((args.batch_size,) + Y_test.shape[1:],
                     dtype=Y_test.dtype)
    for batch in range(nb_batches):
      if batch % 100 == 0 and batch > 0:
        _logger.debug("Batch " + str(batch))

      # Must not use the `batch_indices` function here, because it
      # repeats some examples.
      # It's acceptable to repeat during training, but not eval.
      start = batch * args.batch_size
      end = min(len(X_test), start + args.batch_size)

      # The last batch may be smaller than all others. This should not
      # affect the accuarcy disproportionately.
      cur_batch_size = end - start
      X_cur[:cur_batch_size] = X_test[start:end]
      Y_cur[:cur_batch_size] = Y_test[start:end]
      feed_dict = {x: X_cur, y: Y_cur}
      if feed is not None:
        feed_dict.update(feed)
      cur_corr_preds = correct_preds.eval(feed_dict=feed_dict)

      accuracy += cur_corr_preds[:cur_batch_size].sum()

    assert end >= len(X_test)

    # Divide by number of examples to get final value
    accuracy /= len(X_test)

  return accuracy

_model_eval_cache = {}


def tf_model_load(sess, file_path=None):
  """

  :param sess: the session object to restore
  :param file_path: path to the restored session, if None is
                    taken from FLAGS.train_dir and FLAGS.filename
  :return:
  """
  with sess.as_default():
    saver = tf.train.Saver()
    if file_path is None:
      error = 'file_path argument is missing.'
      raise ValueError(error)
    saver.restore(sess, file_path)

  return True


def batch_eval(*args, **kwargs):
  """
  Wrapper around deprecated function.
  """
  # Inside function to avoid circular import
  from cleverhans.evaluation import batch_eval as new_batch_eval
  warnings.warn("batch_eval has moved to cleverhans.evaluation. "
                "batch_eval will be removed from utils_tf on or after "
                "2019-03-09.")
  return new_batch_eval(*args, **kwargs)


def model_argmax(sess, x, predictions, samples, feed=None):
  """
  Helper function that computes the current class prediction
  :param sess: TF session
  :param x: the input placeholder
  :param predictions: the model's symbolic output
  :param samples: numpy array with input samples (dims must match x)
  :param feed: An optional dictionary that is appended to the feeding
           dictionary before the session runs. Can be used to feed
           the learning phase of a Keras model for instance.
  :return: the argmax output of predictions, i.e. the current predicted class
  """
  feed_dict = {x: samples}
  if feed is not None:
    feed_dict.update(feed)
  probabilities = sess.run(predictions, feed_dict)

  if samples.shape[0] == 1:
    return np.argmax(probabilities)
  else:
    return np.argmax(probabilities, axis=1)


def l2_batch_normalize(x, epsilon=1e-12, scope=None):
  """
  Helper function to normalize a batch of vectors.
  :param x: the input placeholder
  :param epsilon: stabilizes division
  :return: the batch of l2 normalized vector
  """
  with tf.name_scope(scope, "l2_batch_normalize") as name_scope:
    x_shape = tf.shape(x)
    x = tf.contrib.layers.flatten(x)
    x /= (epsilon + reduce_max(tf.abs(x), 1, keepdims=True))
    square_sum = reduce_sum(tf.square(x), 1, keepdims=True)
    x_inv_norm = tf.rsqrt(np.sqrt(epsilon) + square_sum)
    x_norm = tf.multiply(x, x_inv_norm)
    return tf.reshape(x_norm, x_shape, name_scope)


def kl_with_logits(p_logits, q_logits, scope=None,
                   loss_collection=tf.GraphKeys.REGULARIZATION_LOSSES):
  """Helper function to compute kl-divergence KL(p || q)
  """
  with tf.name_scope(scope, "kl_divergence") as name:
    p = tf.nn.softmax(p_logits)
    p_log = tf.nn.log_softmax(p_logits)
    q_log = tf.nn.log_softmax(q_logits)
    loss = reduce_mean(reduce_sum(p * (p_log - q_log), axis=1),
                       name=name)
    tf.losses.add_loss(loss, loss_collection)
    return loss


[docs]def clip_eta(eta, ord, eps): """ Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, bound of the perturbation. """ # Clipping perturbation eta to self.ord norm ball if ord not in [np.inf, 1, 2]: raise ValueError('ord must be np.inf, 1, or 2.') reduc_ind = list(xrange(1, len(eta.get_shape()))) avoid_zero_div = 1e-12 if ord == np.inf: eta = clip_by_value(eta, -eps, eps) elif ord == 1: # Implements a projection algorithm onto the l1-ball from # (Duchi et al. 2008) that runs in time O(d*log(d)) where d is the # input dimension. # Paper link (Duchi et al. 2008): https://dl.acm.org/citation.cfm?id=1390191 eps = tf.cast(eps, eta.dtype) dim = tf.reduce_prod(tf.shape(eta)[1:]) eta_flat = tf.reshape(eta, (-1, dim)) abs_eta = tf.abs(eta_flat) if 'sort' in dir(tf): mu = -tf.sort(-abs_eta, axis=-1) else: # `tf.sort` is only available in TF 1.13 onwards mu = tf.nn.top_k(abs_eta, k=dim, sorted=True)[0] cumsums = tf.cumsum(mu, axis=-1) js = tf.cast(tf.divide(1, tf.range(1, dim + 1)), eta.dtype) t = tf.cast(tf.greater(mu - js * (cumsums - eps), 0), eta.dtype) rho = tf.argmax(t * cumsums, axis=-1) rho_val = tf.reduce_max(t * cumsums, axis=-1) theta = tf.divide(rho_val - eps, tf.cast(1 + rho, eta.dtype)) eta_sgn = tf.sign(eta_flat) eta_proj = eta_sgn * tf.maximum(abs_eta - theta[:, tf.newaxis], 0) eta_proj = tf.reshape(eta_proj, tf.shape(eta)) norm = tf.reduce_sum(tf.abs(eta), reduc_ind) eta = tf.where(tf.greater(norm, eps), eta_proj, eta) elif ord == 2: # avoid_zero_div must go inside sqrt to avoid a divide by zero # in the gradient through this operation norm = tf.sqrt(tf.maximum(avoid_zero_div, reduce_sum(tf.square(eta), reduc_ind, keepdims=True))) # We must *clip* to within the norm ball, not *normalize* onto the # surface of the ball factor = tf.minimum(1., div(eps, norm)) eta = eta * factor return eta
def zero_out_clipped_grads(grad, x, clip_min, clip_max): """ Helper function to erase entries in the gradient where the update would be clipped. :param grad: The gradient :param x: The current input :param clip_min: Minimum input component value :param clip_max: Maximum input component value """ signed_grad = tf.sign(grad) # Find input components that lie at the boundary of the input range, and # where the gradient points in the wrong direction. clip_low = tf.logical_and(tf.less_equal(x, tf.cast(clip_min, x.dtype)), tf.less(signed_grad, 0)) clip_high = tf.logical_and(tf.greater_equal(x, tf.cast(clip_max, x.dtype)), tf.greater(signed_grad, 0)) clip = tf.logical_or(clip_low, clip_high) grad = tf.where(clip, mul(grad, 0), grad) return grad def random_exponential(shape, rate=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the exponential distribution, which is not included in core TensorFlow. """ return tf.random_gamma(shape, alpha=1, beta=1. / rate, dtype=dtype, seed=seed) def random_laplace(shape, loc=0.0, scale=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the Laplace distribution, which is not included in core TensorFlow. """ z1 = random_exponential(shape, loc, dtype=dtype, seed=seed) z2 = random_exponential(shape, scale, dtype=dtype, seed=seed) return z1 - z2 def random_lp_vector(shape, ord, eps, dtype=tf.float32, seed=None): """ Helper function to generate uniformly random vectors from a norm ball of radius epsilon. :param shape: Output shape of the random sample. The shape is expected to be of the form `(n, d1, d2, ..., dn)` where `n` is the number of i.i.d. samples that will be drawn from a norm ball of dimension `d1*d1*...*dn`. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, radius of the norm ball. """ if ord not in [np.inf, 1, 2]: raise ValueError('ord must be np.inf, 1, or 2.') if ord == np.inf: r = tf.random_uniform(shape, -eps, eps, dtype=dtype, seed=seed) else: # For ord=1 and ord=2, we use the generic technique from # (Calafiore et al. 1998) to sample uniformly from a norm ball. # Paper link (Calafiore et al. 1998): # https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&tag=1 # We first sample from the surface of the norm ball, and then scale by # a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable # and `d` is the dimension of the ball. In high dimensions, this is roughly # equivalent to sampling from the surface of the ball. dim = tf.reduce_prod(shape[1:]) if ord == 1: x = random_laplace((shape[0], dim), loc=1.0, scale=1.0, dtype=dtype, seed=seed) norm = tf.reduce_sum(tf.abs(x), axis=-1, keepdims=True) elif ord == 2: x = tf.random_normal((shape[0], dim), dtype=dtype, seed=seed) norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=-1, keepdims=True)) else: raise ValueError('ord must be np.inf, 1, or 2.') w = tf.pow(tf.random.uniform((shape[0], 1), dtype=dtype, seed=seed), 1.0 / tf.cast(dim, dtype)) r = eps * tf.reshape(w * x / norm, shape) return r def model_train(sess, x, y, predictions, X_train, Y_train, save=False, predictions_adv=None, init_all=True, evaluate=None, feed=None, args=None, rng=None, var_list=None): """ Train a TF graph :param sess: TF session to use when training the graph :param x: input placeholder :param y: output placeholder (for labels) :param predictions: model output predictions :param X_train: numpy array with training inputs :param Y_train: numpy array with training outputs :param save: boolean controlling the save operation :param predictions_adv: if set with the adversarial example tensor, will run adversarial training :param init_all: (boolean) If set to true, all TF variables in the session are (re)initialized, otherwise only previously uninitialized variables are initialized before training. :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Should contain `nb_epochs`, `learning_rate`, `batch_size` If save is True, should also contain 'train_dir' and 'filename' :param rng: Instance of numpy.random.RandomState :param var_list: Optional list of parameters to train. :return: True if model trained """ warnings.warn("This function is deprecated and will be removed on or after" " 2019-04-05. Switch to cleverhans.train.train.") args = _ArgsWrapper(args or {}) # Check that necessary arguments were given (see doc above) assert args.nb_epochs, "Number of epochs was not given in args dict" assert args.learning_rate, "Learning rate was not given in args dict" assert args.batch_size, "Batch size was not given in args dict" if save: assert args.train_dir, "Directory for save was not given in args dict" assert args.filename, "Filename for save was not given in args dict" if rng is None: rng = np.random.RandomState() # Define loss loss = model_loss(y, predictions) if predictions_adv is not None: loss = (loss + model_loss(y, predictions_adv)) / 2 train_step = tf.train.AdamOptimizer(learning_rate=args.learning_rate) train_step = train_step.minimize(loss, var_list=var_list) with sess.as_default(): if hasattr(tf, "global_variables_initializer"): if init_all: tf.global_variables_initializer().run() else: initialize_uninitialized_global_variables(sess) else: warnings.warn("Update your copy of tensorflow; future versions of " "CleverHans may drop support for this version.") sess.run(tf.initialize_all_variables()) for epoch in xrange(args.nb_epochs): # Compute number of batches nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_train) # Indices to shuffle training set index_shuf = list(range(len(X_train))) rng.shuffle(index_shuf) prev = time.time() for batch in range(nb_batches): # Compute batch start and end indices start, end = batch_indices( batch, len(X_train), args.batch_size) # Perform one training step feed_dict = {x: X_train[index_shuf[start:end]], y: Y_train[index_shuf[start:end]]} if feed is not None: feed_dict.update(feed) train_step.run(feed_dict=feed_dict) assert end >= len(X_train) # Check that all examples were used cur = time.time() _logger.info("Epoch " + str(epoch) + " took " + str(cur - prev) + " seconds") if evaluate is not None: evaluate() if save: save_path = os.path.join(args.train_dir, args.filename) saver = tf.train.Saver() saver.save(sess, save_path) _logger.info("Completed model training and saved at: " + str(save_path)) else: _logger.info("Completed model training.") return True def infer_devices(devices=None): """ Returns the list of devices that multi-replica code should use. :param devices: list of string device names, e.g. ["/GPU:0"] If the user specifies this, `infer_devices` checks that it is valid, and then uses this user-specified list. If the user does not specify this, infer_devices uses: - All available GPUs, if there are any - CPU otherwise """ if devices is None: devices = get_available_gpus() if len(devices) == 0: warnings.warn("No GPUS, running on CPU") # Set device to empy string, tf will figure out whether to use # XLA or not, etc., automatically devices = [""] else: assert len(devices) > 0 for device in devices: assert isinstance(device, six.string_types), type(device) return devices def get_available_gpus(): """ Returns a list of string names of all available GPUs """ local_device_protos = device_lib.list_local_devices() return [x.name for x in local_device_protos if x.device_type == 'GPU'] def silence(): """ Silences tensorflaw's default printed messages """ os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' def clip_by_value(t, clip_value_min, clip_value_max, name=None): """ A wrapper for clip_by_value that casts the clipping range if needed. """ def cast_clip(clip): """ Cast clipping range argument if needed. """ if t.dtype in (tf.float32, tf.float64): if hasattr(clip, 'dtype'): # Convert to tf dtype in case this is a numpy dtype clip_dtype = tf.as_dtype(clip.dtype) if clip_dtype != t.dtype: return tf.cast(clip, t.dtype) return clip clip_value_min = cast_clip(clip_value_min) clip_value_max = cast_clip(clip_value_max) return tf.clip_by_value(t, clip_value_min, clip_value_max, name) def mul(a, b): """ A wrapper around tf multiplication that does more automatic casting of the input. """ def multiply(a, b): """Multiplication""" return a * b return op_with_scalar_cast(a, b, multiply) def div(a, b): """ A wrapper around tf division that does more automatic casting of the input. """ def divide(a, b): """Division""" return a / b return op_with_scalar_cast(a, b, divide) def op_with_scalar_cast(a, b, f): """ Builds the graph to compute f(a, b). If only one of the two arguments is a scalar and the operation would cause a type error without casting, casts the scalar to match the tensor. :param a: a tf-compatible array or scalar :param b: a tf-compatible array or scalar """ try: return f(a, b) except (TypeError, ValueError): pass def is_scalar(x): """Return True if `x` is a scalar""" if hasattr(x, "get_shape"): shape = x.get_shape() return shape.ndims == 0 if hasattr(x, "ndim"): return x.ndim == 0 assert isinstance(x, (int, float)) return True a_scalar = is_scalar(a) b_scalar = is_scalar(b) if a_scalar and b_scalar: raise TypeError("Trying to apply " + str(f) + " with mixed types") if a_scalar and not b_scalar: a = tf.cast(a, b.dtype) if b_scalar and not a_scalar: b = tf.cast(b, a.dtype) return f(a, b) def assert_less_equal(*args, **kwargs): """ Wrapper for tf.assert_less_equal Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_less_equal(*args, **kwargs) def assert_greater_equal(*args, **kwargs): """ Wrapper for tf.assert_greater_equal. Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_greater_equal(*args, **kwargs) def assert_equal(*args, **kwargs): """ Wrapper for tf.assert_equal. Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_equal(*args, **kwargs) def jacobian_graph(predictions, x, nb_classes): """ Create the Jacobian graph to be ran later in a TF session :param predictions: the model's symbolic output (linear output, pre-softmax) :param x: the input placeholder :param nb_classes: the number of classes the model has :return: """ # This function will return a list of TF gradients list_derivatives = [] # Define the TF graph elements to compute our derivatives for each class for class_ind in xrange(nb_classes): derivatives, = tf.gradients(predictions[:, class_ind], x) list_derivatives.append(derivatives) return list_derivatives def jacobian_augmentation(sess, x, X_sub_prev, Y_sub, grads, lmbda, aug_batch_size=512, feed=None): """ Augment an adversary's substitute training set using the Jacobian of a substitute model to generate new synthetic inputs. See https://arxiv.org/abs/1602.02697 for more details. See cleverhans_tutorials/mnist_blackbox.py for example use case :param sess: TF session in which the substitute model is defined :param x: input TF placeholder for the substitute model :param X_sub_prev: substitute training data available to the adversary at the previous iteration :param Y_sub: substitute training labels available to the adversary at the previous iteration :param grads: Jacobian symbolic graph for the substitute (should be generated using utils_tf.jacobian_graph) :return: augmented substitute data (will need to be labeled by oracle) """ assert len(x.get_shape()) == len(np.shape(X_sub_prev)) assert len(grads) >= np.max(Y_sub) + 1 assert len(X_sub_prev) == len(Y_sub) aug_batch_size = min(aug_batch_size, X_sub_prev.shape[0]) # Prepare input_shape (outside loop) for feeding dictionary below input_shape = list(x.get_shape()) input_shape[0] = 1 # Create new numpy array for adversary training data # with twice as many components on the first dimension. X_sub = np.vstack([X_sub_prev, X_sub_prev]) num_samples = X_sub_prev.shape[0] # Creating and processing as batch for p_idxs in range(0, num_samples, aug_batch_size): X_batch = X_sub_prev[p_idxs:p_idxs + aug_batch_size, ...] feed_dict = {x: X_batch} if feed is not None: feed_dict.update(feed) # Compute sign matrix grad_val = sess.run([tf.sign(grads)], feed_dict=feed_dict)[0] # Create new synthetic point in adversary substitute training set for (indx, ind) in zip(range(p_idxs, p_idxs + X_batch.shape[0]), range(X_batch.shape[0])): X_sub[num_samples + indx] = ( X_batch[ind] + lmbda * grad_val[Y_sub[indx], ind, ...]) # Return augmented training data (needs to be labeled afterwards) return X_sub
================================================ FILE: cleverhans_v3.1.0/docs/_modules/index.html ================================================ Overview: module code — CleverHans documentation ================================================ FILE: cleverhans_v3.1.0/docs/_sources/README.md.txt ================================================ # Generate documentation To generate the documentation do: `make github` The documentation files will be copied to the `cleverhans/docs` directory. ### Preparation Please do: `pip install sphinx` Add a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees a `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file indicates that we are not using Jekyll as our static site generator in this repository. ### Enable GitHub Pages for the GitHub repository 1. Go to the repository on the GitHub website and make sure you are logged in. 2. Add a /docs directory to the master branch. Otherwise you do not get the master branch /docs folder for the Source option in the drop-down list. 3. Click the Settings tab. You first go to the Options section. 4. Scroll down to the GitHub Pages section and choose the drop-down list under Source. Note: Your choices will differ based on whether you’re in a User repo or an Org repository. 5. To keep source and output HTML separate, choose master branch /docs folder for Source. ### Build Sphinx locally and publish on GitHub Pages We keep the source docsource and output docs separate, but still are able to publish on GitHub Pages and preview builds locally. We have the following option in the Makefile: ``` github: @make html @cp -a _build/html/. ../docs ``` Thus, we can run `make github` from the `docsource` directory to generate a local preview and move the docs where GitHub wants to serve them from. ### Hacks If you cannot build the docs for attacks, uncomment `import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`. Otherwise: ```angular2html WARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised: cannot import name 'keras_tensor' ``` It is convenient to create a virtual environment to install all the specific libraries (e.g. virutalen cleverhans). ================================================ FILE: cleverhans_v3.1.0/docs/_sources/index.md.txt ================================================ .. CleverHans documentation master file, created by sphinx-quickstart on Wed Sep 20 15:14:07 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. WARNING: This file has a markdown suffix, but is in fact .rst CleverHans Documentation ====================================== This documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans `_. To get started, we recommend reading the `github readme `_. Afterwards, you can learn more by looking at the following modules: .. toctree:: :maxdepth: 4 source/attacks source/model Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ================================================ FILE: cleverhans_v3.1.0/docs/_sources/source/attacks.md.txt ================================================ `attacks` module -------------------------- .. automodule:: cleverhans.attacks :members: :imported-members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docs/_sources/source/devtools.md.txt ================================================ `devtools` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docs/_sources/source/future.md.txt ================================================ `future` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docs/_sources/source/model.md.txt ================================================ `model` module ------------------------ .. automodule:: cleverhans.model :members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docs/_static/alabaster.css ================================================ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: Georgia, serif; font-size: 17px; background-color: #fff; color: #000; margin: 0; padding: 0; } div.document { width: 940px; margin: 30px auto 0 auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 220px; } div.sphinxsidebar { width: 220px; font-size: 14px; line-height: 1.5; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #fff; color: #3E4349; padding: 0 30px 0 30px; } div.body > .section { text-align: left; } div.footer { width: 940px; margin: 20px auto 30px auto; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } p.caption { font-family: inherit; font-size: inherit; } div.relations { display: none; } div.sphinxsidebar a { color: #444; text-decoration: none; border-bottom: 1px dotted #999; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebarwrapper { padding: 18px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0; margin: -10px 0 0 0px; text-align: center; } div.sphinxsidebarwrapper h1.logo { margin-top: -10px; text-align: center; margin-bottom: 5px; text-align: left; } div.sphinxsidebarwrapper h1.logo-name { margin-top: 0px; } div.sphinxsidebarwrapper p.blurb { margin-top: 0; font-style: normal; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: Georgia, serif; color: #444; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar ul li.toctree-l1 > a { font-size: 120%; } div.sphinxsidebar ul li.toctree-l2 > a { font-size: 110%; } div.sphinxsidebar input { border: 1px solid #CCC; font-family: Georgia, serif; font-size: 1em; } div.sphinxsidebar hr { border: none; height: 1px; color: #AAA; background: #AAA; text-align: left; margin-left: 0; width: 50%; } div.sphinxsidebar .badge { border-bottom: none; } div.sphinxsidebar .badge:hover { border-bottom: none; } /* To address an issue with donation coming after search */ div.sphinxsidebar h3.donation { margin-top: 10px; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: Georgia, serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: #DDD; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #EAEAEA; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { margin: 20px 0px; padding: 10px 30px; background-color: #EEE; border: 1px solid #CCC; } div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { background-color: #FBFBFB; border-bottom: 1px solid #fafafa; } div.admonition p.admonition-title { font-family: Georgia, serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight { background-color: #fff; } dt:target, .highlight { background: #FAF3E8; } div.warning { background-color: #FCC; border: 1px solid #FAA; } div.danger { background-color: #FCC; border: 1px solid #FAA; -moz-box-shadow: 2px 2px 4px #D52C2C; -webkit-box-shadow: 2px 2px 4px #D52C2C; box-shadow: 2px 2px 4px #D52C2C; } div.error { background-color: #FCC; border: 1px solid #FAA; -moz-box-shadow: 2px 2px 4px #D52C2C; -webkit-box-shadow: 2px 2px 4px #D52C2C; box-shadow: 2px 2px 4px #D52C2C; } div.caution { background-color: #FCC; border: 1px solid #FAA; } div.attention { background-color: #FCC; border: 1px solid #FAA; } div.important { background-color: #EEE; border: 1px solid #CCC; } div.note { background-color: #EEE; border: 1px solid #CCC; } div.tip { background-color: #EEE; border: 1px solid #CCC; } div.hint { background-color: #EEE; border: 1px solid #CCC; } div.seealso { background-color: #EEE; border: 1px solid #CCC; } div.topic { background-color: #EEE; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt, code { font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } .hll { background-color: #FFC; margin: 0 -12px; padding: 0 12px; display: block; } img.screenshot { } tt.descname, tt.descclassname, code.descname, code.descclassname { font-size: 0.95em; } tt.descname, code.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #EEE; -webkit-box-shadow: 2px 2px 4px #EEE; box-shadow: 2px 2px 4px #EEE; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #EEE; -webkit-box-shadow: 2px 2px 4px #EEE; box-shadow: 2px 2px 4px #EEE; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #EEE; background: #FDFDFD; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.field-list p { margin-bottom: 0.8em; } /* Cloned from * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 */ .field-name { -moz-hyphens: manual; -ms-hyphens: manual; -webkit-hyphens: manual; hyphens: manual; } table.footnote td.label { width: .1px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } blockquote { margin: 0 0 0 30px; padding: 0; } ul, ol { /* Matches the 30px from the narrow-screen "li > ul" selector below */ margin: 10px 0 10px 30px; padding: 0; } pre { background: #EEE; padding: 7px 30px; margin: 15px 0px; line-height: 1.3em; } div.viewcode-block:target { background: #ffd; } dl pre, blockquote pre, li pre { margin-left: 0; padding-left: 30px; } tt, code { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, code.xref, a tt { background-color: #FBFBFB; border-bottom: 1px solid #fff; } a.reference { text-decoration: none; border-bottom: 1px dotted #004B6B; } /* Don't put an underline on images */ a.image-reference, a.image-reference:hover { border-bottom: none; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted #004B6B; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt, a:hover code { background: #EEE; } @media screen and (max-width: 870px) { div.sphinxsidebar { display: none; } div.document { width: 100%; } div.documentwrapper { margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0; } div.bodywrapper { margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; } ul { margin-left: 0; } li > ul { /* Matches the 30px from the "ul, ol" selector above */ margin-left: 30px; } .document { width: auto; } .footer { width: auto; } .bodywrapper { margin: 0; } .footer { width: auto; } .github { display: none; } } @media screen and (max-width: 875px) { body { margin: 0; padding: 20px 30px; } div.documentwrapper { float: none; background: #fff; } div.sphinxsidebar { display: block; float: none; width: 102.5%; margin: 50px -30px -20px -30px; padding: 10px 20px; background: #333; color: #FFF; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar h3 a { color: #fff; } div.sphinxsidebar a { color: #AAA; } div.sphinxsidebar p.logo { display: none; } div.document { width: 100%; margin: 0; } div.footer { display: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } .rtd_doc_footer { display: none; } .document { width: auto; } .footer { width: auto; } .footer { width: auto; } .github { display: none; } } /* misc. */ .revsys-inline { display: none!important; } /* Make nested-list/multi-paragraph items look better in Releases changelog * pages. Without this, docutils' magical list fuckery causes inconsistent * formatting between different release sub-lists. */ div#changelog > div.section > ul > li > p:only-child { margin-bottom: 0; } /* Hide fugly table cell borders in ..bibliography:: directive output */ table.docutils.citation, table.docutils.citation td, table.docutils.citation th { border: none; /* Below needed in some edge cases; if not applied, bottom shadows appear */ -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } /* relbar */ .related { line-height: 30px; width: 100%; font-size: 0.9rem; } .related.top { border-bottom: 1px solid #EEE; margin-bottom: 20px; } .related.bottom { border-top: 1px solid #EEE; } .related ul { padding: 0; margin: 0; list-style: none; } .related li { display: inline; } nav#rellinks { float: right; } nav#rellinks li+li:before { content: "|"; } nav#breadcrumbs li+li:before { content: "\00BB"; } /* Hide certain items when printing */ @media print { div.related { display: none; } } ================================================ FILE: cleverhans_v3.1.0/docs/_static/basic.css ================================================ /* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } div.section::after { display: block; content: ''; clear: left; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; word-wrap: break-word; overflow-wrap : break-word; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox form.search { overflow: hidden; } div.sphinxsidebar #searchbox input[type="text"] { float: left; width: 80%; padding: 0.25em; box-sizing: border-box; } div.sphinxsidebar #searchbox input[type="submit"] { float: left; width: 20%; border-left: none; padding: 0.25em; box-sizing: border-box; } img { border: 0; max-width: 100%; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; margin-left: auto; margin-right: auto; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable ul { margin-top: 0; margin-bottom: 0; list-style-type: none; } table.indextable > tbody > tr > td > ul { padding-left: 0em; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- domain module index --------------------------------------------------- */ table.modindextable td { padding: 2px; border-collapse: collapse; } /* -- general body styles --------------------------------------------------- */ div.body { min-width: 450px; max-width: 800px; } div.body p, div.body dd, div.body li, div.body blockquote { -moz-hyphens: auto; -ms-hyphens: auto; -webkit-hyphens: auto; hyphens: auto; } a.headerlink { visibility: hidden; } a.brackets:before, span.brackets > a:before{ content: "["; } a.brackets:after, span.brackets > a:after { content: "]"; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink, caption:hover > a.headerlink, p.caption:hover > a.headerlink, div.code-block-caption:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } img.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-default { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px; background-color: #ffe; width: 40%; float: right; clear: right; overflow-x: auto; } p.sidebar-title { font-weight: bold; } div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- content of sidebars/topics/admonitions -------------------------------- */ div.sidebar > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; } div.sidebar::after, div.topic::after, div.admonition::after, blockquote::after { display: block; content: ''; clear: both; } /* -- tables ---------------------------------------------------------------- */ table.docutils { margin-top: 10px; margin-bottom: 10px; border: 0; border-collapse: collapse; } table.align-center { margin-left: auto; margin-right: auto; } table.align-default { margin-left: auto; margin-right: auto; } table caption span.caption-number { font-style: italic; } table caption span.caption-text { } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } th > :first-child, td > :first-child { margin-top: 0px; } th > :last-child, td > :last-child { margin-bottom: 0px; } /* -- figures --------------------------------------------------------------- */ div.figure { margin: 0.5em; padding: 0.5em; } div.figure p.caption { padding: 0.3em; } div.figure p.caption span.caption-number { font-style: italic; } div.figure p.caption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ table.field-list td, table.field-list th { border: 0 !important; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .field-name { -moz-hyphens: manual; -ms-hyphens: manual; -webkit-hyphens: manual; hyphens: manual; } /* -- hlist styles ---------------------------------------------------------- */ table.hlist { margin: 1em 0; } table.hlist td { vertical-align: top; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } :not(li) > ol > li:first-child > :first-child, :not(li) > ul > li:first-child > :first-child { margin-top: 0px; } :not(li) > ol > li:last-child > :last-child, :not(li) > ul > li:last-child > :last-child { margin-bottom: 0px; } ol.simple ol p, ol.simple ul p, ul.simple ol p, ul.simple ul p { margin-top: 0; } ol.simple > li:not(:first-child) > p, ul.simple > li:not(:first-child) > p { margin-top: 0; } ol.simple p, ul.simple p { margin-bottom: 0; } dl.footnote > dt, dl.citation > dt { float: left; margin-right: 0.5em; } dl.footnote > dd, dl.citation > dd { margin-bottom: 0em; } dl.footnote > dd:after, dl.citation > dd:after { content: ""; clear: both; } dl.field-list { display: grid; grid-template-columns: fit-content(30%) auto; } dl.field-list > dt { font-weight: bold; word-break: break-word; padding-left: 0.5em; padding-right: 5px; } dl.field-list > dt:after { content: ":"; } dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; margin-left: 0em; margin-bottom: 0em; } dl { margin-bottom: 15px; } dd > :first-child { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; } dt:target, span.highlighted { background-color: #fbe54e; } rect.highlighted { fill: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .optional { font-size: 1.3em; } .sig-paren { font-size: larger; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } .classifier:before { font-style: normal; margin: 0.5em; content: ":"; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } pre, div[class*="highlight-"] { clear: both; } span.pre { -moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; } div[class*="highlight-"] { margin: 1em 0; } td.linenos pre { border: 0; background-color: transparent; color: #aaa; } table.highlighttable { display: block; } table.highlighttable tbody { display: block; } table.highlighttable tr { display: flex; } table.highlighttable td { margin: 0; padding: 0; } table.highlighttable td.linenos { padding-right: 0.5em; } table.highlighttable td.code { flex: 1; overflow: hidden; } .highlight .hll { display: block; } div.highlight pre, table.highlighttable pre { margin: 0; } div.code-block-caption + div { margin-top: 0; } div.code-block-caption { margin-top: 1em; padding: 2px 5px; font-size: small; } div.code-block-caption code { background-color: transparent; } table.highlighttable td.linenos, span.linenos, div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ user-select: none; } div.code-block-caption span.caption-number { padding: 0.1em 0.3em; font-style: italic; } div.code-block-caption span.caption-text { } div.literal-block-wrapper { margin: 1em 0; } code.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } code.descclassname { background-color: transparent; } code.xref, a code { background-color: transparent; font-weight: bold; } h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } span.eqno a.headerlink { position: absolute; z-index: 1; } div.math:hover a.headerlink { visibility: visible; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } } ================================================ FILE: cleverhans_v3.1.0/docs/_static/custom.css ================================================ /* This file intentionally left blank. */ ================================================ FILE: cleverhans_v3.1.0/docs/_static/doctools.js ================================================ /* * doctools.js * ~~~~~~~~~~~ * * Sphinx JavaScript utilities for all documentation. * * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * select a different prefix for underscore */ $u = _.noConflict(); /** * make the code below compatible with browsers without * an installed firebug like debugger if (!window.console || !console.firebug) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; window.console = {}; for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {}; } */ /** * small helper function to urldecode strings */ jQuery.urldecode = function(x) { return decodeURIComponent(x).replace(/\+/g, ' '); }; /** * small helper function to urlencode strings */ jQuery.urlencode = encodeURIComponent; /** * This function returns the parsed url parameters of the * current request. Multiple values per key are supported, * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { if (typeof s === 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; for (var i = 0; i < parts.length; i++) { var tmp = parts[i].split('=', 2); var key = jQuery.urldecode(tmp[0]); var value = jQuery.urldecode(tmp[1]); if (key in result) result[key].push(value); else result[key] = [value]; } return result; }; /** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { function highlight(node, addItems) { if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className) && !jQuery(node.parentNode).hasClass("nohighlight")) { var span; var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); if (isInSVG) { span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); } else { span = document.createElement("span"); span.className = className; } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); var bbox = node.parentElement.getBBox(); rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); addItems.push({ "parent": node.parentNode, "target": rect}); } } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this, addItems); }); } } var addItems = []; var result = this.each(function() { highlight(this, addItems); }); for (var i = 0; i < addItems.length; ++i) { jQuery(addItems[i].parent).before(addItems[i].target); } return result; }; /* * backward compatibility for jQuery.browser * This will be supported until firefox bug is fixed. */ if (!jQuery.browser) { jQuery.uaMatch = function(ua) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; jQuery.browser = {}; jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; } /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { this.initOnKeyListeners(); } }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated === 'undefined') return string; return (typeof translated === 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated === 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); if (!body.length) { body = $('body'); } window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) === 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this === '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); }, initOnKeyListeners: function() { $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; // don't navigate when in search box, textarea, dropdown or button if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); if (prevHref) { window.location.href = prevHref; return false; } case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } } } }); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); ================================================ FILE: cleverhans_v3.1.0/docs/_static/documentation_options.js ================================================ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false }; ================================================ FILE: cleverhans_v3.1.0/docs/_static/jquery-3.5.1.js ================================================ /*! * jQuery JavaScript Library v3.5.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2020-05-04T22:49Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var getProto = Object.getPrototypeOf; var slice = arr.slice; var flat = arr.flat ? function( array ) { return arr.flat.call( array ); } : function( array ) { return arr.concat.apply( [], array ); }; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; var isWindow = function isWindow( obj ) { return obj != null && obj === obj.window; }; var document = window.document; var preservedScriptAttributes = { type: true, src: true, nonce: true, noModule: true }; function DOMEval( code, node, doc ) { doc = doc || document; var i, val, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { // Support: Firefox 64+, Edge 18+ // Some browsers don't support the "nonce" property on scripts. // On the other hand, just using `getAttribute` is not enough as // the `nonce` attribute is reset to an empty string whenever it // becomes browsing-context connected. // See https://github.com/whatwg/html/issues/2369 // See https://html.spec.whatwg.org/#nonce-attributes // The `node.getAttribute` check was added for the sake of // `jQuery.globalEval` so that it can fake a nonce-containing node // via an object. val = node[ i ] || node.getAttribute && node.getAttribute( i ); if ( val ) { script.setAttribute( i, val ); } } } doc.head.appendChild( script ).parentNode.removeChild( script ); } function toType( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.5.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, even: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return ( i + 1 ) % 2; } ) ); }, odd: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return i % 2; } ) ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { copy = options[ name ]; // Prevent Object.prototype pollution // Prevent never-ending loop if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { src = target[ name ]; // Ensure proper type for the source value if ( copyIsArray && !Array.isArray( src ) ) { clone = []; } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { clone = {}; } else { clone = src; } copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, // Evaluates a script in a provided context; falls back to the global one // if not specified. globalEval: function( code, options, doc ) { DOMEval( code, { nonce: options && options.nonce }, doc ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return flat( ret ); }, // A global GUID counter for objects guid: 1, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = toType( obj ); if ( isFunction( obj ) || isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.5 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * * Date: 2020-03-14 */ ( function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ( {} ).hasOwnProperty, arr = [], pop = arr.pop, pushNative = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[ i ] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] // or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; return nonHex ? // Strip the backslash prefix from a non-hex escape sequence nonHex : // Replace a hexadecimal escape sequence with the encoded Unicode code point // Support: IE <=11+ // For values outside the Basic Multilingual Plane (BMP), manually construct a // surrogate pair high < 0 ? String.fromCharCode( high + 0x10000 ) : String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( ( arr = slice.call( preferredDoc.childNodes ) ), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { pushNative.apply( target, slice.call( els ) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( ( target[ j++ ] = els[ i++ ] ) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { setDocument( context ); context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { // ID selector if ( ( m = match[ 1 ] ) ) { // Document context if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[ 2 ] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !nonnativeSelectorCache[ selector + " " ] && ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && // Support: IE 8 only // Exclude object elements ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { newSelector = selector; newContext = context; // qSA considers elements outside a scoping root when evaluating child or // descendant combinators, which is not what we want. // In such cases, we work around the behavior by prefixing every selector in the // list with an ID selector referencing the scope context. // The technique has to be used as well when a leading combinator is used // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. if ( newContext !== context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", ( nid = expando ) ); } } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + toSelector( groups[ i ] ); } newSelector = groups.join( "," ); } try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { nonnativeSelectorCache( selector, true ); } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return ( cache[ key + " " ] = value ); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement( "fieldset" ); try { return !!fn( el ); } catch ( e ) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split( "|" ), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[ i ] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( ( cur = cur.nextSibling ) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return ( name === "input" || name === "button" ) && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction( function( argument ) { argument = +argument; return markFunction( function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ ( j = matchIndexes[ i ] ) ] ) { seed[ j ] = !( matches[ j ] = seed[ j ] ); } } } ); } ); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { var namespace = elem.namespaceURI, docElem = ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes // https://bugs.jquery.com/ticket/4833 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9 - 11+, Edge 12 - 18+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( preferredDoc != document && ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, // Safari 4 - 5 only, Opera <=11.6 - 12.x only // IE/Edge & older browsers don't support the :scope pseudo-class. // Support: Safari 6.0 only // Safari 6.0 supports :scope but it's an alias of :root there. support.scope = assert( function( el ) { docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll( ":scope fieldset div" ).length; } ); /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert( function( el ) { el.className = "i"; return !el.getAttribute( "className" ); } ); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert( function( el ) { el.appendChild( document.createComment( "" ) ); return !el.getElementsByTagName( "*" ).length; } ); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert( function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; } ); // ID filter and find if ( support.getById ) { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" ); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( ( elem = elems[ i++ ] ) ) { node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find[ "TAG" ] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( ( elem = results[ i++ ] ) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert( function( el ) { var input; // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll( "[selected]" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push( "~=" ); } // Support: IE 11+, Edge 15 - 18+ // IE 11/Edge don't find elements on a `[name='']` query in some cases. // Adding a temporary attribute to the document before the selection works // around the issue. // Interestingly, IE 10 & older don't seem to have the issue. input = document.createElement( "input" ); input.setAttribute( "name", "" ); el.appendChild( input ); if ( !el.querySelectorAll( "[name='']" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll( ":checked" ).length ) { rbuggyQSA.push( ":checked" ); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push( ".#.+[+~]" ); } // Support: Firefox <=3.6 - 5 only // Old Firefox doesn't throw on a badly-escaped identifier. el.querySelectorAll( "\\\f" ); rbuggyQSA.push( "[\\r\\n\\f]" ); } ); assert( function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement( "input" ); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll( "[name=d]" ).length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: Opera 10 - 11 only // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll( "*,:x" ); rbuggyQSA.push( ",.*:" ); } ); } if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector ) ) ) ) { assert( function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); } ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 ) ); } : function( a, b ) { if ( b ) { while ( ( b = b.parentNode ) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { // Choose the first element that is related to our preferred document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( a == document || a.ownerDocument == preferredDoc && contains( preferredDoc, a ) ) { return -1; } // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( b == document || b.ownerDocument == preferredDoc && contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ return a == document ? -1 : b == document ? 1 : /* eslint-enable eqeqeq */ aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( ( cur = cur.parentNode ) ) { ap.unshift( cur ); } cur = b; while ( ( cur = cur.parentNode ) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[ i ] === bp[ i ] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[ i ], bp[ i ] ) : // Otherwise nodes in our document sort first // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ ap[ i ] == preferredDoc ? -1 : bp[ i ] == preferredDoc ? 1 : /* eslint-enable eqeqeq */ 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); if ( support.matchesSelector && documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { nonnativeSelectorCache( expr, true ); } } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( elem.ownerDocument || elem ) != document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return ( sel + "" ).replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( ( elem = results[ i++ ] ) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( ( node = elem[ i++ ] ) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ).replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[ 1 ] = match[ 1 ].toLowerCase(); if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); // other types prohibit arguments } else if ( match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { return null; } // Accept quoted arguments as-is if ( match[ 3 ] ) { match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) ( excess = tokenize( unquoted, true ) ) && // advance to the next closing parenthesis ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { // excess is a negative index match[ 0 ] = match[ 0 ].slice( 0, excess ); match[ 2 ] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || ( pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute( "class" ) || "" ); } ); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; /* eslint-disable max-len */ return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; /* eslint-enable max-len */ }; }, "CHILD": function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, _context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( ( node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start ( diff = nodeIndex = 0 ) || start.pop() ) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( ( node = ++nodeIndex && node && node[ dir ] || ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction( function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( ( elem = unmatched[ i ] ) ) { seed[ i ] = !( matches[ i ] = elem ); } } } ) : function( elem, _context, xml ) { input[ 0 ] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[ 0 ] = null; return !results.pop(); }; } ), "has": markFunction( function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; } ), "contains": markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; } ), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( ( elemLang = documentIsHTML ? elem.lang : elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); return false; }; } ), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && ( !document.hasFocus || document.hasFocus() ) && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return ( nodeName === "input" && !!elem.checked ) || ( nodeName === "option" && !!elem.selected ); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos[ "empty" ]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo( function() { return [ 0 ]; } ), "last": createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), "even": createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "odd": createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument > length ? length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; } ) } }; Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || ( match = rcomma.exec( soFar ) ) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[ 0 ].length ) || soFar; } groups.push( ( tokens = [] ) ); } matched = false; // Combinators if ( ( match = rcombinators.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space type: match[ 0 ].replace( rtrim, " " ) } ); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || ( match = preFilters[ type ]( match ) ) ) ) { matched = match.shift(); tokens.push( { value: matched, type: type, matches: match } ); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[ i ].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || ( outerCache[ elem.uniqueID ] = {} ); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( ( oldCache = uniqueCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return ( newCache[ 2 ] = oldCache[ 2 ] ); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[ i ]( elem, context, xml ) ) { return false; } } return true; } : matchers[ 0 ]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[ i ], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( ( elem = unmatched[ i ] ) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( ( elem = temp[ i ] ) ) { matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) ) { // Restore matcherIn since elem is not yet a final match temp.push( ( matcherIn[ i ] = elem ) ); } } postFinder( null, ( matcherOut = [] ), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } } ); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[ 0 ].type ], implicitRelative = leadingRelative || Expr.relative[ " " ], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; } else { matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[ j ].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens .slice( 0, i - 1 ) .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), len = elems.length; if ( outermost ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq outermostContext = context == document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( !context && elem.ownerDocument != document ) { setDocument( elem ); xml = !documentIsHTML; } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( ( elem = !matcher && elem ) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( ( matcher = setMatchers[ j++ ] ) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !( unmatched[ i ] || setMatched[ i ] ) ) { setMatched[ i ] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[ i ] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { context = ( Expr.find[ "ID" ]( token.matches[ 0 ] .replace( runescape, funescape ), context ) || [] )[ 0 ]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; // Abort if we hit a combinator if ( Expr.relative[ ( type = token.type ) ] ) { break; } if ( ( find = Expr.find[ type ] ) ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert( function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute( "href" ) === "#"; } ) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } } ); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert( function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; } ) ) { addHandle( "value", function( elem, _name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } } ); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert( function( el ) { return el.getAttribute( "disabled" ) == null; } ) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; } } ); } return Sizzle; } )( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Filtered directly for both simple and complex selectors return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, _i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, _i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, _i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( elem.contentDocument != null && // Support: IE 11+ // elements with no `data` attribute has an object // `contentDocument` with a `null` prototype. getProto( elem.contentDocument ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( _i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // rejected_handlers.disable // fulfilled_handlers.disable tuples[ 3 - i ][ 3 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock, // progress_handlers.lock tuples[ 0 ][ 3 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, _key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; // Matches dashed string for camelizing var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() function fcamelCase( _all, letter ) { return letter.toUpperCase(); } // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 // Microsoft forgot to hump their vendor prefix (#9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( camelCase ); } else { key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var documentElement = document.documentElement; var isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ); }, composed = { composed: true }; // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only // Check attachment across shadow DOM boundaries when possible (gh-3504) // Support: iOS 10.0-10.2 only // Early iOS 10 versions support `attachShadow` but not `getRootNode`, // leading to errors. We need to check for `getRootNode`. if ( documentElement.getRootNode ) { isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ) || elem.getRootNode( composed ) === elem.ownerDocument; }; } var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. isAttached( elem ) && jQuery.css( elem, "display" ) === "none"; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = elem.nodeType && ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Support: Firefox <=54 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) initial = initial / 2; // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; while ( maxIterations-- ) { // Evaluate and update our best guess (doubling guesses that zero out). // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { maxIterations = 0; } initialInUnit = initialInUnit / scale; } initialInUnit = initialInUnit * 2; jQuery.style( elem, prop, initialInUnit + unit ); // Make sure we update the tween properties later on valueParts = valueParts || []; } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // Support: IE <=9 only // IE <=9 replaces "; support.option = !!div.lastChild; } )(); // We have to close these tags to support XHTML (#13200) var wrapMap = { // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // Support: IE <=9 only if ( !support.option ) { wrapMap.optgroup = wrapMap.option = [ 1, "" ]; } function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } attached = isAttached( elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( attached ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 - 11+ // focus() and blur() are asynchronous, except when they are no-op. // So expect focus to be synchronous when the element is already active, // and blur to be synchronous when the element is not already active. // (focus and blur are always synchronous in other supported browsers, // this just defines when we can count on it). function expectSync( elem, type ) { return ( elem === safeActiveElement() ) === ( type === "focus" ); } // Support: IE <=9 only // Accessing document.activeElement can throw unexpectedly // https://bugs.jquery.com/ticket/13393 function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Only attach events to objects that accept data if ( !acceptData( elem ) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = Object.create( null ); } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( nativeEvent ), handlers = ( dataPriv.get( this, "events" ) || Object.create( null ) )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // If the event is namespaced, then each handler is only invoked if it is // specially universal or its namespaces are a superset of the event's. if ( !event.rnamespace || handleObj.namespace === false || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, click: { // Utilize native event to ensure correct state for checkable inputs setup: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Claim the first handler if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) leverageNative( el, "click", returnTrue ); } // Return false to allow normal processing in the caller return false; }, trigger: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Force setup before triggering a click if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { leverageNative( el, "click" ); } // Return non-false to allow normal event-path propagation return true; }, // For cross-browser consistency, suppress native .click() on links // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { var target = event.target; return rcheckableType.test( target.type ) && target.click && nodeName( target, "input" ) && dataPriv.get( target, "click" ) || nodeName( target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; // Ensure the presence of an event listener that handles manually-triggered // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. function leverageNative( el, type, expectSync ) { // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add if ( !expectSync ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } return; } // Register the controller as a special universal handler for all event namespaces dataPriv.set( el, type, false ); jQuery.event.add( el, type, { namespace: false, handler: function( event ) { var notAsync, result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event // Saved data should be false in such cases, but might be a leftover capture object // from an async native handler (gh-4350) if ( !saved.length ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array // will not be confused with a leftover capture object. saved = slice.call( arguments ); dataPriv.set( this, type, saved ); // Trigger the native event and capture its result // Support: IE <=9 - 11+ // focus() and blur() are asynchronous notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); if ( saved !== result || notAsync ) { dataPriv.set( this, type, false ); } else { result = {}; } if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); return result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate // (focus or blur), assume that the surrogate already propagated from triggering the // native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { event.stopPropagation(); } // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments } else if ( saved.length ) { // ...and capture the result dataPriv.set( this, type, { value: jQuery.event.trigger( // Support: IE <=9 - 11+ // Extend with the prototype to reset the above stopImmediatePropagation() jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), saved.slice( 1 ), this ) } ); // Abort handling of the native event event.stopImmediatePropagation(); } } } ); } jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, code: true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) leverageNative( this, type, expectSync ); // Return false to allow normal processing in the caller return false; }, trigger: function() { // Force setup before trigger leverageNative( this, type ); // Return non-false to allow normal event-path propagation return true; }, delegateType: delegateType }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.get( src ); events = pdataOld.events; if ( events ) { dataPriv.remove( dest, "handle events" ); for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = flat( args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl && !node.noModule ) { jQuery._evalUrl( node.src, { nonce: node.nonce || node.getAttribute( "nonce" ) }, doc ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && isAttached( node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html; }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = isAttached( elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; var swap = function( elem, options, callback ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.call( elem ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't div.style.right = "60%"; pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; // Support: IE 9 - 11 only // Detect misreporting of content dimensions for box-sizing:border-box elements boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) // Support: Chrome <=64 // Don't get tricked when zoom affects offsetWidth (gh-4029) div.style.position = "absolute"; scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } function roundPixelMeasures( measure ) { return Math.round( parseFloat( measure ) ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; jQuery.extend( support, { boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelBoxStyles: function() { computeStyleTests(); return pixelBoxStylesVal; }, pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; }, scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; }, // Support: IE 9 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { table = document.createElement( "table" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px"; tr.style.height = "1px"; trChild.style.height = "9px"; documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; documentElement.removeChild( table ); } return reliableTrDimensionsVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style, vendorProps = {}; // Return a vendor-prefixed property or undefined function vendorPropName( name ) { // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a potentially-mapped jQuery.cssProps or vendor prefixed property function finalPropName( name ) { var final = jQuery.cssProps[ name ] || vendorProps[ name ]; if ( final ) { return final; } if ( name in emptyStyle ) { return name; } return vendorProps[ name ] = vendorPropName( name ) || name; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }; function setPositiveNumber( _elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { return 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin if ( box === "margin" ) { delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" if ( !isBorderBox ) { // Add padding delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // For "border" or "margin", add border if ( box !== "padding" ) { delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // But still keep track of it otherwise } else { extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } // If we get here with a border-box (content + padding + border), we're seeking "content" or // "padding" or "margin" } else { // For "content", subtract padding if ( box === "content" ) { delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // For "content" or "padding", subtract border if ( box !== "margin" ) { delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } // Account for positive content-box scroll gutter when requested by providing computedVal if ( !isBorderBox && computedVal >= 0 ) { // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border // Assuming integer scroll gutter, subtract the rest and round down delta += Math.max( 0, Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - computedVal - delta - extra - 0.5 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter // Use an explicit zero to avoid NaN (gh-3964) ) ) || 0; } return delta; } function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). // Fake content-box until we know it's needed to know the true value. boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS( elem, dimension, styles ), offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { if ( !extra ) { return val; } val = "auto"; } // Support: IE 9 - 11 only // Use offsetWidth/offsetHeight for when box sizing is unreliable. // In those cases, the computed value can be trusted to be border-box. if ( ( !support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Interestingly, in some cases IE 9 doesn't suffer from this issue. !support.reliableTrDimensions() && nodeName( elem, "tr" ) || // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) val === "auto" || // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && // Make sure the element is visible & connected elem.getClientRects().length ) { isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // Where available, offsetWidth/offsetHeight approximate border box dimensions. // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the // retrieved value as a content box dimension. valueIsBorderBox = offsetProp in elem; if ( valueIsBorderBox ) { val = elem[ offsetProp ]; } } // Normalize "" and auto val = parseFloat( val ) || 0; // Adjust for the element's box model return ( val + boxModelAdjustment( elem, dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) val ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "gridArea": true, "gridColumn": true, "gridColumnEnd": true, "gridColumnStart": true, "gridRow": true, "gridRowEnd": true, "gridRowStart": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append // "px" to a few hardcoded values. if ( type === "number" && !isCustomProp ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( _i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), // Only read styles.position if the test has a chance to fail // to avoid forcing a reflow. scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra ? boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ) : 0; // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && scrollboxSizeBuggy ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY and Edge just mirrors // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = result.stop.bind( result ); } return result; } } jQuery.map( props, createTween, animation ); if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } function classesToArray( value ) { if ( Array.isArray( value ) ) { return value; } if ( typeof value === "string" ) { return value.match( rnothtmlwhite ) || []; } return []; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isValidValue = type === "string" || Array.isArray( value ); if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion support.focusin = "onfocusin" in window; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function( e ) { e.stopPropagation(); }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; if ( event.isPropagationStopped() ) { lastElement.addEventListener( type, stopPropagationCallback ); } elem[ type ](); if ( event.isPropagationStopped() ) { lastElement.removeEventListener( type, stopPropagationCallback ); } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { // Handle: regular nodes (via `this.ownerDocument`), window // (via `this.document`) & document (via `this`). var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = { guid: Date.now() }; var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; if ( a == null ) { return ""; } // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() + " " ] = ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) .concat( match[ 2 ] ); } } match = responseHeaders[ key.toLowerCase() + " " ]; } return match == null ? null : match.join( ", " ); }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available and should be processed, append data to url if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Use a noop converter for missing script if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { s.converters[ "text script" ] = function() {}; } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( _i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery.ajaxPrefilter( function( s ) { var i; for ( i in s.headers ) { if ( i.toLowerCase() === "content-type" ) { s.contentType = s.headers[ i ] || ""; } } } ); jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, // Only evaluate the response if it is successful (gh-4126) // dataFilter is not invoked for failure responses, so using it instead // of the default converter is kludgy but it works. converters: { "text script": function() {} }, dataFilter: function( response ) { jQuery.globalEval( response, options, doc ); } } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var htmlIsFunction = isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain or forced-by-attrs requests if ( s.crossDomain || s.scriptAttrs ) { var script, callback; return { send: function( _, complete ) { script = jQuery( "

Index

A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | V | W | X

A

B

C

D

E

F

G

H

L

M

N

O

P

R

S

V

W

X

================================================ FILE: cleverhans_v3.1.0/docs/index.html ================================================ CleverHans Documentation — CleverHans documentation

CleverHans Documentation

This documentation is auto-generated from the docstrings of modules of the current master branch of cleverhans.

To get started, we recommend reading the github readme. Afterwards, you can learn more by looking at the following modules:

Indices and tables

================================================ FILE: cleverhans_v3.1.0/docs/py-modindex.html ================================================ Python Module Index — CleverHans documentation

Python Module Index

c
 
c
cleverhans
    cleverhans.attacks
    cleverhans.devtools
    cleverhans.model
================================================ FILE: cleverhans_v3.1.0/docs/search.html ================================================ Search — CleverHans documentation

Search

Please activate JavaScript to enable the search functionality.

Searching for multiple words only shows matches that contain all words.

================================================ FILE: cleverhans_v3.1.0/docs/searchindex.js ================================================ Search.setIndex({docnames:["README","index","source/attacks","source/devtools","source/future","source/model"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["README.md","index.md","source/attacks.md","source/devtools.md","source/future.md","source/model.md"],objects:{"cleverhans.attacks":{ABCMeta:[2,1,1,""],Attack:[2,1,1,""],BasicIterativeMethod:[2,1,1,""],BoundaryAttackPlusPlus:[2,3,1,""],CallableModelWrapper:[2,1,1,""],CarliniWagnerL2:[2,1,1,""],DeepFool:[2,1,1,""],ElasticNetMethod:[2,1,1,""],FastFeatureAdversaries:[2,1,1,""],FastGradientMethod:[2,1,1,""],HopSkipJumpAttack:[2,1,1,""],LBFGS:[2,1,1,""],MadryEtAl:[2,1,1,""],MaxConfidence:[2,1,1,""],Model:[2,1,1,""],MomentumIterativeMethod:[2,1,1,""],Noise:[2,1,1,""],ProjectedGradientDescent:[2,1,1,""],SPSA:[2,1,1,""],SaliencyMapMethod:[2,1,1,""],Semantic:[2,1,1,""],SparseL1Descent:[2,1,1,""],SpatialTransformationMethod:[2,1,1,""],VirtualAdversarialMethod:[2,1,1,""],clip_eta:[2,3,1,""],fgm:[2,3,1,""],optimize_linear:[2,3,1,""],projected_optimization:[2,3,1,""],reduce_max:[2,3,1,""],reduce_mean:[2,3,1,""],reduce_sum:[2,3,1,""],softmax_cross_entropy_with_logits:[2,3,1,""],vatm:[2,3,1,""],wrapper_warning:[2,3,1,""],wrapper_warning_logits:[2,3,1,""],xrange:[2,4,1,""]},"cleverhans.attacks.ABCMeta":{register:[2,2,1,""]},"cleverhans.attacks.Attack":{construct_graph:[2,2,1,""],construct_variables:[2,2,1,""],generate:[2,2,1,""],generate_np:[2,2,1,""],get_or_guess_labels:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.CallableModelWrapper":{fprop:[2,2,1,""]},"cleverhans.attacks.CarliniWagnerL2":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.DeepFool":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.ElasticNetMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.FastFeatureAdversaries":{attack_single_step:[2,2,1,""],generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.FastGradientMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.HopSkipJumpAttack":{generate:[2,2,1,""],generate_np:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.LBFGS":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.MaxConfidence":{attack:[2,2,1,""],attack_class:[2,2,1,""],generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.Model":{O_FEATURES:[2,4,1,""],O_LOGITS:[2,4,1,""],O_PROBS:[2,4,1,""],fprop:[2,2,1,""],get_layer:[2,2,1,""],get_layer_names:[2,2,1,""],get_logits:[2,2,1,""],get_params:[2,2,1,""],get_predicted_class:[2,2,1,""],get_probs:[2,2,1,""],make_input_placeholder:[2,2,1,""],make_label_placeholder:[2,2,1,""],make_params:[2,2,1,""]},"cleverhans.attacks.MomentumIterativeMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.Noise":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.ProjectedGradientDescent":{FGM_CLASS:[2,4,1,""],generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.SPSA":{DEFAULT_DELTA:[2,4,1,""],DEFAULT_LEARNING_RATE:[2,4,1,""],DEFAULT_SPSA_ITERS:[2,4,1,""],DEFAULT_SPSA_SAMPLES:[2,4,1,""],generate:[2,2,1,""],generate_np:[2,2,1,""]},"cleverhans.attacks.SaliencyMapMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.Semantic":{generate:[2,2,1,""]},"cleverhans.attacks.SparseL1Descent":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.SpatialTransformationMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.VirtualAdversarialMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.model":{CallableModelWrapper:[5,1,1,""],Model:[5,1,1,""],NoSuchLayerError:[5,5,1,""],wrapper_warning:[5,3,1,""],wrapper_warning_logits:[5,3,1,""]},"cleverhans.model.CallableModelWrapper":{fprop:[5,2,1,""]},"cleverhans.model.Model":{O_FEATURES:[5,4,1,""],O_LOGITS:[5,4,1,""],O_PROBS:[5,4,1,""],fprop:[5,2,1,""],get_layer:[5,2,1,""],get_layer_names:[5,2,1,""],get_logits:[5,2,1,""],get_params:[5,2,1,""],get_predicted_class:[5,2,1,""],get_probs:[5,2,1,""],make_input_placeholder:[5,2,1,""],make_label_placeholder:[5,2,1,""],make_params:[5,2,1,""]},cleverhans:{attacks:[2,0,0,"-"],devtools:[4,0,0,"-"],model:[5,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"],"5":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute","5":"py:exception"},terms:{"001":2,"00420":2,"005":2,"00677":2,"01236":2,"02144":2,"02533":2,"04114":2,"04599":2,"04644":2,"05122":2,"05666":2,"06081":2,"06083":2,"06857":2,"07528":2,"100":2,"1000":2,"10000":2,"128":2,"13000":2,"1312":2,"1412":2,"1507":2,"1511":2,"1607":2,"1608":2,"1611":2,"1703":2,"1706":2,"1709":2,"1710":2,"1802":2,"1904":2,"2014":2,"2016":2,"2017":2,"2018":2,"2019":2,"6199":2,"6572":2,"abstract":[2,5],"boolean":2,"case":2,"class":[2,5],"default":[2,5],"final":[2,5],"float":2,"function":[2,5],"import":[0,2],"int":2,"new":2,"public":2,"return":[2,5],"static":0,"super":2,"true":[2,5],"try":2,For:2,The:[0,2,5],Use:2,Used:[2,5],Using:[2,5],_build:0,_project_perturb:2,abc:2,abcmeta:2,abl:0,abort:2,abort_earli:2,abs:2,acceler:2,access:[2,5],accident:2,accord:2,act:2,action:2,actual:[2,5],adam:2,add:0,addit:2,adversari:2,after:[2,5],afterward:1,against:2,aim:2,algorithm:2,alia:2,all:[0,2,5],allow:2,alon:2,along:2,alreadi:2,also:[2,5],angl:2,angle_max:2,angle_min:2,angular2html:0,ani:[2,5],appli:2,approach:2,approxim:2,arg:2,arg_typ:2,argmax_:2,argument:2,around:2,arrai:2,arxiv:2,assert:2,assign:2,assum:2,attack:[0,1,5],attack_class:2,attack_single_step:2,attain:2,attribut:2,auto:1,autodoc:0,automag:[2,5],automat:[2,5],avoid:2,axi:2,back:2,ball:2,base:[0,2,5],base_attack:2,basic:2,basiciterativemethod:2,batch:2,batch_siz:2,becaus:[2,5],been:[2,5],befor:2,being:2,below:2,beta:2,better:2,between:2,binari:2,binary_search_step:2,black:2,black_border_s:2,boneh:2,bool:2,border:2,bounc:2,bound:2,boundari:2,boundaryattackplusplu:2,box:2,branch:[0,1],build:0,built:2,bundl:2,cach:2,calcul:2,call:[2,5],callabl:[2,5],callable_fn:[2,5],callablemodelwrapp:[2,5],can:[0,1,2,5],cannot:0,carlini:2,carliniwagnerl2:2,center:2,chang:[2,5],check:[2,5],chen:2,child:2,choic:[0,2],choos:[0,2],chosen:2,classif:2,classifi:2,cleverhan:[0,2,5],click:0,clip:2,clip_eta:2,clip_grad:2,clip_max:2,clip_min:2,clockwis:2,code:[2,5],combin:2,come:2,compar:2,competit:2,complement:2,compon:2,compos:2,comput:[2,5],computation:2,concept:2,concret:2,confid:2,configur:2,consid:2,consist:2,constant:2,constraint:2,construct:2,construct_graph:2,construct_vari:2,constructor:[2,5],contain:2,content:[2,5],context:[2,5],control:2,conveni:0,converg:2,convolut:2,coordin:2,copi:0,core:[2,5],correct:2,cost:2,counter:2,cover:2,craft:2,creat:[0,2,5],criterion:2,cross:[2,5],current:[1,2],danger:[2,5],data:2,debug:2,decai:2,decay_factor:2,decis:2,decision_rul:2,decor:2,decreas:2,deepfool:2,default_delta:2,default_learning_r:2,default_rand_init:2,default_spsa_it:2,default_spsa_sampl:2,defens:2,defin:[2,5],delta:2,depend:[2,5],deprec:[2,5],descend:2,descent:2,describ:2,design:2,desir:2,detail:2,detect:[2,5],devic:[2,5],dict:[2,5],dictionari:[2,5],differ:[0,2],differenti:2,dim:2,dimens:2,direct:2,directli:[2,5],directori:0,discret:2,distanc:2,distort:2,doc:0,docsourc:0,docstr:1,document:[0,2],doe:[2,5],domain:2,done:2,dong:2,dot:2,down:0,dramat:2,drop:0,dtype:2,dtypestr:2,dure:2,dx_max:2,dx_min:2,dy_max:2,dy_min:2,each:2,earli:2,early_stop_loss_threshold:2,effect:2,effici:2,either:2,elast:2,elasticnetmethod:2,element:2,enabl:[0,2],encod:2,end:2,enforc:2,entropi:[2,5],environ:0,eps:2,eps_it:2,epsilon:2,estim:2,eta:2,evalu:2,even:[2,5],everi:2,exampl:[2,5],except:[0,5],exist:5,expens:2,explain:2,expos:[2,5],express:2,extend:2,extra:[2,5],factor:2,fail:[0,2],failur:2,fals:[2,5],fast:2,fast_gradient_method:2,faster:2,fastfeatureadversari:2,fastgradientmethod:2,featur:[2,5],fed:[2,5],feedabl:2,few:2,fewer:2,fgm:2,fgm_class:2,file:0,find:2,finit:2,first:[0,2],fix:2,float32:2,folder:0,follow:[0,1,2],forum:2,forward:[2,5],found:2,fprop:[2,5],free:2,from:[0,1,2,5],full:2,g_feat:2,gamma:2,gener:[0,1,2],generate_np:2,geometr:2,geometric_progress:2,get:[0,1,2],get_lay:[2,5],get_layer_nam:[2,5],get_logit:[2,5],get_or_guess_label:2,get_param:[2,5],get_predicted_class:[2,5],get_prob:[2,5],github:[0,1],give:2,given:2,good:2,goodfellow:2,grad:2,grad_spars:2,gradient:[2,5],graph:2,greatli:2,grid:2,grid_search:2,guarante:2,guid:2,h1g0pia9tq:2,hack:0,half:2,handl:2,hard:2,has:[2,5],hash_kei:2,have:[0,2,5],help:2,helper:2,here:2,hidden:[2,5],high:2,higher:2,hold:2,hood:[2,5],hopskipjumpattack:2,hot:2,how:2,hparam:[2,5],html:0,http:2,hurt:2,hyperparamet:2,idea:2,identifi:2,ignor:2,imag:2,image_target:2,imagenet:2,implement:[2,5],importantli:2,improv:2,incept:[2,5],includ:2,incorrect:[2,5],increas:2,index:[0,1,2],indic:0,inf:2,infer:2,infin:2,info:2,initi:2,initial_const:2,initial_num_ev:2,input:[2,5],input_imag:2,insert:2,instal:0,instead:2,intend:2,intention:2,interfac:[2,5],intern:2,interv:2,introduc:2,invok:[2,5],is_debug:2,is_target:2,issu:[2,5],issubclass:2,iter:2,itself:2,jacobian:2,jekyl:0,jordan:2,just:[2,5],keep:[0,2],kei:2,kera:[2,5],keras_tensor:0,keyword:2,known:2,kurakin:2,kwarg:[2,5],label:[2,5],larg:2,larger:2,largest:2,later:[2,5],layer:[2,5],lbfg:2,leak:2,learn:[1,2],learning_r:2,least:2,leav:2,length:2,less:2,level:2,librari:0,like:2,linear:2,linf:2,link:2,list:[0,2,5],local:[0,2],log:0,logit:[2,5],look:1,loop:2,loss:[2,5],loss_fn:2,lower:2,made:2,madri:2,madryet:2,mai:[2,5],make:[0,2,5],make_input_placehold:[2,5],make_label_placehold:[2,5],make_param:[2,5],makefil:0,manag:[2,5],mani:2,map:[2,5],mask:[2,5],master:[0,1],max_it:2,max_iter:2,max_num_ev:2,max_val:2,maxconfid:2,maximum:2,mean:[2,5],measur:2,memori:2,metaclass:2,method:[2,5],mimic:2,minim:2,minimum:2,misclassif:2,mix:2,miyato:2,model:[1,2],moder:2,modifi:2,modul:[0,1],momentum:2,momentumiterativemethod:2,more:[1,2],most:2,move:[0,2],mro:2,much:2,multipl:[2,5],must:2,n_angl:2,n_dx:2,n_dy:2,n_sampl:2,name:[0,2,5],namespac:2,nb_candid:2,nb_class:[2,5],nb_iter:2,need:[2,5],needs_dummy_fprop:[2,5],neg:2,negat:2,neither:2,net:2,network:[2,5],neural:[2,5],nip:2,nois:2,nojekyl:0,non:2,none:[2,5],nor:2,norm:2,normal:2,nosuchlayererror:5,note:[0,2,5],num_iter:2,num_step:2,number:2,numer:2,numpi:2,o_featur:[2,5],o_logit:[2,5],o_prob:[2,5],object:[2,5],off:2,often:2,one:2,onli:2,openreview:2,oper:2,optim:2,optimal_perturb:2,optimize_linear:2,option:[0,2,5],ord:2,order:2,org:[0,2],orient:2,origin:2,other:2,otherwis:[0,2],our:[0,2],out:2,outperform:2,output:[0,2,5],output_lay:[2,5],over:2,overriden:2,overshoot:2,own:2,packag:[2,5],page:[0,1],paper:2,papernot:2,param:[2,5],paramet:[2,5],pars:2,parse_param:2,part:[2,5],particularli:2,pass:[2,5],pdf:2,percent:2,percentag:2,percentil:2,perform:2,perturb:2,pick:2,pip:0,pixel:2,place:[2,5],placehold:[2,5],pleas:0,point:2,posit:2,possibl:2,pre:[2,5],predict:[2,5],prepar:0,prevent:2,preview:0,previou:2,print:2,prob:[2,5],probabl:[2,5],procedur:2,process:2,produc:[2,5],progress:2,project:2,project_perturb:2,projected_gradient_desc:2,projected_optim:2,projectedgradientdesc:2,propag:[2,5],properti:2,propos:2,provid:[2,5],publish:0,purturb:2,put:[2,5],py_func:2,queri:2,radiu:2,rais:[0,5],rand_init:2,rand_init_ep:2,rand_minmax:2,random:2,rang:2,rate:2,rather:2,ratio:2,reach:2,read:[1,2],readm:1,realiz:[2,5],reason:2,recip:2,recommend:[1,2],reduce_max:2,reduce_mean:2,reduce_sum:2,refer:[2,5],region:2,regist:2,reject:2,rel:2,relat:5,remov:[2,5],repo:0,repositori:0,repres:[2,5],represent:[2,5],request:5,requir:2,reshap:[2,5],resolut:2,respect:[2,5],result:[2,5],retain:2,robust:2,root:0,rotat:2,run:[0,2],runtim:2,sabour:2,salienc:2,saliencymapmethod:2,same:[2,5],sampl:2,saniti:2,sanity_check:2,save:2,scalar:2,scale:2,scope:[2,5],scroll:0,search:[1,2],section:0,see:[0,2,5],seed:2,select:2,self:[2,5],semant:2,sentinel:2,separ:0,serv:0,sess:2,session:2,set:[0,2,5],sever:[2,5],shape:2,should:[2,5],show:2,side:2,sign:2,signatur:2,silent:[2,5],similar:2,simpl:2,simplifi:[2,5],simultan:2,singl:[2,5],site:0,size:2,slower:2,smaller:2,smooth:2,softmax:[2,5],softmax_cross_entropy_with_logit:2,softmax_cross_entropy_with_logits_v2:2,solv:2,some:2,soon:2,sourc:[0,2,5],space:2,spars:2,sparsel1desc:2,sparsiti:2,spatial:2,spatialtransformationmethod:2,special:2,specif:[0,2,5],specifi:2,speed:2,sphinx:0,spsa:[0,2],spsa_it:2,spsa_sampl:2,sqrt:2,start:[1,2],steepest:2,step:2,stepsiz:2,stepsize_search:2,still:[0,2,5],stop:2,store:2,str:[2,5],strang:2,stronger:2,strongli:2,structur:2,stuck:2,sub:2,subclass:2,success:2,suppli:[2,5],sure:0,symbol:[2,5],symbolic_impl:2,tab:0,take:2,target:2,target_i:2,tensor:[2,5],tensoradam:2,tensorflow:2,tensorflow_addon:0,tensoroptim:2,term:2,termin:2,test:2,tfa:0,than:2,thei:[2,5],them:[0,2,5],therefor:2,theta:2,thi:[0,1,2,5],those:2,three:2,threshold:2,through:2,thu:[0,2],time:[2,5],too:2,total:2,trade:2,tradeoff:2,train:2,tramer:2,transfer:2,transform:2,translat:2,treat:[2,5],tri:2,tricki:2,true_i:2,tune:2,turn:[2,5],type:2,typic:2,uesato:2,unabl:2,uncom:0,under:[0,2,5],underli:2,uniformli:2,uniqu:2,unit:2,univers:2,unless:2,unnorm:2,unrel:2,untarget:2,until:2,updat:2,usag:2,use:[2,5],used:2,useful:2,user:[0,2,5],uses:2,using:[0,2],valid:[2,5],valu:[2,5],valueerror:5,vanish:2,variabl:[2,5],variant:2,variat:2,vastli:2,vatm:2,vector:2,verbos:2,version:2,via:2,virtual:[0,2],virtualadversarialmethod:2,virutalen:0,wagner:2,wai:[2,5],wainwright:2,want:0,warn:[0,2,5],weak:2,websit:0,were:2,when:[0,2,5],where:[0,2],whether:[0,2,5],which:2,while_loop:2,white:2,without:2,won:2,work:2,wors:[2,5],would:[2,5],wrap:[2,5],wrapper:[2,5],wrapper_warn:[2,5],wrapper_warning_logit:[2,5],write:2,x_t:2,x_val:2,xrang:2,y_target:2,yield:2,you:[0,1,2],your:[0,2]},titles:["<no title>","CleverHans Documentation","attacks module","devtools module","future module","model module"],titleterms:{attack:2,cleverhan:1,devtool:3,document:1,futur:4,indic:1,model:5,modul:[2,3,4,5],tabl:1}}) ================================================ FILE: cleverhans_v3.1.0/docs/source/attacks.html ================================================ attacks module — CleverHans documentation

attacks module

The Attack class, providing a universal abstract interface describing attacks, and many implementations of it.

class cleverhans.attacks.ABCMeta(name, bases, namespace, **kwargs)[source]

Bases: type

Metaclass for defining Abstract Base Classes (ABCs).

Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in class. You can also register unrelated concrete classes (even built-in classes) and unrelated ABCs as ‘virtual subclasses’ – these and their descendants will be considered subclasses of the registering ABC by the built-in issubclass() function, but the registering ABC won’t show up in their MRO (Method Resolution Order) nor will method implementations defined by the registering ABC be callable (not even via super()).

register(subclass)[source]

Register a virtual subclass of an ABC.

Returns the subclass, to allow usage as a class decorator.

class cleverhans.attacks.Attack(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: object

Abstract base class for all attack classes.

construct_graph(fixed, feedable, x_val, hash_key)[source]

Construct the graph required to run the attack through generate_np.

Parameters
  • fixed – Structural elements that require defining a new graph.

  • feedable – Arguments that can be fed to the same graph when they take different values.

  • x_val – symbolic adversarial example

  • hash_key – the key used to store this graph in our cache

construct_variables(kwargs)[source]

Construct the inputs to the attack graph to be used by generate_np.

Parameters

kwargs – Keyword arguments to generate_np.

Returns

Structural arguments Feedable arguments Output of arg_type describing feedable arguments A unique key

generate(x, **kwargs)[source]

Generate the attack’s symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator.

Parameters
  • x – The model’s symbolic inputs.

  • **kwargs

    optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names:

    clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified.

    If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input.

    For other concepts, it’s generally a good idea to read other classes and check for name consistency.

Returns

A symbolic representation of the adversarial examples.

generate_np(x_val, **kwargs)[source]

Generate adversarial examples and return them as a NumPy array. Sub-classes should not implement this method unless they must perform special handling of arguments.

Parameters
  • x_val – A NumPy array with the original inputs.

  • **kwargs

    optional parameters used by child classes.

Returns

A NumPy array holding the adversarial examples.

get_or_guess_labels(x, kwargs)[source]

Get the label to use in generating an adversarial example for x. The kwargs are fed directly from the kwargs of the attack. If ‘y’ is in kwargs, then assume it’s an untargeted attack and use that as the label. If ‘y_target’ is in kwargs and is not none, then assume it’s a targeted attack and use that as the label. Otherwise, use the model’s prediction as the label and perform an untargeted attack.

parse_params(params=None)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Parameters

params – a dictionary of attack-specific parameters

Returns

True when parsing was successful

class cleverhans.attacks.BasicIterativeMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent

The BasicIterativeMethod attack.

cleverhans.attacks.BoundaryAttackPlusPlus(model, sess, dtypestr='float32', **kwargs)[source]

A previous name used for HopSkipJumpAttack.

class cleverhans.attacks.CallableModelWrapper(callable_fn, output_layer)[source]

Bases: cleverhans.model.Model

A wrapper that turns a callable into a valid Model

fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

class cleverhans.attacks.CarliniWagnerL2(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644

At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others.

Parameters
  • model – cleverhans.model.Model

  • sess – tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors.

Parameters
  • x – A tensor with the inputs.

  • kwargs – See parse_params

parse_params(y=None, y_target=None, batch_size=1, confidence=0, learning_rate=0.005, binary_search_steps=5, max_iterations=1000, abort_early=True, initial_const=0.01, clip_min=0, clip_max=1)[source]
Parameters
  • y – (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns.

  • y_target – (optional) A tensor with the target labels for a targeted attack.

  • confidence – Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial.

  • batch_size – Number of attacks to run simultaneously.

  • learning_rate – The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge.

  • binary_search_steps – The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification.

  • max_iterations – The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results.

  • abort_early – If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum).

  • initial_const – The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.DeepFool(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

DeepFool is an untargeted & iterative attack which is based on an iterative linearization of the classifier. The implementation here is w.r.t. the L2 norm. Paper link: “https://arxiv.org/pdf/1511.04599.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(nb_candidate=10, overshoot=0.02, max_iter=50, clip_min=0.0, clip_max=1.0, **kwargs)[source]
Parameters
  • nb_candidate – The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation.

  • overshoot – A termination criterion to prevent vanishing updates

  • max_iter – Maximum number of iteration for deepfool

  • clip_min – Minimum component value for clipping

  • clip_max – Maximum component value for clipping

class cleverhans.attacks.ElasticNetMethod(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack features L1-oriented adversarial examples and includes the C&W L2 attack as a special case (when beta is set to 0). Adversarial examples attain similar performance to those generated by the C&W L2 attack in the white-box case, and more importantly, have improved transferability properties and complement adversarial training. Paper link: https://arxiv.org/abs/1709.04114

Parameters
  • model – cleverhans.model.Model

  • sess – tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors.

Parameters
  • x – (required) A tensor with the inputs.

  • kwargs – See parse_params

parse_params(y=None, y_target=None, beta=0.01, decision_rule='EN', batch_size=1, confidence=0, learning_rate=0.01, binary_search_steps=9, max_iterations=1000, abort_early=False, initial_const=0.001, clip_min=0, clip_max=1)[source]
Parameters
  • y – (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns.

  • y_target – (optional) A tensor with the target labels for a targeted attack.

  • beta – Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion

  • decision_rule – EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion.

  • confidence – Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial.

  • batch_size – Number of attacks to run simultaneously.

  • learning_rate – The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge.

  • binary_search_steps – The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set ‘initial_const’ to a large value and fix this param to 1 for speed.

  • max_iterations – The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results.

  • abort_early – If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet)

  • initial_const – The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.FastFeatureAdversaries(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This is a fast implementation of “Feature Adversaries”, an attack against a target internal representation of a model. “Feature adversaries” were originally introduced in (Sabour et al. 2016), where the optimization was done using LBFGS. Paper link: https://arxiv.org/abs/1511.05122

This implementation is similar to “Basic Iterative Method” (Kurakin et al. 2016) but applied to the internal representations.

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

attack_single_step(x, eta, g_feat)[source]

TensorFlow implementation of the Fast Feature Gradient. This is a single step attack similar to Fast Gradient Method that attacks an internal representation.

Parameters
  • x – the input placeholder

  • eta – A tensor the same shape as x that holds the perturbation.

  • g_feat – model’s internal tensor for guide

Returns

a tensor for the adversarial example

generate(x, g, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • g – The target value of the symbolic representation

  • kwargs – See parse_params

parse_params(layer=None, eps=0.3, eps_iter=0.05, nb_iter=10, ord=inf, clip_min=None, clip_max=None, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • layer – (required str) name of the layer to target.

  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.FastGradientMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack was originally implemented by Goodfellow et al. (2014) with the infinity norm (and is known as the “Fast Gradient Sign Method”). This implementation extends the attack to other norms, and is therefore called the Fast Gradient Method. Paper link: https://arxiv.org/abs/1412.6572

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Returns the graph for Fast Gradient Method adversarial examples.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=0.3, ord=inf, loss_fn=<function softmax_cross_entropy_with_logits>, y=None, y_target=None, clip_min=None, clip_max=None, clip_grad=False, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) attack step size (input variation)

  • ord – (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.

  • loss_fn – Loss function that takes (labels, logits) as arguments and returns loss

  • y – (optional) A tensor with the true labels. Only provide this parameter if you’d like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the “label leaking” effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

  • sanity_checks – bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input)

class cleverhans.attacks.HopSkipJumpAttack(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright. It is a decision-based attack that requires access to output labels of a model alone. Paper link: https://arxiv.org/abs/1904.02144 At a high level, this attack is an iterative attack composed of three steps: Binary search to approach the boundary; gradient estimation; stepsize search. HopSkipJumpAttack requires fewer model queries than Boundary Attack which was based on rejective sampling. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor. see parse_params for details.

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See parse_params

generate_np(x, **kwargs)[source]

Generate adversarial images in a for loop. :param y: An array of shape (n, nb_classes) for true labels. :param y_target: An array of shape (n, nb_classes) for target labels. Required for targeted attack. :param image_target: An array of shape (n, **image shape) for initial target images. Required for targeted attack.

See parse_params for other kwargs.

parse_params(y_target=None, image_target=None, initial_num_evals=100, max_num_evals=10000, stepsize_search='geometric_progression', num_iterations=64, gamma=1.0, constraint='l2', batch_size=128, verbose=True, clip_min=0, clip_max=1)[source]
Parameters
  • y – A tensor of shape (1, nb_classes) for true labels.

  • y_target – A tensor of shape (1, nb_classes) for target labels.

Required for targeted attack. :param image_target: A tensor of shape (1, **image shape) for initial target images. Required for targeted attack. :param initial_num_evals: initial number of evaluations for

gradient estimation.

Parameters
  • max_num_evals – maximum number of evaluations for gradient estimation.

  • stepsize_search

    How to search for stepsize; choices are ‘geometric_progression’, ‘grid_search’. ‘geometric progression’ initializes the stepsize

    by ||x_t - x||_p / sqrt(iteration), and keep decreasing by half until reaching the target side of the boundary. ‘grid_search’ chooses the optimal epsilon over a grid, in the scale of ||x_t - x||_p.

  • num_iterations – The number of iterations.

  • gamma – The binary search threshold theta is gamma / d^{3/2} for l2 attack and gamma / d^2 for linf attack.

  • constraint – The distance to optimize; choices are ‘l2’, ‘linf’.

  • batch_size – batch_size for model prediction.

  • verbose – (boolean) Whether distance at each step is printed.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.LBFGS(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

LBFGS is the first adversarial attack for convolutional neural networks, and is a target & iterative attack. Paper link: “https://arxiv.org/pdf/1312.6199.pdf” :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See parse_params

parse_params(y_target=None, batch_size=1, binary_search_steps=5, max_iterations=1000, initial_const=0.01, clip_min=0, clip_max=1)[source]
Parameters
  • y_target – (optional) A tensor with the one-hot target labels.

  • batch_size – The number of inputs to include in a batch and process simultaneously.

  • binary_search_steps – The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification.

  • max_iterations – The maximum number of iterations.

  • initial_const – The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and cross-entropy loss of the classification.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.MadryEtAl(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent

The attack from Madry et al 2017

class cleverhans.attacks.MaxConfidence(model, sess=None, base_attacker=None)[source]

Bases: cleverhans.attacks.attack.Attack

The MaxConfidence attack.

An attack designed for use against models that use confidence thresholding as a defense. If the underlying optimizer is optimal, this attack procedure gives the optimal failure rate for every confidence threshold t > 0.5.

Publication: https://openreview.net/forum?id=H1g0piA9tQ

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.session.Session

  • base_attacker – cleverhans.attacks.Attack

attack(x, true_y)[source]

Runs the untargeted attack. :param x: The input :param true_y: The correct label for x. This attack aims to produce misclassification.

attack_class(x, target_y)[source]

Run the attack on a specific target class. :param x: tf Tensor. The input example. :param target_y: tf Tensor. The attacker’s desired target class. Returns:

A targeted adversarial example, intended to be classified as the target class.

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – Keyword arguments for the base attacker

parse_params(y=None, nb_classes=10, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Parameters

params – a dictionary of attack-specific parameters

Returns

True when parsing was successful

class cleverhans.attacks.Model(scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False)[source]

Bases: object

An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them.

O_FEATURES = 'features'
O_LOGITS = 'logits'
O_PROBS = 'probs'
fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

get_layer(x, layer, **kwargs)[source]

Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer layer

get_layer_names()[source]

Return the list of exposed layers for this model.

get_logits(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output logits

(i.e., the values fed as inputs to the softmax layer).

get_params()[source]

Provides access to the model’s parameters. :return: A list of all Variables defining the model parameters.

get_predicted_class(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the predicted label

get_probs(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output

probabilities (i.e., the output values produced by the softmax layer).

make_input_placeholder()[source]

Create and return a placeholder representing an input to the model.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_label_placeholder()[source]

Create and return a placeholder representing class labels.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_params()[source]

Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set needs_dummy_fprop=True in the constructor.

class cleverhans.attacks.MomentumIterativeMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

The Momentum Iterative Method (Dong et al. 2017). This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks and Targeted Adversarial Attacks. The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1710.06081.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – Keyword arguments. See parse_params for documentation.

parse_params(eps=0.3, eps_iter=0.06, nb_iter=10, y=None, ord=inf, decay_factor=1.0, clip_min=None, clip_max=None, y_target=None, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • y – (optional) A tensor with the true labels.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2.

  • decay_factor – (optional) Decay factor for the momentum term.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.Noise(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

A weak attack that just picks a random point in the attacker’s action space. When combined with an attack bundling function, this can be used to implement random search.

References: https://arxiv.org/abs/1802.00420 recommends random search to help identify

gradient masking.

https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part

of an attack bundling recipe combining many different optimizers to yield a stronger optimizer.

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=0.3, ord=inf, clip_min=None, clip_max=None, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.ProjectedGradientDescent(model, sess=None, dtypestr='float32', default_rand_init=True, **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • default_rand_init – whether to use random initialization by default

  • kwargs – passed through to super constructor

FGM_CLASS

alias of cleverhans.attacks.fast_gradient_method.FastGradientMethod

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=0.3, eps_iter=0.05, nb_iter=10, y=None, ord=inf, loss_fn=<function softmax_cross_entropy_with_logits>, clip_min=None, clip_max=None, y_target=None, rand_init=None, rand_init_eps=None, clip_grad=False, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • y – (optional) A tensor with the true labels.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2.

  • loss_fn – Loss function that takes (labels, logits) as arguments and returns loss

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • rand_init – (optional) Start the gradient descent from a point chosen uniformly at random in the norm ball of radius rand_init_eps

  • rand_init_eps – (optional float) size of the norm ball from which the initial starting point is chosen. Defaults to eps

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

  • sanity_checks

    bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the

    tests intentionally configure the attack strangely)

class cleverhans.attacks.SPSA(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions.

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

DEFAULT_DELTA = 0.01
DEFAULT_LEARNING_RATE = 0.01
DEFAULT_SPSA_ITERS = 1
DEFAULT_SPSA_SAMPLES = 128
generate(x, y=None, y_target=None, eps=None, clip_min=None, clip_max=None, nb_iter=None, is_targeted=None, early_stop_loss_threshold=None, learning_rate=0.01, delta=0.01, spsa_samples=128, batch_size=None, spsa_iters=1, is_debug=False, epsilon=None, num_steps=None)[source]

Generate symbolic graph for adversarial examples.

Parameters
  • x – The model’s symbolic inputs. Must be a batch of size 1.

  • y – A Tensor or None. The index of the correct label.

  • y_target – A Tensor or None. The index of the target label in a targeted attack.

  • eps – The size of the maximum perturbation, measured in the L-infinity norm.

  • clip_min – If specified, the minimum input value

  • clip_max – If specified, the maximum input value

  • nb_iter – The number of optimization steps.

  • early_stop_loss_threshold – A float or None. If specified, the attack will end as soon as the loss is below early_stop_loss_threshold.

  • learning_rate – Learning rate of ADAM optimizer.

  • delta – Perturbation size used for SPSA approximation.

  • spsa_samples – Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is spsa_samples * spsa_iters

  • batch_size – Deprecated param that is an alias for spsa_samples

  • spsa_iters – Number of model evaluations before performing an update, where each evaluation is on spsa_samples different inputs.

  • is_debug – If True, print the adversarial loss after each update.

  • epsilon – Deprecated alias for eps

  • num_steps – Deprecated alias for nb_iter.

  • is_targeted – Deprecated argument. Ignored.

generate_np(x_val, **kwargs)[source]

Generate adversarial examples and return them as a NumPy array. Sub-classes should not implement this method unless they must perform special handling of arguments.

Parameters
  • x_val – A NumPy array with the original inputs.

  • **kwargs

    optional parameters used by child classes.

Returns

A NumPy array holding the adversarial examples.

class cleverhans.attacks.SaliencyMapMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

The Jacobian-based Saliency Map Method (Papernot et al. 2016). Paper link: https://arxiv.org/pdf/1511.07528.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

Note

When not using symbolic implementation in generate, sess should be provided

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(theta=1.0, gamma=1.0, clip_min=0.0, clip_max=1.0, y_target=None, symbolic_impl=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • theta – (optional float) Perturbation introduced to modified components (can be positive or negative)

  • gamma – (optional float) Maximum percentage of perturbed features

  • clip_min – (optional float) Minimum component value for clipping

  • clip_max – (optional float) Maximum component value for clipping

  • y_target – (optional) Target tensor if the attack is targeted

class cleverhans.attacks.Semantic(model, center, max_val=1.0, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

Semantic adversarial examples

https://arxiv.org/abs/1703.06857

Note: data must either be centered (so that the negative image can be made by simple negation) or must be in the interval [-1, 1]

Parameters
  • model – cleverhans.model.Model

  • center – bool If True, assumes data has 0 mean so the negative image is just negation. If False, assumes data is in the interval [0, max_val]

  • max_val – float Maximum value allowed in the input data

  • sess – optional tf.Session

  • dtypestr – dtype of data

  • kwargs – passed through to the super constructor

generate(x, **kwargs)[source]

Generate the attack’s symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator.

Parameters
  • x – The model’s symbolic inputs.

  • **kwargs

    optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names:

    clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified.

    If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input.

    For other concepts, it’s generally a good idea to read other classes and check for name consistency.

Returns

A symbolic representation of the adversarial examples.

class cleverhans.attacks.SparseL1Descent(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This class implements a variant of Projected Gradient Descent for the l1-norm (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2 cases covered by the ProjectedGradientDescent class, because the steepest descent direction for the l1-norm is too sparse (it updates a single coordinate in the adversarial perturbation in each step). This attack has an additional parameter that controls the sparsity of the update step. For moderately sparse update steps, the attack vastly outperforms Projected Steepest Descent and is competitive with other attacks targeted at the l1-norm such as the ElasticNetMethod attack (which is much more computationally expensive). Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=10.0, eps_iter=1.0, nb_iter=20, y=None, clip_min=None, clip_max=None, y_target=None, rand_init=False, clip_grad=False, grad_sparsity=99, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • y – (optional) A tensor with the true labels.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

:param grad_sparsity (optional) Relative sparsity of the gradient update

step, in percent. Only gradient values larger than this percentile are retained. This parameter can be a scalar, or a vector of the same length as the input batch dimension.

Parameters

sanity_checks

bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the

tests intentionally configure the attack strangely)

class cleverhans.attacks.SpatialTransformationMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

Spatial transformation attack

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return. :param x: The model’s symbolic inputs. :param kwargs: See parse_params

parse_params(n_samples=None, dx_min=- 0.1, dx_max=0.1, n_dxs=2, dy_min=- 0.1, dy_max=0.1, n_dys=2, angle_min=- 30, angle_max=30, n_angles=6, black_border_size=0, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param n_samples: (optional) The number of transformations sampled to

construct the attack. Set it to None to run full grid attack.

Parameters
  • dx_min – (optional float) Minimum translation ratio along x-axis.

  • dx_max – (optional float) Maximum translation ratio along x-axis.

  • n_dxs – (optional int) Number of discretized translation ratios along x-axis.

  • dy_min – (optional float) Minimum translation ratio along y-axis.

  • dy_max – (optional float) Maximum translation ratio along y-axis.

  • n_dys – (optional int) Number of discretized translation ratios along y-axis.

  • angle_min – (optional float) Largest counter-clockwise rotation angle.

  • angle_max – (optional float) Largest clockwise rotation angle.

  • n_angles – (optional int) Number of discretized angles.

  • black_border_size – (optional int) size of the black border in pixels.

class cleverhans.attacks.VirtualAdversarialMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack was originally proposed by Miyato et al. (2016) and was used for virtual adversarial training. Paper link: https://arxiv.org/abs/1507.00677

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=2.0, nb_iter=None, xi=1e-06, clip_min=None, clip_max=None, num_iterations=None, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float )the epsilon (input variation parameter)

  • nb_iter – (optional) the number of iterations Defaults to 1 if not specified

  • xi – (optional float) the finite difference parameter

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • num_iterations – Deprecated alias for nb_iter

cleverhans.attacks.clip_eta(eta, ord, eps)[source]

Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param ord: Order of the norm (mimics Numpy).

Possible values: np.inf, 1 or 2.

Parameters

eps – Epsilon, bound of the perturbation.

cleverhans.attacks.fgm(x, logits, y=None, eps=0.3, ord=inf, loss_fn=<function softmax_cross_entropy_with_logits>, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True)[source]

TensorFlow implementation of the Fast Gradient Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted

is true, then provide the target label. Otherwise, only provide this parameter if you’d like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the “label leaking” effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded.

Parameters
  • eps – the epsilon (input variation parameter)

  • ord – (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.

  • loss_fn – Loss function that takes (labels, logits) as arguments and returns loss

  • clip_min – Minimum float value for adversarial example components

  • clip_max – Maximum float value for adversarial example components

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

  • targeted – Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y.

Returns

a tensor for the adversarial example

cleverhans.attacks.optimize_linear(grad, eps, ord=inf)[source]

Solves for the optimal input to a linear function under a norm constraint.

Optimal_perturbation = argmax_{eta, ||eta||_{ord} < eps} dot(eta, grad)

Parameters
  • grad – tf tensor containing a batch of gradients

  • eps – float scalar specifying size of constraint region

  • ord – int specifying order of norm

Returns

tf tensor containing optimal perturbation

cleverhans.attacks.projected_optimization(loss_fn, input_image, label, epsilon, num_steps, clip_min=None, clip_max=None, optimizer=<cleverhans.attacks.spsa.TensorAdam object>, project_perturbation=<function _project_perturbation>, early_stop_loss_threshold=None, is_debug=False)[source]

Generic projected optimization, generalized to work with approximate gradients. Used for e.g. the SPSA attack.

Args:
param loss_fn

A callable which takes input_image and label as arguments, and returns a batch of loss values. Same interface as TensorOptimizer.

param input_image

Tensor, a batch of images

param label

Tensor, a batch of labels

param epsilon

float, the L-infinity norm of the maximum allowable perturbation

param num_steps

int, the number of steps of gradient descent

param clip_min

float, minimum pixel value

param clip_max

float, maximum pixel value

param optimizer

A TensorOptimizer object

param project_perturbation

A function, which will be used to enforce some constraint. It should have the same signature as _project_perturbation.

param early_stop_loss_threshold

A float or None. If specified, the attack will end if the loss is below early_stop_loss_threshold.

Enabling this option can have several different effects:
  • Setting the threshold to 0. guarantees that if a successful attack is found, it is returned. This increases the attack success rate, because without early stopping the optimizer can accidentally bounce back to a point where the attack fails.

  • Early stopping can make the attack run faster because it may run for fewer steps.

  • Early stopping can make the attack run slower because the loss must be calculated at each step. The loss is not calculated as part of the normal SPSA optimization procedure. For most reasonable choices of hyperparameters, early stopping makes the attack much faster because it decreases the number of steps dramatically.

param is_debug

A bool. If True, print debug info for attack progress.

Returns:
adversarial version of input_image, with L-infinity difference less than

epsilon, which tries to minimize loss_fn.

Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper function which you can use to write your own attack methods. The method uses a tf.while_loop to optimize a loss function in a single sess.run() call.

cleverhans.attacks.reduce_max(*args, **kwargs)

Issues a deprecation warning and passes through the arguments.

cleverhans.attacks.reduce_mean(*args, **kwargs)

Issues a deprecation warning and passes through the arguments.

cleverhans.attacks.reduce_sum(*args, **kwargs)

Issues a deprecation warning and passes through the arguments.

cleverhans.attacks.softmax_cross_entropy_with_logits(sentinel=None, labels=None, logits=None, dim=- 1)[source]

Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle deprecated warning

cleverhans.attacks.vatm(model, x, logits, eps, num_iterations=1, xi=1e-06, clip_min=None, clip_max=None, scope=None)[source]

Tensorflow implementation of the perturbation method used for virtual adversarial training: https://arxiv.org/abs/1507.00677 :param model: the model which returns the network unnormalized logits :param x: the input placeholder :param logits: the model’s unnormalized output tensor (the input to

the softmax layer)

Parameters
  • eps – the epsilon (input variation parameter)

  • num_iterations – the number of iterations

  • xi – the finite difference parameter

  • clip_min – optional parameter that can be used to set a minimum value for components of the example returned

  • clip_max – optional parameter that can be used to set a maximum value for components of the example returned

  • seed – the seed for random generator

Returns

a tensor for the adversarial example

cleverhans.attacks.wrapper_warning()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”probs”. Using “probs” as any part of the attack interface is dangerous. We can’t just change output_layer to logits because: - that would be a silent interface change. We’d have no way of detecting

code that still means to use probs. Note that we can’t just check whether the final output op is a softmax—for example, Inception puts a reshape after the softmax.

  • automatically wrapping user-supplied callables with output_layer=’logits’ is even worse, see wrapper_warning_logits

Note: this function will be removed at the same time as the code that calls it.

cleverhans.attacks.wrapper_warning_logits()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”logits”. This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking.

cleverhans.attacks.xrange

alias of range

================================================ FILE: cleverhans_v3.1.0/docs/source/devtools.html ================================================ devtools module — CleverHans documentation

devtools module

================================================ FILE: cleverhans_v3.1.0/docs/source/future.html ================================================ future module — CleverHans documentation

future module

================================================ FILE: cleverhans_v3.1.0/docs/source/model.html ================================================ model module — CleverHans documentation

model module

The Model class and related functionality.

class cleverhans.model.CallableModelWrapper(callable_fn, output_layer)[source]

Bases: cleverhans.model.Model

A wrapper that turns a callable into a valid Model

fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

class cleverhans.model.Model(scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False)[source]

Bases: object

An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them.

O_FEATURES = 'features'
O_LOGITS = 'logits'
O_PROBS = 'probs'
fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

get_layer(x, layer, **kwargs)[source]

Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer layer

get_layer_names()[source]

Return the list of exposed layers for this model.

get_logits(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output logits

(i.e., the values fed as inputs to the softmax layer).

get_params()[source]

Provides access to the model’s parameters. :return: A list of all Variables defining the model parameters.

get_predicted_class(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the predicted label

get_probs(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output

probabilities (i.e., the output values produced by the softmax layer).

make_input_placeholder()[source]

Create and return a placeholder representing an input to the model.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_label_placeholder()[source]

Create and return a placeholder representing class labels.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_params()[source]

Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set needs_dummy_fprop=True in the constructor.

exception cleverhans.model.NoSuchLayerError[source]

Bases: ValueError

Raised when a layer that does not exist is requested.

cleverhans.model.wrapper_warning()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”probs”. Using “probs” as any part of the attack interface is dangerous. We can’t just change output_layer to logits because: - that would be a silent interface change. We’d have no way of detecting

code that still means to use probs. Note that we can’t just check whether the final output op is a softmax—for example, Inception puts a reshape after the softmax.

  • automatically wrapping user-supplied callables with output_layer=’logits’ is even worse, see wrapper_warning_logits

Note: this function will be removed at the same time as the code that calls it.

cleverhans.model.wrapper_warning_logits()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”logits”. This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking.

================================================ FILE: cleverhans_v3.1.0/docsource/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = python -msphinx SPHINXPROJ = CleverHans SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) full-api: sphinx-apidoc --suffix .md -o source .. .PHONY: help Makefile # To keep the source and output separate, but still be able to both publish # on GitHub Pages and preview builds locally. github: @make html @cp -a _build/html/. ../docs # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: cleverhans_v3.1.0/docsource/README.md ================================================ # Generate documentation To generate the documentation do: `make github` The documentation files will be copied to the `cleverhans/docs` directory. ### Preparation Please do: `pip install sphinx` Add a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees a `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file indicates that we are not using Jekyll as our static site generator in this repository. ### Enable GitHub Pages for the GitHub repository 1. Go to the repository on the GitHub website and make sure you are logged in. 2. Add a /docs directory to the master branch. Otherwise you do not get the master branch /docs folder for the Source option in the drop-down list. 3. Click the Settings tab. You first go to the Options section. 4. Scroll down to the GitHub Pages section and choose the drop-down list under Source. Note: Your choices will differ based on whether you’re in a User repo or an Org repository. 5. To keep source and output HTML separate, choose master branch /docs folder for Source. ### Build Sphinx locally and publish on GitHub Pages We keep the source docsource and output docs separate, but still are able to publish on GitHub Pages and preview builds locally. We have the following option in the Makefile: ``` github: @make html @cp -a _build/html/. ../docs ``` Thus, we can run `make github` from the `docsource` directory to generate a local preview and move the docs where GitHub wants to serve them from. ### Hacks If you cannot build the docs for attacks, uncomment `import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`. Otherwise: ```angular2html WARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised: cannot import name 'keras_tensor' ``` It is convenient to create a virtual environment to install all the specific libraries (e.g. virutalen cleverhans). ================================================ FILE: cleverhans_v3.1.0/docsource/_templates/layout.html ================================================ {% extends '!layout.html' %} {% block footer %} {% endblock %} ================================================ FILE: cleverhans_v3.1.0/docsource/conf.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # # CleverHans documentation build configuration file, created by # sphinx-quickstart on Wed Sep 20 15:14:07 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, as shown here. # import os import sys sys.path.insert(0, os.path.abspath("..")) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.mathjax", "sphinx.ext.viewcode", "sphinx.ext.githubpages", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = ".md" # The master toctree document. master_doc = "index" # General information about the project. project = "CleverHans" author = "Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. # version = '2.0.0' # The full version, including alpha/beta/rc tags. # release = '2.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Custom sidebar templates must be a dictionary that maps document names # to template names. # # This is required for the alabaster theme # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars html_sidebars = { "**": [ "about.html", "navigation.html", "relations.html", # needs 'show_related': True theme option to display "searchbox.html", "donate.html", ] } # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = "CleverHansdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ( master_doc, "CleverHans.tex", "CleverHans Documentation", "Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley", "manual", ), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "cleverhans", "CleverHans Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "CleverHans", "CleverHans Documentation", author, "CleverHans", "One line description of project.", "Miscellaneous", ), ] ================================================ FILE: cleverhans_v3.1.0/docsource/docs_requirements.txt ================================================ tensorflow ================================================ FILE: cleverhans_v3.1.0/docsource/index.md ================================================ .. CleverHans documentation master file, created by sphinx-quickstart on Wed Sep 20 15:14:07 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. WARNING: This file has a markdown suffix, but is in fact .rst CleverHans Documentation ====================================== This documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans `_. To get started, we recommend reading the `github readme `_. Afterwards, you can learn more by looking at the following modules: .. toctree:: :maxdepth: 4 source/attacks source/model Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ================================================ FILE: cleverhans_v3.1.0/docsource/source/attacks.md ================================================ `attacks` module -------------------------- .. automodule:: cleverhans.attacks :members: :imported-members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docsource/source/devtools.md ================================================ `devtools` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docsource/source/future.md ================================================ `future` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/docsource/source/model.md ================================================ `model` module ------------------------ .. automodule:: cleverhans.model :members: :undoc-members: :show-inheritance: ================================================ FILE: cleverhans_v3.1.0/examples/README.md ================================================ # Examples * **CIFAR10 with FGSM using the TensorFlow backend** ([code](ex_cifar10_tf.py)): this tutorial covers how to train a CIFAR10 model using TensorFlow, craft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572), and make the model more robust to adversarial examples using adversarial training. * **Adversarial faces using FGSM against Facenet library** ([code](facenet_adversarial_faces)): this example covers how to create adversarial faces using the [fast gradient sign method](https://arxiv.org/abs/1412.6572) over the Facenet library. # Additional dependencies Besides the standard CleverHans dependencies, these examples also require `wget`. ================================================ FILE: cleverhans_v3.1.0/examples/RL-attack/README.md ================================================ # Crafting Adversarial Example Attacks on Policy Learners Examples of test-time and training-time FGSM attacks on Deep Q-Networks (DQNs). These examples are based on RLAttack ( https://github.com/behzadanksu/rl-attack/ ), a framework that provides an interface between Cleverhans and [@openai/baselines](https://github.com/openai/baselines) for experimental analysis of adversarial example attacks on policy learning in Deep RL. Attack models and methodologies are detailed in our paper "Whatever Does Not Kill Deep Reinforcement Learning, Makes It Stronger" (Behzadan & Munir, 2017 - https://arxiv.org/abs/1712.09344 ). ### Dependencies - Python 3 - cleverhans v2.0.0 - RLAttack v1.0.0 ``` git clone https://github.com/behzadanksu/rl-attack.git cd rl-attack pip install -e . ``` ### Examples Two example scripts are included. - enjoy-adv.py : a sample implementation of test-time FGSM attack on pre-trained DQN Atari agents. - train.py: a sample implementation of training-time FGSM attack on DQN Atari agents. Some example executions on the Breakout game environment are: - Test-time, No attack, testing a DQN model of Breakout trained without parameter noise: ``` $> python3 enjoy-adv.py --env Breakout --model-dir ./data/Breakout/model-173000 --video ./Breakout.mp4 ``` - Test-time, No attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation): ``` $> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --video ./Breakout.mp4 ``` - Test-time, Whitebox FGSM attack, testing a DQN model of Breakout trained without parameter noise: ``` $> python3 enjoy-adv.py --env Breakout --model-dir ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4 ``` - Test-time, Whitebox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation): ``` $> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4 ``` - Test-time, Blackbox FGSM attack, testing a DQN model of Breakout trained without parameter noise: ``` $> python3 enjoy-adv.py --env Breakout --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox --model-dir2 ./data/Breakout/model-173000-2 --video ./Breakout.mp4 ``` - Test-time, Blackbox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation), replica model trained without parameter noise: ``` $> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox --model-dir2 ./data/Breakout/model-173000-2 --video ./Breakout.mp4 ``` - Test-time, Blackbox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation), replica model trained with parameter noise: ``` $> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox --model-dir2 ./data/Breakout/model-173000-2 --noisy2 --video ./Breakout.mp4 ``` - Training-time, Whitebox attack, no parameter noise, injecting adversarial example with 20% probability: ``` $> python3 train.py --env Breakout --save-dir ./data/Breakout/ --attack fgsm --num-steps 200000000 --attack-prob 0.2 ``` - Training-time, Whitebox attack, NoisyNet parameter noise, injecting adversarial example with 100% probability: ``` $> python3 train.py --env Breakout --noisy --save-dir ./data/Breakout/ --attack fgsm --num-steps 200000000 --attack-prob 1.0 ``` ================================================ FILE: cleverhans_v3.1.0/examples/RL-attack/enjoy-adv.py ================================================ """ DQN - Test-time attacks ============ Sample usage ============ No attack, testing a DQN model of Breakout trained without parameter noise: $> python3 enjoy-adv.py --env Breakout --model-dir \ ./data/Breakout/model-100 --video ./Breakout.mp4 No attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation): $> python3 enjoy-adv.py --env Breakout --noisy \ --model-dir ./data/Breakout/model-173000 --video ./Breakout.mp4 Whitebox FGSM attack, testing a DQN model of Breakout trained without parameter noise: $> python3 enjoy-adv.py --env Breakout --model-dir \ ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4 Whitebox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation): $> python3 enjoy-adv.py --env Breakout --noisy --model-dir \ ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4 Blackbox FGSM attack, testing a DQN model of Breakout trained without parameter noise: $> python3 enjoy-adv.py --env Breakout --model-dir \ ./data/Breakout/model-173000 --attack fgsm --blackbox \ --model-dir2 ./data/Breakout/model-173000-2 --video ./Breakout.mp4 Blackbox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation), replica model trained without parameter noise: $> python3 enjoy-adv.py --env Breakout --noisy \ --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox \ --model-dir2 ./data/Breakout/model2-173000-2 --video ./Breakout.mp4 Blackbox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation), replica model trained with parameter noise: $> python3 enjoy-adv.py --env Breakout --noisy --model-dir \ ./data/Breakout/model-173000 --attack fgsm --blackbox \ --model-dir2 ./data/Breakout/model2-173000 --noisy2 --video ./Breakout.mp4 """ import argparse import gym import os import numpy as np from gym.monitoring import VideoRecorder import rlattack.common.tf_util as U from rlattack import deepq from rlattack.common.misc_util import ( boolean_flag, SimpleMonitor, ) from rlattack.common.atari_wrappers_deprecated import wrap_dqn # V: imports# import tensorflow as tf import cv2 from collections import deque from model import model, dueling_model from statistics import statistics class DQNModel: """ Creating Q-graph, FGSM graph Supports loading multiple graphs - needed for blackbox attacks """ def __init__(self, env, dueling, noisy, fname): self.g = tf.Graph() self.noisy = noisy self.dueling = dueling self.env = env with self.g.as_default(): self.act = deepq.build_act_enjoy( make_obs_ph=lambda name: U.Uint8Input( env.observation_space.shape, name=name ), q_func=dueling_model if dueling else model, num_actions=env.action_space.n, noisy=noisy, ) self.saver = tf.train.Saver() self.sess = tf.Session(graph=self.g) if fname is not None: print("Loading Model...") self.saver.restore(self.sess, fname) def get_act(self): return self.act def get_session(self): return self.sess def craft_adv(self): with self.sess.as_default(): with self.g.as_default(): craft_adv_obs = deepq.build_adv( make_obs_tf=lambda name: U.Uint8Input( self.env.observation_space.shape, name=name ), q_func=dueling_model if self.dueling else model, num_actions=self.env.action_space.n, epsilon=1.0 / 255.0, noisy=self.noisy, ) return craft_adv_obs def parse_args(): parser = argparse.ArgumentParser("Run an already learned DQN model.") # Environment parser.add_argument("--env", type=str, required=True, help="name of the game") parser.add_argument( "--model-dir", type=str, default=None, help="load model from this directory. " ) parser.add_argument( "--video", type=str, default=None, help="Path to mp4 file where the \ video of first episode will be recorded.", ) boolean_flag( parser, "stochastic", default=True, help="whether or not to use stochastic \ actions according to models eps value", ) boolean_flag( parser, "dueling", default=False, help="whether or not to use dueling model" ) # V: Attack Arguments# parser.add_argument( "--model-dir2", type=str, default=None, help="load adversarial model from \ this directory (blackbox attacks). ", ) parser.add_argument( "--attack", type=str, default=None, help="Method to attack the model." ) boolean_flag(parser, "noisy", default=False, help="whether or not to NoisyNetwork") boolean_flag(parser, "noisy2", default=False, help="whether or not to NoisyNetwork") boolean_flag( parser, "blackbox", default=False, help="whether or not to NoisyNetwork" ) return parser.parse_args() def make_env(game_name): env = gym.make(game_name + "NoFrameskip-v4") env = SimpleMonitor(env) env = wrap_dqn(env) return env def play( env, act, craft_adv_obs, craft_adv_obs2, stochastic, video_path, attack, m_target, m_adv, ): num_episodes = 0 num_moves = 0 num_transfer = 0 video_recorder = None video_recorder = VideoRecorder(env, video_path, enabled=video_path is not None) obs = env.reset() while True: env.unwrapped.render() video_recorder.capture_frame() # V: Attack # if attack is not None: # Craft adv. examples with m_adv.get_session().as_default(): adv_obs = craft_adv_obs(np.array(obs)[None], stochastic_adv=stochastic)[ 0 ] with m_target.get_session().as_default(): action = act(np.array(adv_obs)[None], stochastic=stochastic)[0] action2 = act(np.array(obs)[None], stochastic=stochastic)[0] num_moves += 1 if action != action2: num_transfer += 1 else: # Normal action = act(np.array(obs)[None], stochastic=stochastic)[0] obs, rew, done, info = env.step(action) if done: obs = env.reset() if len(info["rewards"]) > num_episodes: if len(info["rewards"]) == 1 and video_recorder.enabled: # save video of first episode print("Saved video.") video_recorder.close() video_recorder.enabled = False print("Reward: " + str(info["rewards"][-1])) num_episodes = len(info["rewards"]) print("Episode: " + str(num_episodes)) success = float(num_transfer / num_moves) * 100.0 print("Percentage of successful attacks: " + str(success)) num_moves = 0 num_transfer = 0 if __name__ == "__main__": args = parse_args() env = make_env(args.env) g1 = tf.Graph() g2 = tf.Graph() with g1.as_default(): m1 = DQNModel( env, args.dueling, args.noisy, os.path.join(args.model_dir, "saved") ) if args.blackbox: with g2.as_default(): m2 = DQNModel( env, args.dueling, args.noisy2, os.path.join(args.model_dir2, "saved") ) with m2.get_session().as_default(): craft_adv_obs = m2.craft_adv() with m1.get_session().as_default(): craft_adv_obs2 = m1.craft_adv() play( env, m1.get_act(), craft_adv_obs, craft_adv_obs2, args.stochastic, args.video, args.attack, m1, m2, ) else: with m1.get_session().as_default(): craft_adv_obs = m1.craft_adv() play( env, m1.get_act(), craft_adv_obs, None, args.stochastic, args.video, args.attack, m1, m1, ) ================================================ FILE: cleverhans_v3.1.0/examples/RL-attack/model.py ================================================ import tensorflow as tf import tensorflow.contrib.layers as layers from rlattack.common.tf_util import noisy_dense def model(img_in, num_actions, scope, noisy=False, reuse=False, concat_softmax=False): with tf.variable_scope(scope, reuse=reuse): out = img_in with tf.variable_scope("convnet"): # original architecture out = layers.convolution2d( out, num_outputs=32, kernel_size=8, stride=4, activation_fn=tf.nn.relu ) out = layers.convolution2d( out, num_outputs=64, kernel_size=4, stride=2, activation_fn=tf.nn.relu ) out = layers.convolution2d( out, num_outputs=64, kernel_size=3, stride=1, activation_fn=tf.nn.relu ) out = layers.flatten(out) with tf.variable_scope("action_value"): if noisy: # Apply noisy network on fully connected layers # ref: https://arxiv.org/abs/1706.10295 out = noisy_dense( out, name="noisy_fc1", size=512, activation_fn=tf.nn.relu ) out = noisy_dense(out, name="noisy_fc2", size=num_actions) else: out = layers.fully_connected( out, num_outputs=512, activation_fn=tf.nn.relu ) out = layers.fully_connected( out, num_outputs=num_actions, activation_fn=None ) # V: Softmax - inspired by deep-rl-attack # if concat_softmax: out = tf.nn.softmax(out) return out def dueling_model( img_in, num_actions, scope, noisy=False, reuse=False, concat_softmax=False ): """As described in https://arxiv.org/abs/1511.06581""" with tf.variable_scope(scope, reuse=reuse): out = img_in with tf.variable_scope("convnet"): # original architecture out = layers.convolution2d( out, num_outputs=32, kernel_size=8, stride=4, activation_fn=tf.nn.relu ) out = layers.convolution2d( out, num_outputs=64, kernel_size=4, stride=2, activation_fn=tf.nn.relu ) out = layers.convolution2d( out, num_outputs=64, kernel_size=3, stride=1, activation_fn=tf.nn.relu ) out = layers.flatten(out) with tf.variable_scope("state_value"): if noisy: # Apply noisy network on fully connected layers # ref: https://arxiv.org/abs/1706.10295 state_hidden = noisy_dense( out, name="noisy_fc1", size=512, activation_fn=tf.nn.relu ) state_score = noisy_dense(state_hidden, name="noisy_fc2", size=1) else: state_hidden = layers.fully_connected( out, num_outputs=512, activation_fn=tf.nn.relu ) state_score = layers.fully_connected( state_hidden, num_outputs=1, activation_fn=None ) with tf.variable_scope("action_value"): if noisy: # Apply noisy network on fully connected layers # ref: https://arxiv.org/abs/1706.10295 actions_hidden = noisy_dense( out, name="noisy_fc1", size=512, activation_fn=tf.nn.relu ) action_scores = noisy_dense( actions_hidden, name="noisy_fc2", size=num_actions ) else: actions_hidden = layers.fully_connected( out, num_outputs=512, activation_fn=tf.nn.relu ) action_scores = layers.fully_connected( actions_hidden, num_outputs=num_actions, activation_fn=None ) action_scores_mean = tf.reduce_mean(action_scores, 1) action_scores = action_scores - tf.expand_dims(action_scores_mean, 1) return state_score + action_scores ================================================ FILE: cleverhans_v3.1.0/examples/RL-attack/train.py ================================================ import argparse import gym import numpy as np import os import tensorflow as tf import tempfile import time import json import random import rlattack.common.tf_util as U from rlattack import logger from rlattack import deepq from rlattack.deepq.replay_buffer import ReplayBuffer, PrioritizedReplayBuffer from rlattack.common.misc_util import ( boolean_flag, pickle_load, pretty_eta, relatively_safe_pickle_dump, set_global_seeds, RunningAvg, SimpleMonitor, ) from rlattack.common.schedules import LinearSchedule, PiecewiseSchedule # when updating this to non-deprecated ones, it is important to # copy over LazyFrames from rlattack.common.atari_wrappers_deprecated import wrap_dqn from rlattack.common.azure_utils import Container from model import model, dueling_model from statistics import statistics def parse_args(): parser = argparse.ArgumentParser("DQN experiments for Atari games") # Environment parser.add_argument("--env", type=str, default="Pong", help="name of the game") parser.add_argument("--seed", type=int, default=42, help="which seed to use") # Core DQN parameters parser.add_argument( "--replay-buffer-size", type=int, default=int(1e6), help="replay buffer size" ) parser.add_argument( "--lr", type=float, default=1e-4, help="learning rate for Adam optimizer" ) parser.add_argument( "--num-steps", type=int, default=int(2e8), help="total number of steps to \ run the environment for", ) parser.add_argument( "--batch-size", type=int, default=32, help="number of transitions to optimize \ at the same time", ) parser.add_argument( "--learning-freq", type=int, default=4, help="number of iterations between \ every optimization step", ) parser.add_argument( "--target-update-freq", type=int, default=40000, help="number of iterations between \ every target network update", ) # Bells and whistles boolean_flag(parser, "noisy", default=False, help="whether or not to NoisyNetwork") boolean_flag( parser, "double-q", default=True, help="whether or not to use double q learning" ) boolean_flag( parser, "dueling", default=False, help="whether or not to use dueling model" ) boolean_flag( parser, "prioritized", default=False, help="whether or not to use prioritized replay buffer", ) parser.add_argument( "--prioritized-alpha", type=float, default=0.6, help="alpha parameter for prioritized replay buffer", ) parser.add_argument( "--prioritized-beta0", type=float, default=0.4, help="initial value of beta \ parameters for prioritized replay", ) parser.add_argument( "--prioritized-eps", type=float, default=1e-6, help="eps parameter for prioritized replay buffer", ) # Checkpointing parser.add_argument( "--save-dir", type=str, default=None, required=True, help="directory in which \ training state and model should be saved.", ) parser.add_argument( "--save-azure-container", type=str, default=None, help="It present data will saved/loaded from Azure. \ Should be in format ACCOUNT_NAME:ACCOUNT_KEY:\ CONTAINER", ) parser.add_argument( "--save-freq", type=int, default=1e6, help="save model once every time this many \ iterations are completed", ) boolean_flag( parser, "load-on-start", default=True, help="if true and model was previously saved then training \ will be resumed", ) # V: Attack Arguments # parser.add_argument( "--attack", type=str, default=None, help="Method to attack the model." ) parser.add_argument( "--attack-init", type=int, default=0, help="Iteration no. to begin attacks" ) parser.add_argument( "--attack-prob", type=float, default=0.0, help="Probability of attack at each step, \ float in range 0 - 1.0", ) return parser.parse_args() def make_env(game_name): env = gym.make(game_name + "NoFrameskip-v4") monitored_env = SimpleMonitor(env) env = wrap_dqn(monitored_env) return env, monitored_env def maybe_save_model(savedir, container, state): if savedir is None: return start_time = time.time() model_dir = "model-{}".format(state["num_iters"]) U.save_state(os.path.join(savedir, model_dir, "saved")) if container is not None: container.put(os.path.join(savedir, model_dir), model_dir) relatively_safe_pickle_dump( state, os.path.join(savedir, "training_state.pkl.zip"), compression=True ) if container is not None: container.put( os.path.join(savedir, "training_state.pkl.zip"), "training_state.pkl.zip" ) relatively_safe_pickle_dump( state["monitor_state"], os.path.join(savedir, "monitor_state.pkl") ) if container is not None: container.put(os.path.join(savedir, "monitor_state.pkl"), "monitor_state.pkl") logger.log("Saved model in {} seconds\n".format(time.time() - start_time)) def maybe_load_model(savedir, container): """Load model if present at the specified path.""" if savedir is None: return state_path = os.path.join(os.path.join(savedir, "training_state.pkl.zip")) if container is not None: logger.log("Attempting to download model from Azure") found_model = container.get(savedir, "training_state.pkl.zip") else: found_model = os.path.exists(state_path) if found_model: state = pickle_load(state_path, compression=True) model_dir = "model-{}".format(state["num_iters"]) if container is not None: container.get(savedir, model_dir) U.load_state(os.path.join(savedir, model_dir, "saved")) logger.log( "Loaded models checkpoint at {} iterations".format(state["num_iters"]) ) return state if __name__ == "__main__": args = parse_args() # Parse savedir and azure container. savedir = args.save_dir if args.save_azure_container is not None: account_name, account_key, container_name = args.save_azure_container.split(":") container = Container( account_name=account_name, account_key=account_key, container_name=container_name, maybe_create=True, ) if savedir is None: # Careful! This will not get cleaned up. savedir = tempfile.TemporaryDirectory().name else: container = None # Create and seed the env. env, monitored_env = make_env(args.env) if args.seed > 0: set_global_seeds(args.seed) env.unwrapped.seed(args.seed) # V: Save arguments, configure log dump path to savedir # if savedir: with open(os.path.join(savedir, "args.json"), "w") as f: json.dump(vars(args), f) logger.configure(dir=savedir) # log to savedir with U.make_session(4) as sess: # Create training graph and replay buffer act, train, update_target, debug, craft_adv = deepq.build_train( make_obs_ph=lambda name: U.Uint8Input( env.observation_space.shape, name=name ), q_func=dueling_model if args.dueling else model, num_actions=env.action_space.n, optimizer=tf.train.AdamOptimizer(learning_rate=args.lr, epsilon=1e-4), gamma=0.99, grad_norm_clipping=10, double_q=args.double_q, noisy=args.noisy, attack=args.attack, ) approximate_num_iters = args.num_steps / 4 exploration = PiecewiseSchedule( [ (0, 1.0), (approximate_num_iters / 50, 0.1), (approximate_num_iters / 5, 0.01), ], outside_value=0.01, ) if args.prioritized: replay_buffer = PrioritizedReplayBuffer( args.replay_buffer_size, args.prioritized_alpha ) beta_schedule = LinearSchedule( approximate_num_iters, initial_p=args.prioritized_beta0, final_p=1.0 ) else: replay_buffer = ReplayBuffer(args.replay_buffer_size) U.initialize() update_target() num_iters = 0 # Load the model state = maybe_load_model(savedir, container) if state is not None: num_iters, replay_buffer = ( state["num_iters"], state["replay_buffer"], ) monitored_env.set_state(state["monitor_state"]) start_time, start_steps = None, None steps_per_iter = RunningAvg(0.999) iteration_time_est = RunningAvg(0.999) obs = env.reset() # Record the mean of the \sigma sigma_name_list = [] sigma_list = [] for param in tf.trainable_variables(): # only record the \sigma in the action network if "sigma" in param.name and "deepq/q_func/action_value" in param.name: summary_name = ( param.name.replace("deepq/q_func/action_value/", "") .replace("/", ".") .split(":")[0] ) sigma_name_list.append(summary_name) sigma_list.append(tf.reduce_mean(tf.abs(param))) f_mean_sigma = U.function(inputs=[], outputs=sigma_list) # Statistics writer = tf.summary.FileWriter(savedir, sess.graph) im_stats = statistics( scalar_keys=["action", "im_reward", "td_errors", "huber_loss"] + sigma_name_list ) ep_stats = statistics(scalar_keys=["ep_reward", "ep_length"]) # Main trianing loop ep_length = 0 while True: num_iters += 1 ep_length += 1 # V: Perturb observation if we are past the init stage # and at a designated attack step # if craft_adv != None and (num_iters >= args.attack_init) # and ((num_iters - args.attack_init) % args.attack_freq == 0) : if ( craft_adv is not None and (num_iters >= args.attack_init) and (random.random() <= args.attack_prob) ): obs = craft_adv(np.array(obs)[None])[0] # Take action and store transition in the replay buffer. if args.noisy: # greedily choose action = act(np.array(obs)[None], stochastic=False)[0] else: # epsilon greedy action = act( np.array(obs)[None], update_eps=exploration.value(num_iters) )[0] new_obs, rew, done, info = env.step(action) replay_buffer.add(obs, action, rew, new_obs, float(done)) obs = new_obs if done: obs = env.reset() if ( num_iters > max(5 * args.batch_size, args.replay_buffer_size // 20) and num_iters % args.learning_freq == 0 ): # Sample a bunch of transitions from replay buffer if args.prioritized: experience = replay_buffer.sample( args.batch_size, beta=beta_schedule.value(num_iters) ) ( obses_t, actions, rewards, obses_tp1, dones, weights, batch_idxes, ) = experience else: obses_t, actions, rewards, obses_tp1, dones = replay_buffer.sample( args.batch_size ) weights = np.ones_like(rewards) # Minimize the error in Bellman's and compute TD-error td_errors, huber_loss = train( obses_t, actions, rewards, obses_tp1, dones, weights ) # Update the priorities in the replay buffer if args.prioritized: new_priorities = np.abs(td_errors) + args.prioritized_eps replay_buffer.update_priorities(batch_idxes, new_priorities) # Write summary mean_sigma = f_mean_sigma() im_stats.add_all_summary( writer, [action, rew, np.mean(td_errors), np.mean(huber_loss)] + mean_sigma, num_iters, ) # Update target network. if num_iters % args.target_update_freq == 0: update_target() if start_time is not None: steps_per_iter.update(info["steps"] - start_steps) iteration_time_est.update(time.time() - start_time) start_time, start_steps = time.time(), info["steps"] # Save the model and training state. if num_iters > 0 and ( num_iters % args.save_freq == 0 or info["steps"] > args.num_steps ): maybe_save_model( savedir, container, { "replay_buffer": replay_buffer, "num_iters": num_iters, "monitor_state": monitored_env.get_state(), }, ) if info["steps"] > args.num_steps: break if done: steps_left = args.num_steps - info["steps"] completion = np.round(info["steps"] / args.num_steps, 1) mean_ep_reward = np.mean(info["rewards"][-100:]) logger.record_tabular("% completion", completion) logger.record_tabular("steps", info["steps"]) logger.record_tabular("iters", num_iters) logger.record_tabular("episodes", len(info["rewards"])) logger.record_tabular( "reward (100 epi mean)", np.mean(info["rewards"][-100:]) ) if not args.noisy: logger.record_tabular("exploration", exploration.value(num_iters)) if args.prioritized: logger.record_tabular("max priority", replay_buffer._max_priority) fps_estimate = ( float(steps_per_iter) / (float(iteration_time_est) + 1e-6) if steps_per_iter._value is not None else "calculating:" ) logger.dump_tabular() logger.log() logger.log("ETA: " + pretty_eta(int(steps_left / fps_estimate))) logger.log() # add summary for one episode ep_stats.add_all_summary(writer, [mean_ep_reward, ep_length], num_iters) ep_length = 0 ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/LibriSpeech/LICENSE.TXT ================================================ LibriSpeech (c) 2014 by Vassil Panayotov LibriSpeech ASR corpus is licensed under a Creative Commons Attribution 4.0 International License. See . ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/README.md ================================================ # Imperceptible, Robust and Targeted Adversarial Examples for Automatic Speech Recognition This is a Tensorflow implementation for the ICML 2019 paper ["Imperceptible, Robust and Targeted Adversarial Examples for Automatic Speech Recognition"](http://proceedings.mlr.press/v97/qin19a.html). The details of all the models implemented here can be found in the [paper](http://proceedings.mlr.press/v97/qin19a.html). ## Dependencies * Python 2.7 * a TensorFlow [installation](https://www.tensorflow.org/install/) (Tensorflow 1.13 is supported for this version of Lingvo system), * a `C++` compiler (only g++ 4.8 is officially supported), * the bazel build system, * librosa (```pip install librosa```), * Cython (```pip install Cython```), * pyroomacoustics (```pip install pyroomacoustics```). ## Data Here we provide 10 audios from LibriSpeech test-clean dataset as an example to show how to run the codes. Please refer to [Lingvo](https://github.com/tensorflow/lingvo/tree/master/lingvo/tasks/asr/tools) or [Librispeech website](http://www.openslr.org/resources/12/) to download the whole test set. In the file ```read_data.txt```, the directory of the 10 audios, the corresponding original transcription and the targeted transcription are provided in the format of [dir, original transcription, targeted transcription]. The full list of 1000 audio examples used in our experiments is provided in ```./util/read_data_ful.txt```. You can run the script ```sh util/convert_name_format.sh``` to convert the audios in the LibriSpeech from the format ```.flac``` to ```.wav```. You need to first change the directory of the downloaded LibriSpeech dataset in the script ```./util/convert_name_format.sh```. ## Pretrained model The pretrained model can be downloaded [here](http://cseweb.ucsd.edu/~yaq007/ckpt-00908156.data-00000-of-00001). You need to place the downloaded pretrained model into the directory ```./model/```. ## Lingvo ASR system The automatic speech recognition (ASR) system used in this paper is [Lingvo system](https://github.com/tensorflow/lingvo). To run our codes, you need to first download the forked version [here](https://github.com/yaq007/lingvo) and make sure that you are in the "icml" branch. ```bash git clone https://github.com/yaq007/lingvo.git cd lingvo git checkout icml ``` Then you need to compile the lingvo system. The easiest way to build [Lingvo system](https://github.com/tensorflow/lingvo) is to use the [docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Here we place the folder ```lingvo/``` and ```lingvo_compiled/``` under the root directory ```~/```. If you change their locations, you need to make corresponding changes in the following commands. ```bash cd .. mkdir lingvo_compiled export LINGVO_DEVICE="gpu" sudo docker build --no-cache --tag tensorflow:lingvo $(test "$LINGVO_DEVICE" = "gpu" && echo "--build-arg base_image=nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04") - < lingvo/docker/dev.dockerfile export LINGVO_DIR=$HOME/lingvo sudo docker run --rm $(test "$LINGVO_DEVICE" = "gpu" && echo "--runtime=nvidia") -it -v ${LINGVO_DIR}:/tmp/lingvo -v ~/lingvo_compiled:/tmp/lingvo_compiled -v ${HOME}/.gitconfig:/home/${USER}/.gitconfig:ro -p 6006:6006 -p 8888:8888 --name lingvo tensorflow:lingvo bash # In docker bazel build -c opt --config=cuda //lingvo:trainer cp -rfL bazel-bin/lingvo/trainer.runfiles/__main__/lingvo /tmp/lingvo_compiled # Outside of docker sudo chown -R $USER ~/lingvo_compiled export PYTHONPATH=$PYTHONPATH:~/lingvo_compiled ``` The folder ```lingvo/``` in the directory ```lingvo_compiled/``` needs to be placed in the directory ```./adversarial_asr/```. Then this directory becomes ```./adversarial_asr/lingvo/```. ## Imperceptible Adversarial Examples Currently, all the python scripts are tested on one GPU. You can use ```CUDA_VISIBLE_DEVICES=GPU_INDEX``` to choose which gpu to run the python scripts. To generate imperceptible adversarial examples, run ```bash python generate_imperceptible_adv.py ``` The adversarial examples saved with the name ended with "stage1" is the adversarial examples in [Carlini's work](https://arxiv.org/abs/1801.01944). Adversarial examples ended with the name "stage2" is our imperceptible adversarial examples using frequency masking threshold. To test the accuracy of our imperceptible adversarial examples, simply run: ```bash python test_imperceptible_adv.py --stage=stage2 --adv=True ``` You can set ```--stage=stage1``` to test the accuracy of Carlini's adversarial examples. If you set ```--adv=False```, then you can test the performance for clean examples with its corresponding original transcriptions. ## Robust Adversarial Examples To generate robust adversarial examples that are simulated playing over-the-air in the simulated random rooms, we need to first generate the simulated room reverberations. ```bash python room_simulator.py ``` Then you can run the following command to generate robust adversarial examples. ``` python generate_robust_adv.py --initial_bound=2000 --num_iter_stage1=2000 ``` In the paper, we test the last 100 audios in the ```./util/read_data_full.txt``` and we set the parameter ```initial bound``` and ```num_iter_stage1``` as ```2000``` in our experiments. Empirically, for longer audios, you might need to increase the ```initial bound``` of perturbation to generate robust adversarial examples that can successfully attack the simulated rooms. Correspndingly, you also need to increase ```num_iter_stage1``` to allow the adversarial generation to converge. You can tune the training parameters in ```generate_robust_adv.py``` to play with your data. To test the performance of robust adversarial examples, simply run ``` python test_robust_adv.py --stage=stage2 --adv=True ``` If you want to test the performance of clean examples played in the simulated rooms, you can set ```--adv=False```. ## Citation If you find the code or the models implemented here are useful, please cite this paper: ``` @InProceedings{pmlr-v97-qin19a, title = {Imperceptible, Robust, and Targeted Adversarial Examples for Automatic Speech Recognition}, author = {Qin, Yao and Carlini, Nicholas and Cottrell, Garrison and Goodfellow, Ian and Raffel, Colin}, booktitle = {Proceedings of the 36th International Conference on Machine Learning}, pages = {5231--5240}, year = {2019}, volume = {97}, series = {Proceedings of Machine Learning Research}, publisher = {PMLR}, } ``` ## Acknowledgement This code is based on Lingvo ASR system. Thanks to the contributors of the Lingvo. ``` @article{shen2019lingvo, title={Lingvo: a modular and scalable framework for sequence-to-sequence modeling}, author={Shen, Jonathan and Nguyen, Patrick and Wu, Yonghui and Chen, Zhifeng and Chen, Mia X and Jia, Ye and Kannan, Anjuli and Sainath, Tara and Cao, Yuan and Chiu, Chung-Cheng and others}, journal={arXiv preprint arXiv:1902.08295}, year={2019} } ``` ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/generate_imperceptible_adv.py ================================================ import tensorflow as tf from lingvo import model_imports from lingvo import model_registry import numpy as np import scipy.io.wavfile as wav import generate_masking_threshold as generate_mask from tool import Transform, create_features, create_inputs import time from lingvo.core import cluster_factory from absl import flags from absl import app # data directory flags.DEFINE_string("root_dir", "./", "location of Librispeech") flags.DEFINE_string( "input", "read_data.txt", "Input audio .wav file(s), at 16KHz (separated by spaces)" ) # data processing flags.DEFINE_integer("window_size", "2048", "window size in spectrum analysis") flags.DEFINE_integer( "max_length_dataset", "223200", "the length of the longest audio in the whole dataset", ) flags.DEFINE_float( "initial_bound", "2000", "initial l infinity norm for adversarial perturbation" ) # training parameters flags.DEFINE_string("checkpoint", "./model/ckpt-00908156", "location of checkpoint") flags.DEFINE_integer("batch_size", "5", "batch size") flags.DEFINE_float("lr_stage1", "100", "learning_rate for stage 1") flags.DEFINE_float("lr_stage2", "1", "learning_rate for stage 2") flags.DEFINE_integer("num_iter_stage1", "1000", "number of iterations in stage 1") flags.DEFINE_integer("num_iter_stage2", "4000", "number of iterations in stage 2") flags.DEFINE_integer("num_gpu", "0", "which gpu to run") FLAGS = flags.FLAGS def ReadFromWav(data, batch_size): """ Returns: audios_np: a numpy array of size (batch_size, max_length) in float trans: a numpy array includes the targeted transcriptions (batch_size, ) th_batch: a numpy array of the masking threshold, each of size (?, 1025) psd_max_batch: a numpy array of the psd_max of the original audio (batch_size) max_length: the max length of the batch of audios sample_rate_np: a numpy array masks: a numpy array of size (batch_size, max_length) masks_freq: a numpy array of size (batch_size, max_length_freq, 80) lengths: a list of the length of original audios """ audios = [] lengths = [] th_batch = [] psd_max_batch = [] # read the .wav file for i in range(batch_size): sample_rate_np, audio_temp = wav.read(FLAGS.root_dir + str(data[0, i])) # read the wav form range from [-32767, 32768] or [-1, 1] if max(audio_temp) < 1: audio_np = audio_temp * 32768 else: audio_np = audio_temp length = len(audio_np) audios.append(audio_np) lengths.append(length) max_length = max(lengths) # pad the input audio audios_np = np.zeros([batch_size, max_length]) masks = np.zeros([batch_size, max_length]) lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3 max_length_freq = max(lengths_freq) masks_freq = np.zeros([batch_size, max_length_freq, 80]) for i in range(batch_size): audio_float = audios[i].astype(float) audios_np[i, : lengths[i]] = audio_float masks[i, : lengths[i]] = 1 masks_freq[i, : lengths_freq[i], :] = 1 # compute the masking threshold th, psd_max = generate_mask.generate_th( audios_np[i], sample_rate_np, FLAGS.window_size ) th_batch.append(th) psd_max_batch.append(psd_max) th_batch = np.array(th_batch) psd_max_batch = np.array(psd_max_batch) # read the transcription trans = data[2, :] return ( audios_np, trans, th_batch, psd_max_batch, max_length, sample_rate_np, masks, masks_freq, lengths, ) class Attack: def __init__( self, sess, batch_size=1, lr_stage1=100, lr_stage2=0.1, num_iter_stage1=1000, num_iter_stage2=4000, th=None, psd_max_ori=None, ): self.sess = sess self.num_iter_stage1 = num_iter_stage1 self.num_iter_stage2 = num_iter_stage2 self.batch_size = batch_size self.lr_stage1 = lr_stage1 tf.set_random_seed(1234) params = model_registry.GetParams("asr.librispeech.Librispeech960Wpm", "Test") params.random_seed = 1234 params.is_eval = True params.cluster.worker.gpus_per_replica = 1 cluster = cluster_factory.Cluster(params.cluster) with cluster, tf.device(cluster.GetPlacer()): model = params.cls(params) self.delta_large = tf.Variable( np.zeros((batch_size, FLAGS.max_length_dataset), dtype=np.float32), name="qq_delta", ) # placeholders self.input_tf = tf.placeholder( tf.float32, shape=[batch_size, None], name="qq_input" ) self.tgt_tf = tf.placeholder(tf.string) self.sample_rate_tf = tf.placeholder(tf.int32, name="qq_sample_rate") self.th = tf.placeholder( tf.float32, shape=[batch_size, None, None], name="qq_th" ) self.psd_max_ori = tf.placeholder( tf.float32, shape=[batch_size], name="qq_psd" ) self.mask = tf.placeholder( dtype=np.float32, shape=[batch_size, None], name="qq_mask" ) self.mask_freq = tf.placeholder( dtype=np.float32, shape=[batch_size, None, 80] ) self.noise = tf.placeholder( np.float32, shape=[batch_size, None], name="qq_noise" ) self.maxlen = tf.placeholder(np.int32) self.lr_stage2 = tf.placeholder(np.float32) # variable self.rescale = tf.Variable( np.ones((batch_size, 1), dtype=np.float32), name="qq_rescale" ) self.alpha = tf.Variable( np.ones((batch_size), dtype=np.float32) * 0.05, name="qq_alpha" ) # extract the delta self.delta = tf.slice( tf.identity(self.delta_large), [0, 0], [batch_size, self.maxlen] ) self.apply_delta = ( tf.clip_by_value(self.delta, -FLAGS.initial_bound, FLAGS.initial_bound) * self.rescale ) self.new_input = self.apply_delta * self.mask + self.input_tf self.pass_in = tf.clip_by_value( self.new_input + self.noise, -(2 ** 15), 2 ** 15 - 1 ) # generate the inputs that are needed for the lingvo model self.features = create_features( self.pass_in, self.sample_rate_tf, self.mask_freq ) self.inputs = create_inputs( model, self.features, self.tgt_tf, self.batch_size, self.mask_freq ) task = model.GetTask() metrics = task.FPropDefaultTheta(self.inputs) # self.celoss with the shape (batch_size) self.celoss = tf.get_collection("per_loss")[0] self.decoded = task.Decode(self.inputs) # compute the loss for masking threshold self.loss_th_list = [] self.transform = Transform(FLAGS.window_size) for i in range(self.batch_size): logits_delta = self.transform( (self.apply_delta[i, :]), (self.psd_max_ori)[i] ) loss_th = tf.reduce_mean(tf.nn.relu(logits_delta - (self.th)[i])) loss_th = tf.expand_dims(loss_th, dim=0) self.loss_th_list.append(loss_th) self.loss_th = tf.concat(self.loss_th_list, axis=0) self.optimizer1 = tf.train.AdamOptimizer(self.lr_stage1) self.optimizer2 = tf.train.AdamOptimizer(self.lr_stage2) grad1, var1 = self.optimizer1.compute_gradients( self.celoss, [self.delta_large] )[0] grad21, var21 = self.optimizer2.compute_gradients( self.celoss, [self.delta_large] )[0] grad22, var22 = self.optimizer2.compute_gradients( self.alpha * self.loss_th, [self.delta_large] )[0] self.train1 = self.optimizer1.apply_gradients([(tf.sign(grad1), var1)]) self.train21 = self.optimizer2.apply_gradients([(grad21, var21)]) self.train22 = self.optimizer2.apply_gradients([(grad22, var22)]) self.train2 = tf.group(self.train21, self.train22) def attack_stage1( self, audios, trans, th_batch, psd_max_batch, maxlen, sample_rate, masks, masks_freq, num_loop, data, lr_stage2, ): sess = self.sess # initialize and load the pretrained model sess.run(tf.initializers.global_variables()) saver = tf.train.Saver( [x for x in tf.global_variables() if x.name.startswith("librispeech")] ) saver.restore(sess, FLAGS.checkpoint) # reassign the variables sess.run( tf.assign(self.rescale, np.ones((self.batch_size, 1), dtype=np.float32)) ) sess.run( tf.assign( self.delta_large, np.zeros((self.batch_size, FLAGS.max_length_dataset), dtype=np.float32), ) ) # noise = np.random.normal(scale=2, size=audios.shape) noise = np.zeros(audios.shape) feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.th: th_batch, self.psd_max_ori: psd_max_batch, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lr_stage2: lr_stage2, } losses, predictions = sess.run((self.celoss, self.decoded), feed_dict) # show the initial predictions for i in range(self.batch_size): print( "example: {}, loss: {}".format( num_loop * self.batch_size + i, losses[i] ) ) print("pred:{}".format(predictions["topk_decoded"][i, 0])) print("targ:{}".format(trans[i].lower())) print("true: {}".format(data[1, i].lower())) # We'll make a bunch of iterations of gradient descent here now = time.time() MAX = self.num_iter_stage1 loss_th = [np.inf] * self.batch_size final_deltas = [None] * self.batch_size clock = 0 for i in range(MAX): now = time.time() # Actually do the optimization sess.run(self.train1, feed_dict) if i % 10 == 0: d, cl, predictions, new_input = sess.run( (self.delta, self.celoss, self.decoded, self.new_input), feed_dict ) for ii in range(self.batch_size): # print out the prediction each 100 iterations if i % 1000 == 0: print("pred:{}".format(predictions["topk_decoded"][ii, 0])) # print("rescale: {}".format(sess.run(self.rescale[ii]))) if i % 10 == 0: if i % 100 == 0: print("example: {}".format(num_loop * self.batch_size + ii)) print("iteration: {}. loss {}".format(i, cl[ii])) if predictions["topk_decoded"][ii, 0] == trans[ii].lower(): print( "-------------------------------True--------------------------" ) # update rescale rescale = sess.run(self.rescale) if rescale[ii] * FLAGS.initial_bound > np.max(np.abs(d[ii])): rescale[ii] = np.max(np.abs(d[ii])) / FLAGS.initial_bound rescale[ii] *= 0.8 # save the best adversarial example final_deltas[ii] = new_input[ii] print( "Iteration i=%d, worked ii=%d celoss=%f bound=%f" % (i, ii, cl[ii], FLAGS.initial_bound * rescale[ii]) ) sess.run(tf.assign(self.rescale, rescale)) # in case no final_delta return if i == MAX - 1 and final_deltas[ii] is None: final_deltas[ii] = new_input[ii] if i % 10 == 0: print("ten iterations take around {} ".format(clock)) clock = 0 clock += time.time() - now return final_deltas def attack_stage2( self, audios, trans, adv, th_batch, psd_max_batch, maxlen, sample_rate, masks, masks_freq, num_loop, data, lr_stage2, ): sess = self.sess # initialize and load the pretrained model sess.run(tf.initializers.global_variables()) saver = tf.train.Saver( [x for x in tf.global_variables() if x.name.startswith("librispeech")] ) saver.restore(sess, FLAGS.checkpoint) sess.run( tf.assign(self.rescale, np.ones((self.batch_size, 1), dtype=np.float32)) ) sess.run( tf.assign(self.alpha, np.ones((self.batch_size), dtype=np.float32) * 0.05) ) # reassign the variables sess.run(tf.assign(self.delta_large, adv)) # noise = np.random.normal(scale=2, size=audios.shape) noise = np.zeros(audios.shape) feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.th: th_batch, self.psd_max_ori: psd_max_batch, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lr_stage2: lr_stage2, } losses, predictions = sess.run((self.celoss, self.decoded), feed_dict) # show the initial predictions for i in range(self.batch_size): print( "example: {}, loss: {}".format( num_loop * self.batch_size + i, losses[i] ) ) print("pred:{}".format(predictions["topk_decoded"][i, 0])) print("targ:{}".format(trans[i].lower())) print("true: {}".format(data[1, i].lower())) # We'll make a bunch of iterations of gradient descent here now = time.time() MAX = self.num_iter_stage2 loss_th = [np.inf] * self.batch_size final_deltas = [None] * self.batch_size final_alpha = [None] * self.batch_size # final_th = [None] * self.batch_size clock = 0 min_th = 0.0005 for i in range(MAX): now = time.time() if i == 3000: # min_th = -np.inf lr_stage2 = 0.1 feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.th: th_batch, self.psd_max_ori: psd_max_batch, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lr_stage2: lr_stage2, } # Actually do the optimization sess.run(self.train2, feed_dict) if i % 10 == 0: d, cl, l, predictions, new_input = sess.run( ( self.delta, self.celoss, self.loss_th, self.decoded, self.new_input, ), feed_dict, ) for ii in range(self.batch_size): # print out the prediction each 100 iterations if i % 1000 == 0: print("pred:{}".format(predictions["topk_decoded"][ii, 0])) # print("rescale: {}".format(sess.run(self.rescale[ii]))) if i % 10 == 0: # print("example: {}".format(num_loop * self.batch_size + ii)) alpha = sess.run(self.alpha) if i % 100 == 0: print("example: {}".format(num_loop * self.batch_size + ii)) print( "iteration: %d, alpha: %f, loss_ce: %f, loss_th: %f" % (i, alpha[ii], cl[ii], l[ii]) ) # if the network makes the targeted prediction if predictions["topk_decoded"][ii, 0] == trans[ii].lower(): if l[ii] < loss_th[ii]: final_deltas[ii] = new_input[ii] loss_th[ii] = l[ii] final_alpha[ii] = alpha[ii] print( "-------------------------------------Succeed---------------------------------" ) print( "save the best example=%d at iteration= %d, alpha = %f" % (ii, i, alpha[ii]) ) # increase the alpha each 20 iterations if i % 20 == 0: alpha[ii] *= 1.2 sess.run(tf.assign(self.alpha, alpha)) # if the network fails to make the targeted prediction, reduce alpha each 50 iterations if ( i % 50 == 0 and predictions["topk_decoded"][ii, 0] != trans[ii].lower() ): alpha[ii] *= 0.8 alpha[ii] = max(alpha[ii], min_th) sess.run(tf.assign(self.alpha, alpha)) # in case no final_delta return if i == MAX - 1 and final_deltas[ii] is None: final_deltas[ii] = new_input[ii] if i % 500 == 0: print("alpha is {}, loss_th is {}".format(final_alpha, loss_th)) if i % 10 == 0: print("ten iterations take around {} ".format(clock)) clock = 0 clock += time.time() - now return final_deltas, loss_th, final_alpha def main(argv): data = np.loadtxt(FLAGS.input, dtype=str, delimiter=",") data = data[:, FLAGS.num_gpu * 10 : (FLAGS.num_gpu + 1) * 10] num = len(data[0]) batch_size = FLAGS.batch_size num_loops = num / batch_size assert num % batch_size == 0 with tf.device("/gpu:0"): tfconf = tf.ConfigProto(allow_soft_placement=True) with tf.Session(config=tfconf) as sess: # set up the attack class attack = Attack( sess, batch_size=batch_size, lr_stage1=FLAGS.lr_stage1, lr_stage2=FLAGS.lr_stage2, num_iter_stage1=FLAGS.num_iter_stage1, num_iter_stage2=FLAGS.num_iter_stage2, ) for l in range(num_loops): data_sub = data[:, l * batch_size : (l + 1) * batch_size] # stage 1 # all the output are numpy arrays ( audios, trans, th_batch, psd_max_batch, maxlen, sample_rate, masks, masks_freq, lengths, ) = ReadFromWav(data_sub, batch_size) adv_example = attack.attack_stage1( audios, trans, th_batch, psd_max_batch, maxlen, sample_rate, masks, masks_freq, l, data_sub, FLAGS.lr_stage2, ) # save the adversarial examples in stage 1 for i in range(batch_size): print( "Final distortion for stage 1", np.max( np.abs( adv_example[i][: lengths[i]] - audios[i, : lengths[i]] ) ), ) name, _ = data_sub[0, i].split(".") saved_name = FLAGS.root_dir + str(name) + "_stage1.wav" adv_example_float = adv_example[i] / 32768.0 wav.write( saved_name, 16000, np.array(adv_example_float[: lengths[i]]) ) print(saved_name) # stage 2 # read the adversarial examples saved in stage 1 adv = np.zeros([batch_size, FLAGS.max_length_dataset]) adv[:, :maxlen] = adv_example - audios adv_example, loss_th, final_alpha = attack.attack_stage2( audios, trans, adv, th_batch, psd_max_batch, maxlen, sample_rate, masks, masks_freq, l, data_sub, FLAGS.lr_stage2, ) # save the adversarial examples in stage 2 for i in range(batch_size): print("example: {}".format(i)) print( "Final distortion for stage 2: {}, final alpha is {}, final loss_th is {}".format( np.max( np.abs( adv_example[i][: lengths[i]] - audios[i, : lengths[i]] ) ), final_alpha[i], loss_th[i], ) ) name, _ = data_sub[0, i].split(".") saved_name = FLAGS.root_dir + str(name) + "_stage2.wav" adv_example[i] = adv_example[i] / 32768.0 wav.write(saved_name, 16000, np.array(adv_example[i][: lengths[i]])) print(saved_name) if __name__ == "__main__": app.run(main) ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/generate_masking_threshold.py ================================================ import scipy.io.wavfile as wav import numpy as np from scipy.fftpack import fft from scipy.fftpack import ifft from scipy import signal import scipy import librosa def compute_PSD_matrix(audio, window_size): """ First, perform STFT. Then, compute the PSD. Last, normalize PSD. """ win = np.sqrt(8.0 / 3.0) * librosa.core.stft(audio, center=False) z = abs(win / window_size) psd_max = np.max(z * z) psd = 10 * np.log10(z * z + 0.0000000000000000001) PSD = 96 - np.max(psd) + psd return PSD, psd_max def Bark(f): """returns the bark-scale value for input frequency f (in Hz)""" return 13 * np.arctan(0.00076 * f) + 3.5 * np.arctan(pow(f / 7500.0, 2)) def quiet(f): """returns threshold in quiet measured in SPL at frequency f with an offset 12(in Hz)""" thresh = ( 3.64 * pow(f * 0.001, -0.8) - 6.5 * np.exp(-0.6 * pow(0.001 * f - 3.3, 2)) + 0.001 * pow(0.001 * f, 4) - 12 ) return thresh def two_slops(bark_psd, delta_TM, bark_maskee): """ returns the masking threshold for each masker using two slopes as the spread function """ Ts = [] for tone_mask in range(bark_psd.shape[0]): bark_masker = bark_psd[tone_mask, 0] dz = bark_maskee - bark_masker zero_index = np.argmax(dz > 0) sf = np.zeros(len(dz)) sf[:zero_index] = 27 * dz[:zero_index] sf[zero_index:] = (-27 + 0.37 * max(bark_psd[tone_mask, 1] - 40, 0)) * dz[ zero_index: ] T = bark_psd[tone_mask, 1] + delta_TM[tone_mask] + sf Ts.append(T) return Ts def compute_th(PSD, barks, ATH, freqs): """returns the global masking threshold""" # Identification of tonal maskers # find the index of maskers that are the local maxima length = len(PSD) masker_index = signal.argrelextrema(PSD, np.greater)[0] # delete the boundary of maskers for smoothing if 0 in masker_index: masker_index = np.delete(0) if length - 1 in masker_index: masker_index = np.delete(length - 1) num_local_max = len(masker_index) # treat all the maskers as tonal (conservative way) # smooth the PSD p_k = pow(10, PSD[masker_index] / 10.0) p_k_prev = pow(10, PSD[masker_index - 1] / 10.0) p_k_post = pow(10, PSD[masker_index + 1] / 10.0) P_TM = 10 * np.log10(p_k_prev + p_k + p_k_post) # bark_psd: the first column bark, the second column: P_TM, the third column: the index of points _BARK = 0 _PSD = 1 _INDEX = 2 bark_psd = np.zeros([num_local_max, 3]) bark_psd[:, _BARK] = barks[masker_index] bark_psd[:, _PSD] = P_TM bark_psd[:, _INDEX] = masker_index # delete the masker that doesn't have the highest PSD within 0.5 Bark around its frequency for i in range(num_local_max): next = i + 1 if next >= bark_psd.shape[0]: break while bark_psd[next, _BARK] - bark_psd[i, _BARK] < 0.5: # masker must be higher than quiet threshold if quiet(freqs[int(bark_psd[i, _INDEX])]) > bark_psd[i, _PSD]: bark_psd = np.delete(bark_psd, (i), axis=0) if next == bark_psd.shape[0]: break if bark_psd[i, _PSD] < bark_psd[next, _PSD]: bark_psd = np.delete(bark_psd, (i), axis=0) else: bark_psd = np.delete(bark_psd, (next), axis=0) if next == bark_psd.shape[0]: break # compute the individual masking threshold delta_TM = 1 * (-6.025 - 0.275 * bark_psd[:, 0]) Ts = two_slops(bark_psd, delta_TM, barks) Ts = np.array(Ts) # compute the global masking threshold theta_x = np.sum(pow(10, Ts / 10.0), axis=0) + pow(10, ATH / 10.0) return theta_x def generate_th(audio, fs, window_size=2048): """ returns the masking threshold theta_xs and the max psd of the audio """ PSD, psd_max = compute_PSD_matrix(audio, window_size) freqs = librosa.core.fft_frequencies(fs, window_size) barks = Bark(freqs) # compute the quiet threshold ATH = np.zeros(len(barks)) - np.inf bark_ind = np.argmax(barks > 1) ATH[bark_ind:] = quiet(freqs[bark_ind:]) # compute the global masking threshold theta_xs theta_xs = [] # compute the global masking threshold in each window for i in range(PSD.shape[1]): theta_xs.append(compute_th(PSD[:, i], barks, ATH, freqs)) theta_xs = np.array(theta_xs) return theta_xs, psd_max ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/generate_robust_adv.py ================================================ import tensorflow as tf from lingvo import model_imports from lingvo import model_registry import numpy as np import scipy.io.wavfile as wav import generate_masking_threshold as generate_mask from tool import create_features, create_inputs, create_speech_rir import time from lingvo.core import cluster_factory from absl import flags from absl import app import random # data directory flags.DEFINE_string("root_dir", "./", "location of Librispeech") flags.DEFINE_string( "input", "read_data.txt", "the text file saved the dir of audios and the corresponding original and targeted transcriptions", ) flags.DEFINE_string( "rir_dir", "LibriSpeech/test-clean/3575/170457/3575-170457-0013", "directory of generated room reverberations", ) # data processing flags.DEFINE_integer( "max_length_dataset", "223200", "the length of the longest audio in the whole dataset", ) flags.DEFINE_float( "initial_bound", "2000.", "initial l infinity norm for adversarial perturbation" ) flags.DEFINE_integer( "num_rir", "1000", "number of room reverberations used in training" ) flags.DEFINE_integer( "num_counter", "2", "the initial number of required successful rooms" ) flags.DEFINE_integer("num_rooms", "10", "the initial number of rooms to test") flags.DEFINE_integer( "max_delta", "300", "the max delta added to the max l infinity norm" ) # training parameters flags.DEFINE_string("checkpoint", "./model/ckpt-00908156", "location of checkpoint") flags.DEFINE_integer("batch_size", "5", "batch size") flags.DEFINE_float("lr_stage1", "50", "learning_rate for stage 1") flags.DEFINE_float("lr_stage2", "5", "learning_rate for stage 2") flags.DEFINE_integer("num_iter_stage1", "2000", "number of iterations in stage 1") flags.DEFINE_integer("num_iter_stage2", "4000", "number of iterations in stage 2") flags.DEFINE_integer("num_gpu", "0", "which gpu to run") FLAGS = flags.FLAGS def ReadFromWav(data, batch_size): """ Returns: audios_np: a numpy array of size (batch_size, max_length) in float trans: a numpy array includes the targeted transcriptions (batch_size, ) max_length: the max length of the batch of audios sample_rate_np: a numpy array masks: a numpy array of size (batch_size, max_length) masks_freq: a numpy array of size (batch_size, max_length_freq, 80) lengths: a list of the length of original audios """ audios = [] lengths = [] # read the .wav file for i in range(batch_size): sample_rate_np, audio_temp = wav.read(FLAGS.root_dir + str(data[0, i])) # read the wav form range from [-32767, 32768] or [-1, 1] if max(audio_temp) < 1: audio_np = audio_temp * 32768 else: audio_np = audio_temp length = len(audio_np) audios.append(audio_np) lengths.append(length) max_length = max(lengths) # pad the input audio audios_np = np.zeros([batch_size, max_length]) masks = np.zeros([batch_size, max_length]) lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3 max_length_freq = max(lengths_freq) masks_freq = np.zeros([batch_size, max_length_freq, 80]) for i in range(batch_size): audio_float = audios[i].astype(float) audios_np[i, : lengths[i]] = audio_float masks[i, : lengths[i]] = 1 masks_freq[i, : lengths_freq[i], :] = 1 # read the transcription trans = data[2, :] lengths = np.array(lengths).astype(np.int32) return audios_np, trans, max_length, sample_rate_np, masks, masks_freq, lengths def Readrir(): """ Return: rir: a numpy array of the room reverberation """ index = random.randint(1, FLAGS.num_rir) _, rir = wav.read(FLAGS.root_dir + FLAGS.rir_dir + "_rir_" + str(index) + ".wav") return rir class Attack: def __init__( self, sess, batch_size=1, lr_stage1=100, lr_stage2=0.1, num_iter_stage1=1000, num_iter_stage2=4000, th=None, psd_max_ori=None, ): self.sess = sess self.num_iter_stage1 = num_iter_stage1 self.num_iter_stage2 = num_iter_stage2 self.batch_size = batch_size self.lr_stage1 = lr_stage1 self.lr_stage2 = lr_stage2 tf.set_random_seed(1234) params = model_registry.GetParams("asr.librispeech.Librispeech960Wpm", "Test") params.random_seed = 1234 params.is_eval = True params.cluster.worker.gpus_per_replica = 1 cluster = cluster_factory.Cluster(params.cluster) with cluster, tf.device(cluster.GetPlacer()): model = params.cls(params) self.delta_large = tf.Variable( np.zeros((batch_size, FLAGS.max_length_dataset), dtype=np.float32), name="qq_delta", ) # placeholders self.input_tf = tf.placeholder( tf.float32, shape=[batch_size, None], name="qq_input" ) self.tgt_tf = tf.placeholder(tf.string) self.rir = tf.placeholder(tf.float32) self.sample_rate_tf = tf.placeholder(tf.int32, name="qq_sample_rate") self.mask = tf.placeholder( dtype=np.float32, shape=[batch_size, None], name="qq_mask" ) self.mask_freq = tf.placeholder( dtype=np.float32, shape=[batch_size, None, 80] ) self.noise = tf.placeholder( np.float32, shape=[batch_size, None], name="qq_noise" ) self.maxlen = tf.placeholder(np.int32) self.lr = tf.placeholder(np.float32) self.lengths = tf.placeholder( np.int32, shape=[ batch_size, ], ) # variable self.rescale = tf.Variable( np.ones((batch_size, 1), dtype=np.float32) * FLAGS.initial_bound, name="qq_rescale", ) # extract the delta self.delta = tf.slice( tf.identity(self.delta_large), [0, 0], [batch_size, self.maxlen] ) self.apply_delta = tf.clip_by_value(self.delta, -self.rescale, self.rescale) self.before_rir = tf.clip_by_value( self.apply_delta * self.mask + self.input_tf, -(2 ** 15), 2 ** 15 - 1 ) self.new_input = ( create_speech_rir( self.before_rir, self.rir, self.lengths, self.maxlen, self.batch_size, ) * self.mask ) self.pass_in = tf.clip_by_value( self.new_input + self.noise, -(2 ** 15), 2 ** 15 - 1 ) # generate the inputs that are needed for the lingvo model self.features = create_features( self.pass_in, self.sample_rate_tf, self.mask_freq ) self.inputs = create_inputs( model, self.features, self.tgt_tf, self.batch_size, self.mask_freq ) task = model.GetTask() metrics = task.FPropDefaultTheta(self.inputs) # self.celoss with the shape (batch_size) self.celoss = tf.get_collection("per_loss")[0] self.decoded = task.Decode(self.inputs) self.optimizer1 = tf.train.AdamOptimizer(self.lr) grad1, var1 = self.optimizer1.compute_gradients( self.celoss, [self.delta_large] )[0] self.train1 = self.optimizer1.apply_gradients([(tf.sign(grad1), var1)]) def attack_stage1( self, audios, trans, maxlen, sample_rate, masks, masks_freq, num_loop, data, lengths, ): """ The first stage saves the adversarial examples that can successfully attack one room """ sess = self.sess # initialize and load the pretrained model sess.run(tf.initializers.global_variables()) saver = tf.train.Saver( [x for x in tf.global_variables() if x.name.startswith("librispeech")] ) saver.restore(sess, FLAGS.checkpoint) # reassign the variables sess.run( tf.assign( self.rescale, np.ones((self.batch_size, 1), dtype=np.float32) * FLAGS.initial_bound, ) ) sess.run( tf.assign( self.delta_large, np.zeros((self.batch_size, FLAGS.max_length_dataset), dtype=np.float32), ) ) noise = np.zeros(audios.shape) rir = Readrir() feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lengths: lengths, self.rir: rir, self.lr: self.lr_stage1, } losses, predictions = sess.run((self.celoss, self.decoded), feed_dict) # show the initial predictions for i in range(self.batch_size): print( "example: {}, loss: {}".format( num_loop * self.batch_size + i, losses[i] ) ) print("pred:{}".format(predictions["topk_decoded"][i, 0])) print("targ:{}".format(trans[i].lower())) print("true: {}".format(data[1, i].lower())) # We'll make a bunch of iterations of gradient descent here now = time.time() MAX = self.num_iter_stage1 loss_th = [np.inf] * self.batch_size final_adv = [None] * self.batch_size final_perturb = [None] * self.batch_size clock = 0 for i in range(1, MAX + 1): now = time.time() rir = Readrir() feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lengths: lengths, self.rir: rir, self.lr: self.lr_stage1, } losses, predictions = sess.run((self.celoss, self.decoded), feed_dict) # Actually do the optimization sess.run(self.train1, feed_dict) if i % 10 == 0: d, apply_delta, cl, predictions, new_input = sess.run( ( self.delta, self.apply_delta, self.celoss, self.decoded, self.new_input, ), feed_dict, ) for ii in range(self.batch_size): if i % 100 == 0: print("example: {}".format(num_loop * self.batch_size + ii)) print("iteration: {}. loss {}".format(i, cl[ii])) print("pred:{}".format(predictions["topk_decoded"][ii, 0])) print("targ:{}".format(trans[ii].lower())) if i % 10 == 0: if predictions["topk_decoded"][ii, 0] == trans[ii].lower(): print( "-------------------------------True--------------------------" ) rescale = sess.run(self.rescale) # update rescale if i % 10 == 0: if rescale[ii] > np.max(np.abs(d[ii])): rescale[ii] = np.max(np.abs(d[ii])) rescale[ii] *= 0.8 print( "Iteration i=%d, worked ii=%d celoss=%f bound=%f" % (i, ii, cl[ii], rescale[ii]) ) sess.run(tf.assign(self.rescale, rescale)) # save the best adversarial example final_adv[ii] = new_input[ii] final_perturb[ii] = apply_delta[ii] print( "Stage 1: save the example at iteration i=%d example ii=%d celoss=%f bound=%f" % (i, ii, cl[ii], rescale[ii]) ) # in case no final_delta return if i == MAX - 1 and final_adv[ii] is None: final_adv[ii] = new_input[ii] final_perturb[ii] = apply_delta[ii] if i % 10 == 0: print("ten iterations take around {} ".format(clock)) clock = 0 clock += time.time() - now return final_adv, final_perturb def attack_stage2( self, audios, trans, adv, rescales, maxlen, sample_rate, masks, masks_freq, num_loop, data, lengths, ): sess = self.sess # initialize and load the pretrained model sess.run(tf.initializers.global_variables()) saver = tf.train.Saver( [x for x in tf.global_variables() if x.name.startswith("librispeech")] ) saver.restore(sess, FLAGS.checkpoint) # reassign the variables sess.run(tf.assign(self.delta_large, adv)) sess.run(tf.assign(self.rescale, rescales)) noise = np.zeros(audios.shape) rir = Readrir() feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lengths: lengths, self.rir: rir, self.lr: self.lr_stage2, } losses, predictions = sess.run((self.celoss, self.decoded), feed_dict) # show the initial predictions for i in range(self.batch_size): print( "example: {}, loss: {}".format( num_loop * self.batch_size + i, losses[i] ) ) print("pred:{}".format(predictions["topk_decoded"][i, 0])) print("targ:{}".format(trans[i].lower())) print("true: {}".format(data[1, i].lower())) # We'll make a bunch of iterations of gradient descent here now = time.time() MAX = self.num_iter_stage2 loss_th = [np.inf] * self.batch_size final_adv = [None] * self.batch_size final_perturb = [None] * self.batch_size num_counters = [FLAGS.num_counter] * self.batch_size num_rooms = [FLAGS.num_rooms] * self.batch_size clock = 0 for i in range(1, MAX + 1): now = time.time() rir = Readrir() feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lengths: lengths, self.rir: rir, self.lr: self.lr_stage2, } losses, predictions = sess.run((self.celoss, self.decoded), feed_dict) # Actually do the optimization sess.run(self.train1, feed_dict) if i % 10 == 0: d, apply_delta, cl, predictions, new_input = sess.run( ( self.delta, self.apply_delta, self.celoss, self.decoded, self.new_input, ), feed_dict, ) for ii in range(self.batch_size): if i % 100 == 0: print("example: {}".format(num_loop * self.batch_size + ii)) print("iteration: {}. loss {}".format(i, cl[ii])) print("pred:{}".format(predictions["topk_decoded"][ii, 0])) print("targ:{}".format(trans[ii].lower())) sum_counter = 0 if i % 10 == 0: for counter in range(num_rooms[ii]): if predictions["topk_decoded"][ii, 0] == trans[ii].lower(): sum_counter += 1 print("succeed %d times for example %d" % (sum_counter, ii)) rir = Readrir() feed_dict = { self.input_tf: audios, self.tgt_tf: trans, self.sample_rate_tf: sample_rate, self.mask: masks, self.mask_freq: masks_freq, self.noise: noise, self.maxlen: maxlen, self.lengths: lengths, self.rir: rir, self.lr: self.lr_stage2, } predictions = sess.run(self.decoded, feed_dict) if sum_counter == num_counters[ii]: print( "-------------------------------True--------------------------" ) print( " The num_counter is %d for example %d" % (num_counters[ii], ii) ) num_counters[ii] += 1 if num_counters[ii] > num_rooms[ii]: num_rooms[ii] += 1 # save the best adversarial example final_adv[ii] = new_input[ii] final_perturb[ii] = apply_delta[ii] print( "Stage 2: save the example at iteration i=%d example ii=%d celoss=%f" % (i, ii, cl[ii]) ) # in case no final_delta return if i == MAX - 1 and final_adv[ii] is None: final_adv[ii] = new_input[ii] final_perturb[ii] = apply_delta[ii] if i % 10 == 0: print("ten iterations take around {} ".format(clock)) clock = 0 clock += time.time() - now return final_adv, final_perturb def main(argv): data = np.loadtxt(FLAGS.input, dtype=str, delimiter=",") data = data[:, FLAGS.num_gpu * 10 : (FLAGS.num_gpu + 1) * 10] num = len(data[0]) batch_size = FLAGS.batch_size num_loops = num / batch_size assert num % batch_size == 0 with tf.device("/gpu:0"): tfconf = tf.ConfigProto(allow_soft_placement=True) with tf.Session(config=tfconf) as sess: # set up the attack class attack = Attack( sess, batch_size=batch_size, lr_stage1=FLAGS.lr_stage1, lr_stage2=FLAGS.lr_stage2, num_iter_stage1=FLAGS.num_iter_stage1, num_iter_stage2=FLAGS.num_iter_stage2, ) for l in range(num_loops): data_sub = data[:, l * batch_size : (l + 1) * batch_size] # stage 1 # all the output are numpy arrays ( audios, trans, maxlen, sample_rate, masks, masks_freq, lengths, ) = ReadFromWav(data_sub, batch_size) adv_example, perturb = attack.attack_stage1( audios, trans, maxlen, sample_rate, masks, masks_freq, l, data_sub, lengths, ) # save the adversarial examples in stage 1 that can only successfully attack one simulated room for i in range(batch_size): print( "Final distortion for stage 1", np.max( np.abs( adv_example[i][: lengths[i]] - audios[i, : lengths[i]] ) ), ) name, _ = data_sub[0, i].split(".") saved_name = ( FLAGS.root_dir + str(name) + "_robust_speechrir_stage1.wav" ) adv_example_float = adv_example[i] / 32768.0 wav.write( saved_name, 16000, np.array( np.clip( adv_example_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1 ) ), ) saved_name = ( FLAGS.root_dir + str(name) + "_robust_perturb_stage1.wav" ) perturb_float = perturb[i] / 32768.0 wav.write( saved_name, 16000, np.array( np.clip( perturb_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1 ) ), ) print(saved_name) # stage 2 # read the adversarial examples saved in stage 1 adv = np.zeros([batch_size, FLAGS.max_length_dataset]) adv[:, :maxlen] = adv_example - audios rescales = np.max(np.abs(adv), axis=1) + FLAGS.max_delta rescales = np.expand_dims(rescales, axis=1) ( audios, trans, maxlen, sample_rate, masks, masks_freq, lengths, ) = ReadFromWav(data_sub, batch_size) adv_example, perturb = attack.attack_stage2( audios, trans, adv, rescales, maxlen, sample_rate, masks, masks_freq, l, data_sub, lengths, ) # save the adversarial examples in stage 2 that can successfully attack a set of simulated rooms for i in range(batch_size): print( "Final distortion for stage 2", np.max( np.abs( adv_example[i][: lengths[i]] - audios[i, : lengths[i]] ) ), ) name, _ = data_sub[0, i].split(".") saved_name = ( FLAGS.root_dir + str(name) + "_robust_speechrir_stage2.wav" ) adv_example_float = adv_example[i] / 32768.0 wav.write( saved_name, 16000, np.array( np.clip( adv_example_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1 ) ), ) saved_name = ( FLAGS.root_dir + str(name) + "_robust_perturb_stage2.wav" ) perturb_float = perturb[i] / 32768.0 wav.write( saved_name, 16000, np.array( np.clip( perturb_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1 ) ), ) print(saved_name) if __name__ == "__main__": app.run(main) ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/model/checkpoint ================================================ model_checkpoint_path: "/tmp/librispeech/log/train/ckpt-00908156" all_model_checkpoint_paths: "/tmp/librispeech/log/train/ckpt-00000000" all_model_checkpoint_paths: "/tmp/librispeech/log/train/ckpt-00000005" all_model_checkpoint_paths: "/tmp/librispeech/log/train/ckpt-00000011" ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/read_data.txt ================================================ LibriSpeech/test-clean/3575/170457/3575-170457-0013.wav,LibriSpeech/test-clean/2961/960/2961-960-0020.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0029.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0017.wav,LibriSpeech/test-clean/8224/274381/8224-274381-0007.wav,LibriSpeech/test-clean/61/70968/61-70968-0049.wav,LibriSpeech/test-clean/61/70968/61-70968-0011.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0007.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0006.wav THE MORE SHE IS ENGAGED IN HER PROPER DUTIES THE LESS LEISURE WILL SHE HAVE FOR IT EVEN AS AN ACCOMPLISHMENT AND A RECREATION,AND HENCE WE FIND THE SAME SORT OF CLUMSINESS IN THE TIMAEUS OF PLATO WHICH CHARACTERIZES THE PHILOSOPHICAL POEM OF LUCRETIUS,ALTHOUGH THE BRETHREN WITH ME ARE NOT APOSTLES LIKE MYSELF YET THEY ARE ALL OF ONE MIND WITH ME THINK WRITE AND TEACH AS I DO,HE OBTAINED THE DESIRED SPEED AND LOAD WITH A FRICTION BRAKE ALSO REGULATOR OF SPEED BUT WAITED FOR AN INDICATOR TO VERIFY IT,THERE MAY BE A SPECIFIC FEELING WHICH COULD BE CALLED THE FEELING OF PASTNESS ESPECIALLY WHERE IMMEDIATE MEMORY IS CONCERNED,BY QUICK MARCHES THROUGH THESE INACCESSIBLE MOUNTAINS THAT GENERAL FREED HIMSELF FROM THE SUPERIOR FORCES OF THE COVENANTERS,HAVE YOUR WILL CHILD IF THE BOY ALSO WILLS IT MONTFICHET ANSWERED FEELING TOO ILL TO OPPOSE ANYTHING VERY STRONGLY JUST THEN,HE GAVE WAY TO THE OTHERS VERY READILY AND RETREATED UNPERCEIVED BY THE SQUIRE AND MISTRESS FITZOOTH TO THE REAR OF THE TENT,A LITTLE CRACKED THAT IN THE POPULAR PHRASE WAS MY IMPRESSION OF THE STRANGER WHO NOW MADE HIS APPEARANCE IN THE SUPPER ROOM,THE LOG AND THE COMPASS THEREFORE WERE ABLE TO BE CALLED UPON TO DO THE WORK OF THE SEXTANT WHICH HAD BECOME UTTERLY USELESS OLD WILL IS A FINE FELLOW BUT POOR AND HELPLESS SINCE MISSUS ROGERS HAD HER ACCIDENT,THE WOOD FLAMED UP SPLENDIDLY UNDER THE LARGE BREWING COPPER AND IT SIGHED SO DEEPLY,I WOULD FAIN KNOW IF I AM DESTINED FOR SO GLORIOUS A CAREER CRIED THE TREE REJOICING,WE WILL GO OUT TOGETHER TO THE BOWER THERE IS A WAY DOWN TO THE COURT FROM MY WINDOW,FINALLY THE ONE PARTY WENT OFF EXULTING AND THE OTHER WAS LEFT IN DESOLATION AND WOE,SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS,THE MODERN ORGANIZATION OF INDUSTRY WORKS IN THE SAME DIRECTION ALSO BY ANOTHER LINE,ISN'T HE SPLENDID CRIED JASPER IN INTENSE PRIDE SWELLING UP FATHER KNEW HOW TO DO IT,HER REGARD SHIFTED TO THE GREEN STALKS AND LEAVES AGAIN AND SHE STARTED TO MOVE AWAY,WHEN WE WERE OUT IN THE DARKNESS OF THE QUADRANGLE WE AGAIN LOOKED UP AT THE WINDOWS ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/room_simulator.py ================================================ import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile from scipy.signal import fftconvolve import pyroomacoustics as pra import random import pickle def clip(signal, high, low): """ Clip a signal from above at high and from below at low. """ s = signal.copy() s[np.where(s > high)] = high s[np.where(s < low)] = low return s def normalize(signal, bits=None): """ normalize to be in a given range. """ s = signal.copy() s /= np.abs(s).max() # if one wants to scale for bits allocated if bits is not None: s *= 2 ** (bits - 1) - 1 s = clip(s, 2 ** (bits - 1) - 1, -(2 ** (bits - 1))) return s # name of the rir data = np.loadtxt("./read_data.txt", dtype=str, delimiter=",") name = data[0, 0] name_sub, _ = name.split(".") # read one audio fs, signal = wavfile.read(name) temp = 0 room_settings = [] # set the number of room reverberations that you want to create num_rooms = 1500 for i in range(num_rooms): print("Saved room reverberation: " + str(i)) width = random.randint(3, 5) length = random.randint(4, 6) height = random.randint(2, 4) room_dim = [width, length, height] x_source = random.randint(0, width * 10) / 10.0 y_source = random.randint(0, length * 10) / 10.0 z_source = random.randint(0, height * 10) / 10.0 x_mic = random.randint(0, width * 10) / 10.0 y_mic = random.randint(0, length * 10) / 10.0 z_mic = random.randint(0, height * 10) / 10.0 source = [x_source, y_source, z_source] microphone = np.array([[x_mic], [y_mic], [z_mic]]) room_setting = [ width, length, height, x_source, y_source, z_source, x_mic, y_mic, z_mic, ] if room_setting not in room_settings: temp += 1 room_settings.append(room_setting) max_order = 100 # set max_order to a low value for a quick (but less accurate) RIR room = pra.ShoeBox(room_dim, fs=fs, max_order=max_order, absorption=0.2) # add source and set the signal to WAV file content room.add_source(source, signal=signal) # add two-microphone array room.add_microphone_array(pra.MicrophoneArray(microphone, room.fs)) # compute image sources room.image_source_model(use_libroom=True) room.compute_rir() rir = room.rir[0][0] # save the room reverberations wavfile.write(name_sub + "_rir_" + str(temp) + ".wav", 16000, rir) with open("room_setting.data", "wb") as f: pickle.dump(room_settings, f) ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/test_imperceptible_adv.py ================================================ import tensorflow as tf from lingvo import model_imports from lingvo import model_registry import numpy as np import scipy.io.wavfile as wav import generate_masking_threshold as generate_mask from tool import create_features, create_inputs import time from lingvo.core import cluster_factory from absl import flags from absl import app flags.DEFINE_string( "input", "read_data.txt", "the text file saved the dir of audios and the corresponding original and targeted transcriptions", ) flags.DEFINE_integer("batch_size", "5", "batch_size to do the testing") flags.DEFINE_string("checkpoint", "./model/ckpt-00908156", "location of checkpoint") flags.DEFINE_string("stage", "stage2", "which stage to test") flags.DEFINE_boolean("adv", "True", "to test adversarial examples or clean examples") FLAGS = flags.FLAGS def Read_input(data, batch_size): """ Returns: audios_np: a numpy array of size (batch_size, max_length) in float sample_rate: a numpy array trans: an array includes the targeted transcriptions (batch_size,) masks_freq: a numpy array to mask out the padding features in frequency domain """ audios = [] lengths = [] for i in range(batch_size): name, _ = data[0, i].split(".") if FLAGS.adv: sample_rate_np, audio_temp = wav.read( "./" + str(name) + "_" + FLAGS.stage + ".wav" ) else: sample_rate_np, audio_temp = wav.read("./" + str(name) + ".wav") # read the wav form range from [-32767, 32768] or [-1, 1] if max(audio_temp) < 1: audio_np = audio_temp * 32768 else: audio_np = audio_temp length = len(audio_np) audios.append(audio_np) lengths.append(length) max_length = max(lengths) lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3 max_length_freq = max(lengths_freq) masks_freq = np.zeros([batch_size, max_length_freq, 80]) # combine the audios into one array audios_np = np.zeros([batch_size, max_length]) for i in range(batch_size): audios_np[i, : lengths[i]] = audios[i] masks_freq[i, : lengths_freq[i], :] = 1 audios_np = audios_np.astype(float) if FLAGS.adv: trans = data[2, :] else: trans = data[1, :] return audios_np, sample_rate_np, trans, masks_freq def main(argv): data = np.loadtxt(FLAGS.input, dtype=str, delimiter=",") # calculate the number of loops to run the test num = len(data[0]) batch_size = FLAGS.batch_size num_loops = num / batch_size assert num % batch_size == 0 with tf.device("/gpu:0"): tf.set_random_seed(1234) tfconf = tf.ConfigProto(allow_soft_placement=True) with tf.Session(config=tfconf) as sess: params = model_registry.GetParams( "asr.librispeech.Librispeech960Wpm", "Test" ) params.cluster.worker.gpus_per_replica = 1 cluster = cluster_factory.Cluster(params.cluster) with cluster, tf.device(cluster.GetPlacer()): params.vn.global_vn = False params.random_seed = 1234 params.is_eval = True model = params.cls(params) task = model.GetTask() saver = tf.train.Saver() saver.restore(sess, FLAGS.checkpoint) # define the placeholders input_tf = tf.placeholder(tf.float32, shape=[batch_size, None]) tgt_tf = tf.placeholder(tf.string) sample_rate_tf = tf.placeholder(tf.int32) mask_tf = tf.placeholder(tf.float32, shape=[batch_size, None, 80]) # generate the features and inputs features = create_features(input_tf, sample_rate_tf, mask_tf) shape = tf.shape(features) inputs = create_inputs(model, features, tgt_tf, batch_size, mask_tf) # loss metrics = task.FPropDefaultTheta(inputs) loss = tf.get_collection("per_loss")[0] # prediction decoded_outputs = task.Decode(inputs) dec_metrics_dict = task.CreateDecoderMetrics() correct = 0 for l in range(num_loops): data_sub = data[:, l * batch_size : (l + 1) * batch_size] audios_np, sample_rate, tgt_np, mask_freq = Read_input( data_sub, batch_size ) feed_dict = { input_tf: audios_np, sample_rate_tf: sample_rate, tgt_tf: tgt_np, mask_tf: mask_freq, } losses = sess.run(loss, feed_dict) predictions = sess.run(decoded_outputs, feed_dict) task.PostProcessDecodeOut(predictions, dec_metrics_dict) wer_value = dec_metrics_dict["wer"].value * 100.0 for i in range(batch_size): print("pred:{}".format(predictions["topk_decoded"][i, 0])) print("targ:{}".format(tgt_np[i].lower())) print("true: {}".format(data_sub[1, i].lower())) if predictions["topk_decoded"][i, 0] == tgt_np[i].lower(): correct += 1 print("------------------------------") print("example {} succeeds".format(i)) print("Now, the WER is: {0:.2f}%".format(wer_value)) print("num of examples succeed: {}".format(correct)) print("success rate: {}%".format(correct / float(num) * 100)) if __name__ == "__main__": app.run(main) ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/test_robust_adv.py ================================================ import tensorflow as tf from lingvo import model_imports from lingvo import model_registry import numpy as np import scipy.io.wavfile as wav import generate_masking_threshold as generate_mask from tool import create_features, create_inputs, create_speech_rir import time from lingvo.core import cluster_factory from absl import flags from absl import app flags.DEFINE_string("root_dir", "./", "location of Librispeech") flags.DEFINE_string( "input", "read_data.txt", "the text file saved the dir of audios and the corresponding original and targeted transcriptions", ) flags.DEFINE_string( "rir_dir", "LibriSpeech/test-clean/3575/170457/3575-170457-0013", "directory of generated room reverberations", ) flags.DEFINE_string("checkpoint", "./model/ckpt-00908156", "location of checkpoint") flags.DEFINE_integer("batch_size", "5", "batch_size to do the testing") flags.DEFINE_string("stage", "stage2", "which step to test") flags.DEFINE_boolean("adv", "True", "to test adversarial examples or clean examples") flags.DEFINE_integer("num_test_rooms", "100", "batch_size to do the testing") flags.DEFINE_integer("num_train_rooms", "1000", "batch_size to do the testing") FLAGS = flags.FLAGS def Read_input(data, batch_size): """ Returns: audios_np: a numpy array of size (batch_size, max_length) in float sample_rate: a numpy array trans: an array includes the targeted transcriptions (batch_size,) """ audios = [] lengths = [] for i in range(batch_size): name, _ = data[0, i].split(".") if FLAGS.adv: sample_rate_np, delta = wav.read( "./" + str(name) + "_robust_perturb_" + FLAGS.stage + ".wav" ) _, audio_orig = wav.read("./" + str(name) + ".wav") if max(delta) < 1: delta = delta * 32768 audio_np = audio_orig + delta else: sample_rate_np, audio_np = wav.read("./" + str(name) + ".wav") length = len(audio_np) audios.append(audio_np) lengths.append(length) max_length = max(lengths) masks = np.zeros([batch_size, max_length]) lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3 max_length_freq = max(lengths_freq) masks_freq = np.zeros([batch_size, max_length_freq, 80]) # combine the audios into one array audios_np = np.zeros([batch_size, max_length]) for i in range(batch_size): audios_np[i, : lengths[i]] = audios[i] masks[i, : lengths[i]] = 1 masks_freq[i, : lengths_freq[i], :] = 1 audios_np = audios_np.astype(float) if FLAGS.adv: trans = data[2, :] else: trans = data[1, :] lengths = np.array(lengths).astype(np.int32) return audios_np, sample_rate_np, trans, masks_freq, lengths, max_length, masks def Readrir(num_room): """ Return: rir: a numpy array of the room reverberation (make sure the test rooms are different from training rooms) """ index = num_room + FLAGS.num_train_rooms + 1 _, rir = wav.read(FLAGS.root_dir + FLAGS.rir_dir + "_rir_" + str(index) + ".wav") return rir def main(argv): data = np.loadtxt(FLAGS.input, dtype=str, delimiter=",") # calculate the number of loops to run the test num = len(data[0]) batch_size = FLAGS.batch_size num_loops = num / batch_size assert num % batch_size == 0 with tf.device("/gpu:0"): tf.set_random_seed(1234) tfconf = tf.ConfigProto(allow_soft_placement=True) with tf.Session(config=tfconf) as sess: params = model_registry.GetParams( "asr.librispeech.Librispeech960Wpm", "Test" ) params.cluster.worker.gpus_per_replica = 1 cluster = cluster_factory.Cluster(params.cluster) with cluster, tf.device(cluster.GetPlacer()): params.vn.global_vn = False params.random_seed = 1234 params.is_eval = True model = params.cls(params) task = model.GetTask() saver = tf.train.Saver() saver.restore(sess, FLAGS.checkpoint) # define the placeholders input_tf = tf.placeholder(tf.float32, shape=[batch_size, None]) tgt_tf = tf.placeholder(tf.string) sample_rate_tf = tf.placeholder(tf.int32) mask_tf = tf.placeholder(tf.float32, shape=[batch_size, None, 80]) rir_tf = tf.placeholder(tf.float32) lengths = tf.placeholder( np.int32, shape=[ batch_size, ], ) maxlen = tf.placeholder(np.int32) mask = tf.placeholder(dtype=np.float32, shape=[batch_size, None]) # generate the features and inputs new_input = ( create_speech_rir(input_tf, rir_tf, lengths, maxlen, batch_size) * mask ) features = create_features(new_input, sample_rate_tf, mask_tf) shape = tf.shape(features) inputs = create_inputs(model, features, tgt_tf, batch_size, mask_tf) # loss metrics = task.FPropDefaultTheta(inputs) loss = tf.get_collection("per_loss")[0] # prediction decoded_outputs = task.Decode(inputs) dec_metrics_dict = task.CreateDecoderMetrics() success_rates = [] for num_room in range(FLAGS.num_test_rooms): correct = 0 rir = Readrir(num_room) for l in range(num_loops): data_sub = data[:, l * batch_size : (l + 1) * batch_size] ( audios_np, sample_rate, tgt_np, mask_freq, lengths_np, max_len, masks, ) = Read_input(data_sub, batch_size) feed_dict = { input_tf: audios_np, sample_rate_tf: sample_rate, tgt_tf: tgt_np, mask_tf: mask_freq, rir_tf: rir, lengths: lengths_np, maxlen: max_len, mask: masks, } losses = sess.run(loss, feed_dict) predictions = sess.run(decoded_outputs, feed_dict) task.PostProcessDecodeOut(predictions, dec_metrics_dict) wer_value = dec_metrics_dict["wer"].value * 100.0 for i in range(batch_size): print( "example: {}, loss_ce: {}".format( l * batch_size + i, losses[i] ) ) print("pred:{}".format(predictions["topk_decoded"][i, 0])) print("targ:{}".format(tgt_np[i].lower())) print("true: {}".format(data_sub[1, i].lower())) if predictions["topk_decoded"][i, 0] == tgt_np[i].lower(): correct += 1 print("--------------------------------") print("Now, the WER is: {0:.2f}%".format(wer_value)) print( "num of examples succeed for room {}: {}".format( num_room, correct ) ) success_rate = correct / float(num) * 100 print( "success rate for room {}: {}%".format(num_room, success_rate) ) success_rates.append(success_rate) success_ave = float(sum(success_rates)) / len(success_rates) print("success rate overall: {}%".format(success_ave)) if __name__ == "__main__": app.run(main) ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/tool.py ================================================ from tensorflow.python import pywrap_tensorflow import numpy as np import tensorflow as tf from lingvo.core import asr_frontend from lingvo.core import py_utils def _MakeLogMel(audio, sample_rate): audio = tf.expand_dims(audio, axis=0) static_sample_rate = 16000 mel_frontend = _CreateAsrFrontend() with tf.control_dependencies([tf.assert_equal(sample_rate, static_sample_rate)]): log_mel, _ = mel_frontend.FPropDefaultTheta(audio) return log_mel def _CreateAsrFrontend(): p = asr_frontend.MelFrontend.Params() p.sample_rate = 16000.0 p.frame_size_ms = 25.0 p.frame_step_ms = 10.0 p.num_bins = 80 p.lower_edge_hertz = 125.0 p.upper_edge_hertz = 7600.0 p.preemph = 0.97 p.noise_scale = 0.0 p.pad_end = False # Stack 3 frames and sub-sample by a factor of 3. p.left_context = 2 p.output_stride = 3 return p.cls(p) def create_features(input_tf, sample_rate_tf, mask_freq): """ Return: A tensor of features with size (batch_size, max_time_steps, 80) """ features_list = [] # unstact the features with placeholder input_unpack = tf.unstack(input_tf, axis=0) for i in range(len(input_unpack)): features = _MakeLogMel(input_unpack[i], sample_rate_tf) features = tf.reshape(features, shape=[-1, 80]) features = tf.expand_dims(features, dim=0) features_list.append(features) features_tf = tf.concat(features_list, axis=0) features_tf = features_tf * mask_freq return features_tf def create_inputs(model, features, tgt, batch_size, mask_freq): tgt_ids, tgt_labels, tgt_paddings = model.GetTask().input_generator.StringsToIds( tgt ) # we expect src_inputs to be of shape [batch_size, num_frames, feature_dim, channels] src_paddings = tf.zeros( [tf.shape(features)[0], tf.shape(features)[1]], dtype=tf.float32 ) src_paddings = 1.0 - mask_freq[:, :, 0] src_frames = tf.expand_dims(features, dim=-1) inputs = py_utils.NestedMap() inputs.tgt = py_utils.NestedMap( ids=tgt_ids, labels=tgt_labels, paddings=tgt_paddings, weights=1.0 - tgt_paddings, ) inputs.src = py_utils.NestedMap(src_inputs=src_frames, paddings=src_paddings) inputs.sample_ids = tf.zeros([batch_size]) return inputs def create_speech_rir(audios, rir, lengths_audios, max_len, batch_size): """ Returns: A tensor of speech with reverberations (Convolve the audio with the rir) """ speech_rir = [] for i in range(batch_size): s1 = lengths_audios[i] s2 = tf.convert_to_tensor(tf.shape(rir)) shape = s1 + s2 - 1 # Compute convolution in fourier space sp1 = tf.spectral.rfft(rir, shape) sp2 = tf.spectral.rfft( tf.slice( tf.reshape( audios[i], [ -1, ], ), [0], [lengths_audios[i]], ), shape, ) ret = tf.spectral.irfft(sp1 * sp2, shape) # normalization ret /= tf.reduce_max(tf.abs(ret)) ret *= 2 ** (16 - 1) - 1 ret = tf.clip_by_value(ret, -(2 ** (16 - 1)), 2 ** (16 - 1) - 1) ret = tf.pad(ret, tf.constant([[0, 100000]])) ret = ret[:max_len] speech_rir.append(tf.expand_dims(ret, axis=0)) speech_rirs = tf.concat(speech_rir, axis=0) return speech_rirs class Transform(object): """ Return: PSD """ def __init__(self, window_size): self.scale = 8.0 / 3.0 self.frame_length = int(window_size) self.frame_step = int(window_size // 4) self.window_size = window_size def __call__(self, x, psd_max_ori): win = tf.contrib.signal.stft(x, self.frame_length, self.frame_step) z = self.scale * tf.abs(win / self.window_size) psd = tf.square(z) PSD = tf.pow(10.0, 9.6) / tf.reshape(psd_max_ori, [-1, 1, 1]) * psd return PSD ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/util/convert_name_format.sh ================================================ #!/bin/bash for entry in "$HOME/tf/librispeech/raw/LibriSpeech/test-clean"/* do for i in "$entry"/* do for j in "$i"/*.flac do flac -d $j done done done ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_asr/util/read_data_full.txt ================================================ LibriSpeech/test-clean/3575/170457/3575-170457-0013.wav,LibriSpeech/test-clean/2961/960/2961-960-0020.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0029.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0017.wav,LibriSpeech/test-clean/8224/274381/8224-274381-0007.wav,LibriSpeech/test-clean/61/70968/61-70968-0049.wav,LibriSpeech/test-clean/61/70968/61-70968-0011.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0007.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0006.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0005.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0043.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0019.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0009.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0023.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0019.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0033.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0002.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0021.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0011.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0018.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0008.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0020.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0008.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0026.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0011.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0019.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0003.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0006.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0014.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0008.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0000.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0006.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0025.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0036.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0017.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0018.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0006.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0021.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0040.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0067.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0029.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0007.wav,LibriSpeech/test-clean/121/127105/121-127105-0026.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0010.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0014.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0001.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0016.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0023.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0024.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0004.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0027.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0000.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0009.wav,LibriSpeech/test-clean/2961/961/2961-961-0014.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0025.wav,LibriSpeech/test-clean/908/31957/908-31957-0008.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0014.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0018.wav,LibriSpeech/test-clean/61/70970/61-70970-0000.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0004.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0001.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0007.wav,LibriSpeech/test-clean/908/157963/908-157963-0021.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0053.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0034.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0011.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0013.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0002.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0004.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0002.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0040.wav,LibriSpeech/test-clean/237/126133/237-126133-0023.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0001.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0042.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0049.wav,LibriSpeech/test-clean/2961/961/2961-961-0001.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0010.wav,LibriSpeech/test-clean/237/126133/237-126133-0003.wav,LibriSpeech/test-clean/908/157963/908-157963-0012.wav,LibriSpeech/test-clean/908/157963/908-157963-0006.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0020.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0006.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0009.wav,LibriSpeech/test-clean/672/122797/672-122797-0055.wav,LibriSpeech/test-clean/672/122797/672-122797-0006.wav,LibriSpeech/test-clean/61/70970/61-70970-0036.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0014.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0011.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0029.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0033.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0032.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0054.wav,LibriSpeech/test-clean/2961/961/2961-961-0007.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0013.wav,LibriSpeech/test-clean/908/157963/908-157963-0023.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0025.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0008.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0024.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0011.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0005.wav,LibriSpeech/test-clean/2961/961/2961-961-0016.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0051.wav,LibriSpeech/test-clean/260/123288/260-123288-0002.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0031.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0037.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0001.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0018.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0013.wav,LibriSpeech/test-clean/260/123440/260-123440-0010.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0027.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0049.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0008.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0003.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0033.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0048.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0017.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0023.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0011.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0007.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0000.wav,LibriSpeech/test-clean/260/123440/260-123440-0019.wav,LibriSpeech/test-clean/237/134500/237-134500-0041.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0010.wav,LibriSpeech/test-clean/121/127105/121-127105-0028.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0036.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0015.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0005.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0008.wav,LibriSpeech/test-clean/2961/960/2961-960-0017.wav,LibriSpeech/test-clean/2961/960/2961-960-0004.wav,LibriSpeech/test-clean/2830/3979/2830-3979-0011.wav,LibriSpeech/test-clean/260/123286/260-123286-0028.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0016.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0025.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0004.wav,LibriSpeech/test-clean/121/127105/121-127105-0002.wav,LibriSpeech/test-clean/908/31957/908-31957-0019.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0058.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0031.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0005.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0024.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0019.wav,LibriSpeech/test-clean/672/122797/672-122797-0016.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0013.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0023.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0022.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0036.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0033.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0015.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0013.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0005.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0005.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0013.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0003.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0021.wav,LibriSpeech/test-clean/61/70970/61-70970-0039.wav,LibriSpeech/test-clean/61/70968/61-70968-0033.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0034.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0035.wav,LibriSpeech/test-clean/260/123286/260-123286-0026.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0005.wav,LibriSpeech/test-clean/121/127105/121-127105-0031.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0036.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0000.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0032.wav,LibriSpeech/test-clean/61/70970/61-70970-0001.wav,LibriSpeech/test-clean/61/70968/61-70968-0026.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0054.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0052.wav,LibriSpeech/test-clean/2961/961/2961-961-0008.wav,LibriSpeech/test-clean/2961/960/2961-960-0018.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0055.wav,LibriSpeech/test-clean/237/126133/237-126133-0019.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0037.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0005.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0047.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0002.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0002.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0020.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0004.wav,LibriSpeech/test-clean/908/157963/908-157963-0026.wav,LibriSpeech/test-clean/908/157963/908-157963-0020.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0028.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0059.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0044.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0018.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0006.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0000.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0029.wav,LibriSpeech/test-clean/2830/3979/2830-3979-0000.wav,LibriSpeech/test-clean/260/123286/260-123286-0006.wav,LibriSpeech/test-clean/237/126133/237-126133-0014.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0039.wav,LibriSpeech/test-clean/121/127105/121-127105-0011.wav,LibriSpeech/test-clean/121/121726/121-121726-0010.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0028.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0038.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0021.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0018.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0032.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0013.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0025.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0015.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0021.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0037.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0050.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0048.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0036.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0004.wav,LibriSpeech/test-clean/672/122797/672-122797-0038.wav,LibriSpeech/test-clean/61/70968/61-70968-0041.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0024.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0067.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0016.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0074.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0010.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0002.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0027.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0013.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0030.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0010.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0042.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0000.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0001.wav,LibriSpeech/test-clean/2961/960/2961-960-0022.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0032.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0023.wav,LibriSpeech/test-clean/260/123286/260-123286-0030.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0036.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0016.wav,LibriSpeech/test-clean/121/121726/121-121726-0000.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0002.wav,LibriSpeech/test-clean/908/31957/908-31957-0009.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0041.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0005.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0015.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0005.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0024.wav,LibriSpeech/test-clean/61/70970/61-70970-0037.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0010.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0009.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0066.wav,LibriSpeech/test-clean/260/123286/260-123286-0027.wav,LibriSpeech/test-clean/237/134500/237-134500-0037.wav,LibriSpeech/test-clean/237/134493/237-134493-0001.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0008.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0002.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0027.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0007.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0013.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0001.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0010.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0009.wav,LibriSpeech/test-clean/7021/79730/7021-79730-0005.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0020.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0042.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0001.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0023.wav,LibriSpeech/test-clean/1221/135767/1221-135767-0014.wav,LibriSpeech/test-clean/908/157963/908-157963-0025.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0039.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0044.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0002.wav,LibriSpeech/test-clean/61/70968/61-70968-0050.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0022.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0001.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0050.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0047.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0003.wav,LibriSpeech/test-clean/2961/961/2961-961-0011.wav,LibriSpeech/test-clean/2961/960/2961-960-0016.wav,LibriSpeech/test-clean/237/134493/237-134493-0004.wav,LibriSpeech/test-clean/121/127105/121-127105-0003.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0018.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0034.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0004.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0002.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0001.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0007.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0022.wav,LibriSpeech/test-clean/260/123286/260-123286-0016.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0040.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0027.wav,LibriSpeech/test-clean/121/127105/121-127105-0013.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0016.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0033.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0028.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0017.wav,LibriSpeech/test-clean/61/70970/61-70970-0021.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0051.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0016.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0029.wav,LibriSpeech/test-clean/2961/961/2961-961-0010.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0025.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0027.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0005.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0002.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0021.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0053.wav,LibriSpeech/test-clean/61/70968/61-70968-0028.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0023.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0004.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0004.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0003.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0044.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0014.wav,LibriSpeech/test-clean/2961/960/2961-960-0007.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0036.wav,LibriSpeech/test-clean/260/123286/260-123286-0023.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0016.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0001.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0021.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0039.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0008.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0002.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0012.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0014.wav,LibriSpeech/test-clean/2961/960/2961-960-0015.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0056.wav,LibriSpeech/test-clean/237/134500/237-134500-0022.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0012.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0004.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0070.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0024.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0033.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0026.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0020.wav,LibriSpeech/test-clean/61/70968/61-70968-0000.wav,LibriSpeech/test-clean/5142/36586/5142-36586-0003.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0013.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0025.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0045.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0029.wav,LibriSpeech/test-clean/237/126133/237-126133-0017.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0052.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0008.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0004.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0003.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0010.wav,LibriSpeech/test-clean/61/70968/61-70968-0024.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0023.wav,LibriSpeech/test-clean/2961/960/2961-960-0001.wav,LibriSpeech/test-clean/237/134493/237-134493-0015.wav,LibriSpeech/test-clean/237/126133/237-126133-0005.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0031.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0011.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0030.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0045.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0015.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0005.wav,LibriSpeech/test-clean/61/70970/61-70970-0031.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0018.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0006.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0005.wav,LibriSpeech/test-clean/237/126133/237-126133-0010.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0031.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0005.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0032.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0020.wav,LibriSpeech/test-clean/121/127105/121-127105-0034.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0033.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0006.wav,LibriSpeech/test-clean/61/70970/61-70970-0026.wav,LibriSpeech/test-clean/61/70968/61-70968-0043.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0017.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0012.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0026.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0028.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0037.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0019.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0040.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0017.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0017.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0006.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0025.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0008.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0019.wav,LibriSpeech/test-clean/672/122797/672-122797-0072.wav,LibriSpeech/test-clean/61/70968/61-70968-0017.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0004.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0053.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0011.wav,LibriSpeech/test-clean/2961/960/2961-960-0014.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0027.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0006.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0028.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0015.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0011.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0006.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0004.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0005.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0012.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0001.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0065.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0030.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0051.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0005.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0014.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0036.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0019.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0059.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0024.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0048.wav,LibriSpeech/test-clean/2961/961/2961-961-0020.wav,LibriSpeech/test-clean/2961/961/2961-961-0015.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0039.wav,LibriSpeech/test-clean/237/134500/237-134500-0036.wav,LibriSpeech/test-clean/237/134500/237-134500-0000.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0009.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0007.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0003.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0021.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0039.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0029.wav,LibriSpeech/test-clean/672/122797/672-122797-0020.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0018.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0017.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0033.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0019.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0051.wav,LibriSpeech/test-clean/260/123286/260-123286-0003.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0038.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0023.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0020.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0042.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0020.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0010.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0030.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0020.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0020.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0028.wav,LibriSpeech/test-clean/672/122797/672-122797-0070.wav,LibriSpeech/test-clean/61/70968/61-70968-0047.wav,LibriSpeech/test-clean/61/70968/61-70968-0030.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0020.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0009.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0032.wav,LibriSpeech/test-clean/3570/5696/3570-5696-0004.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0037.wav,LibriSpeech/test-clean/260/123286/260-123286-0018.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0014.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0009.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0009.wav,LibriSpeech/test-clean/121/127105/121-127105-0005.wav,LibriSpeech/test-clean/121/123859/121-123859-0003.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0035.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0003.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0007.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0006.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0012.wav,LibriSpeech/test-clean/672/122797/672-122797-0013.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0007.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0006.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0011.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0019.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0009.wav,LibriSpeech/test-clean/2961/960/2961-960-0012.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0023.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0033.wav,LibriSpeech/test-clean/908/31957/908-31957-0024.wav,LibriSpeech/test-clean/908/31957/908-31957-0023.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0020.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0007.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0002.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0012.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0023.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0000.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0005.wav,LibriSpeech/test-clean/61/70968/61-70968-0023.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0010.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0024.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0019.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0019.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0007.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0024.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0022.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0069.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0008.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0020.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0012.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0005.wav,LibriSpeech/test-clean/61/70970/61-70970-0040.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0004.wav,LibriSpeech/test-clean/260/123440/260-123440-0015.wav,LibriSpeech/test-clean/260/123288/260-123288-0027.wav,LibriSpeech/test-clean/237/134500/237-134500-0033.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0029.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0005.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0007.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0003.wav,LibriSpeech/test-clean/121/127105/121-127105-0001.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0038.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0023.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0025.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0020.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0024.wav,LibriSpeech/test-clean/672/122797/672-122797-0073.wav,LibriSpeech/test-clean/672/122797/672-122797-0012.wav,LibriSpeech/test-clean/61/70970/61-70970-0016.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0005.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0001.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0010.wav,LibriSpeech/test-clean/237/126133/237-126133-0011.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0018.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0011.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0045.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0043.wav,LibriSpeech/test-clean/908/31957/908-31957-0003.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0037.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0040.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0035.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0001.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0011.wav,LibriSpeech/test-clean/672/122797/672-122797-0061.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0011.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0003.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0012.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0035.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0043.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0001.wav,LibriSpeech/test-clean/3570/5696/3570-5696-0006.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0011.wav,LibriSpeech/test-clean/260/123286/260-123286-0009.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0039.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0029.wav,LibriSpeech/test-clean/121/127105/121-127105-0012.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0022.wav,LibriSpeech/test-clean/908/31957/908-31957-0017.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0018.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0017.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0024.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0031.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0045.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0026.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0006.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0015.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0036.wav,LibriSpeech/test-clean/61/70970/61-70970-0027.wav,LibriSpeech/test-clean/61/70970/61-70970-0013.wav,LibriSpeech/test-clean/61/70970/61-70970-0007.wav,LibriSpeech/test-clean/61/70968/61-70968-0061.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0005.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0015.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0038.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0009.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0000.wav,LibriSpeech/test-clean/237/134493/237-134493-0011.wav,LibriSpeech/test-clean/237/126133/237-126133-0022.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0049.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0024.wav,LibriSpeech/test-clean/1221/135767/1221-135767-0024.wav,LibriSpeech/test-clean/908/31957/908-31957-0014.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0013.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0014.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0012.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0022.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0014.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0000.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0016.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0004.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0040.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0031.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0009.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0008.wav,LibriSpeech/test-clean/61/70968/61-70968-0032.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0008.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0001.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0022.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0021.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0024.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0075.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0009.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0025.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0014.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0022.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0015.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0023.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0020.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0053.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0015.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0036.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0005.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0018.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0052.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0032.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0015.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0056.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0023.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0012.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0017.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0011.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0010.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0028.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0076.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0008.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0013.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0024.wav,LibriSpeech/test-clean/121/123859/121-123859-0004.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0031.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0029.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0005.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0008.wav,LibriSpeech/test-clean/7021/79759/7021-79759-0002.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0002.wav,LibriSpeech/test-clean/61/70968/61-70968-0015.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0018.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0007.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0044.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0004.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0033.wav,LibriSpeech/test-clean/2830/3979/2830-3979-0006.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0021.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0042.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0044.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0007.wav,LibriSpeech/test-clean/1221/135767/1221-135767-0005.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0011.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0021.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0030.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0012.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0022.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0025.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0000.wav,LibriSpeech/test-clean/260/123288/260-123288-0017.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0004.wav,LibriSpeech/test-clean/121/127105/121-127105-0006.wav,LibriSpeech/test-clean/908/31957/908-31957-0020.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0064.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0041.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0008.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0006.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0003.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0008.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0030.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0011.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0010.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0055.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0038.wav,LibriSpeech/test-clean/260/123440/260-123440-0012.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0028.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0026.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0015.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0015.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0031.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0017.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0001.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0023.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0005.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0023.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0020.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0022.wav,LibriSpeech/test-clean/672/122797/672-122797-0066.wav,LibriSpeech/test-clean/672/122797/672-122797-0007.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0005.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0017.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0013.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0007.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0020.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0006.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0016.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0006.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0019.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0013.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0018.wav,LibriSpeech/test-clean/237/134493/237-134493-0018.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0009.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0034.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0026.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0003.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0012.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0024.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0023.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0027.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0023.wav,LibriSpeech/test-clean/61/70970/61-70970-0018.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0007.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0001.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0013.wav,LibriSpeech/test-clean/237/134500/237-134500-0002.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0029.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0002.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0004.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0002.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0006.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0035.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0017.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0052.wav,LibriSpeech/test-clean/61/70968/61-70968-0057.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0049.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0008.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0006.wav,LibriSpeech/test-clean/260/123440/260-123440-0016.wav,LibriSpeech/test-clean/260/123286/260-123286-0013.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0024.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0015.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0025.wav,LibriSpeech/test-clean/121/121726/121-121726-0009.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0006.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0003.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0014.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0033.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0007.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0065.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0002.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0000.wav,LibriSpeech/test-clean/2961/961/2961-961-0006.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0063.wav,LibriSpeech/test-clean/237/134500/237-134500-0010.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0058.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0000.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0015.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0000.wav,LibriSpeech/test-clean/8224/274381/8224-274381-0011.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0007.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0003.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0007.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0009.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0013.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0034.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0051.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0017.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0021.wav,LibriSpeech/test-clean/2961/961/2961-961-0021.wav,LibriSpeech/test-clean/2961/961/2961-961-0018.wav,LibriSpeech/test-clean/237/134500/237-134500-0039.wav,LibriSpeech/test-clean/237/134493/237-134493-0014.wav,LibriSpeech/test-clean/237/134493/237-134493-0006.wav,LibriSpeech/test-clean/237/126133/237-126133-0013.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0000.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0056.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0035.wav,LibriSpeech/test-clean/121/121726/121-121726-0007.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0005.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0034.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0017.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0009.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0002.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0035.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0026.wav,LibriSpeech/test-clean/61/70970/61-70970-0011.wav,LibriSpeech/test-clean/61/70968/61-70968-0019.wav,LibriSpeech/test-clean/61/70968/61-70968-0013.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0010.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0023.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0020.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0034.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0010.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0022.wav,LibriSpeech/test-clean/2961/961/2961-961-0009.wav,LibriSpeech/test-clean/260/123286/260-123286-0005.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0036.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0004.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0041.wav,LibriSpeech/test-clean/121/121726/121-121726-0003.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0023.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0019.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0052.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0001.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0014.wav,LibriSpeech/test-clean/61/70968/61-70968-0016.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0042.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0041.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0021.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0004.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0017.wav,LibriSpeech/test-clean/260/123286/260-123286-0000.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0013.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0022.wav,LibriSpeech/test-clean/121/127105/121-127105-0007.wav,LibriSpeech/test-clean/908/31957/908-31957-0012.wav,LibriSpeech/test-clean/908/31957/908-31957-0007.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0008.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0042.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0034.wav,LibriSpeech/test-clean/672/122797/672-122797-0034.wav,LibriSpeech/test-clean/61/70968/61-70968-0040.wav,LibriSpeech/test-clean/61/70968/61-70968-0022.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0022.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0012.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0022.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0003.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0072.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0061.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0001.wav,LibriSpeech/test-clean/260/123288/260-123288-0008.wav,LibriSpeech/test-clean/260/123286/260-123286-0029.wav,LibriSpeech/test-clean/237/134500/237-134500-0024.wav,LibriSpeech/test-clean/237/126133/237-126133-0021.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0054.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0010.wav,LibriSpeech/test-clean/908/31957/908-31957-0013.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0020.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0009.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0024.wav,LibriSpeech/test-clean/61/70968/61-70968-0029.wav,LibriSpeech/test-clean/61/70968/61-70968-0020.wav,LibriSpeech/test-clean/61/70968/61-70968-0005.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0023.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0036.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0002.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0012.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0027.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0019.wav,LibriSpeech/test-clean/260/123288/260-123288-0006.wav,LibriSpeech/test-clean/260/123286/260-123286-0015.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0045.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0030.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0005.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0013.wav,LibriSpeech/test-clean/61/70970/61-70970-0029.wav,LibriSpeech/test-clean/61/70968/61-70968-0056.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0027.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0020.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0002.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0000.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0068.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0064.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0003.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0048.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0009.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0021.wav,LibriSpeech/test-clean/260/123286/260-123286-0007.wav,LibriSpeech/test-clean/237/134500/237-134500-0032.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0014.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0035.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0039.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0009.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0029.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0022.wav,LibriSpeech/test-clean/61/70968/61-70968-0055.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0016.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0010.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0006.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0008.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0041.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0000.wav,LibriSpeech/test-clean/260/123440/260-123440-0011.wav,LibriSpeech/test-clean/260/123288/260-123288-0016.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0019.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0009.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0012.wav,LibriSpeech/test-clean/121/127105/121-127105-0019.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0037.wav,LibriSpeech/test-clean/908/157963/908-157963-0017.wav,LibriSpeech/test-clean/908/157963/908-157963-0005.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0015.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0032.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0012.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0007.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0028.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0014.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0021.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0013.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0035.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0059.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0035.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0068.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0053.wav,LibriSpeech/test-clean/260/123286/260-123286-0031.wav,LibriSpeech/test-clean/237/134500/237-134500-0040.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0053.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0027.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0022.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0015.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0008.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0029.wav,LibriSpeech/test-clean/908/157963/908-157963-0010.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0003.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0016.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0022.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0039.wav,LibriSpeech/test-clean/672/122797/672-122797-0030.wav,LibriSpeech/test-clean/672/122797/672-122797-0021.wav,LibriSpeech/test-clean/61/70970/61-70970-0020.wav,LibriSpeech/test-clean/61/70968/61-70968-0008.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0046.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0028.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0022.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0009.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0015.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0028.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0024.wav,LibriSpeech/test-clean/237/134500/237-134500-0021.wav,LibriSpeech/test-clean/237/134500/237-134500-0006.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0024.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0002.wav,LibriSpeech/test-clean/121/127105/121-127105-0022.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0020.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0010.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0008.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0010.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0007.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0012.wav,LibriSpeech/test-clean/672/122797/672-122797-0050.wav,LibriSpeech/test-clean/672/122797/672-122797-0015.wav,LibriSpeech/test-clean/61/70970/61-70970-0022.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0016.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0010.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0019.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0011.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0010.wav,LibriSpeech/test-clean/260/123440/260-123440-0020.wav,LibriSpeech/test-clean/237/134500/237-134500-0011.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0019.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0021.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0008.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0006.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0007.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0026.wav,LibriSpeech/test-clean/908/31957/908-31957-0006.wav,LibriSpeech/test-clean/908/157963/908-157963-0028.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0050.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0003.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0008.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0019.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0007.wav,LibriSpeech/test-clean/672/122797/672-122797-0017.wav,LibriSpeech/test-clean/61/70970/61-70970-0002.wav,LibriSpeech/test-clean/61/70968/61-70968-0037.wav,LibriSpeech/test-clean/61/70968/61-70968-0003.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0043.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0016.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0045.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0056.wav,LibriSpeech/test-clean/2961/961/2961-961-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0071.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0062.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0003.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0040.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0010.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0024.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0037.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0018.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0013.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0005.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0008.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0028.wav,LibriSpeech/test-clean/672/122797/672-122797-0040.wav,LibriSpeech/test-clean/61/70970/61-70970-0019.wav,LibriSpeech/test-clean/61/70970/61-70970-0014.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0009.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0025.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0010.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0019.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0002.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0014.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0029.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0015.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0013.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0036.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0028.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0006.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0011.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0016.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0014.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0010.wav,LibriSpeech/test-clean/908/31957/908-31957-0016.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0065.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0001.wav,LibriSpeech/test-clean/672/122797/672-122797-0074.wav,LibriSpeech/test-clean/672/122797/672-122797-0056.wav,LibriSpeech/test-clean/672/122797/672-122797-0036.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0007.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0056.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0049.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0048.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0002.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0000.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0022.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0029.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0006.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0012.wav,LibriSpeech/test-clean/260/123288/260-123288-0001.wav,LibriSpeech/test-clean/237/134500/237-134500-0028.wav,LibriSpeech/test-clean/237/134500/237-134500-0008.wav,LibriSpeech/test-clean/237/134493/237-134493-0013.wav,LibriSpeech/test-clean/237/126133/237-126133-0012.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0009.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0021.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0032.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0004.wav,LibriSpeech/test-clean/908/157963/908-157963-0022.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0004.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0032.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0024.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0024.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0023.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0012.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0003.wav,LibriSpeech/test-clean/61/70970/61-70970-0033.wav,LibriSpeech/test-clean/5142/36586/5142-36586-0000.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0037.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0018.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0007.wav THE MORE SHE IS ENGAGED IN HER PROPER DUTIES THE LESS LEISURE WILL SHE HAVE FOR IT EVEN AS AN ACCOMPLISHMENT AND A RECREATION,AND HENCE WE FIND THE SAME SORT OF CLUMSINESS IN THE TIMAEUS OF PLATO WHICH CHARACTERIZES THE PHILOSOPHICAL POEM OF LUCRETIUS,ALTHOUGH THE BRETHREN WITH ME ARE NOT APOSTLES LIKE MYSELF YET THEY ARE ALL OF ONE MIND WITH ME THINK WRITE AND TEACH AS I DO,HE OBTAINED THE DESIRED SPEED AND LOAD WITH A FRICTION BRAKE ALSO REGULATOR OF SPEED BUT WAITED FOR AN INDICATOR TO VERIFY IT,THERE MAY BE A SPECIFIC FEELING WHICH COULD BE CALLED THE FEELING OF PASTNESS ESPECIALLY WHERE IMMEDIATE MEMORY IS CONCERNED,BY QUICK MARCHES THROUGH THESE INACCESSIBLE MOUNTAINS THAT GENERAL FREED HIMSELF FROM THE SUPERIOR FORCES OF THE COVENANTERS,HAVE YOUR WILL CHILD IF THE BOY ALSO WILLS IT MONTFICHET ANSWERED FEELING TOO ILL TO OPPOSE ANYTHING VERY STRONGLY JUST THEN,HE GAVE WAY TO THE OTHERS VERY READILY AND RETREATED UNPERCEIVED BY THE SQUIRE AND MISTRESS FITZOOTH TO THE REAR OF THE TENT,A LITTLE CRACKED THAT IN THE POPULAR PHRASE WAS MY IMPRESSION OF THE STRANGER WHO NOW MADE HIS APPEARANCE IN THE SUPPER ROOM,THE LOG AND THE COMPASS THEREFORE WERE ABLE TO BE CALLED UPON TO DO THE WORK OF THE SEXTANT WHICH HAD BECOME UTTERLY USELESS,FOR A FEW MILES SHE FOLLOWED THE LINE HITHERTO PRESUMABLY OCCUPIED BY THE COAST OF ALGERIA BUT NO LAND APPEARED TO THE SOUTH,BY THIS TIME THE TWO GENTLEMEN HAD REACHED THE PALINGS AND HAD GOT DOWN FROM THEIR HORSES IT WAS PLAIN THEY MEANT TO COME IN,UNCAS OCCUPIED A DISTANT CORNER IN A RECLINING ATTITUDE BEING RIGIDLY BOUND BOTH HANDS AND FEET BY STRONG AND PAINFUL WITHES,I GREATLY MOURN THAT ONE SO WELL DISPOSED SHOULD DIE IN HIS IGNORANCE AND I HAVE SOUGHT A GOODLY HYMN CAN YOU LEAD ME TO HIM,IT WAS A PAIN TO SEE THEM AND A SWORD LIKE PAIN TO SEE THE SIGNS OF ADOLESCENCE THAT MADE REPELLENT THEIR PITIABLE NAKEDNESS,THAT EVENING TROT GAVE A GRAND BALL IN THE PALACE TO WHICH THE MOST IMPORTANT OF THE PINKIES AND THE BLUESKINS WERE INVITED,BUT YOUR POWER IS SO SUPERIOR TO ANY THAT I CAN ADVANCE AS TO MAKE US HERE FEEL THAT THERE IS NO DISGRACE IN YIELDING TO IT,THAT SUMMER'S EMIGRATION HOWEVER BEING MAINLY FROM THE FREE STATES GREATLY CHANGED THE RELATIVE STRENGTH OF THE TWO PARTIES,A FRESH WHOLESOME LOOKING BOY WAS TOM GATES WITH STEADY GRAY EYES AN INTELLIGENT FOREHEAD BUT A SENSITIVE RATHER WEAK MOUTH,SHE SPOKE WITH A SUDDEN ENERGY WHICH PARTOOK OF FEAR AND PASSION AND FLUSHED HER THIN CHEEK AND MADE HER LANGUID EYES FLASH,THERE IN THE CEDAR HOLLOW THEN LIVED OLIVE LORD AN ANGRY RESENTFUL LITTLE CREATURE WEIGHED DOWN BY A FIERCE SENSE OF INJURY,MISTER POPHAM EXAGGERATED NOTHING BUT ON THE CONTRARY LEFT MUCH UNSAID IN HIS NARRATIVE OF THE FAMILY AT THE HOUSE OF LORDS,OF COURSE HE REFLECTED SHE ALWAYS HAD THAT COMBINATION OF SOMETHING HOMELY AND SENSIBLE AND SOMETHING UTTERLY WILD AND DAFT,EVERYTHING HE HAS DONE HAS BEEN AIMED AT THE CONSERVATION OF ENERGY THE CONTRACTION OF SPACE THE INTENSIFICATION OF CULTURE,SHE HAD BEEN BORN WITHIN ITS BORDERS WITHIN ITS BORDERS SHE HAD LIVED AND GROWN AND WITHIN ITS BORDERS SHE HAD MET HER LOVE,HERE SHE WAS TEACHING DIRTY CHILDREN AND THE SMELL OF CONFUSED ODORS AND BODILY PERSPIRATION WAS TO HER AT TIMES UNBEARABLE,TO EMBARRASS THIS DAMAGING EXPOSURE JUDGE LECOMPTE ISSUED A WRIT AGAINST THE EX GOVERNOR ON A FRIVOLOUS CHARGE OF CONTEMPT,WOMEN CAN HIDE THEIR PAIN BETTER THAN WE MEN AND BEAR IT BETTER TOO EXCEPT WHEN SHAME DROPS FIRE INTO THE DREADFUL CHALICE,RALPH THURSTON HAD FOUND A LINE OF LATIN FOR THEM IN HIS BELOVED HORACE TIBI SPLENDET FOCUS FOR YOU THE HEARTH FIRE SHINES,WHEN SHE COULD NOT MAKE A RABBIT OR A BIRD LOOK REAL ON PAPER SHE SEARCHED IN HER FATHER'S BOOKS FOR PICTURES OF ITS BONES,THE QUESTION IS WHICH OF THE TWO METHODS WILL MOST EFFECTIVELY REACH THE PERSONS WHOSE CONVICTIONS IT IS DESIRED TO AFFECT,NOTWITHSTANDING THE HIGH RESOLUTION OF HAWKEYE HE FULLY COMPREHENDED ALL THE DIFFICULTIES AND DANGER HE WAS ABOUT TO INCUR,AT THE FOOT OF THE MOUNTAIN THAT SEPARATED THE COUNTRY OF THE MUNCHKINS FROM THE COUNTRY OF THE GILLIKINS THE PATH DIVIDED,A MOMENT BEFORE THE GHOST OF THE ANCIENT KINGDOM OF THE DANES HAD LOOKED FORTH THROUGH THE VESTURE OF THE HAZEWRAPPED CITY,HE PLANTED A COMPANY BEFORE THE HOTEL AND DEMANDED A SURRENDER OF THE ARMS BELONGING TO THE FREE STATE MILITARY COMPANIES,IN THE OLD BADLY MADE PLAY IT WAS FREQUENTLY NECESSARY FOR ONE OF THE CHARACTERS TO TAKE THE AUDIENCE INTO HIS CONFIDENCE,FOR A MOMENT BETH STOOD STARING WHILE THE NEW MAID REGARDED HER WITH COMPOSURE AND A SLIGHT SMILE UPON HER BEAUTIFUL FACE,RODOLFO ARRIVED AT HIS OWN HOUSE WITHOUT ANY IMPEDIMENT AND LEOCADIA'S PARENTS REACHED THEIRS HEART BROKEN AND DESPAIRING,SHE'S WONDERFUL MORE WONDERFUL THAN ANYBODY WE'VE EVER SEEN ANYWHERE AND SHE DRAWS BETTER THAN THE TEACHER IN CHARLESTOWN,THE SIGHT OF YOU BARTLEY TO SEE YOU LIVING AND HAPPY AND SUCCESSFUL CAN I NEVER MAKE YOU UNDERSTAND WHAT THAT MEANS TO ME,THIS SENTENCE ALSO DEFINES OUR SINS AS GREAT SO GREAT IN FACT THAT THE WHOLE WORLD COULD NOT MAKE AMENDS FOR A SINGLE SIN,DID EVER ANYBODY SEE THE LIKE SCREAMED MISSUS POYSER RUNNING TOWARDS THE TABLE WHEN HER EYE HAD FALLEN ON THE BLUE STREAM,HE KNEW IT WOULD TAKE THEM TO THE HOUSE OF THE CROOKED MAGICIAN WHOM HE HAD NEVER SEEN BUT WHO WAS THEIR NEAREST NEIGHBOR,THE FIRST OF THESE TOUCHES CONVEYED THAT THE WRITTEN STATEMENT TOOK UP THE TALE AT A POINT AFTER IT HAD IN A MANNER BEGUN,NEVER DID HE OBJECT TO BUCKLING UP HIS SUITCASE FOR ANY COUNTRY WHATEVER CHINA OR THE CONGO NO MATTER HOW FAR OFF IT WAS,AMONG OTHER THINGS ON WHICH SHE CAST HER EYES WAS A SMALL CRUCIFIX OF SOLID SILVER STANDING ON A CABINET NEAR THE WINDOW,HIS HAT HAD A PEAKED CROWN AND A FLAT BRIM AND AROUND THE BRIM WAS A ROW OF TINY GOLDEN BELLS THAT TINKLED WHEN HE MOVED,THEY WERE VOYAGING ACROSS THE DESERTS OF THE SKY A HOST OF NOMADS ON THE MARCH VOYAGING HIGH OVER IRELAND WESTWARD BOUND,I COULDN'T SHIVER MUCH BEIN BOUND SO TIGHT BUT WHEN I'M LOOSE I MEAN TO HAVE JUS ONE GOOD SHIVER TO RELIEVE MY FEELIN'S,THE LAST DROP FLY AS LUCK WOULD HAVE IT CAUGHT JUST IN THE CORNER OF THE HAWK'S ANGRILY OPEN BEAK HOOKING ITSELF FIRMLY,BUT SUDDENLY STRAIGHT AND SWIFT AS A DIVING CORMORANT HE SHOT DOWN INTO THE TORRENT AND DISAPPEARED BENEATH THE SURFACE,TO SAY NOTHING SAID MONTALAIS SO THAT WHEN MADEMOISELLE DE TONNAY CHARENTE THINKS ATHENAIS IS THE ONLY ONE WHO KNOWS IT,THE STOP AT QUEENSTOWN THE TEDIOUS PASSAGE UP THE MERSEY WERE THINGS THAT HE NOTED DIMLY THROUGH HIS GROWING IMPATIENCE,AT THE INCEPTION OF PLURAL MARRIAGE AMONG THE LATTER DAY SAINTS THERE WAS NO LAW NATIONAL OR STATE AGAINST ITS PRACTISE,NINE THOUSAND YEARS HAVE ELAPSED SINCE SHE FOUNDED YOURS AND EIGHT THOUSAND SINCE SHE FOUNDED OURS AS OUR ANNALS RECORD,YOU KNOW I HAVE JUST BEEN TELLING YOU HOW THIS SCHOOL OF MATERIALISM AND CLAY INVOLVED ITSELF AT LAST IN CLOUD AND FIRE,NAY I RATHER THRILLED DISTRUSTING EVERY LIGHT THAT SEEMED TO GILD THE ONWARD PATH AND FEARED TO OVERLEAN A FINGER EVEN,THEY MUST HAVE SOME CHARACTERISTIC WHICH MAKES US REGARD THEM AS REFERRING TO MORE OR LESS REMOTE PORTIONS OF THE PAST,I COME NOW TO THE OTHER CHARACTERISTIC WHICH MEMORY IMAGES MUST HAVE IN ORDER TO ACCOUNT FOR OUR KNOWLEDGE OF THE PAST,MISS DE GRAF SAID KENNETH NOTICING THE BOY'S FACE CRITICALLY AS HE STOOD WHERE THE LIGHT FROM THE PASSAGE FELL UPON IT,YOUNG FITZOOTH HAD BEEN COMMANDED TO HIS MOTHER'S CHAMBER SO SOON AS HE HAD COME OUT FROM HIS CONVERSE WITH THE SQUIRE,BY THIS TIME LORD CHELFORD AND WYLDER RETURNED AND DISGUSTED RATHER WITH MYSELF I RUMINATED ON MY WANT OF GENERAL SHIP,HE HAD PRECONCEIVED IDEAS ABOUT EVERYTHING AND HIS IDEA ABOUT AMERICANS WAS THAT THEY SHOULD BE ENGINEERS OR MECHANICS,HESTER PRYNNE NEVERTHELESS THE LOVING MOTHER OF THIS ONE CHILD RAN LITTLE RISK OF ERRING ON THE SIDE OF UNDUE SEVERITY,LIVES NOT ALONE NOR OR ITSELF FEAR NOT AND I WILL CALL THE WEAK WORM FROM ITS LOWLY BED AND THOU SHALT HEAR ITS VOICE,WERE I TO COMPLY WITH YOUR ORDERS WITHOUT EXPRESSING MY OWN OPINION I SHOULD SEEM TO HAVE DONE SO WILLINGLY HEREAFTER,NOT A DOUBT BUT HAD YOUR FORCE BEEN ONLY DOUBLE OR TREBLE OUR OWN I SHOULD HAVE FOUND IT MY DUTY TO STRUGGLE WITH YOU,THE PRINCESS SAT DOWN UNDER A BLUE CANOPY WITH BOUQUETS OF ROSES AND SHE LET ANDERS SIT IN A GOLDEN CHAIR BY HER SIDE,PUT THESE PLAYTHINGS ALL AWAY QUICK AND CAREFULLY AND WE WILL NOT LET THEM KNOW ANY THING ABOUT YOUR LEAVING THEM OUT,NOW DELIA CONTRIVED TO OBTAIN A GREAT INFLUENCE AND ASCENDENCY OVER THE MINDS OF THE CHILDREN BY MEANS OF THESE DOLLS,AND YET YOU MUST OWN HER BEHAVIOUR HAS WARRANTED THEM HAS IT NOT BEEN IN THIS PARTICULAR INCOHERENT AND UNACCOUNTABLE,IN ORDER TO PLEASE HER I SPOKE TO HER OF THE ABBE CONTI AND I HAD OCCASION TO QUOTE TWO LINES OF THAT PROFOUND WRITER,INDEED THERE WERE ONLY ONE OR TWO STRANGERS WHO COULD BE ADMITTED AMONG THE SISTERS WITHOUT PRODUCING THE SAME RESULT,HE CRIED IN HIGH DUDGEON JUST AS IF HE OWNED THE WHOLE OF THE PEPPERS AND COULD DISPOSE OF THEM ALL TO SUIT HIS FANCY,THIS REALITY BEGINS TO EXPLAIN THE DARK POWER AND OTHERWORLDLY FASCINATION OF TWENTY THOUSAND LEAGUES UNDER THE SEAS,IN NOVELS THE HERO HAS OFTEN PUSHED HIS MEALS AWAY UNTASTED BUT NO STAGE HERO WOULD DO ANYTHING SO UNNATURAL AS THIS,HE DETESTED THE GRASPING DISPOSITION THAT WOULD ENDEAVOR TO TAKE ADVANTAGE OF HIS EVIDENT DESIRE TO HELP YOUNG GATES,AND NOW HE DESIRES TO SEE THE IDEAL STATE SET IN MOTION HE WOULD LIKE TO KNOW HOW SHE BEHAVED IN SOME GREAT STRUGGLE,EITHER HE CALLS MINISTERS THROUGH THE AGENCY OF MEN OR HE CALLS THEM DIRECTLY AS HE CALLED THE PROPHETS AND APOSTLES,SOMEHOW OF ALL THE DAYS WHEN THE HOME FEELING WAS THE STRONGEST THIS DAY IT SEEMED AS IF SHE COULD BEAR IT NO LONGER,BUT THEL IS LIKE A FAINT CLOUD KINDLED AT THE RISING SUN I VANISH FROM MY PEARLY THRONE AND WHO SHALL FIND MY PLACE,AND GENTLE SLEEP THE SLEEP OF DEATH AND GENTLY HEAR THE VOICE OF HIM THAT WALKETH IN THE GARDEN IN THE EVENING TIME,I AND MY WIFE AND SON AND THE TWO CRASWELLERS AND THREE OR FOUR OTHERS AGREED TO DINE ON BOARD THE SHIP ON THE NEXT,IF WE HAD RETAINED THE SUBJECT OR ACT IN KNOWLEDGE THE WHOLE PROBLEM OF MEMORY WOULD HAVE BEEN COMPARATIVELY SIMPLE,THE BEHAVIOURIST WHO ATTEMPTS TO MAKE PSYCHOLOGY A RECORD OF BEHAVIOUR HAS TO TRUST HIS MEMORY IN MAKING THE RECORD,IT IS YOU WHO ARE MISTAKEN RAOUL I HAVE READ HIS DISTRESS IN HIS EYES IN HIS EVERY GESTURE AND ACTION THE WHOLE DAY,AND THEN HE TOLD ALL ABOUT HIS YOUTH AND THE LITTLE MICE HAD NEVER HEARD THE LIKE BEFORE AND THEY LISTENED AND SAID,TO GROW AND GROW TO GET OLDER AND BE TALL THOUGHT THE TREE THAT AFTER ALL IS THE MOST DELIGHTFUL THING IN THE WORLD,ROBIN FITZOOTH SAW THAT HIS DOUBTS OF WARRENTON HAD BEEN UNFAIR AND HE BECAME ASHAMED OF HIMSELF FOR HARBORING THEM,YES SOMETHING EVERYTHING SAID RACHEL HURRIEDLY LOOKING FROWNINGLY AT A FLOWER WHICH SHE WAS TWIRLING IN HER FINGERS,THEIR WALK CONTINUED SILENT FOR THE GREATER PART NEITHER WAS QUITE SATISFIED WITH THE OTHER BUT RACHEL AT LAST SAID,THIS TRUTH WHICH I HAVE LEARNED FROM HER LIPS IS CONFIRMED BY HIS FACE IN WHICH WE HAVE BOTH BEHELD THAT OF OUR SON,WHAT I MEAN IS THAT I WANT YOU TO PROMISE NEVER TO SEE ME AGAIN NO MATTER HOW OFTEN I COME NO MATTER HOW HARD I BEG,HE STOOD A LITTLE BEHIND HER AND TRIED TO STEADY HIMSELF AS HE SAID IT'S SOFT AND MISTY SEE HOW WHITE THE STARS ARE,STUNG BY ANXIETY FOR THIS LITTLE SISTER SHE UPBRAIDED MISS W FOR HER FANCIED INDIFFERENCE TO ANNE'S STATE OF HEALTH,THE SUBJECT WAS A VERY NOBLE ONE HE DESCRIBED THE MOST FAMOUS ACTION IN WHICH THE ATHENIAN PEOPLE WERE EVER ENGAGED,IF EVER HE WAS IMPELLED TO CAST SIN FROM HIM AND TO REPENT THE IMPULSE THAT MOVED HIM WAS THE WISH TO BE HER KNIGHT,THE HELPLESS WORM AROSE AND SAT UPON THE LILLYS LEAF AND THE BRIGHT CLOUD SAILD ON TO FIND HIS PARTNER IN THE VALE,SHE SAT DOWN IN A ROCKING CHAIR AND CLASPING HER HANDS IN HER LAP ROCKED SLOWLY BACK AND FORTH I'M SORRY SAID BETH,THESE WOMEN WERE FLATTERED BY THE ATTENTION OF THE YOUNG LADY AND HAD PROMISED TO ASSIST IN ELECTING MISTER FORBES,DOUBTS NOW AROSE AND SOME DISCUSSION FOLLOWED WHETHER OR NOT IT WAS DESIRABLE FOR BEN ZOOF TO ACCOMPANY HIS MASTER,MOTHER CAREY POURED COFFEE NANCY CHOCOLATE AND THE OTHERS HELPED SERVE THE SANDWICHES AND CAKE DOUGHNUTS AND TARTS,SHE A TORY AND CLERGYMAN'S DAUGHTER WAS ALWAYS IN A MINORITY OF ONE IN OUR HOUSE OF VIOLENT DISSENT AND RADICALISM,I WILL BRIEFLY DESCRIBE THEM TO YOU AND YOU SHALL READ THE ACCOUNT OF THEM AT YOUR LEISURE IN THE SACRED REGISTERS,WHEN YOU ARGUE ABOUT THE NATURE OF GOD APART FROM THE QUESTION OF JUSTIFICATION YOU MAY BE AS PROFOUND AS YOU LIKE,THE ATMOSPHERE IS CHARGED WITH VAPOURS PERVADED WITH THE ELECTRICITY GENERATED BY THE EVAPORATION OF SALINE WATERS,WE WANT TO KNOW MISTER GILCHRIST HOW YOU AN HONOURABLE MAN EVER CAME TO COMMIT SUCH AN ACTION AS THAT OF YESTERDAY,WHAT COULD HE DO HE CAUGHT UP EVERYTHING WHICH WOULD BETRAY HIM AND HE RUSHED INTO YOUR BEDROOM TO CONCEAL HIMSELF,THEY UNITE EVERY QUALITY AND SOMETIMES YOU WILL FIND ME REFERRING TO THEM AS COLORISTS SOMETIMES AS CHIAROSCURISTS,SO GHIP GHISIZZLE ORDERED THE CAPTAIN TO TAKE A FILE OF SOLDIERS AND ESCORT THE RAVING BEAUTIES TO THEIR NEW HOME,JACK HAD BEEN STANDING IN THE FAR CORNER OF THE ROOM TALKING TO EVA AND WAS NOW REDUCED TO SILENCE BY HIS PRAISES,HOW CHEERFULLY HE SEEMS TO GRIN HOW NEATLY SPREAD HIS CLAWS AND WELCOME LITTLE FISHES IN WITH GENTLY SMILING JAWS,EDISON HELD THAT THE ELECTRICITY SOLD MUST BE MEASURED JUST LIKE GAS OR WATER AND HE PROCEEDED TO DEVELOP A METER,IT WAS SIMPLE ENOUGH SIR IF YOU ONLY HAD KNOWN BUT WITH ALL YOUR CLEVERNESS IT WAS IMPOSSIBLE THAT YOU COULD KNOW,I CANNOT ALLOW THE EXAMINATION TO BE HELD IF ONE OF THE PAPERS HAS BEEN TAMPERED WITH THE SITUATION MUST BE FACED,THERE WAS SOMETHING IN HIS AIR AND MANNER THAT BETRAYED TO THE SCOUT THE UTTER CONFUSION OF THE STATE OF HIS MIND,HOW IS IT LA VALLIERE SAID MADEMOISELLE DE TONNAY CHARENTE THAT THE VICOMTE DE BRAGELONNE SPOKE OF YOU AS LOUISE,GIVE ME A CHECK FOR A HUNDRED AND FIFTY AND I'LL TURN OVER TO YOU THE FORGED CHECK AND QUASH FURTHER PROCEEDINGS,HE WOULDN'T SEARCH SO DON'T WORRY REPLIED CYRIL QUIETLY AND THE TWO LOOKED AT EACH OTHER AND KNEW THAT IT WAS SO,HE WELL KNEW THE PERILS OF THE FRONTIER THE SAVAGE STATE OF SOCIETY THE LURKING INDIANS AND THE DANGERS OF FEVER,BUT IT IS NOT WITH A VIEW TO DISTINCTION THAT YOU SHOULD CULTIVATE THIS TALENT IF YOU CONSULT YOUR OWN HAPPINESS,HE SPOKE FRENCH PERFECTLY I HAVE BEEN TOLD WHEN NEED WAS BUT DELIGHTED USUALLY IN TALKING THE BROADEST YORKSHIRE,AND OFTEN HAS MY MOTHER SAID WHILE ON HER LAP I LAID MY HEAD SHE FEARED FOR TIME I WAS NOT MADE BUT FOR ETERNITY,CRIED ALICE AGAIN FOR THIS TIME THE MOUSE WAS BRISTLING ALL OVER AND SHE FELT CERTAIN IT MUST BE REALLY OFFENDED,I CAN'T PRAY TO HAVE THE THINGS I WANT HE SAID SLOWLY AND I WON'T PRAY NOT TO HAVE THEM NOT IF I'M DAMNED FOR IT,I GAVE HIM A LITTLE BRANDY AND LEFT HIM COLLAPSED IN A CHAIR WHILE I MADE A MOST CAREFUL EXAMINATION OF THE ROOM,THE AWKWARD THING WAS THAT THEY HAD PRACTICALLY NO OTHER RELATIONS AND THAT HIS OWN AFFAIRS TOOK UP ALL HIS TIME,THE WHARVES OF BROOKLYN AND EVERY PART OF NEW YORK BORDERING THE EAST RIVER WERE CROWDED WITH CURIOSITY SEEKERS,SUDDENLY FOR THE PURPOSE OF RESTORING PEACE AND ORDER SPRING ACCOMPANIED BY HIS WHOLE COURT MADE HIS APPEARANCE,HE RECKONED THEREFORE NOT ONLY UPON ASCERTAINING THE EXTENT OF THE LATE CATASTROPHE BUT UPON LEARNING ITS CAUSE,IRENE BURGOYNE ONE OF HER FAMILY TOLD ME IN CONFIDENCE THAT THERE WAS A ROMANCE SOMEWHERE BACK IN THE BEGINNING,NOTHING CAN EXCEED THE BEAUTY OR ART OF THE INTRODUCTION IN WHICH HE IS USING WORDS AFTER HIS ACCUSTOMED MANNER,THERE IS NO DANGER OF THE MODERN COMMENTATORS ON THE TIMAEUS FALLING INTO THE ABSURDITIES OF THE NEO PLATONISTS,THE LORD WHO HAS GIVEN US POWER TO TEACH AND TO HEAR LET HIM ALSO GIVE US THE POWER TO SERVE AND TO DO LUKE TWO,ITS JAW IS ENORMOUS AND ACCORDING TO NATURALISTS IT IS ARMED WITH NO LESS THAN ONE HUNDRED AND EIGHTY TWO TEETH,MY FRIEND DID NOT APPEAR TO BE DEPRESSED BY HIS FAILURE BUT SHRUGGED HIS SHOULDERS IN HALF HUMOROUS RESIGNATION,SO UNCAS YOU HAD BETTER TAKE THE LEAD WHILE I WILL PUT ON THE SKIN AGAIN AND TRUST TO CUNNING FOR WANT OF SPEED,THIS OUTWARD MUTABILITY INDICATED AND DID NOT MORE THAN FAIRLY EXPRESS THE VARIOUS PROPERTIES OF HER INNER LIFE,CRIED ONE OF THE WOMEN HE TOOK NO NOTICE OF HER HE LOOKED AT ME BUT AS IF INSTEAD OF ME HE SAW WHAT HE SPOKE OF,THOU CANST WAIT THROUGH SORROW AND SICKNESS TO BRING SOULS TO TOUCH AND THINK IT SOON WHEN OTHERS CRY TOO LATE,IT IS FOUNDED ON THE ACKNOWLEDGED WEAKNESS OF THOSE WHO SURVIVE THAT PERIOD OF LIFE AT WHICH MEN CEASE TO WORK,YOU HAVE RECEIVED US WITH ALL THAT COURTESY AND HOSPITALITY FOR WHICH YOUR CHARACTER IN ENGLAND STANDS SO HIGH,ALL THAT I AM DOING IS TO USE ITS LOGICAL TENABILITY AS A HELP IN THE ANALYSIS OF WHAT OCCURS WHEN WE REMEMBER,LOOK YONDER DO YOU NOT SEE THE MOON SLOWLY RISING SILVERING THE TOPMOST BRANCHES OF THE CHESTNUTS AND THE OAKS,SHE WAS DRESSED IN THE REGULATION COSTUME OF THE MAIDS AT ELMHURST A PLAIN BLACK GOWN WITH WHITE APRON AND CAP,YES THEN SOMETHING BETTER SOMETHING STILL GRANDER WILL SURELY FOLLOW OR WHEREFORE SHOULD THEY THUS ORNAMENT ME,SHE SAW THAT THE BED WAS GILDED AND SO RICH THAT IT SEEMED THAT OF A PRINCE RATHER THAN OF A PRIVATE GENTLEMAN,THE SUGAR MANUFACTURER WHO SAYS LOAF CLARIFIED LUMPS BASTARD COMMON BURNT THIS HONEST MANUFACTURER TALKS SLANG,I ADDRESS HIM IN ITALIAN AND HE ANSWERS VERY WITTILY BUT HIS WAY OF SPEAKING MAKES ME SMILE AND I TELL HIM WHY,THE METER CONTINUED IN GENERAL SERVICE DURING EIGHTEEN NINETY NINE AND PROBABLY UP TO THE CLOSE OF THE CENTURY,COME COME SAID HOLMES KINDLY IT IS HUMAN TO ERR AND AT LEAST NO ONE CAN ACCUSE YOU OF BEING A CALLOUS CRIMINAL,THE WHOLE PARTY CROWDED TO THE SPOT WHERE UNCAS POINTED OUT THE IMPRESSION OF A MOCCASIN IN THE MOIST ALLUVION,A CIRCLE OF A FEW HUNDRED FEET IN CIRCUMFERENCE WAS DRAWN AND EACH OF THE PARTY TOOK A SEGMENT FOR HIS PORTION,WHILE THE OLD GOLD AND THE MARBLE STAYS FOREVER GLEAMING ITS SOFT STRONG BLAZE CALM IN THE EARLY EVENING GLOW,THE ROOM OF THE GREAT KNIFE WAS HIGH AND BIG AND AROUND IT RAN ROWS OF BENCHES FOR THE SPECTATORS TO SIT UPON,HE WAS A FANATIC ON FORMALITY AND HE ONLY ADDRESSED ME IN THE THIRD PERSON TO THE POINT WHERE IT GOT TIRESOME,BUT HERE HE WAS AT A TERRIBLE DISADVANTAGE AS COMPARED WITH THE OWLS HAWKS AND EAGLES HE HAD NO RENDING CLAWS,SURFACE DUST AT LEAST HAD BEEN REMOVED AND THE FINE OLD FURNITURE GAVE A HINT OF ITS REAL ELEGANCE AND POLISH,HE IMPLORES US TO BE DISCREET AS THE GRAVE IN THIS MATTER FOR IN SOOTH HIS LIFE IS IN THE HOLLOW OF OUR HANDS,THRUSTING OPEN THE PROPER ENTRANCE OF THE TENT ROBIN SUDDENLY RUSHED FORTH WITH HIS BURDEN WITH A GREAT SHOUT,THEN I DRANK HALF OF THE HORNFUL AND SENT THE REST ACROSS THE FIRE TO THE FARMER HE TOOK IT AND SMILED SAYING,BARTLEY LEANED OVER HER SHOULDER WITHOUT TOUCHING HER AND WHISPERED IN HER EAR YOU ARE GIVING ME A CHANCE YES,TWO MONSTERS ONLY WERE CREATING ALL THIS COMMOTION AND BEFORE MY EYES ARE TWO REPTILES OF THE PRIMITIVE WORLD,NO ONE WOULD DISTURB THEIR LITTLE HOUSE EVEN IF ANYONE CAME SO FAR INTO THE THICK FOREST WHILE THEY WERE GONE,SHE WAS YOUNG UNTRIED NERVOUS IT WAS A VISION OF SERIOUS DUTIES AND LITTLE COMPANY OF REALLY GREAT LONELINESS,IN BOTH THESE HIGH MYTHICAL SUBJECTS THE SURROUNDING NATURE THOUGH SUFFERING IS STILL DIGNIFIED AND BEAUTIFUL,YOU WILL FIND ME CONTINUALLY SPEAKING OF FOUR MEN TITIAN HOLBEIN TURNER AND TINTORET IN ALMOST THE SAME TERMS,I DISCOVERED AND PUT OUT A FIRE THAT WOULD HAVE DESTROYED THE WHOLE PLANT BUT MARSHALL NEVER EVEN THANKED ME,THERE BEFELL AN ANXIOUS INTERVIEW MISTRESS FITZOOTH ARGUING FOR AND AGAINST THE SQUIRE'S PROJECT IN A BREATH,THE STROLLERS TOOK THEIR PART IN IT WITH HEARTY ZEST NOW THAT THEY HAD SOME CHANCE OF BEATING OFF THEIR FOES,THAT IS THE BEST WAY TO DECIDE FOR THE SPEAR WILL ALWAYS POINT SOMEWHERE AND ONE THING IS AS GOOD AS ANOTHER,HERE IS A RING FOR SIF THE FRIENDLY AND HERE IS A BRACELET A SWORD WOULD NOT BE ASHAMED TO HANG AT YOUR SIDE,BUT THE MEMORY OF THEIR EXPLOITS HAS PASSED AWAY OWING TO THE LAPSE OF TIME AND THE EXTINCTION OF THE ACTORS,BUT IN THE REST OF THE WORK THE POWER OF LANGUAGE SEEMS TO FAIL HIM AND THE DRAMATIC FORM IS WHOLLY GIVEN UP,TO BESTOW PEACE AND GRACE LIES IN THE PROVINCE OF GOD WHO ALONE CAN CREATE THESE BLESSINGS THE ANGELS CANNOT,DEAR ME EJACULATED THE OLD GENTLEMAN IN THE UTMOST AMAZEMENT AND SUCH A TIME AS I'VE HAD TO GET HER HERE TOO,HE WEIGHED AND REWEIGHED THE METER PLATES AND PURSUED EVERY LINE OF INVESTIGATION IMAGINABLE BUT ALL IN VAIN,SEVERAL CLOTHES HORSES A PILLION A SPINNING WHEEL AND AN OLD BOX WIDE OPEN AND STUFFED FULL OF COLOURED RAGS,I HAVE A LETTER HERE MISTER SOAMES WHICH I WROTE TO YOU EARLY THIS MORNING IN THE MIDDLE OF A RESTLESS NIGHT,MY FRIEND'S TEMPER HAD NOT IMPROVED SINCE HE HAD BEEN DEPRIVED OF THE CONGENIAL SURROUNDINGS OF BAKER STREET,AFTER PROCEEDING A FEW MILES THE PROGRESS OF HAWKEYE WHO LED THE ADVANCE BECAME MORE DELIBERATE AND WATCHFUL,DEAR ME WHAT A CHATTERBOX YOU'RE GETTING TO BE UNC REMARKED THE MAGICIAN WHO WAS PLEASED WITH THE COMPLIMENT,GOLD IS THE MOST COMMON METAL IN THE LAND OF OZ AND IS USED FOR MANY PURPOSES BECAUSE IT IS SOFT AND PLIABLE,AND SAYS THOU MOTHER OF MY CHILDREN I HAVE LOVED THEE AND I HAVE GIVEN THEE A CROWN THAT NONE CAN TAKE AWAY,TILL WE ARISE LINK'D IN A GOLDEN BAND AND NEVER PART BUT WALK UNITED BEARING FOOD TO ALL OUR TENDER FLOWERS,I OPENED A LINE OF CREDIT SUFFICIENT TO COVER THE BABIRUSA AND CONSEIL AT MY HEELS I JUMPED INTO A CARRIAGE,BUT IT IS SURMISED THAT YOU WILL FIND DIFFICULTIES IN THE WAY OF YOUR ENTERING AT ONCE UPON YOUR GOVERNMENT,I WAS TO BE TAKEN AWAY AND CARRIED TO ENGLAND OR ELSEWHERE OR DROWNED UPON THE VOYAGE IT MATTERED NOT WHICH,IT IS AN ANTIPATHY AN ANTIPATHY I CANNOT GET OVER DEAR DORCAS YOU MAY THINK IT A MADNESS BUT DON'T BLAME ME,I MADE HER FOR ONLY TWENTY OARS BECAUSE I THOUGHT FEW MEN WOULD FOLLOW ME FOR I WAS YOUNG FIFTEEN YEARS OLD,BUT THE MORE FORGETFULNESS HAD THEN PREVAILED THE MORE POWERFUL WAS THE FORCE OF REMEMBRANCE WHEN SHE AWOKE,IT IS SOLD EVERYWHERE BUT FOR THE LAST THREE WEEKS NOBODY WILL USE ANY SNUFF BUT THAT SOLD AT THE CIVET CAT,WE WANT YOU TO HELP US PUBLISH SOME LEADING WORK OF LUTHER'S FOR THE GENERAL AMERICAN MARKET WILL YOU DO IT,WE ARE LOSING TIME AND THE FACT IS I HAVE NOT COME ALL THIS WAY TO TAKE A LITTLE SAIL UPON A POND ON A RAFT,ASKED PHRONSIE IN INTENSE INTEREST SLIPPING DOWN OUT OF POLLY'S ARMS AND CROWDING UP CLOSE TO JASPER'S SIDE,I'VE STRONG ASSURANCE THAT NO EVIL WILL HAPPEN TO YOU AND MY UNCLE AND THE CHILDREN FROM ANYTHING I'VE DONE,SHE WAS THE MOST AGREEABLE WOMAN I'VE EVER KNOWN IN HER POSITION SHE WOULD HAVE BEEN WORTHY OF ANY WHATEVER,HOUSECLEANING A DOMESTIC UPHEAVAL THAT MAKES IT EASY FOR THE GOVERNMENT TO ENLIST ALL THE SOLDIERS IT NEEDS,THE RETREAT WILL BEGIN ON WEDNESDAY AFTERNOON IN HONOUR OF SAINT FRANCIS XAVIER WHOSE FEAST DAY IS SATURDAY,ATCHISON WHO HAD BEEN HARANGUING THE MOB PLANTED HIS TWO GUNS BEFORE THE BUILDING AND TRAINED THEM UPON IT,BUT THE AFFAIR WAS MAGNIFIED AS A CROWNING PROOF THAT THE FREE STATE MEN WERE INSURRECTIONISTS AND OUTLAWS,AND IT IS MADE OF MOTHER'S BEST YARN AND SHE KNITTED IT HERSELF AND EVERYBODY WANTS TO GET IT AWAY FROM ME,HOWEVER HER FEATURES AND FORM MIGHT REPRESS ANY EVIDENCE OF NERVOUSNESS THESE HANDS TOLD A DIFFERENT STORY,THE ATTENDANCE WAS UNEXPECTEDLY LARGE AND THE GIRLS WERE DELIGHTED FORESEEING GREAT SUCCESS FOR THEIR FETE,THEN ROGERS WOULDN'T DO ANYTHING BUT LEAD HER AROUND AND WAIT UPON HER AND THE PLACE WENT TO RACK AND RUIN,SOMETIMES I'M THAT YEARNING FOR A SMOKE I'M NEARLY CRAZY AN I DUNNO WHICH IS WORST DYIN ONE WAY OR ANOTHER,MY BED WAS UNEXCEPTIONABLY COMFORTABLE BUT IN MY THEN MOOD I COULD HAVE WISHED IT A GREAT DEAL MORE MODERN,BUT THAT WISE AND PLACID WOMAN UNDERSTOOD THE SWEET REBEL A GREAT DEAL BETTER THAN RUTH UNDERSTOOD HERSELF,THIS DIFFERENTIATION IS FURTHERED BY THE INHERITANCE OF WEALTH AND THE CONSEQUENT INHERITANCE OF GENTILITY,DID NOT CHRIST HIMSELF SAY I AM THE WAY AND THE TRUTH AND THE LIFE NO MAN COMETH UNTO THE FATHER BUT BY ME,SAID CAPTAIN DONNITHORNE SEATING HIMSELF WHERE HE COULD SEE ALONG THE SHORT PASSAGE TO THE OPEN DAIRY DOOR,THE CROWD DRIFTS OFF LEAVING THE HERO AND HEROINE ALONE IN THE MIDDLE OF THE STAGE AND THEN YOU CAN BEGIN,BUT JOYCE HAD NOT BEEN LISTENING ALL AT ONCE SHE PUT DOWN HER CANDLE ON THE TABLE AND FACED HER COMPANION,THOUGHT THE FIR TREE AND BELIEVED IT ALL BECAUSE THE MAN WHO TOLD THE STORY WAS SO GOOD LOOKING WELL WELL,I LIKE YOU WILL YOU ARE THE SECOND WILL THAT I HAVE MET AND LIKED WITHIN TWO DAYS IS THERE A SIGN IN THAT,NAOMI SHOOK HER FOREFINGER REPROACHFULLY AT THEM AS IF THE TWO STURDY YOUNG FARMERS HAD BEEN TWO CHILDREN,BUT YOUNG SHARP TONGUE NOW THAT WE HAVE CAUGHT YOU WE WILL PUT YOU INTO A TRAP THAT YOU CANNOT GET OUT OF,HILDA WATCHED HIM FROM HER CORNER TREMBLING AND SCARCELY BREATHING DARK SHADOWS GROWING ABOUT HER EYES IT,THIS ATTITUDE IS UNIVERSAL AND PARTICULARLY DEVELOPED IN THOSE WHO CONSIDER THEMSELVES BETTER THAN OTHERS,THEIR CONTENTS HAD ALL BOILED AWAY LEAVING IN THE BOTTOM OF EACH KETTLE A FEW GRAINS OF FINE WHITE POWDER,INSTEAD OF SHOES THE OLD MAN WORE BOOTS WITH TURNOVER TOPS AND HIS BLUE COAT HAD WIDE CUFFS OF GOLD BRAID,IF YOU DRESSED IN SILK AND GOLD FROM TOP TO TOE YOU COULD NOT LOOK ANY NICER THAN IN YOUR LITTLE RED CAP,I HAD SCARCELY KNOWN WHAT I HAD BEEN SAYING OR DOING UP TO THIS TIME BUT AS HE SPOKE I LOOKED AT MY HAND,HER MANNER WAS NEITHER INDEPENDENT NOR ASSERTIVE BUT RATHER ONE OF WELL BRED COMPOSURE AND CALM RELIANCE,POOR RACHEL HER NATURE RECOILED FROM DECEIT AND SHE TOLD AT ALL EVENTS AS MUCH OF THE TRUTH AS SHE DARED,SO NO TALES GOT OUT TO THE NEIGHBORS BESIDES IT WAS A LONELY PLACE AND BY GOOD LUCK NO ONE CAME THAT WAY,HER SEA GOING QUALITIES WERE EXCELLENT AND WOULD HAVE AMPLY SUFFICED FOR A CIRCUMNAVIGATION OF THE GLOBE,ITS ORIGIN WAS SMALL A GERM AN INSIGNIFICANT SEED HARDLY TO BE THOUGHT OF AS LIKELY TO AROUSE OPPOSITION,PLATO HAD NOT THE COMMAND OF HIS MATERIALS WHICH WOULD HAVE ENABLED HIM TO PRODUCE A PERFECT WORK OF ART,WE LOOK FOR THAT REWARD WHICH EYE HATH NOT SEEN NOR EAR HEARD NEITHER HATH ENTERED INTO THE HEART OF MAN,THESE PERVERTERS OF THE RIGHTEOUSNESS OF CHRIST RESIST THE FATHER AND THE SON AND THE WORKS OF THEM BOTH,SUDDENLY THE ICHTHYOSAURUS AND THE PLESIOSAURUS DISAPPEAR BELOW LEAVING A WHIRLPOOL EDDYING IN THE WATER,NAY DEAR AUNT YOU NEVER HEARD ME SAY THAT ALL PEOPLE ARE CALLED TO FORSAKE THEIR WORK AND THEIR FAMILIES,THE GLIMMERING SEA OF DELICATE LEAVES WHISPERED AND MURMURED BEFORE HER STRETCHING AWAY TO THE NORTHWARD,ALSO A POPULAR CONTRIVANCE WHEREBY LOVE MAKING MAY BE SUSPENDED BUT NOT STOPPED DURING THE PICNIC SEASON,AFTER EARLY NIGHTFALL THE YELLOW LAMPS WOULD LIGHT UP HERE AND THERE THE SQUALID QUARTER OF THE BROTHELS,AND THOUGH I HAVE GROWN SERENE AND STRONG SINCE THEN I THINK THAT GOD HAS WILLED A STILL RENEWABLE FEAR,THERE CAME UPON ME A SUDDEN SHOCK WHEN I HEARD THESE WORDS WHICH EXCEEDED ANYTHING WHICH I HAD YET FELT,ANOTHER PREACHER AFTER REPROACHING HIM TO HIS FACE WITH HIS MISGOVERNMENT ORDERED THIS PSALM TO BE SUNG,AND SO ON TILL YOU GET TO THE END WHEN OPHELIA MIGHT SAY AH YES OR SOMETHING NON COMMITTAL OF THAT SORT,BUT SUPPOSE YOU SAID I'M FOND OF WRITING MY PEOPLE ALWAYS SAY MY LETTERS HOME ARE GOOD ENOUGH FOR PUNCH,FOR THE FIRST TIME THE MAID SEEMED A LITTLE CONFUSED AND HER GAZE WANDERED FROM THE FACE OF HER VISITOR,HIS TONES RANG PLEASANTLY ON WARRENTON'S EARS AND FORTHWITH A GOOD FELLOWSHIP WAS HERALDED BETWEEN THEM,TO THE FERVENT LATTER DAY SAINT A TEMPLE IS NOT SIMPLY A CHURCH BUILDING A HOUSE FOR RELIGIOUS ASSEMBLY,JANUARY AND FEBRUARY OF EIGHTEEN THIRTY SEVEN HAD PASSED AWAY AND STILL THERE WAS NO REPLY FROM SOUTHEY,SINCE CHRIST WAS GIVEN FOR OUR SINS IT STANDS TO REASON THAT THEY CANNOT BE PUT AWAY BY OUR OWN EFFORTS,I CAN DISTINGUISH THE EYE OF THE ICHTHYOSAURUS GLOWING LIKE A RED HOT COAL AND AS LARGE AS A MAN'S HEAD,BUT EMIL IF I UNDERSTAND THEN ALL OUR GOOD TIMES ARE OVER WE CAN NEVER DO NICE THINGS TOGETHER ANY MORE,HIS WIFE NOW LIES BESIDE HIM AND THE WHITE SHAFT THAT MARKS THEIR GRAVES GLEAMS ACROSS THE WHEAT FIELDS,I BELIEVE IN THE TRAINING OF PEOPLE TO THEIR HIGHEST CAPACITY THE ENGLISHMAN HERE HEARTILY SECONDED HIM,THIS SET OF ROOMS IS QUITE THE OLDEST IN THE COLLEGE AND IT IS NOT UNUSUAL FOR VISITORS TO GO OVER THEM,AS SOON AS THESE DISPOSITIONS WERE MADE THE SCOUT TURNED TO DAVID AND GAVE HIM HIS PARTING INSTRUCTIONS,IT IS MY HEART HUNG IN THE SKY AND NO CLOUDS EVER FLOAT BETWEEN THE GRAVE FLOWERS AND MY HEART ON HIGH,AS TO HIS AGE AND ALSO THE NAME OF HIS MASTER JACOB'S STATEMENT VARIED SOMEWHAT FROM THE ADVERTISEMENT,IN SHORT HE BECOMES A PROMINENT FIGURE IN LONDON SOCIETY AND IF HE IS NOT CAREFUL SOMEBODY WILL SAY SO,ON HUGE SILVER PLATTERS WERE PYRAMIDS OF TARTS AND CAKES AND RED WINE SPARKLED IN GLITTERING DECANTERS,AT THE FARTHER END OF THE LARGEST HALL A TABLE WAS SET WITH GOLDEN CUPS AND GOLDEN PLATES IN LONG ROWS,SO YOU WILL BE A GOOD GIRL I KNOW AND NOT MAKE ANY TROUBLE BUT WILL STAY AT HOME CONTENTEDLY WON'T YOU,NANCY'S CURLY CHESTNUT CROP SHONE IN THE SUN AND OLIVE'S THICK BLACK PLAITS LOOKED BLACKER BY CONTRAST,IT IS BLACK IN MISFORTUNE IT IS BLACKER STILL IN CRIME THESE TWO BLACKNESSES AMALGAMATED COMPOSE SLANG,BUT THE WINDOWS ARE PATCHED WITH WOODEN PANES AND THE DOOR I THINK IS LIKE THE GATE IT IS NEVER OPENED,YOU SEE I'VE LIVED ALL MY LIFE WITH UNC NUNKIE THE SILENT ONE AND THERE WAS NO ONE TO TELL ME ANYTHING,YEA HIS HONOURABLE WORSHIP IS WITHIN BUT HE HATH A GODLY MINISTER OR TWO WITH HIM AND LIKEWISE A LEECH,I SEE THEY LAY HELPLESS AND NAKED WEEPING AND NONE TO ANSWER NONE TO CHERISH THEE WITH MOTHERS SMILES,THE INMATES BEING REMOVED AT THE APPOINTED HOUR A FEW CANNON BALLS WERE FIRED THROUGH THE STONE WALLS,BUT IT IS THE CIGARETTE WHICH CHIEFLY HAS BROUGHT THE MODERN DRAMA TO ITS PRESENT STATE OF PERFECTION,HIS FEET WERE RED HIS LONG NARROW BEAK WITH ITS SAW TOOTHED EDGES AND SHARP HOOKED TIP WAS BRIGHT RED,HE MADE AN EFFORT TO HIDE HIS CONDITION FROM THEM ALL AND ROBIN FELT HIS FINGERS TIGHTEN UPON HIS ARM,HE KNEW HIS UNCLE WOULD BE GLAD TO HEAR THAT HE HAD AT LAST TURNED HIS THOUGHTS TO A PRACTICAL MATTER,IT ENGENDERS A WHOLE WORLD LA PEGRE FOR WHICH READ THEFT AND A HELL LA PEGRENNE FOR WHICH READ HUNGER,TABBY HAD TENDED THEM IN THEIR CHILDHOOD THEY AND NONE OTHER SHOULD TEND HER IN HER INFIRMITY AND AGE,TABBY HAD LIVED WITH THEM FOR TEN OR TWELVE YEARS AND WAS AS CHARLOTTE EXPRESSED IT ONE OF THE FAMILY,IN THE COMMUNITIES OF THE WESTERN CULTURE THIS POINT IS AT PRESENT FOUND AMONG THE LOWER MIDDLE CLASS,THE GENEALOGIES WHICH YOU HAVE RECITED TO US OUT OF YOUR OWN ANNALS SOLON ARE A MERE CHILDREN'S STORY,BUT PLATO HAS NOT THE SAME MASTERY OVER HIS INSTRUMENT WHICH HE EXHIBITS IN THE PHAEDRUS OR SYMPOSIUM,THE AIR AND THE EARTH ARE CURIOUSLY MATED AND INTERMINGLED AS IF THE ONE WERE THE BREATH OF THE OTHER,THERE WAS A UNANIMOUS GROAN AT THIS AND MUCH REPROACH AFTER WHICH IN HIS PREOCCUPIED WAY HE EXPLAINED,AT ONCE THE GOAT GAVE A LEAP ESCAPED FROM THE SOLDIERS AND WITH BOWED HEAD RUSHED UPON THE BOOLOOROO,I'M GOING TO SEE MISTER MARSHALL SAID KENNETH AND DISCOVER WHAT I CAN DO TO ASSIST YOU THANK YOU SIR,WHATEVER LORD CHELFORD SAID MISS BRANDON RECEIVED IT VERY GRACIOUSLY AND EVEN WITH A MOMENTARY SMILE,THE SOUND OF AN IMPERATIVE AND UNCOMPROMISING BELL RECALLED ME IN DUE TIME TO THE REGIONS OF REALITY,IN FIVE MINUTES I WAS IN A NEW WORLD AND MY MELANCHOLY ROOM WAS FULL OF THE LIVELIEST FRENCH COMPANY,HE GIVE UP HIS POSITION AND SHUT THE FAMILY UP IN THAT TOMB OF A HOUSE SO T HE COULD STUDY HIS BOOKS,THEY WERE BOTH REMEMBERING WHAT THE WOMAN HAD SAID WHEN SHE TOOK THE MONEY GOD GIVE YOU A HAPPY LOVE,THESE THOUGHTS AGITATED ME ALL DAY AND MY IMAGINATION SCARCELY CALMED DOWN AFTER SEVERAL HOURS SLEEP,HE RETURNED CARRYING HIS JUMPING SHOES WHICH ARE PROVIDED AS YOU ARE AWARE WITH SEVERAL SHARP SPIKES,HOW LONG WOULD IT TAKE HIM TO DO THAT USING EVERY POSSIBLE CONTRACTION A QUARTER OF AN HOUR NOT LESS,YOU'LL EASILY JUDGE WHY WHEN YOU HEAR BECAUSE THE THING HAD BEEN SUCH A SCARE HE CONTINUED TO FIX ME,AS A PRIVATE CITIZEN I SHALL BE A MODEL OF DEPORTMENT BECAUSE IT WOULD BE DANGEROUS TO BE OTHERWISE,I WAS WELL SATISFIED WITH MY CABIN WHICH WAS LOCATED IN THE STERN AND OPENED INTO THE OFFICERS MESS,JACK WOULD BECOME EVA'S HAPPY HUSBAND AND WOULD REMAIN AMIDST THE HURRIED DUTIES OF THE EAGER WORLD,BUT IN THIS FRIENDLY PRESSURE RAOUL COULD DETECT THE NERVOUS AGITATION OF A GREAT INTERNAL CONFLICT,THEY THEN RENEWED THEIR JOURNEY AND UNDER THE BETTER LIGHT MADE A SAFE CROSSING OF THE STABLE ROOFS,AND WITH IT I LEAVE YOU A NAME SIF THE FRIENDLY I SHALL HOPE TO DRINK WITH YOU SOMETIME IN VALHALLA,YOU MUST SEE LIEUTENANT I SHOULD THINK THAT WE ARE NOT SO NEAR THE COAST OF ALGERIA AS YOU IMAGINED,PLEASE TELL ME ONE THING BARTLEY AT LEAST TELL ME THAT YOU BELIEVE I THOUGHT I WAS MAKING YOU HAPPY,BUT IN EGYPT THE TRADITIONS OF OUR OWN AND OTHER LANDS ARE BY US REGISTERED FOR EVER IN OUR TEMPLES,BY HIS RESURRECTION CHRIST WON THE VICTORY OVER LAW SIN FLESH WORLD DEVIL DEATH HELL AND EVERY EVIL,I LEFT INSTRUCTIONS FOR SHIPPING MY CONTAINERS OF STUFFED ANIMALS AND DRIED PLANTS TO PARIS FRANCE,OTHER SUBTLETIES OCCUR INSIDE EACH EPISODE THE TEXTURES SPARKLING WITH WIT INFORMATION AND INSIGHT,ON ARRIVING AT HOME AT MY OWN RESIDENCE I FOUND THAT OUR SALON WAS FILLED WITH A BRILLIANT COMPANY,REMEMBERING HAS TO BE A PRESENT OCCURRENCE IN SOME WAY RESEMBLING OR RELATED TO WHAT IS REMEMBERED,AND TO THINK WE CAN SAVE ALL THAT MISERY AND DESPAIR BY THE PAYMENT OF A HUNDRED AND FIFTY DOLLARS,THE HEAD AND CHIEF OF THE RIOT THE NOTTINGHAM APPRENTICE WITH CLENCHED FISTS THREATENED MONTFICHET,YOU WERE QUITE RIGHT TO SAY NO AMBROSE BEGAN NEVER SMOKE WITH JOHN JAGO HIS CIGARS WILL POISON YOU,I SWAN TO MAN HE EJACULATED IF YOU DON'T WORK HARD YOU CAN'T KEEP UP WITH THE TIMES DOCTOR OF LAWS,I SHOULD NEVER HAVE ASKED YOU IF MOLLY HAD BEEN HERE FOR I REMEMBER YOU DON'T LIKE ENGLISH COOKERY,MOREOVER HAD THE PEOPLE BEEN INCLINED TO REBELLION WHAT GREATER OPPORTUNITY COULD THEY HAVE WISHED,I WILL MAKE YOU TRANSLATE THEM INTO FRENCH AND YOU NEED NOT BE AFRAID OF MY FINDING YOU INSATIABLE,TO THOSE DUTIES YOU HAVE NOT YET BEEN CALLED AND WHEN YOU ARE YOU WILL BE LESS EAGER FOR CELEBRITY,BUT THEY HAVE NOTHING TO DO WITH THE INTERPRETATION OF PLATO AND IN SPIRIT THEY ARE OPPOSED TO HIM,WHEREVER THE MEANS OF GRACE ARE FOUND THERE IS THE HOLY CHURCH EVEN THOUGH ANTICHRIST REIGNS THERE,THE RAFT WAS HEAVED UP ON A WATERY MOUNTAIN AND PITCHED DOWN AGAIN AT A DISTANCE OF TWENTY FATHOMS,FOR ONE LONG MOMENT HE PAUSED STUPID AGAPE WITH UTTER AMAZEMENT THEN LEANED DIZZILY AGAINST A TREE,AT LAST THE COTTON COMBINE WAS TO ALL APPEARANCES AN ASSURED FACT AND HE WAS SLATED FOR THE SENATE,WHAT SHALL WE DO WITH THE MINGOES AT THE DOOR THEY COUNT SIX AND THIS SINGER IS AS GOOD AS NOTHING,IT HAS NO BEAUTY WHATSOEVER NO SPECIALTY OF PICTURESQUENESS AND ALL ITS LINES ARE CRAMPED AND POOR,I THOUGHT WE WERE STUMPED AGAIN WHEN I FIRST SAW THAT PICTURE BUT IT'S BEEN OF SOME USE AFTER ALL,THE POOR LITTLE THINGS CRIED CYNTHIA THINK OF THEM HAVING BEEN TURNED TO THE WALL ALL THESE YEARS,SHE LOOKED AT HIS HEAVY SHOULDERS AND BIG DETERMINED HEAD THRUST FORWARD LIKE A CATAPULT IN LEASH,WESTMERE AND I WERE BACK AFTER THE FIRST ACT AND WE THOUGHT SHE SEEMED QUITE UNCERTAIN OF HERSELF,THE STYLE AND PLAN OF THE TIMAEUS DIFFER GREATLY FROM THAT OF ANY OTHER OF THE PLATONIC DIALOGUES,OTHERWISE PAUL SHOULD HAVE WRITTEN GRACE FROM GOD THE FATHER AND PEACE FROM OUR LORD JESUS CHRIST,WHEN SHE USED TO TELL ME ABOUT HIM I ALWAYS WONDERED WHETHER SHE WASN'T A LITTLE IN LOVE WITH HIM,SHE WANTED A GLANCE OF THE NEW BOOKS AND PERIODICALS AND TALK OF GREAT PHILANTHROPIES AND REFORMS,DISTRUSTING HIS OWN JUDGMENT HIS APPEALS TO THE OPINION OF CHINGACHGOOK WERE FREQUENT AND EARNEST,AND THIS PLAN WAS ADOPTED TOO IN ORDER TO EXTRACT FROM ME A PROMISE THAT I WOULD DEPART IN PEACE,HOW MUCH OF EVIL OF REAL ACCOMPLISHED EVIL HAD THERE NOT OCCURRED TO ME DURING THE LAST FEW DAYS,AS HE HAD PROMISED TO PROTECT THE HOTEL THE REASSURED CITIZENS BEGAN TO LAUGH AT THEIR OWN FEARS,THE DRAG UPON HIS BEAK AND THE LIGHT CHECK UPON HIS WINGS WERE INEXPLICABLE TO HIM AND APPALLING,FAR FROM IT SIRE YOUR MAJESTY HAVING GIVEN NO DIRECTIONS ABOUT IT THE MUSICIANS HAVE RETAINED IT,HE BEGAN A CONFUSED COMPLAINT AGAINST THE WIZARD WHO HAD VANISHED BEHIND THE CURTAIN ON THE LEFT,BUT THIS SUBJECT WILL BE MORE PROPERLY DISCUSSED WHEN WE TREAT OF THE DIFFERENT RACES OF MANKIND,APPROACHING THE DINING TABLE HE CAREFULLY PLACED THE ARTICLE IN THE CENTRE AND REMOVED THE CLOTH,TO MEET THE NEEDS OF THIS CONFLICT WRETCHEDNESS HAS INVENTED A LANGUAGE OF COMBAT WHICH IS SLANG,I AM NOT GOOD ENOUGH FOR YOU AND YOU MUST BE KEPT FROM THE CONTAMINATION OF TOO INTIMATE SOCIETY,YOUR LETTER HAS GIVEN ME GREAT PLEASURE AND I SHOULD NOT FORGIVE MYSELF IF I DID NOT TELL YOU SO,THERE JAP YOU'VE CAUGHT IT LAUGHED PERCY WHILE THE OTHERS SCREAMED AT THE SIGHT OF JASPER'S FACE,I MUST COME ANOTHER DAY AND SEE YOUR HUSBAND I WANT TO HAVE A CONSULTATION WITH HIM ABOUT HORSES,THEN SHE GAVE ROSALIE BACK HER MAGIC RING THANKING THE KIND WITCH FOR ALL SHE HAD DONE FOR THEM,AS SOON AS THEY ENTERED THE ROOM OF THE GREAT KNIFE THE BOOLOOROO GAVE A YELL OF DISAPPOINTMENT,OF THIS PARTY EDWARD A BOY OF SEVENTEEN CALLED FORTH MUCH SYMPATHY HE TOO WAS CLAIMED BY HOLLAN,THE CAT GROWLED SOFTLY PICKED UP THE PRIZE IN HER JAWS AND TROTTED INTO THE BUSHES TO DEVOUR IT,SPOKE THE SQUIRE LOSING ALL PATIENCE AND IT WAS TO YOU THAT I GAVE ANOTHER PURSE IN CONSOLATION,THE STRANGE WOMAN AND HER PASSIONATE SENTENCE THAT RANG OUT SO SHARPLY HAD FRIGHTENED THEM BOTH,THE INFLUENCE WITH THE TIMAEUS HAS EXERCISED UPON POSTERITY IS DUE PARTLY TO A MISUNDERSTANDING,THERE WAS SOMETHING INDIVIDUAL ABOUT THE GREAT FARM A MOST UNUSUAL TRIMNESS AND CARE FOR DETAIL,OH SHE'S ALWAYS AT THE PIANO SAID VAN SHE MUST BE THERE NOW SOMEWHERE AND THEN SOMEBODY LAUGHED,BRAVELY AND GENEROUSLY HAS HE BATTLED IN MY BEHALF AND THIS AND MORE WILL I DARE IN HIS SERVICE,SHE WAS A LARGE HOMELY WOMAN THEY WERE COMMON WHITE PEOPLE WITH NO REPUTATION IN THE COMMUNITY,SEMON'S TWO BOOKS MENTIONED IN AN EARLIER LECTURE DO NOT TOUCH KNOWLEDGE MEMORY AT ALL CLOSELY,CAPTAIN MARTIN SAID I SHALL GIVE YOU A PISTOL TO HELP PROTECT YOURSELF IF WORSE COMES TO WORST,THERE CANNOT BE A DOUBT HE RECEIVED YOU KINDLY FOR IN FACT YOU RETURNED WITHOUT HIS PERMISSION,HE WAS SOFT HEARTED AND IMPETUOUS SAID BETH AND BEING IN LOVE HE DIDN'T STOP TO COUNT THE COST,CRIED HE WAVING THE LANTHORN BEFORE HIM TO MAKE SURE THAT THESE WERE NO GHOSTS IN FRONT OF HIM,TO RELIEVE HER FROM BOTH HE LAID HIS HAND WITH FORCE UPON HIS HEART AND SAID DO YOU BELIEVE ME,CONSUMPTION BECOMES A LARGER ELEMENT IN THE STANDARD OF LIVING IN THE CITY THAN IN THE COUNTRY,AGAINST THESE BOASTING FALSE APOSTLES PAUL BOLDLY DEFENDS HIS APOSTOLIC AUTHORITY AND MINISTRY,DO YOU SUPPOSE THAT GOD FOR THE SAKE OF A FEW LUTHERAN HERETICS WOULD DISOWN HIS ENTIRE CHURCH,OH YOU ARE THE DEAREST AND BEST MISTER KING I EVER SAW BUT HOW DID YOU MAKE MAMMY LET HER COME,HOLMES HELD OUT A SMALL CHIP WITH THE LETTERS N N AND A SPACE OF CLEAR WOOD AFTER THEM YOU SEE,YET HERE ARE WE WITHIN A SHORT RANGE OF THE SCAROONS AND NOT A SIGN OF A TRAIL HAVE WE CROSSED,I WILL SHOW YOU WHAT A GOOD JOB I DID AND SHE WENT TO A TALL CUPBOARD AND THREW OPEN THE DOORS,THE FIRST LOT WE TESTED ON OUR GLASS CAT WHICH NOT ONLY BEGAN TO LIVE BUT HAS LIVED EVER SINCE,IT SOUNDED DULL IT SOUNDED STRANGE AND ALL THE MORE SO BECAUSE OF HIS MAIN CONDITION WHICH WAS,SHE ROSE QUICKLY TO HER FEET WITH AN IMPETUOUS GESTURE THAT MADE HER VISITOR CATCH HER BREATH,AND THIS WAS WHY KENNETH AND BETH DISCOVERED HIM CONVERSING WITH THE YOUNG WOMAN IN THE BUGGY,FITZOOTH'S HAND RESTED AT LAST UPON THE TOP RUNG OF A LADDER AND SLOWLY THE TRUTH CAME TO HIM,FRIENDS SAID MONTFICHET FAINTLY TO THE WRESTLERS BEAR US ESCORT SO FAR AS THE SHERIFF'S HOUSE,CHOKING WITH EMOTION LEOCADI MADE A SIGN TO HER PARENTS THAT SHE WISHED TO BE ALONE WITH THEM,AT THAT MOMENT THE GENTLEMAN ENTERED BEARING A HUGE OBJECT CONCEALED BY A PIECE OF GREEN FELT,SHE CLOSED HER EYES AND TOOK A DEEP BREATH AS IF TO DRAW IN AGAIN THE FRAGRANCE OF THOSE DAYS,NONSENSE OF COURSE I CAN'T REALLY SING EXCEPT THE WAY MY MOTHER AND GRANDMOTHER DID BEFORE ME,SHE INTRODUCED ME TO ALL HER GUESTS AND GAVE ME SOME PARTICULARS RESPECTING EVERY ONE OF THEM,I HAD NOT VENTURED TO HOPE FOR SUCH A REPLY SO CONSIDERATE IN ITS TONE SO NOBLE IN ITS SPIRIT,WE WERE MORE INTERESTED IN THE TECHNICAL CONDITION OF THE STATION THAN IN THE COMMERCIAL PART,THERE MIGHT BE A BIT OF POETRY HERE AND THERE BUT MOST OF THIS PLACE WAS SUCH DESPERATE PROSE,THEN AS IF SATISFIED OF THEIR SAFETY THE SCOUT LEFT HIS POSITION AND SLOWLY ENTERED THE PLACE,THE PRIDE OF THAT DIM IMAGE BROUGHT BACK TO HIS MIND THE DIGNITY OF THE OFFICE HE HAD REFUSED,A GENTLE KICK FROM THE TALL BOY IN THE BENCH BEHIND URGED STEPHEN TO ASK A DIFFICULT QUESTION,THE CHAOS IN WHICH HIS ARDOUR EXTINGUISHED ITSELF WAS A COLD INDIFFERENT KNOWLEDGE OF HIMSELF,AS HE FLEW HIS DOWN REACHING CLUTCHING TALONS WERE NOT HALF A YARD ABOVE THE FUGITIVE'S HEAD,AND THE GARDENER'S BOY CHOPPED THE TREE INTO SMALL PIECES THERE WAS A WHOLE HEAP LYING THERE,I COULD NOT SEE MY BOY INJURED EXCELLENCE FOR BUT DOING HIS DUTY AS ONE OF CUMBERLAND'S SONS,SHE SIGNED TO ME WITH A GHOSTLY SOLEMNITY TO TAKE THE VACANT PLACE ON THE LEFT OF HER FATHER,TO DIMINISH THE NUMBER OF THE SHADY TO AUGMENT THE NUMBER OF THE LUMINOUS THAT IS THE OBJECT,I HAD A NAME I BELIEVE IN MY YOUNG DAYS BUT I HAVE FORGOTTEN IT SINCE I HAVE BEEN IN SERVICE,THE IDEAS ALSO REMAIN BUT THEY HAVE BECOME TYPES IN NATURE FORMS OF MEN ANIMALS BIRDS FISHES,ON SHE HURRIED UNTIL SWEEPING DOWN TO THE LAGOON AND THE ISLAND LO THE COTTON LAY BEFORE HER,CAN THESE THINGS BE RETURNED DAVID BREATHING MORE FREELY AS THE TRUTH BEGAN TO DAWN UPON HIM,A BED QUILT MADE OF PATCHES OF DIFFERENT KINDS AND COLORS OF CLOTH ALL NEATLY SEWED TOGETHER,WE ARE TRAVELING REPLIED OJO AND WE STOPPED AT YOUR HOUSE JUST TO REST AND REFRESH OURSELVES,I DID NOT MEAN SAID CAPTAIN BATTLEAX TO TOUCH UPON PUBLIC SUBJECTS AT SUCH A MOMENT AS THIS,THIS HAS INDEED BEEN A HARASSING DAY CONTINUED THE YOUNG MAN HIS EYES FIXED UPON HIS FRIEND,IF THE COUNT WERE ON BOARD A STRANGE FATALITY WAS BRINGING HIM TO THE PRESENCE OF HIS RIVAL,I FELT IT IN MY BONES WHEN I WOKE THIS MORNING THAT SOMETHING SPLENDID WAS GOING TO TURN UP,YOU WILL SAY THAT A WOMAN HAS NO NEED OF SUCH A CAUTION THERE CAN BE NO PERIL IN IT FOR HER,THE UTILITY OF CONSUMPTION AS AN EVIDENCE OF WEALTH IS TO BE CLASSED AS A DERIVATIVE GROWTH,PAUL ANSWERS THE MAN WHO IS NAMED JESUS CHRIST AND THE SON OF GOD GAVE HIMSELF FOR OUR SINS,THEY DO NOT GO WHERE THE ENEMIES OF THE GOSPEL PREDOMINATE THEY GO WHERE THE CHRISTIANS ARE,NO THANK YOU I'LL JUST LOOK AT THE WHELPS AND LEAVE A MESSAGE ABOUT THEM WITH YOUR SHEPHERD,WE HAVE OUR LITTLE STRUGGLES HERE AS ELSEWHERE AND ALL THINGS CANNOT BE DONE BY ROSE WATER,IN THE LIGHT OF THE MOON I SAW A KNIFE RED WITH BLOOD AND MY HAND TOO WAS ALSO DISCOLOURED,THEY LEFT HIM THEN FOR THE JAILER ARRIVED TO UNLOCK THE DOOR AND ESCORT THEM TO THE OFFICE,I HAVE VERY FEW TO LOVE ME NOW AND I THOUGHT YOU MIGHT LOVE ME AS I HAVE BEGUN TO LOVE YOU,YES AND WITH ALL YOUR FINGERS IT TOOK YOU A YEAR TO CATCH ME THE KING FROWNED MORE ANGRILY,IT HAS OCCUPIED MOTHER A LONG TIME TO FIND AT THE SHOPS THE EXACT SHADE FOR HER NEW BONNET,HE REFUSED AT FIRST TO LISTEN TO THE CAREFUL ADVICE IT WAS REPUGNANT TO HIS LIBERAL NATURE,THIS IS THE EXPLANATION OF THE SHALLOWS WHICH ARE FOUND IN THAT PART OF THE ATLANTIC OCEAN,MANY LAWS EXIST AMONG US WHICH ARE THE COUNTERPART OF YOURS AS THEY WERE IN THE OLDEN TIME,THE TERMS OF GRACE AND PEACE ARE COMMON TERMS WITH PAUL AND ARE NOW PRETTY WELL UNDERSTOOD,I CAN'T PLAY WITH YOU LIKE A LITTLE BOY ANY MORE HE SAID SLOWLY THAT'S WHAT YOU MISS MARIE,FRANK READ ENGLISH SLOWLY AND THE MORE HE READ ABOUT THIS DIVORCE CASE THE ANGRIER HE GREW,YOU OUGHT TO KNOW JOHN IF I TEACH NEGROES I'LL SCARCELY SEE MUCH OF PEOPLE IN MY OWN CLASS,FIND SOME CRESSWELLS THERE BIG PLANTATIONS RATED AT TWO HUNDRED AND FIFTY THOUSAND DOLLARS,WITHOUT HIS SCRAPBOOKS HIS CHEMICALS AND HIS HOMELY UNTIDINESS HE WAS AN UNCOMFORTABLE MAN,IF A LAYMAN IN GIVING BAPTISM POUR THE WATER BEFORE SAYING THE WORDS IS THE CHILD BAPTIZED,I CAN ASSURE YOU HE HAS NOT EVEN ALLOWED ME TO SEE THE TRIGGER SINCE I HAVE BEEN ON BOARD,TEN DAYS WERE CONSUMED IN THESE NEGOTIATIONS BUT THE SPIRIT OF VENGEANCE REFUSED TO YIELD,BUT THE TREE DID NOT REJOICE AT ALL HE GREW AND GREW AND WAS GREEN BOTH WINTER AND SUMMER,HE LOOKED UP AT NAOMI DOUBTINGLY FROM HIS PLATE AND LOOKED DOWN AGAIN SLOWLY WITH A FROWN,THE ONLY CHEERFUL CONVERSATION WAS THE CONVERSATION ACROSS THE TABLE BETWEEN NAOMI AND ME,YOU WOULD NOT EAT WITH US YOU CANNOT SAY NO TO HALF OF MY ALE I DRINK THIS TO YOUR HEALTH,OH IT IS BETTER TO LIVE ON THE SEA AND LET OTHER MEN RAISE YOUR CROPS AND COOK YOUR MEALS,AT TEA TIME THEY WERE SAD AND SILENT AND THE MEAL WENT AWAY UNTOUCHED BY ANY OF THE THREE,YOU SEEM ANXIOUS MY UNCLE I SAID SEEING HIM CONTINUALLY WITH HIS GLASS TO HIS EYE ANXIOUS,HE FELT HE WAS UP AGAINST IT AND THAT PERHAPS ANOTHER KIND OF A JOB WOULD SUIT HIM BETTER,GOOBERS DON'T GROW ON THE TOPS OF VINES BUT UNDERGROUND ON THE ROOTS LIKE YAMS IS THAT SO,MISS TAYLOR DID NOT KNOW MUCH ABOUT COTTON BUT AT LEAST ONE MORE REMARK SEEMED CALLED FOR,MY SCHOLAR HAS BEEN LEFT VERY POOR BUT HE IS HARD WORKING AND INDUSTRIOUS HE WILL DO WELL,THEN HE APPROACHED IT AND STANDING ON TIPTOE WITH HIS NECK CRANED HE LOOKED INTO THE ROOM,BUT IN THIS VIGNETTE COPIED FROM TURNER YOU HAVE THE TWO PRINCIPLES BROUGHT OUT PERFECTLY,HE SUMMONED HALF A DOZEN CITIZENS TO JOIN HIS POSSE WHO FOLLOWED OBEYED AND ASSISTED HIM,DOUBLE NINE TWO THREE ELSINORE DOUBLE NINE YES HALLO IS THAT YOU HORATIO HAMLET SPEAKING,WHERE THE WAVES FOR AN INSTANT SANK THEY CAME CLOSER BUT NOT QUITE WITHIN GRASPING REACH,QUICK QUICK THEN AMONG THE HIGH REED GRASS SAID MONTALAIS STOOP ATHENAIS YOU ARE SO TALL,THE GOLDEN STAR OF TINSEL WAS STILL ON THE TOP OF THE TREE AND GLITTERED IN THE SUNSHINE,MASTER MONCEUX THE SHERIFF OF NOTTINGHAM WAS MIGHTILY PUT ABOUT WHEN TOLD OF THE RIOTING,NOW BE SILENT ON YOUR LIVES HE BEGAN BUT THE CAPTURED APPRENTICE SET UP AN INSTANT SHOUT,AND SHE THREW HER ARMS ROUND HER COUSIN'S NECK AND BRAVE RACHEL AT LAST BURST INTO TEARS,PHILIP LEFRANK THIS IS MY OVERLOOKER MISTER JAGO SAID THE OLD MAN FORMALLY PRESENTING US,BUT PHILIP IS HONEST AND HE HAS TALENT ENOUGH IF HE WILL STOP SCRIBBLING TO MAKE HIS WAY,THE SALIENT FEATURES OF THIS DEVELOPMENT OF DOMESTIC SERVICE HAVE ALREADY BEEN INDICATED,SO MUCH FOR THE TITLE OF THE EPISTLE NOW FOLLOWS THE GREETING OF THE APOSTLE VERSE THREE,I SAW AT THE HAMBURG MUSEUM THE SKELETON OF ONE OF THESE CREATURES THIRTY FEET IN LENGTH,THEY DREW BACK A LITTLE FROM THE ENTRANCE AND MOTIONED TO THE SUPPOSED CONJURER TO ENTER,SHE RAN TO HER HUSBAND'S SIDE AT ONCE AND HELPED HIM LIFT THE FOUR KETTLES FROM THE FIRE,THEN THEY STARTED ON AGAIN AND TWO HOURS LATER CAME IN SIGHT OF THE HOUSE OF DOCTOR PIPT,I COULD WRITE TO MY MAN AND ENCLOSE THE KEY HE COULD SEND DOWN THE PACKET AS HE FINDS IT,LOVE IS A BABE THEN MIGHT I NOT SAY SO TO GIVE FULL GROWTH TO THAT WHICH STILL DOTH GROW,THUS NO KNOWLEDGE AS TO THE PAST IS TO BE DERIVED FROM THE FEELING OF FAMILIARITY ALONE,YES THE CHARACTER WHICH YOUR ROYAL HIGHNESS ASSUMED IS IN PERFECT HARMONY WITH YOUR OWN,THEN TURNING TO JANE SHE ASKED IN A SOMEWHAT ALTERED TONE HAS SHE BEEN A GOOD GIRL JANE,WHAT THEN A HUMAN HAND LARGE AND SHAPELY APPEARED DISTINCTLY ON THE SURFACE OF THE POND,WE'LL COME IN HERE THIS AFTERNOON WITH OLD CLOTHES ON AND HAVE A REGULAR HOUSE CLEANING,I AM NOW TALL AND MY BRANCHES SPREAD LIKE THE OTHERS THAT WERE CARRIED OFF LAST YEAR OH,RACHEL'S PALE AND SHARPENED FEATURES AND DILATED EYE STRUCK HER WITH A PAINFUL SURPRISE,A NEW MEMBER OF THE FAMILY CIRCLE WHO INSTANTLY ATTRACTED MY ATTENTION ENTERED THE ROOM,WHATEVER APPEALED TO HER SENSE OF BEAUTY WAS STRAIGHTWAY TRANSFERRED TO PAPER OR CANVAS,I WILL MAKE NO UNJUST USE OF WHAT I KNOW HE REPLIED WITH FIRMNESS I BELIEVE YOU MY LORD,EACH WILL THEREFORE SERVE ABOUT EQUALLY WELL DURING THE EARLIER STAGES OF SOCIAL GROWTH,MANY IF NOT ALL THE ELEMENTS OF THE PRE SOCRATIC PHILOSOPHY ARE INCLUDED IN THE TIMAEUS,YOU'RE A RARE UN FOR SITTING DOWN TO YOUR WORK A LITTLE WHILE AFTER IT'S TIME TO PUT BY,EVERY PLANT IN THE GRASS IS SET FORMALLY GROWS PERFECTLY AND MAY BE REALIZED COMPLETELY,I LOVE THEE WITH THE PASSION PUT TO USE IN MY OLD GRIEFS AND WITH MY CHILDHOOD'S FAITH,I LOVE THEE FREELY AS MEN STRIVE FOR RIGHT I LOVE THEE PURELY AS THEY TURN FROM PRAISE,THE COMBINED BANDS OF BOTH THE COUNTRIES PLAYED THE MUSIC AND A FINE SUPPER WAS SERVED,THEREFORE HER MAJESTY PAID NO ATTENTION TO ANYONE AND NO ONE PAID ANY ATTENTION TO HER,EVEN SO I HAD JUST RETURNED FROM AN ARDUOUS JOURNEY EXHAUSTED AND BADLY NEEDING A REST,THE NAUTILUS NEARLY PERISHES IN THE ANTARCTIC AND NEMO SINKS INTO A GROWING DEPRESSION,IN THIS CASE AS IN MOST OTHERS WHAT MAY BE TAKEN AS CERTAIN IN ADVANCE IS RATHER VAGUE,HE PASSED THROUGH HENLEY SAINT ALBANS AND CAME SO NEAR TO LONDON AS HARROW ON THE HILL,THE ONLY THING NECESSARY WAS TO FIX SETH REYNOLDS AND THIS HOPKINS ARRANGED PERSONALLY,BUT I WRESTLED WITH THIS FELLOW AND DO KNOW THAT HE PLAYED UNFAIRLY IN THE SECOND BOUT,I WAS THINKING IT'S VERY LIKE THE ACE OF HEARTS ANSWERED THE CAPTAIN SOFTLY SMILING ON,I STOOD WITH MY BACK TO THE WALL FOR I WANTED NO SWORD REACHING OUT OF THE DARK FOR ME,NOTHING WAS TO BE DONE BUT TO PUT ABOUT AND RETURN IN DISAPPOINTMENT TOWARDS THE NORTH,MY YACHT IS AT YOUR SERVICE SIR EVEN SHOULD YOU REQUIRE TO MAKE A TOUR ROUND THE WORLD,IT IS SUCH A NOBLE AMBITION THAT IT IS A PITY IT HAS USUALLY SUCH A SHALLOW FOUNDATION,BARTLEY STARTED WHEN HILDA RANG THE LITTLE BELL BESIDE HER DEAR ME WHY DID YOU DO THAT,IN THE EVENINGS I CONFESS I DO THINK BUT I NEVER TROUBLE ANY ONE ELSE WITH MY THOUGHTS,THE VICIOUS CHARACTER OF SIN IS BROUGHT OUT BY THE WORDS WHO GAVE HIMSELF FOR OUR SINS,I THINK THAT WILL DO SHE CONTINUED FOR THE OTHER QUALITIES ARE NOT NEEDED IN A SERVANT,HE DARTED LIKE AN ARROW THROUGH ALL THE HALLS DOWN ALL THE STAIRS AND ACROSS THE YARD,BUT YOU MUST NOT EAT WITH YOUR CAP ON YOUR HEAD SHE SAID AND WAS GOING TO TAKE IT OFF,THE TWIN BROTHER DID SOMETHING SHE DIDN'T LIKE AND SHE TURNED HIS PICTURE TO THE WALL,THEY REGAINED THEIR APARTMENT APPARENTLY WITHOUT DISTURBING THE HOUSEHOLD OF GAMEWELL,IN THE NATURE OF THINGS LUXURIES AND THE COMFORTS OF LIFE BELONG TO THE LEISURE CLASS,I WISH I HADN'T CRIED SO MUCH SAID ALICE AS SHE SWAM ABOUT TRYING TO FIND HER WAY OUT,A SUFFOCATING SMELL OF NITROGEN FILLS THE AIR IT ENTERS THE THROAT IT FILLS THE LUNGS,I WISH YOU WEREN'T SO RESTLESS AND DIDN'T GET SO WORKED UP OVER THINGS SHE SAID SADLY,HENCE THE EDISON ELECTROLYTIC METER IS NO LONGER USED DESPITE ITS EXCELLENT QUALITIES,WHY IF WE ERECT A STATION AT THE FALLS IT IS A GREAT ECONOMY TO GET IT UP TO THE CITY,THE MOMENT I LOOKED AT MY TABLE I WAS AWARE THAT SOMEONE HAD RUMMAGED AMONG MY PAPERS,FOR A LONG TIME HE HAD WISHED TO EXPLORE THE BEAUTIFUL LAND OF OZ IN WHICH THEY LIVED,SOMEONE ELSE TOLD A STORY NOT PARTICULARLY EFFECTIVE WHICH I SAW HE WAS NOT FOLLOWING,BUT NOW HERE IS A SUBJECT OF WHICH YOU WILL WONDER AT FIRST WHY TURNER DREW IT AT ALL,YOU GAVE ME DOUBLE FIVE I WANT DOUBLE NINE HALLO IS THAT YOU HORATIO HAMLET SPEAKING,EXQUISITE SOFT TURF OF THE WOODS THE HAPPINESS WHICH YOUR FRIENDSHIP CONFERS UPON ME,YET LITTLE AS IT WAS IT HAD ALREADY MADE A VAST DIFFERENCE IN THE ASPECT OF THE ROOM,OLD WILL IS A FINE FELLOW BUT POOR AND HELPLESS SINCE MISSUS ROGERS HAD HER ACCIDENT,THE WOOD FLAMED UP SPLENDIDLY UNDER THE LARGE BREWING COPPER AND IT SIGHED SO DEEPLY,I WOULD FAIN KNOW IF I AM DESTINED FOR SO GLORIOUS A CAREER CRIED THE TREE REJOICING,WE WILL GO OUT TOGETHER TO THE BOWER THERE IS A WAY DOWN TO THE COURT FROM MY WINDOW,FINALLY THE ONE PARTY WENT OFF EXULTING AND THE OTHER WAS LEFT IN DESOLATION AND WOE,SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS,THE MODERN ORGANIZATION OF INDUSTRY WORKS IN THE SAME DIRECTION ALSO BY ANOTHER LINE,ISN'T HE SPLENDID CRIED JASPER IN INTENSE PRIDE SWELLING UP FATHER KNEW HOW TO DO IT,HER REGARD SHIFTED TO THE GREEN STALKS AND LEAVES AGAIN AND SHE STARTED TO MOVE AWAY,WHEN WE WERE OUT IN THE DARKNESS OF THE QUADRANGLE WE AGAIN LOOKED UP AT THE WINDOWS,HE WAS STILL SUFFERING FROM THIS SUDDEN DISTURBANCE OF THE QUIET ROUTINE OF HIS LIFE,SEE THAT YOUR LIVES BE IN NOTHING WORSE THAN A BOY'S CLIMBING FOR HIS ENTANGLED KITE,WHEN CALLED BEFORE I TOLD HOW HASTILY I DROPPED MY FLOWERS OR BRAKE OFF FROM A GAME,DEPARTING FROM FIVE HUNDRED THOUSAND THROATS THREE CHEERS BURST FORTH IN SUCCESSION,THEN SAID SIR FERDINANDO THERE IS NOTHING FOR IT BUT THAT HE MUST TAKE YOU WITH HIM,THE MILITARY FORCE PARTLY RABBLE PARTLY ORGANIZED HAD MEANWHILE MOVED INTO THE TOWN,UPON THIS MADAME DEIGNED TO TURN HER EYES LANGUISHINGLY TOWARDS THE COMTE OBSERVING,TABLES WERE SPREAD ON THE LAWN AND A DAINTY BUT SUBSTANTIAL REPAST WAS TO BE SERVED,DON'T YOU KNOW ONE ABOUT BACON AND TALLOW CANDLES CAN'T YOU TELL ANY LARDER STORIES,WHEREUPON LAKE LAUGHED QUIETLY STILL LOOKING ON THE ACE OF HEARTS WITH HIS SLY EYES,AMBROSE MET ME AT THE BOTTOM OF THE STAIRS AND SHOWED ME THE WAY TO THE SUPPER ROOM,IS IT NOT IMPOSSIBLE HE MURMURED ALOUD THAT ANY CITY SHOULD DISAPPEAR SO COMPLETELY,TRUE HISTORY BEING A MIXTURE OF ALL THINGS THE TRUE HISTORIAN MINGLES IN EVERYTHING,BARTLEY BENT OVER AND TOOK HER IN HIS ARMS KISSING HER MOUTH AND HER WET TIRED EYES,THEY ASKED HIM TO COME TO SEE THEM IN CHELSEA AND THEY SPOKE VERY TENDERLY OF HILDA,AS USED IN THE SPEECH OF EVERYDAY LIFE THE WORD CARRIES AN UNDERTONE OF DEPRECATION,PAUL DECLARES THAT THE FALSE APOSTLES WERE CALLED OR SENT NEITHER BY MEN NOR BY MAN,I TAKE THIS AS MY ANSWER AND I LEAVE THE PROFESSOR TO BITE HIS LIPS WITH IMPATIENCE,I ENTERED AND I TOOK YOU INTO MY CONFIDENCE AS TO THE SUGGESTIONS OF THE SIDE TABLE,SOMETIMES IT IS CALLED A CRAZY QUILT BECAUSE THE PATCHES AND COLORS ARE SO MIXED UP,IT WASN'T SIMPLY THAT SHE SAID SO BUT THAT I KNEW SHE HADN'T I WAS SURE I COULD SEE,HE STOOD STILL IN DEFERENCE TO THEIR CALLS AND PARRIED THEIR BANTER WITH EASY WORDS,MUSSULMANS AND GIAOURS THROW KERCHIEFS AT A SMILE AND HAVE NO RUTH FOR ANY WEEPING,THIS SHE SAID WAS TRUE HOSPITALITY AND I AM NOT SURE THAT I DID NOT AGREE WITH HER,MY WIFE ON THE SPUR OF THE MOMENT MANAGED TO GIVE THE GENTLEMEN A VERY GOOD DINNER,THE FIRST OF OUR VAGUE BUT INDUBITABLE DATA IS THAT THERE IS KNOWLEDGE OF THE PAST,HE CONTINUED HIS PRETENDED SEARCH AND TO GIVE COLOR TO HIS ERRAND MADE TWO ARRESTS,LORD JOHN TAKING OUT GOLD CIGARETTE CASE FROM HIS LEFT HAND UPPER WAISTCOAT POCKET,WELL SAID MADEMOISELLE DE TONNAY CHARENTE I ALSO THINK A GOOD DEAL BUT I TAKE CARE,HERS HAPPENED TO BE IN THE SAME FRAME TOO BUT SHE EVIDENTLY DIDN'T CARE ABOUT THAT,THUS IT IS THAT THE HONOR OF THREE IS SAVED OUR COUNTRY'S OUR MASTER'S AND OUR OWN,ELIZA CLOSED THE DOOR BEHIND HER WITH A DECIDED SLAM AND A KEY CLICKED IN THE LOCK,ROBIN CAREFULLY DESCENDED THE LADDER AND FOUND HIMSELF SOON UPON FIRM ROCKY GROUND,THERE WAS NO CHANCE TO ALTER HIS SLEEPING ROOM TO ONE NEARER TO GAMEWELL'S CHAMBER,HE WAS IN DEEP CONVERSE WITH THE CLERK AND ENTERED THE HALL HOLDING HIM BY THE ARM,YOU ARE A WORTHY LEECH WILL PRESENTLY WHISPERED ROBIN THE WINE HAS WORKED A MARVEL,THIS TRANSIENT SPRING AND LIGHTING UP ARE BEAUTIFUL A GLAMOUR BEGUILING OUR SENSES,OUR FIRST IMPRESSIONS OF PEOPLE ARE IN NINE CASES OUT OF TEN THE RIGHT IMPRESSIONS,HE SHALL NOT LEAVE YOU DAY OR NIGHT WHETHER YOU ARE WORKING OR PLAYING OR SLEEPING,AND WHAT DEMONSTRATION DO YOU OFFER ASKED SERVADAC EAGERLY THAT IT WILL NOT HAPPEN,FAST AS HIS LEGS COULD CARRY HIM SERVADAC HAD MADE HIS WAY TO THE TOP OF THE CLIFF,HOW BROWN YOU'VE GOT SINCE YOU CAME HOME I WISH I HAD AN ATHLETE TO MOW MY ORCHARD,I DIDN'T HAVE ANY FEARS IF I WORKED IT RIGHTLY SAID THE OLD GENTLEMAN COMPLACENTLY,NO SIR HE ISN'T HE'S GONE TO ROSSETER TO SEE MISTER WEST THE FACTOR ABOUT THE WOOL,FOR A WHILE SHE LAY IN HER CHAIR IN HAPPY DREAMY PLEASURE AT SUN AND BIRD AND TREE,PEARL SEEING THE ROSE BUSHES BEGAN TO CRY FOR A RED ROSE AND WOULD NOT BE PACIFIED,A RING OF AMETHYST I COULD NOT WEAR HERE PLAINER TO MY SIGHT THAN THAT FIRST KISS,SCUSE ME SAID TROT I NEGLECTED TO TELL YOU THAT YOU'RE NOT THE BOOLOOROO ANY MORE,THERE WAS GOOD REASON TO STOP AND THINK EVEN FOR THE WORLD'S MOST EMOTIONLESS MAN,SUBSTANTIALLY THIS WAS JACOB'S UNVARNISHED DESCRIPTION OF HIS MASTER AND MISTRESS,SOME POINTS MAY BE TAKEN AS FIXED AND SUCH AS ANY THEORY OF MEMORY MUST ARRIVE AT,THE LEADERS OF THE CONSPIRACY BECAME DISTRUSTFUL OF THEIR POWER TO CRUSH THE TOWN,ALL ABOUT HIM WAS A TUMULT OF BRIGHT AND BROKEN COLOR SCATTERED IN BROAD SPLASHES,OH MADEMOISELLE WHY HAVE I NOT A DEVOTED SISTER OR A TRUE FRIEND SUCH AS YOURSELF,YOU HAVE COME ANDELLA ANDELLA WAS THE NAME OF JANE'S DOLL TO MAKE ROSALIE A VISIT,SOME GIRL HAS BEEN HERE TWICE TO INTERVIEW MY MEN AND I HAVE REFUSED TO ADMIT HER,AS REGARDS MY ROBBING THE COMPANY I'LL SAY THAT I SAVED THEM A HEAVY LOSS ONE DAY,THEY WERE RECEIVED IN THE LITTLE OFFICE BY A MAN NAMED MARKHAM WHO WAS THE JAILER,FAIRVIEW WAS TWELVE MILES AWAY BUT BY TEN O'CLOCK THEY DREW UP AT THE COUNTY JAIL,HE FELT FOR AND FOUND THE WIZARD'S BLACK CLOTH THE SQUIRE WAS QUITE OUT OF BREATH,I BELIEVE I HAVE A LITTLE TASTE THAT WAY THOSE ARE ALL REAL YOU KNOW THOSE JEWELS,WHAT IS YOUR COUNTRY OLAF HAVE YOU ALWAYS BEEN A THRALL THE THRALL'S EYES FLASHED,IT WAS ON THE LAST DAY OF JANUARY THAT THE REPAIRS OF THE SCHOONER WERE COMPLETED,WHAT SHE WANTED FROM US WAS NEITHER OUR FLOWERS NOR OUR FRANCS BUT JUST OUR YOUTH,I SEE A CROWD IN ONE CORNER OF THE GARDEN EVERYBODY STANDING STILL AND LOOKING UP,BUT THE REAL SIGNIFICANCE AND COMFORT OF THE WORDS FOR OUR SINS IS LOST UPON THEM,IT IS POSSIBLE THAT I MAY BE IN A POSITION THEN TO INDICATE SOME COURSE OF ACTION,THEIR ASSUMED CHARACTER CHANGED WITH THEIR CHANGING OPPORTUNITIES OR NECESSITIES,THE HAWK SAT UPON THE BRANCH AND WATCHED HIS QUARRY SWIMMING BENEATH THE SURFACE,AND ALL HIS BROTHERS AND SISTERS STOOD ROUND AND LISTENED WITH THEIR MOUTHS OPEN,WON'T YOU RUN INTO THE HOUSE AND SEE IF MARTHA CAN'T SPARE ONE OR TWO MORE MAIDS,I DIDN'T STOP TO THINK WHETHER IT WAS FOOLISH OR NOT I DID IT AND I'M GLAD I DID,SIT DOWN PLEASE SAID GATES IN A CHEERFUL AND PLEASANT VOICE THERE'S A BENCH HERE,I TOOK FIVE GREAT BRACELETS OF GOLD FROM OUR TREASURE CHEST AND GAVE THEM TO HIM,AS OUR BOAT FLASHED DOWN THE ROLLERS INTO THE WATER I MADE THIS SONG AND SANG IT,HAS THEE CONSULTED THY MOTHER ABOUT A CAREER I SUPPOSE IT IS A CAREER THEE WANTS,I HAVEN'T HAD A CHANCE YET TO TELL YOU WHAT A JOLLY LITTLE PLACE I THINK THIS IS,SHE CONSIDERED A MOMENT AND THEN SAID NO I THINK NOT THOUGH I AM GLAD YOU ASK ME,WE ARE TO HEAR CHRIST WHO HAS BEEN APPOINTED BY THE FATHER AS OUR DIVINE TEACHER,FOR A MOMENT GILCHRIST WITH UPRAISED HAND TRIED TO CONTROL HIS WRITHING FEATURES,BUT THE DUSK DEEPENING IN THE SCHOOLROOM COVERED OVER HIS THOUGHTS THE BELL RANG,THE PECULIAR CIRCUMSTANCES OF THE COLONY ARE WITHIN YOUR EXCELLENCY'S KNOWLEDGE,THEIR DISTINCTIVE CHARACTERS HOWEVER DISPLAY ONE BROAD AND UNFAILING DIFFERENCE,THE HAWK ALIGHTED ON THE DEAD BRANCH AND SAT UPRIGHT MOTIONLESS AS IF SURPRISED,SOME MYSTERIOUS FORCE SEEMED TO HAVE BROUGHT ABOUT A CONVULSION OF THE ELEMENTS,I LEFT YOU ON A CONTINENT AND HERE I HAVE THE HONOR OF FINDING YOU ON AN ISLAND,ALWAYS IRRITABLE COLD INDIFFERENT HE HAD GROWN RAPIDLY MORE SO AS YEARS WENT ON,ALL THESE HONEST PERSONS ARE WAITING THEIR TURN TO GET THEIR SNUFF BOXES FILLED,ON THE OTHER HAND WE ARE NOT TO REGARD THEM AS SO TERRIBLE THAT WE MUST DESPAIR,PAUL TAKES PRIDE IN HIS MINISTRY NOT TO HIS OWN PRAISE BUT TO THE PRAISE OF GOD,MARY TAYLOR HOWEVER RELATED THE TALE OF ZORA TO MISSUS GREY'S PRIVATE EAR LATER,THAT IS ONE REASON YOU ARE OJO THE UNLUCKY SAID THE WOMAN IN A SYMPATHETIC TONE,SO I RETURN REBUK'D TO MY CONTENT AND GAIN BY ILL THRICE MORE THAN I HAVE SPENT,STEPHEN'S HEART BEGAN SLOWLY TO FOLD AND FADE WITH FEAR LIKE A WITHERING FLOWER,OUR BAGGAGE WAS IMMEDIATELY CARRIED TO THE DECK OF THE FRIGATE I RUSHED ABOARD,THIS WAS A FORMIDABLE ARRAY OF ADVANTAGES SLAVERY WAS PLAYING WITH LOADED DICE,FOR LIKE AS NOT THEY MUST HAVE THOUGHT HIM A PRINCE WHEN THEY SAW HIS FINE CAP,THEY ARE CHIEFLY FORMED FROM COMBINATIONS OF THE IMPRESSIONS MADE IN CHILDHOOD,CONGRATULATIONS WERE POURED IN UPON THE PRINCESS EVERYWHERE DURING HER JOURNEY,NAY WE REFUSED THEIR REQUEST MOST POLITELY MOST NOBLE SAID THE LITTLE STROLLER,TO MY MIND THERE HAS ALWAYS BEEN SOMETHING INEXPRESSIBLY AWFUL IN FAMILY FEUDS,I'M GLAD YOU LIKE IT SAYS WYLDER CHUCKLING BENIGNANTLY ON IT OVER HIS SHOULDER,I AM STIFF WITH LONG SITTING HE SAID I ITCH FOR A FIGHT I TURNED TO THE FARMER,ONCE IN ACTION HE WAS LEADING A DETACHMENT OF INFANTRY THROUGH AN INTRENCHMENT,DO WE REALLY KNOW THE MOUNTAIN WELL WHEN WE ARE NOT ACQUAINTED WITH THE CAVERN,A WORD SHOULD NOW BE SAID ABOUT THE ORIGIN OF LUTHER'S COMMENTARY ON GALATIANS,THAT'S THE WAY WITH YOU THAT'S THE ROAD YOU'D ALL LIKE TO GO HEADLONGS TO RUIN,A SUDDEN IMPULSE CAME OVER HIM TO ENTER AND SEE IF THEY WERE INDEED THE PROOFS,I DARE NOT GO SO FAR AS THAT BUT OF THE THREE HE IS PERHAPS THE LEAST UNLIKELY,CHINGACHGOOK HAD CAUGHT THE LOOK AND MOTIONING WITH HIS HAND HE BADE HIM SPEAK,IT WAS THE SCARLET LETTER IN ANOTHER FORM THE SCARLET LETTER ENDOWED WITH LIFE,SOME IMAGES LIKE SOME SENSATIONS FEEL VERY FAMILIAR WHILE OTHERS FEEL STRANGE,HE STILL HELD ON TO IT WITH BOTH HANDS AS HE RUSHED INTO HIS MOTHER'S COTTAGE,A LITTLE BIT OF PLASTER TUMBLED DOWN THE CHIMNEY AND STARTLED ME CONFOUNDEDLY,THEN I WILL GET ME A FARM AND WILL WINTER IN THAT LAND NOW WHO WILL FOLLOW ME,SHE'S OLDER THAN I AM BUT SO TINY AND SAD AND SHY THAT SHE SEEMS LIKE A CHILD,IT WAS VERY JOLLY HE MURMURED LAZILY AS MARIE CAME IN TO TAKE AWAY THE COFFEE,IN A GENERAL WAY THOUGH NOT WHOLLY NOR CONSISTENTLY THESE TWO GROUPS COINCIDE,IS THE ATMOSPHERIC CONDITION HAVING ONCE REACHED THIS DENSITY TO BECOME FINAL,HE PANTED TO KNOW IF SHE TOO KNEW OR KNEW AND CARED NOT OR CARED AND KNEW NOT,THE OTHERS RESENTED POSTPONEMENT BUT IT WAS JUST HIS SCRUPLES THAT CHARMED ME,I THANK ALL WHO HAVE LOVED ME IN THEIR HEARTS WITH THANKS AND LOVE FROM MINE,AND I HAVE NO ONE READY TO WHOM I CAN GIVE UP THE ARCHIVES OF THE GOVERNMENT,RE ENTER BUTLER AND THREE FOOTMEN WHO REMOVE THE TEA THINGS HOSTESS TO GUEST,LEND ME YOUR EAR FOR TEN MINUTES AND YOU SHALL LEARN JUST WHAT STAGECRAFT IS,IT MIGHT HAVE SEEMED THAT A TROUT OF THIS SIZE WAS A FAIRLY SUBSTANTIAL MEAL,GENTLEMEN TO YOUR POSTS WHEREUPON SAINT AIGNAN AND VILLEROY TOOK THEIR LEAVE,IT DID NOT BECKON OR INDEED MOVE AT ALL IT WAS AS STILL AS THE HAND OF DEATH,I WAS BOOKKEEPER SO IT WAS EASY TO GET A BLANK CHECK AND FORGE THE SIGNATURE,I'M RUNNING FOR REPRESENTATIVE ON THE REPUBLICAN TICKET SAID KENNETH QUIETLY,BUT IN SUCH A CASE MISS MILNER'S ELECTION OF A HUSBAND SHALL NOT DIRECT MINE,TO TEACH READING MEANS TO LIGHT THE FIRE EVERY SYLLABLE SPELLED OUT SPARKLES,GRACE BE TO YOU AND PEACE FROM GOD THE FATHER AND FROM OUR LORD JESUS CHRIST,IT'LL BE NO USE THEIR PUTTING THEIR HEADS DOWN AND SAYING COME UP AGAIN DEAR,NO NO NO TOTTY UD GET HER FEET WET SAID MISSUS POYSER CARRYING AWAY HER IRON,WELL WHAT CAN'T BE DONE BY MAIN COURAGE IN WAR MUST BE DONE BY CIRCUMVENTION,BUT THE BEAR INSTEAD OF OBEYING MAINTAINED THE SEAT IT HAD TAKEN AND GROWLED,MOST PEOPLE TALK TOO MUCH SO IT IS A RELIEF TO FIND ONE WHO TALKS TOO LITTLE,AT THE EMERALD CITY WHERE OUR PRINCESS OZMA LIVES GREEN IS THE POPULAR COLOR,THAT A STYLE IS RESTRAINED OR SEVERE DOES NOT MEAN THAT IT IS ALSO ERRONEOUS,FOR A FULL HOUR HE HAD PACED UP AND DOWN WAITING BUT HE COULD WAIT NO LONGER,WE SAT WITH THE OFFICERS SOME LITTLE TIME AFTER DINNER AND THEN WENT ASHORE,ONCE FAIRLY A WING HOWEVER HE WHEELED AND MADE BACK HURRIEDLY FOR HIS PERCH,IT IS TOO DIFFICULT REPLIED MADEMOISELLE DE TONNAY CHARENTE LAUGHING LOUDLY,THEN SHE GAVE A LITTLE LAUGH AND REPLIED NO MISS BETH I'M ELIZABETH PARSONS,WE HAVE HEARD SOMETHING OF YOUR STORY SAID KENNETH AND ARE INTERESTED IN IT,WHY ONE MORNING THERE CAME A QUANTITY OF PEOPLE AND SET TO WORK IN THE LOFT,IN AUTUMN THE WOOD CUTTERS ALWAYS CAME AND FELLED SOME OF THE LARGEST TREES,AND HE MADE A LITTLE DIP OF HIS CANE TOWARDS BRANDON HALL OVER HIS SHOULDER,ALL THE TIME HE WAS TALKING TO ME HIS ANGRY LITTLE EYES WERE FOLLOWING LAKE,DO YOU KNOW LAKE OH I REALLY CAN'T TELL BUT HE'LL SOON TIRE OF COUNTRY LIFE,MEANWHILE RODOLFO HAD LEOCADIA SAFE IN HIS CUSTODY AND IN HIS OWN APARTMENT,A MORE DREARY AND MORE DISUNITED FAMILY PARTY I NEVER SAT AT THE TABLE WITH,NO CATHEDRAL NOT EVEN BURGOS ITSELF COULD VIE WITH THE CHURCH AT MONTMARTRE,RUTH SAT QUITE STILL FOR A TIME WITH FACE INTENT AND FLUSHED IT WAS OUT NOW,IS THY FATHER WILLING THEE SHOULD GO AWAY TO A SCHOOL OF THE WORLD'S PEOPLE,THE WORLD IS ALL THERE JUST AS IT USED TO BE BUT I CAN'T GET AT IT ANY MORE,DO YOU KNOW I THOUGHT THE DANCE A BIT CONSCIOUS TO NIGHT FOR THE FIRST TIME,I SIT DOWN AT A SMALL TABLE A WAITER COMES IMMEDIATELY TO ENQUIRE MY WISHES,THERE IS EVEN A WHITE ROW OF BEEHIVES IN THE ORCHARD UNDER THE WALNUT TREES,BUT CRESSWELL ADDED SIGNIFICANTLY CAPACITY DIFFERS ENORMOUSLY BETWEEN RACES,WELL WELL DON'T TROUBLE TO ANSWER LISTEN AND SEE THAT I DO YOU NO INJUSTICE,AS A MATTER OF FACT HE COULD NOT SAID SOAMES FOR I ENTERED BY THE SIDE DOOR,THE HAIR WAS OF BROWN YARN AND HUNG DOWN ON HER NECK IN SEVERAL NEAT BRAIDS,PLEASE FORGIVE ME FOR THIS UNDERHANDED WAY OF ADMITTING I HAD TURNED FORTY,MONSIEUR WAS THE ONLY ONE WHO DID NOT UNDERSTAND ANYTHING ABOUT THE MATTER,AND MY POCKET MONEY IS GETTING LOW AGAIN AND YOU HAVEN'T ANY LEFT AS USUAL,THEY THEY EXCITE ME IN SOME WAY AND I I CAN'T BEAR THEM YOU MUST EXCUSE ME,YOU SPEAK LIKE AN EDUCATED PERSON SAID BETH WONDERINGLY WHERE IS YOUR HOME,THE HOURS PASSED WEARILY BY AND MOVEMENT COULD YET BE HEARD ABOUT THE HALL,AT THE PROW I CARVED THE HEAD WITH OPEN MOUTH AND FORKED TONGUE THRUST OUT,HE SEEMED BORN TO PLEASE WITHOUT BEING CONSCIOUS OF THE POWER HE POSSESSED,HE MENTIONS THE APOSTLES FIRST BECAUSE THEY WERE APPOINTED DIRECTLY BY GOD,A BRISK WIND HAD COME UP AND WAS DRIVING PUFFY WHITE CLOUDS ACROSS THE SKY,HE DARTED THROUGH THE TREES AND PAUSED A TALL MAN STRONGLY BUT SLIMLY MADE,JOHN TAYLOR WHO HAD SUPPORTED HER THROUGH COLLEGE WAS INTERESTED IN COTTON,WHEN THEY WERE OUTSIDE UNC SIMPLY LATCHED THE DOOR AND STARTED UP THE PATH,YET THESE THOUGHTS AFFECTED HESTER PRYNNE LESS WITH HOPE THAN APPREHENSION,THE KING STOOD UP AND CALLED FOR THAT PSALM WHICH BEGINS WITH THESE WORDS,GOOD GRACIOUS HAS THE KING ANY RIGHT TO INTERFERE IN MATTERS OF THAT KIND,OH LET HIM COME ALONG SHE URGED I DO LOVE TO SEE HIM ABOUT THAT OLD HOUSE,HE MIGHT HAVE HAD THAT FORGED CHECK FOR THE FACE OF IT IF HE'D BEEN SHARP,THESE ESCAPADES ARE NOT FOR OLD GAMEWELL LAD HIS DAY HAS COME TO TWILIGHT,THERE IS HARDLY ONE DAY OUT OF A HUNDRED WHICH IS WHOLLY JOYOUS AND SUNNY,WHEN DID YOU COME BARTLEY AND HOW DID IT HAPPEN YOU HAVEN'T SPOKEN A WORD,I THOUGHT IT MIGHT BE SISTER KATE OR COUSIN MIKE WOULD BE HAPPENING ALONG,I SHALL BE PUNISHED FOR IT NOW I SUPPOSE BY BEING DROWNED IN MY OWN TEARS,THE SHADOW OF THE RAFT WAS CLEARLY OUTLINED UPON THE SURFACE OF THE WAVES,BUT THE PLANT RAN AND IT WAS THE FIRST THREE WIRE STATION IN THIS COUNTRY,THE SQUARES OF COTTON SHARP EDGED HEAVY WERE JUST ABOUT TO BURST TO BOLLS,THE MAN ENTERED AND TOOK THE PAPERS SHEET BY SHEET FROM THE CENTRAL TABLE,HOTEL A PLACE WHERE A GUEST OFTEN GIVES UP GOOD DOLLARS FOR POOR QUARTERS,I EXPECT YOU HAVE BEEN A VERY GOOD GIRL ANDELLA SINCE YOU WERE HERE LAST,TO GIVE AN IDEA OF THESE CONVERSATIONS I WILL REPORT ONE OF THEM IN FULL,WE OUGHT TO HAVE MORE ATTENDANTS BETH SAID LOUISE APPROACHING HER COUSIN,IT WAS BETTER FOR HIM TO THINK THE GIRL UNFEELING THAN TO KNOW THE TRUTH,BUT UNDER THE CIRCUMSTANCES I DOUBT IF SUCH AN ARRANGEMENT COULD BE MADE,SOFT HEART HE SAID GENTLY TO HER THEN TO THORKEL WELL LET HIM GO THORKEL,WELL MOTHER SAID THE YOUNG STUDENT LOOKING UP WITH A SHADE OF IMPATIENCE,THE ARMY FOUND THE PEOPLE IN POVERTY AND LEFT THEM IN COMPARATIVE WEALTH,AND WHAT WAS THE SUBJECT OF THE POEM SAID THE PERSON WHO MADE THE REMARK,UNDERSCORE THESE WORDS FOR THEY ARE FULL OF COMFORT FOR SORE CONSCIENCES,IT'S EXCITING TO SEE EVERYTHING GROWING SO FAST AND TO GET THE GRASS CUT,BY THE BY I'VE NEVER SEEN YOUR DAIRY I MUST SEE YOUR DAIRY MISSUS POYSER,IT WAS THE INDIAN WHOSE DARK SILHOUETTE APPEARED SUDDENLY UPON HIS BLIND,DID ANYONE KNOW THAT THESE PROOFS WOULD BE THERE NO ONE SAVE THE PRINTER,THIS WAS WHAT DID THE MISCHIEF SO FAR AS THE RUNNING AWAY WAS CONCERNED,HIS CONDUCT AND PRESENCE OF MIND IN THIS EMERGENCE APPEARED CONSPICUOUS,SHE THEN ROSE HUMMING THE AIR TO WHICH SHE WAS PRESENTLY GOING TO DANCE,IT WAS A DELIBERATE THEFT FROM HIS EMPLOYERS TO PROTECT A GIRL HE LOVED,SERVADAC TOOK IT FOR GRANTED THAT THE DOBRYNA WAS ENDEAVORING TO PUT IN,EXCLAIMED BILL HARMON TO HIS WIFE AS THEY WENT THROUGH THE LIGHTED HALL,MY LORD MISS MILNER'S TASTE IS NOT A DEPRAVED ONE IT IS BUT TOO REFINED,WHY SHOULD I RUST AND BE STUPID AND SIT IN INACTION BECAUSE I AM A GIRL,IN THIS WORLD EVIDENTLY THE VESTIBULE OF ANOTHER THERE ARE NO FORTUNATE,OH WHAT A RECORD TO READ WHAT A PICTURE TO GAZE UPON HOW AWFUL THE FACT,I THOUGHT IT THEREFORE MY DUTY WHEN I LEFT SCHOOL TO BECOME A GOVERNESS,BUT I WOULD NOT SPEAK AT THE TIME BECAUSE I WANTED TO REFRESH MY MEMORY,THE MOST FAMOUS OF THEM ALL WAS THE OVERTHROW OF THE ISLAND OF ATLANTIS,THAT WON'T LAST IT WILL GO AWAY AND THINGS WILL BE JUST AS THEY USED TO,THEY THINK YOU'RE PROUD BECAUSE YOU'VE BEEN AWAY TO SCHOOL OR SOMETHING,THAT'S NOT MUCH OF A JOB FOR AN ATHLETE HERE I'VE BEEN TO TOWN AND BACK,I KNOW GASPED POLLY CONTROLLING HER SOBS I WON'T ONLY I CAN'T THANK YOU,THE PARIS PLANT LIKE THAT AT THE CRYSTAL PALACE WAS A TEMPORARY EXHIBIT,I THINK I SHOULD BE DOING YOU A SERVICE TO TURN YOU OUT OF SUCH A PLACE,HOLMES TURNED AWAY AND STOOPED SUDDENLY TO THE FLOOR HALLOA WHAT'S THIS,HORSE SENSE A DEGREE OF WISDOM THAT KEEPS ONE FROM BETTING ON THE RACES,WHOSE FEET ARE AS THE FEET OF HARTS AND UNDERNEATH THE EVERLASTING ARMS,THE RECTOR PAUSED AND THEN SHAKING HIS CLASPED HANDS BEFORE HIM WENT ON,BUT AT THIS POINT IN THE RAPIDS IT WAS IMPOSSIBLE FOR HIM TO STAY DOWN,THE GREAT HAWK FOLLOWED HURRIEDLY TO RETRIEVE HIS PREY FROM THE GROUND,HE WAS SUCH A BIG BOY THAT HE WORE HIGH BOOTS AND CARRIED A JACK KNIFE,WILL YOU LEAVE ME ALONE IN MY OWN ROOM OR MUST I GO AWAY TO ESCAPE YOU,HE SPOKE SIMPLY BUT PACED UP AND DOWN THE NARROW CELL IN FRONT OF THEM,AS ANY IN ENGLAND I WOULD SAY SAID GAMEWELL PROUDLY THAT IS IN HIS DAY,IT IS ENOUGH SAID GEORGE GAMEWELL SHARPLY AND HE TURNED UPON THE CROWD,BEFORE THEM FLED THE STROLLER AND HIS THREE SONS CAPLESS AND TERRIFIED,HE IS NOT WELL HE HAS COME OVER THE OCEAN FOR REST AND CHANGE OF SCENE,IT WAS SO DARK THAT I COULD SEE NOTHING BUT A FEW SPARKS ON THE HEARTH,WHY IT'S IN MISSOURI SOMEWHERE ON THE FRONTIER I THINK WE'LL GET A MAP,HE FELT A TREMOR RUN THROUGH THE SLENDER YELLOW FIGURE IN FRONT OF HIM,I AM NOT DEPRECIATING IT WHEN I SAY THAT IN THESE TIMES IT IS NOT RARE,THE LIVERY BECOMES OBNOXIOUS TO NEARLY ALL WHO ARE REQUIRED TO WEAR IT,TELL US SAID THE OTHER THE WHOLE STORY AND WHERE SOLON HEARD THE STORY,I AM NOT COMPLAINING THAT THE RATE IS SLOW BUT THAT THE SEA IS SO WIDE,HOLMES HELD IT OUT ON HIS OPEN PALM IN THE GLARE OF THE ELECTRIC LIGHT,I HAD TO READ IT OVER CAREFULLY AS THE TEXT MUST BE ABSOLUTELY CORRECT,UNCAS CAST HIS SKIN AND STEPPED FORTH IN HIS OWN BEAUTIFUL PROPORTIONS,HAY FEVER A HEART TROUBLE CAUSED BY FALLING IN LOVE WITH A GRASS WIDOW,YOU SEE MY FRIEND IT'S AN ISSUE OF THE MONSTER THE NOTORIOUS NARWHALE,ANYHOW WE'LL LEAVE INSTRUCTIONS TO SHIP THE WHOLE MENAGERIE TO FRANCE,YOU WILL ALLOW ME TO SUGGEST SAID HE THAT THAT IS A MATTER OF OPINION,DELLA HAD A YOUNG SISTER NAMED MARIA AND A COUSIN WHOSE NAME WAS JANE,THIS THOUGHT HOWEVER DID NOT ENTER THE HEADS OF THE ENTHUSIASTIC PAIR,AND THEN THEY BECAME VEXED AND WOULD HAVE SNATCHED YOUR PURSE FROM US,AND THEN YOU CAME BACK NOT CARING VERY MUCH BUT IT MADE NO DIFFERENCE,YOU SEE LOVING SOME ONE AS I LOVE YOU MAKES THE WHOLE WORLD DIFFERENT,HILDA'S FACE QUIVERED BUT SHE WHISPERED YES I THINK IT MUST HAVE BEEN,ALREADY A NORTH AND A SOUTH WERE TALKED OF WHY NOT SET UP ALSO A WEST,THEIR SUFFERINGS HAVE NEVER YET BEEN FITLY CHRONICLED BY HUMAN SCRIBE,WHEN I WAS A YOUNG MAN I THOUGHT PAUL WAS MAKING TOO MUCH OF HIS CALL,SATURDAY AUGUST FIFTEENTH THE SEA UNBROKEN ALL ROUND NO LAND IN SIGHT,ABOVE ALL THINGS I DESIRE TO SETTLE THE MATTER QUIETLY AND DISCREETLY,THE DELAWARES ARE CHILDREN OF THE TORTOISE AND THEY OUTSTRIP THE DEER,TO THIS HIS ANSWER WAS PROMPT OH THANK GOD NO AND IS THE RECORD YOURS,IF HE TO KEEP ONE OATH MUST LOSE ONE JOY BY HIS LIFE'S STAR FORETOLD,COULD IT MEAN TO LAST A LOVE SET PENDULOUS BETWEEN SORROW AND SORROW,OVER THE TRACK LINED CITY STREET THE YOUNG MEN THE GRINNING MEN PASS,YOU HEAR WHAT SIR FERDINANDO BROWN HAS SAID REPLIED CAPTAIN BATTLEAX,THE DUCHESS OF SOUTHBRIDGE TO LORD REGGIE OH REGGIE WHAT DID YOU SAY,A STORY CRIED THE CHILDREN DRAWING A LITTLE FAT MAN TOWARDS THE TREE,RIGHT WILLINGLY FOR BETWEEN US WE HAVE WON THE BATTLE ANSWERED ROBIN,TIS FINE FOR YOU TO TALK OLD MAN ANSWERED THE LEAN SULLEN APPRENTICE,WHAT OF THE FARM OLAF NOT YET I ANSWERED VIKING IS BETTER FOR SUMMER,NEVER MIND NOW INTERPOSED THE CAPTAIN WE WILL TALK OF THAT BY AND BY,THERE IS THE SLANG OF THE AFFECTED LADY AS WELL AS OF THE PRECIEUSES,IT'S BEEN ON ONLY TWO WEEKS AND I'VE BEEN HALF A DOZEN TIMES ALREADY,THIS PASSAGE THEN BEARS OUT THE FACT THAT ALL MEN ARE SOLD UNDER SIN,NOT GOLD OR SILVER OR PASCHAL LAMBS OR AN ANGEL BUT HIMSELF WHAT FOR,THEY SAID TO THE GALATIANS YOU HAVE NO RIGHT TO THINK HIGHLY OF PAUL,THERE'S A HEAVY STORM COMING ON I CRIED POINTING TOWARDS THE HORIZON,THOSE HUGE CREATURES ATTACKED EACH OTHER WITH THE GREATEST ANIMOSITY,I LIKE TO TALK TO CARL ABOUT NEW YORK AND WHAT A FELLOW CAN DO THERE,SHE ASKED IMPULSIVELY I DIDN'T BELIEVE YOU COULD PERSUADE HER FATHER,OH SIR SAID MISSUS POYSER RATHER ALARMED YOU WOULDN'T LIKE IT AT ALL,I WILL TAKE THE BLACK CLAY WITH ME ALSO THE PENCIL CUTTINGS GOOD BYE,SLOW TO WORLD GREETINGS QUICK WITH ITS O LIST WHEN THE ANGELS SPEAK,YES WE ARE CERTAINLY I REPLIED EVASIVELY BUT AFTER WE MAKE A DETOUR,NOT ONCE DID HE COMMENT ON THE LENGTH OR THE HARDSHIPS OF A JOURNEY,THEY SAY ILLUMINATION BY CANDLE LIGHT IS THE PRETTIEST IN THE WORLD,THE SQUIRE HELPED TO THRUST THEM ALL IN AND ENTERED SWIFTLY HIMSELF,SHAME ON YOU CITIZENS CRIED HE I BLUSH FOR MY FELLOWS OF NOTTINGHAM,THIS WAS SO SWEET A LADY SIR AND IN SOME MANNER I DO THINK SHE DIED,YOU RESEMBLE ME RACHEL YOU ARE FEARLESS AND INFLEXIBLE AND GENEROUS,SO I WILL GIVE OUT THIS LAW THAT MY MEN SHALL NEVER LEAVE YOU ALONE,TWO HUNDRED WARRIORS FEASTED IN HIS HALL AND FOLLOWED HIM TO BATTLE,I SAY SIR HARRY THE LITTLE GIRL'S GOING FAMOUSLY TO NIGHT ISN'T SHE,I CANNOT DENY MYSELF THE GRATIFICATION OF INSERTING SOUTHEY'S REPLY,BUT THE GENERAL DISTINCTION IS NOT ON THAT ACCOUNT TO BE OVERLOOKED,THE ATMOSPHERE IS EVIDENTLY CHARGED AND SURCHARGED WITH ELECTRICITY,IT MUST BE AS WIDE AS THE MEDITERRANEAN OR THE ATLANTIC AND WHY NOT,SUDDENLY HE HEARD HIM AT THE VERY DOOR THERE WAS NO POSSIBLE ESCAPE,MISTER SOAMES WAS SOMEWHAT OVERWHELMED BY THIS FLOOD OF INFORMATION,THE BEAR SHOOK HIS SHAGGY SIDES AND THEN A WELL KNOWN VOICE REPLIED,IT CAN'T HURT ANYTHING I'M SURE FOR WE WON'T DISTURB THINGS AT ALL,FROM THE BLACKNESS BEHIND THE LIGHT THEY HEARD A VOICE WARRENTON'S,THE WINE DID CERTAINLY BRING BACK THE COLOR TO THE SQUIRE'S CHEEKS,A COLD BRIGHT MOON WAS SHINING WITH CLEAR SHARP LIGHTS AND SHADOWS,THE FLOOR MORE THAN ANYTHING ELSE SHOWED THE GREAT AGE OF THE ROOM,BUT DON'T THESE VERY WISE THINGS SOMETIMES TURN OUT VERY FOOLISHLY,IT WAS ONE OF THE MASTERLY AND CHARMING STORIES OF DUMAS THE ELDER,SO I LIVED AND NOW AM YOUR TOOTH THRALL WELL IT IS THE LUCK OF WAR,YOUR FATHER THOUGHT A MOMENT THEN LOOKED AT YOUR MOTHER AND SMILED,SHE IS UNDER SAIL BUT SHE IS COUNT TIMASCHEFF'S YACHT HE WAS RIGHT,THIS WITHOUT RECKONING IN THE PAINS OF THE HEART AND SO IT GOES ON,IT'S NOT PARTICULARLY RARE SHE SAID BUT SOME OF IT WAS MY MOTHER'S,SHE MUST CARE ABOUT THE THEATRE A GREAT DEAL MORE THAN SHE USED TO,HE CALLED THIS SEA A POND AND OUR LONG VOYAGE TAKING A LITTLE SAIL,I GET TIRED OF SEEING MEN AND HORSES GOING UP AND DOWN UP AND DOWN,PEARL SAW AND GAZED INTENTLY BUT NEVER SOUGHT TO MAKE ACQUAINTANCE,THAT IS ALL QUITE TRUE MISTER NEVERBEND SAID SIR FERDINANDO BROWN,THIS KNOWLEDGE IS MEMORY IN ONE SENSE THOUGH IN ANOTHER IT IS NOT,THE PARLIAMENT AND THE SCOTS LAID THEIR PROPOSALS BEFORE THE KING,THE YOUNG GIRLS HAD INDEED MADE THEMSELVES SMALL INDEED INVISIBLE,I ATTEND TO THE HOUSEHOLD MENDING YOU KNOW AND CARE FOR THE LINEN,ROBIN WAS GLAD WHEN AT LENGTH THEY WERE LEFT TO THEIR OWN DEVICES,MARK MY WORDS YOU'LL FIND HIM TOO STRONG FOR YOU AYE AND TOO DEEP,IT IS THE ONLY AMENDS I ASK OF YOU FOR THE WRONG YOU HAVE DONE ME,HE KEEPS THE THOU SHALT NOT COMMANDMENTS FIRST RATE HEN LORD DOES,HE SEEMED TO WAIT FOR HER REPLY BUT AS SHE MADE NONE HE PROCEEDED,GRACE INVOLVES THE REMISSION OF SINS PEACE AND A HAPPY CONSCIENCE,IN EVERY WAY THEY SOUGHT TO UNDERMINE THE AUTHORITY OF SAINT PAUL,NO I'VE MADE UP MY MIND ABOUT IT IF I'M MABEL I'LL STAY DOWN HERE,I REFER TO THE THERMOMETER IT INDICATES THE FIGURE IS OBLITERATED,COTTON IS A WONDERFUL THING IS IT NOT BOYS SHE SAID RATHER PRIMLY,IT WOULD HAVE BEEN MORE WONDERFUL HAD HE SPOKEN WITHOUT A BIDDING,WE HAVE COME FROM A FAR LONELIER PLACE THAN THIS A LONELIER PLACE,MISSUS GRIFFIN HOWEVER EXPRESSED THE NEED FOR A LITTLE MORE LIGHT,IN THE SILENCE THEIR DARK FIRE KINDLED THE DUSK INTO A TAWNY GLOW,THE CLOUD THEN SHEWD HIS GOLDEN HEAD AND HIS BRIGHT FORM EMERG'D,LIKE THE DOVES VOICE LIKE TRANSIENT DAY LIKE MUSIC IN THE AIR AH,I'LL NOT BE WICKED ANY MORE SIGHED THE OLD BOOLOOROO I'LL REFORM,IN PERSON WELCOME ABOARD PROFESSOR YOUR CABIN IS WAITING FOR YOU,SEVERAL HUNDRED FREE STATE MEN PROMPTLY RESPONDED TO THE SUMMONS,IT IS NECESSARY THEREFORE THAT HE SHOULD COMPLY THE KING FROWNED,THE SOMBRE OLD TREES LIKE GIGANTIC HEARSE PLUMES BLACK AND AWFUL,DON'T INSULT ME STANLEY BY TALKING AGAIN AS YOU DID THIS MORNING,UP AND DOWN THE WATER WE WENT TO GET MUCH WEALTH AND MUCH FROLIC,WOULD NOT THE LOFTIEST EMINENCES OF THE CITY AT LEAST BE VISIBLE,AND IF I HAD A FORTUNE WOULD THEE WANT ME TO LEAD A USELESS LIFE,TO BURN WITHOUT CEASING TO FLY THEREIN LIES THE MARVEL OF GENIUS,ALEXANDER ROSE AND SHOOK HIMSELF ANGRILY YES I KNOW I'M COWARDLY,THE GREATNESS OF THE RANSOM CHRIST THE SON OF GOD INDICATES THIS,AT THE SAME TIME PAUL CONFIRMS OUR CREED THAT CHRIST IS VERY GOD,AS FOR THE ICHTHYOSAURUS HAS HE RETURNED TO HIS SUBMARINE CAVERN,I PRAY FOR YOU BUT THAT'S NOT THE SAME AS IF YOU PRAYED YOURSELF,FOR IF HE'S ANYWHERE ON THE FARM WE CAN SEND FOR HIM IN A MINUTE,MUNNY I TOULD IKE TO DO INTO DE BARN TO TOMMY TO SEE DE WHITTAWD,I SUPPOSE THOUGH IT'S TOO EARLY FOR THEM THEN CAME THE EXPLOSION,SHE HAD ALMOST FORGOTTEN THAT IT WAS HERE WITHIN TOUCH AND SIGHT,THE YOUNG MAN IS IN BONDAGE AND MUCH I FEAR HIS DEATH IS DECREED,ON FRIDAY CONFESSION WILL BE HEARD ALL THE AFTERNOON AFTER BEADS,SHE CEASD AND SMILD IN TEARS THEN SAT DOWN IN HER SILVER SHRINE,BUT CAP'N BILL MADE NO SUCH ATTEMPT KNOWING IT WOULD BE USELESS,STRAIGHTWAY THE HAWK GLIDED FROM HIS PERCH AND DARTED AFTER HIM,I HAD AGAIN BEEN ACTING UNDER THE INFLUENCE OF THIS MAN'S POWER,HE LOOKED UP RATHER UNGRACIOUSLY BUT MOTIONED THEM TO BE SEATED,PERHAPS THE OTHER TREES FROM THE FOREST WILL COME TO LOOK AT ME,AND TOWARDS CHRISTMAS HE WAS ONE OF THE FIRST THAT WAS CUT DOWN,WILL WHISPERED ROBIN OPENING HIS DOOR AS HE SPOKE ARE YOU READY,TAKE YOUR PLACE AND LET US SEE WHAT THE CRYSTAL CAN SHOW TO YOU,BY THE BEARD OF ODIN I CRIED YOU HAVE TAKEN OUR JOKE LIKE A MAN,ON A BENCH IN A FAR CORNER WERE A DOZEN PEOPLE HUDDLED TOGETHER,IS THEE GOING TO THE YEARLY MEETING RUTH ASKED ONE OF THE GIRLS,MARGARET BOLTON ALMOST LOST FOR A MOMENT HER HABITUAL PLACIDITY,DON'T I THOUGH I'M SO SORRY TO HEAR IT HOW DID HER SON TURN OUT,THIS SHOULD GO FAR IN SHUTTING THE MOUTHS OF THE FALSE APOSTLES,IN THIS WHOLE EPISTLE PAUL TREATS OF THE RESURRECTION OF CHRIST,OH EVER SO MUCH ONLY HE SEEMS KIND OF STAID AND SCHOOL TEACHERY,JUST SMELL THE WILD ROSES THEY ARE ALWAYS SO SPICY AFTER A RAIN,YOU LEFT HIM IN A CHAIR YOU SAY WHICH CHAIR BY THE WINDOW THERE,THE HEAD OF THE PATCHWORK GIRL WAS THE MOST CURIOUS PART OF HER,WELL IF I DON'T KNOW WHO SHE WAS IN LOVE WITH I KNOW WHO HE WAS,THE GOAT'S WARLIKE SPIRIT WAS ROUSED BY THIS SUCCESSFUL ATTACK,AND IN THIS LAST ACTION HE FALLS INTO THE CLASSIC SIN OF PRIDE,BUT MUCH OF THE NOVEL'S BROODING POWER COMES FROM CAPTAIN NEMO,HE WORKED ME VERY HARD HE WANTED TO BE BEATING ME ALL THE TIME,ANYHOW IT'S JOLLY EXCITING AND I CAN DO THE DIALOGUE ALL RIGHT,OH SAY THAT'S DIFFERENT OBSERVED MARKHAM ALTERING HIS DEMEANOR,THEY SNUFFED ABOUT THE FIR TREE AND RUSTLED AMONG THE BRANCHES,WERE I IN THE WARM ROOM WITH ALL THE SPLENDOR AND MAGNIFICENCE,ROBIN ENTERED THE HUT DRAGGING THE UNWILLING ESQUIRE AFTER HIM,AGAIN HE SEARCHED HIS OWN THOUGHTS NOR INEFFECTUALLY AS BEFORE,ALEXANDER LEANED FORWARD AND WARMED HIS HANDS BEFORE THE BLAZE,COME WE'LL HAVE OUR COFFEE IN THE OTHER ROOM AND YOU CAN SMOKE,SIR HARRY TOWNE MISTER BARTLEY ALEXANDER THE AMERICAN ENGINEER,HE'S ANOTHER WHO'S AWFULLY KEEN ABOUT HER LET ME INTRODUCE YOU,WE WON'T TALK ABOUT HER ANY MORE IF YOU'D RATHER NOT WE INDEED,AREN'T YOU SPLASHED LOOK AT THE SPIDER WEBS ALL OVER THE GRASS,HE SAT DOWN WEAK BEWILDERED AND ONE THOUGHT WAS UPPERMOST ZORA,THERE IS NO OPENING EXCEPT THE ONE PANE SAID OUR LEARNED GUIDE,THE PROOF WAS IN THREE LONG SLIPS I HAD LEFT THEM ALL TOGETHER,LET US RETRACE OUR STEPS AND EXAMINE AS WE GO WITH KEENER EYES,SHE POURED INTO THE DISH A QUANTITY FROM EACH OF THESE BOTTLES,THE RECTOR DID NOT ASK FOR A CATECHISM TO HEAR THE LESSON FROM,OPEN THY HEART WIDE AND FOLD WITHIN THE WET WINGS OF THY DOVE,OR AN EYE OF GIFTS AND GRACES SHOWRING FRUITS AND COINED GOLD,ONE OF US ALWAYS REMAINS ON BOARD WHILE THE OTHER IS ON SHORE,YOUR PLAY MUST BE NOT MERELY A GOOD PLAY BUT A SUCCESSFUL ONE,DOES YOUR MAJESTY THEN NO LONGER BELIEVE THE DISLOYAL ATTEMPT,VOLTAIRE PICKED UP SOMETHING FROM THE GROUND AND LOOKED AT IT,NOTHING MORE NOT EVEN THE WRIST TO WHICH IT MIGHT BE ATTACHED,SOMETHING BETTER SOMETHING STILL GRANDER MUST FOLLOW BUT WHAT,MOST OF ALL ROBIN THOUGHT OF HIS FATHER WHAT WOULD HE COUNSEL,WHAT IS YOUR NAME LORDING ASKED THE LITTLE STROLLER PRESENTLY,HE WAS LIKE UNTO MY FATHER IN A WAY AND YET WAS NOT MY FATHER,THEIR EYES DANCED BIG THORLEIF STOOD UP AND STRETCHED HIMSELF,TO ALL THESE INQUIRIES THE COUNT RESPONDED IN THE AFFIRMATIVE,IT IS SO MADE THAT EVERYWHERE WE FEEL THE SENSE OF PUNISHMENT,I DOUBT WHETHER BRANWELL WAS MAINTAINING HIMSELF AT THIS TIME,SOLON MARVELLED AND DESIRED TO BE INFORMED OF THE PARTICULARS,WE THINK THAT BY SOME LITTLE WORK OR MERIT WE CAN DISMISS SIN,NOT FOR A CROWN OR A KINGDOM OR OUR GOODNESS BUT FOR OUR SINS,NO NAMES PLEASE SAID HOLMES AS WE KNOCKED AT GILCHRIST'S DOOR,ONE HARDLY LIKES TO THROW SUSPICION WHERE THERE ARE NO PROOFS,OLD DANCES ARE SIMPLIFIED OF THEIR YEARNING BLEACHED BY TIME,COME AND GET THE BOOLOOROO SHE SAID GOING TOWARD THE BENCHES,YOU HAVE COME TO US THREATENING US WITH ABSOLUTE DESTRUCTION,I HAVE BEEN HERE THIS QUARTER OF AN HOUR REPLIED LA VALLIERE,I REMEMBER NOW AND I CONGRATULATE MYSELF DO YOU LOVE ANY ONE,SEEING THAT I AM SO FINE I MAY AS WELL GO AND VISIT THE KING,CAN YOU IMAGINE WHY BUCKINGHAM HAS BEEN SO VIOLENT I SUSPECT,SHE EVEN SEEMED MILDLY AMUSED AT THE ATTENTION SHE ATTRACTED,AND THE WHOLE NIGHT THE TREE STOOD STILL AND IN DEEP THOUGHT,AT LAST ALL WAS QUIET AND BLACK IN THE COURTYARD OF GAMEWELL,PRESENTLY HE CROSSED THE FLOOR OF HIS ROOM WITH DECIDED STEP,ILL AND TROUBLED DEAR TROUBLED IN MIND AND MISERABLY NERVOUS,I DID NOT EVEN TAKE THE PRECAUTION OF SMOKING UP THE CHIMNEY,IN THE STERN I CURVED THE TAIL UP ALMOST AS HIGH AS THE HEAD,OLIVE'S MOURNFUL BLACK EYES MET NANCY'S SPARKLING BROWN ONES,GRANDFATHER WAS ALEXANDER CAREY L L D DOCTOR OF LAWS THAT IS,WHAT CAN YOU MEAN BY THAT MISS WOODLEY YOU TALK MYSTERIOUSLY,IS HE GOING TO START A DAILY NEWSPAPER AMONG THE KICK A POOS,YOU CAN BEGIN BY CARRYING A ROD AND PUTTING DOWN THE FIGURES,I'LL DO ANYTHING YOU WISH ME TO BARTLEY SHE SAID TREMULOUSLY,WHEN THE KING COMES TO PARIS EVERYBODY CALLS OUT VIVE LE ROI,KESWICK MARCH TWENTY SECOND EIGHTEEN THIRTY SEVEN DEAR MADAM,THERE SEEMS NO GOOD REASON FOR BELIEVING THAT IT WILL CHANGE,POSITIVELY HEROIC ADDED CRESSWELL AVOIDING HIS SISTER'S EYES,I WAS IN SUCH A HURRY TO COME TO YOU YOU LEFT YOUR DOOR OPEN,DO NOT THEREFORE THINK THAT THE GOTHIC SCHOOL IS AN EASY ONE,WELL NOW ENNIS I DECLARE YOU HAVE A HEAD AND SO HAS MY STICK,DEAREST TEACH ME SO TO POUR OUT GRATITUDE AS THOU DOST GOOD,I SHALL BE HAPPY TO TAKE CHARGE OF THEM SAID SIR FERDINANDO,THEY WERE CERTAINLY NO NEARER THE SOLUTION OF THEIR PROBLEM,HOWEVER THAT WAS OVER NOW THE TREE GONE THE STORY AT AN END,SAID THE FIR TREE THINKING OVER WHAT HE HAD HIMSELF RELATED,HUMPY DUMPY FELL DOWNSTAIRS AND YET HE MARRIED THE PRINCESS,IF A FELLOW'S BEEN A LITTLE BIT WILD HE'S BEELZEBUB AT ONCE,HERE THEY SAID IS A RASCAL WHO HAS BEEN HARRYING OUR COASTS,HERE FRIEND TAKE IT AND HE THRUST IT INTO THE FARMER'S HAND,BY THE HAMMER OF THOR SHOUTED GRIM HERE IS NO STINGY COWARD,EXCLAIMED SERVADAC KEEPING HIS EYE UNMOVED AT HIS TELESCOPE,LENGTH OF SERVICE FOURTEEN YEARS THREE MONTHS AND FIVE DAYS,BUT WHY DIDN'T YOU TELL ME WHEN YOU WERE HERE IN THE SUMMER,IT'S REALLY TOO WARM IN THIS ROOM TO SING DON'T YOU FEEL IT,HE'S BEEN WANTING TO MARRY HILDA THESE THREE YEARS AND MORE,THERE IS A MORE OR LESS ELABORATE SYSTEM OF RANK AND GRADES,THE WEATHER IF WE MAY USE THAT TERM WILL CHANGE BEFORE LONG,I'M SURE ALEXANDRA HOPES YOU WILL STAY ON HERE SHE MURMURED,I SUPPOSE IT'S THE WET SEASON WILL YOU HAVE TO CUT THEM TOO,INDEED HE HAD LOOKED AWAY WITH THE PURPOSE OF NOT SEEING IT,THERE THERE HE SAID SOOTHINGLY PATTING HER BROWN FUZZY HEAD,THE LAGOON HAD BEEN LEVEL WITH THE DYKES A WEEK AGO AND NOW,ON THE PALM WERE THREE LITTLE PYRAMIDS OF BLACK DOUGHY CLAY,WATSON I HAVE ALWAYS DONE YOU AN INJUSTICE THERE ARE OTHERS,NUMBER TEN FRESH NELLY IS WAITING ON YOU GOOD NIGHT HUSBAND,COME FORTH WORM AND THE SILENT VALLEY TO THY PENSIVE QUEEN,JOHN WESLEY COMBASH JACOB TAYLOR AND THOMAS EDWARD SKINNER,HOW YOU MAY BE WONDERING ARE YOU TO BEGIN YOUR MASTERPIECE,TO BE OR NOT TO BE THAT IS THE QUESTION WHETHER TIS NOBLER,MY TONGUE REFUSED TO ARTICULATE MY POWER OF SPEECH LEFT ME,PERCHANCE TOO KAFFAR'S DEATH MIGHT SERVE HIM IN GOOD STEAD,SAID ANOTHER VOICE WHICH I RECOGNIZED AS VOLTAIRE'S KAFFAR,NOW WHAT WAS THE SENSE OF IT TWO INNOCENT BABIES LIKE THAT,TRULY SUCH A HORSE SHOULD BE WORTH MUCH IN NOTTINGHAM FAIR,IT IS MANIFEST THAT MAN IS NOW SUBJECT TO MUCH VARIABILITY,HAKON THERE SHALL BE YOUR CONSTANT COMPANION FRIEND FARMER,MY DRAGON'S BELLY IS NEVER FULL AND ON BOARD WENT THE GOLD,TO ASK ANY MORE QUESTIONS OF YOU I BELIEVE WOULD BE UNFAIR OLD WILL IS A FINE FELLOW BUT POOR AND HELPLESS SINCE MISSUS ROGERS HAD HER ACCIDENT,THE WOOD FLAMED UP SPLENDIDLY UNDER THE LARGE BREWING COPPER AND IT SIGHED SO DEEPLY,I WOULD FAIN KNOW IF I AM DESTINED FOR SO GLORIOUS A CAREER CRIED THE TREE REJOICING,WE WILL GO OUT TOGETHER TO THE BOWER THERE IS A WAY DOWN TO THE COURT FROM MY WINDOW,FINALLY THE ONE PARTY WENT OFF EXULTING AND THE OTHER WAS LEFT IN DESOLATION AND WOE,SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS,THE MODERN ORGANIZATION OF INDUSTRY WORKS IN THE SAME DIRECTION ALSO BY ANOTHER LINE,ISN'T HE SPLENDID CRIED JASPER IN INTENSE PRIDE SWELLING UP FATHER KNEW HOW TO DO IT,HER REGARD SHIFTED TO THE GREEN STALKS AND LEAVES AGAIN AND SHE STARTED TO MOVE AWAY,WHEN WE WERE OUT IN THE DARKNESS OF THE QUADRANGLE WE AGAIN LOOKED UP AT THE WINDOWS,HE WAS STILL SUFFERING FROM THIS SUDDEN DISTURBANCE OF THE QUIET ROUTINE OF HIS LIFE,SEE THAT YOUR LIVES BE IN NOTHING WORSE THAN A BOY'S CLIMBING FOR HIS ENTANGLED KITE,WHEN CALLED BEFORE I TOLD HOW HASTILY I DROPPED MY FLOWERS OR BRAKE OFF FROM A GAME,DEPARTING FROM FIVE HUNDRED THOUSAND THROATS THREE CHEERS BURST FORTH IN SUCCESSION,THEN SAID SIR FERDINANDO THERE IS NOTHING FOR IT BUT THAT HE MUST TAKE YOU WITH HIM,THE MILITARY FORCE PARTLY RABBLE PARTLY ORGANIZED HAD MEANWHILE MOVED INTO THE TOWN,UPON THIS MADAME DEIGNED TO TURN HER EYES LANGUISHINGLY TOWARDS THE COMTE OBSERVING,TABLES WERE SPREAD ON THE LAWN AND A DAINTY BUT SUBSTANTIAL REPAST WAS TO BE SERVED,DON'T YOU KNOW ONE ABOUT BACON AND TALLOW CANDLES CAN'T YOU TELL ANY LARDER STORIES,WHEREUPON LAKE LAUGHED QUIETLY STILL LOOKING ON THE ACE OF HEARTS WITH HIS SLY EYES,AMBROSE MET ME AT THE BOTTOM OF THE STAIRS AND SHOWED ME THE WAY TO THE SUPPER ROOM,IS IT NOT IMPOSSIBLE HE MURMURED ALOUD THAT ANY CITY SHOULD DISAPPEAR SO COMPLETELY,TRUE HISTORY BEING A MIXTURE OF ALL THINGS THE TRUE HISTORIAN MINGLES IN EVERYTHING,BARTLEY BENT OVER AND TOOK HER IN HIS ARMS KISSING HER MOUTH AND HER WET TIRED EYES,THEY ASKED HIM TO COME TO SEE THEM IN CHELSEA AND THEY SPOKE VERY TENDERLY OF HILDA,AS USED IN THE SPEECH OF EVERYDAY LIFE THE WORD CARRIES AN UNDERTONE OF DEPRECATION,PAUL DECLARES THAT THE FALSE APOSTLES WERE CALLED OR SENT NEITHER BY MEN NOR BY MAN,I TAKE THIS AS MY ANSWER AND I LEAVE THE PROFESSOR TO BITE HIS LIPS WITH IMPATIENCE,I ENTERED AND I TOOK YOU INTO MY CONFIDENCE AS TO THE SUGGESTIONS OF THE SIDE TABLE,SOMETIMES IT IS CALLED A CRAZY QUILT BECAUSE THE PATCHES AND COLORS ARE SO MIXED UP,IT WASN'T SIMPLY THAT SHE SAID SO BUT THAT I KNEW SHE HADN'T I WAS SURE I COULD SEE,HE STOOD STILL IN DEFERENCE TO THEIR CALLS AND PARRIED THEIR BANTER WITH EASY WORDS,MUSSULMANS AND GIAOURS THROW KERCHIEFS AT A SMILE AND HAVE NO RUTH FOR ANY WEEPING,THIS SHE SAID WAS TRUE HOSPITALITY AND I AM NOT SURE THAT I DID NOT AGREE WITH HER,MY WIFE ON THE SPUR OF THE MOMENT MANAGED TO GIVE THE GENTLEMEN A VERY GOOD DINNER,THE FIRST OF OUR VAGUE BUT INDUBITABLE DATA IS THAT THERE IS KNOWLEDGE OF THE PAST,HE CONTINUED HIS PRETENDED SEARCH AND TO GIVE COLOR TO HIS ERRAND MADE TWO ARRESTS,LORD JOHN TAKING OUT GOLD CIGARETTE CASE FROM HIS LEFT HAND UPPER WAISTCOAT POCKET,WELL SAID MADEMOISELLE DE TONNAY CHARENTE I ALSO THINK A GOOD DEAL BUT I TAKE CARE,HERS HAPPENED TO BE IN THE SAME FRAME TOO BUT SHE EVIDENTLY DIDN'T CARE ABOUT THAT,THUS IT IS THAT THE HONOR OF THREE IS SAVED OUR COUNTRY'S OUR MASTER'S AND OUR OWN,ELIZA CLOSED THE DOOR BEHIND HER WITH A DECIDED SLAM AND A KEY CLICKED IN THE LOCK,ROBIN CAREFULLY DESCENDED THE LADDER AND FOUND HIMSELF SOON UPON FIRM ROCKY GROUND,THERE WAS NO CHANCE TO ALTER HIS SLEEPING ROOM TO ONE NEARER TO GAMEWELL'S CHAMBER,HE WAS IN DEEP CONVERSE WITH THE CLERK AND ENTERED THE HALL HOLDING HIM BY THE ARM,YOU ARE A WORTHY LEECH WILL PRESENTLY WHISPERED ROBIN THE WINE HAS WORKED A MARVEL,THIS TRANSIENT SPRING AND LIGHTING UP ARE BEAUTIFUL A GLAMOUR BEGUILING OUR SENSES,OUR FIRST IMPRESSIONS OF PEOPLE ARE IN NINE CASES OUT OF TEN THE RIGHT IMPRESSIONS,HE SHALL NOT LEAVE YOU DAY OR NIGHT WHETHER YOU ARE WORKING OR PLAYING OR SLEEPING,AND WHAT DEMONSTRATION DO YOU OFFER ASKED SERVADAC EAGERLY THAT IT WILL NOT HAPPEN,FAST AS HIS LEGS COULD CARRY HIM SERVADAC HAD MADE HIS WAY TO THE TOP OF THE CLIFF,HOW BROWN YOU'VE GOT SINCE YOU CAME HOME I WISH I HAD AN ATHLETE TO MOW MY ORCHARD,I DIDN'T HAVE ANY FEARS IF I WORKED IT RIGHTLY SAID THE OLD GENTLEMAN COMPLACENTLY,NO SIR HE ISN'T HE'S GONE TO ROSSETER TO SEE MISTER WEST THE FACTOR ABOUT THE WOOL,FOR A WHILE SHE LAY IN HER CHAIR IN HAPPY DREAMY PLEASURE AT SUN AND BIRD AND TREE,PEARL SEEING THE ROSE BUSHES BEGAN TO CRY FOR A RED ROSE AND WOULD NOT BE PACIFIED,A RING OF AMETHYST I COULD NOT WEAR HERE PLAINER TO MY SIGHT THAN THAT FIRST KISS,SCUSE ME SAID TROT I NEGLECTED TO TELL YOU THAT YOU'RE NOT THE BOOLOOROO ANY MORE,THERE WAS GOOD REASON TO STOP AND THINK EVEN FOR THE WORLD'S MOST EMOTIONLESS MAN,SUBSTANTIALLY THIS WAS JACOB'S UNVARNISHED DESCRIPTION OF HIS MASTER AND MISTRESS,SOME POINTS MAY BE TAKEN AS FIXED AND SUCH AS ANY THEORY OF MEMORY MUST ARRIVE AT,THE LEADERS OF THE CONSPIRACY BECAME DISTRUSTFUL OF THEIR POWER TO CRUSH THE TOWN,ALL ABOUT HIM WAS A TUMULT OF BRIGHT AND BROKEN COLOR SCATTERED IN BROAD SPLASHES,OH MADEMOISELLE WHY HAVE I NOT A DEVOTED SISTER OR A TRUE FRIEND SUCH AS YOURSELF,YOU HAVE COME ANDELLA ANDELLA WAS THE NAME OF JANE'S DOLL TO MAKE ROSALIE A VISIT,SOME GIRL HAS BEEN HERE TWICE TO INTERVIEW MY MEN AND I HAVE REFUSED TO ADMIT HER,AS REGARDS MY ROBBING THE COMPANY I'LL SAY THAT I SAVED THEM A HEAVY LOSS ONE DAY,THEY WERE RECEIVED IN THE LITTLE OFFICE BY A MAN NAMED MARKHAM WHO WAS THE JAILER,FAIRVIEW WAS TWELVE MILES AWAY BUT BY TEN O'CLOCK THEY DREW UP AT THE COUNTY JAIL,HE FELT FOR AND FOUND THE WIZARD'S BLACK CLOTH THE SQUIRE WAS QUITE OUT OF BREATH,I BELIEVE I HAVE A LITTLE TASTE THAT WAY THOSE ARE ALL REAL YOU KNOW THOSE JEWELS,WHAT IS YOUR COUNTRY OLAF HAVE YOU ALWAYS BEEN A THRALL THE THRALL'S EYES FLASHED,IT WAS ON THE LAST DAY OF JANUARY THAT THE REPAIRS OF THE SCHOONER WERE COMPLETED,WHAT SHE WANTED FROM US WAS NEITHER OUR FLOWERS NOR OUR FRANCS BUT JUST OUR YOUTH,I SEE A CROWD IN ONE CORNER OF THE GARDEN EVERYBODY STANDING STILL AND LOOKING UP,BUT THE REAL SIGNIFICANCE AND COMFORT OF THE WORDS FOR OUR SINS IS LOST UPON THEM,IT IS POSSIBLE THAT I MAY BE IN A POSITION THEN TO INDICATE SOME COURSE OF ACTION,THEIR ASSUMED CHARACTER CHANGED WITH THEIR CHANGING OPPORTUNITIES OR NECESSITIES,THE HAWK SAT UPON THE BRANCH AND WATCHED HIS QUARRY SWIMMING BENEATH THE SURFACE,AND ALL HIS BROTHERS AND SISTERS STOOD ROUND AND LISTENED WITH THEIR MOUTHS OPEN,WON'T YOU RUN INTO THE HOUSE AND SEE IF MARTHA CAN'T SPARE ONE OR TWO MORE MAIDS,I DIDN'T STOP TO THINK WHETHER IT WAS FOOLISH OR NOT I DID IT AND I'M GLAD I DID,SIT DOWN PLEASE SAID GATES IN A CHEERFUL AND PLEASANT VOICE THERE'S A BENCH HERE,I TOOK FIVE GREAT BRACELETS OF GOLD FROM OUR TREASURE CHEST AND GAVE THEM TO HIM,AS OUR BOAT FLASHED DOWN THE ROLLERS INTO THE WATER I MADE THIS SONG AND SANG IT,HAS THEE CONSULTED THY MOTHER ABOUT A CAREER I SUPPOSE IT IS A CAREER THEE WANTS,I HAVEN'T HAD A CHANCE YET TO TELL YOU WHAT A JOLLY LITTLE PLACE I THINK THIS IS,SHE CONSIDERED A MOMENT AND THEN SAID NO I THINK NOT THOUGH I AM GLAD YOU ASK ME,WE ARE TO HEAR CHRIST WHO HAS BEEN APPOINTED BY THE FATHER AS OUR DIVINE TEACHER,FOR A MOMENT GILCHRIST WITH UPRAISED HAND TRIED TO CONTROL HIS WRITHING FEATURES,BUT THE DUSK DEEPENING IN THE SCHOOLROOM COVERED OVER HIS THOUGHTS THE BELL RANG,THE PECULIAR CIRCUMSTANCES OF THE COLONY ARE WITHIN YOUR EXCELLENCY'S KNOWLEDGE,THEIR DISTINCTIVE CHARACTERS HOWEVER DISPLAY ONE BROAD AND UNFAILING DIFFERENCE,THE HAWK ALIGHTED ON THE DEAD BRANCH AND SAT UPRIGHT MOTIONLESS AS IF SURPRISED,SOME MYSTERIOUS FORCE SEEMED TO HAVE BROUGHT ABOUT A CONVULSION OF THE ELEMENTS,I LEFT YOU ON A CONTINENT AND HERE I HAVE THE HONOR OF FINDING YOU ON AN ISLAND,ALWAYS IRRITABLE COLD INDIFFERENT HE HAD GROWN RAPIDLY MORE SO AS YEARS WENT ON,ALL THESE HONEST PERSONS ARE WAITING THEIR TURN TO GET THEIR SNUFF BOXES FILLED,ON THE OTHER HAND WE ARE NOT TO REGARD THEM AS SO TERRIBLE THAT WE MUST DESPAIR,PAUL TAKES PRIDE IN HIS MINISTRY NOT TO HIS OWN PRAISE BUT TO THE PRAISE OF GOD,MARY TAYLOR HOWEVER RELATED THE TALE OF ZORA TO MISSUS GREY'S PRIVATE EAR LATER,THAT IS ONE REASON YOU ARE OJO THE UNLUCKY SAID THE WOMAN IN A SYMPATHETIC TONE,SO I RETURN REBUK'D TO MY CONTENT AND GAIN BY ILL THRICE MORE THAN I HAVE SPENT,STEPHEN'S HEART BEGAN SLOWLY TO FOLD AND FADE WITH FEAR LIKE A WITHERING FLOWER,OUR BAGGAGE WAS IMMEDIATELY CARRIED TO THE DECK OF THE FRIGATE I RUSHED ABOARD,THIS WAS A FORMIDABLE ARRAY OF ADVANTAGES SLAVERY WAS PLAYING WITH LOADED DICE,FOR LIKE AS NOT THEY MUST HAVE THOUGHT HIM A PRINCE WHEN THEY SAW HIS FINE CAP,THEY ARE CHIEFLY FORMED FROM COMBINATIONS OF THE IMPRESSIONS MADE IN CHILDHOOD,CONGRATULATIONS WERE POURED IN UPON THE PRINCESS EVERYWHERE DURING HER JOURNEY,NAY WE REFUSED THEIR REQUEST MOST POLITELY MOST NOBLE SAID THE LITTLE STROLLER,TO MY MIND THERE HAS ALWAYS BEEN SOMETHING INEXPRESSIBLY AWFUL IN FAMILY FEUDS,I'M GLAD YOU LIKE IT SAYS WYLDER CHUCKLING BENIGNANTLY ON IT OVER HIS SHOULDER,I AM STIFF WITH LONG SITTING HE SAID I ITCH FOR A FIGHT I TURNED TO THE FARMER,ONCE IN ACTION HE WAS LEADING A DETACHMENT OF INFANTRY THROUGH AN INTRENCHMENT,DO WE REALLY KNOW THE MOUNTAIN WELL WHEN WE ARE NOT ACQUAINTED WITH THE CAVERN,A WORD SHOULD NOW BE SAID ABOUT THE ORIGIN OF LUTHER'S COMMENTARY ON GALATIANS,THAT'S THE WAY WITH YOU THAT'S THE ROAD YOU'D ALL LIKE TO GO HEADLONGS TO RUIN,A SUDDEN IMPULSE CAME OVER HIM TO ENTER AND SEE IF THEY WERE INDEED THE PROOFS,I DARE NOT GO SO FAR AS THAT BUT OF THE THREE HE IS PERHAPS THE LEAST UNLIKELY,CHINGACHGOOK HAD CAUGHT THE LOOK AND MOTIONING WITH HIS HAND HE BADE HIM SPEAK,IT WAS THE SCARLET LETTER IN ANOTHER FORM THE SCARLET LETTER ENDOWED WITH LIFE,SOME IMAGES LIKE SOME SENSATIONS FEEL VERY FAMILIAR WHILE OTHERS FEEL STRANGE,HE STILL HELD ON TO IT WITH BOTH HANDS AS HE RUSHED INTO HIS MOTHER'S COTTAGE,A LITTLE BIT OF PLASTER TUMBLED DOWN THE CHIMNEY AND STARTLED ME CONFOUNDEDLY,THEN I WILL GET ME A FARM AND WILL WINTER IN THAT LAND NOW WHO WILL FOLLOW ME,SHE'S OLDER THAN I AM BUT SO TINY AND SAD AND SHY THAT SHE SEEMS LIKE A CHILD,IT WAS VERY JOLLY HE MURMURED LAZILY AS MARIE CAME IN TO TAKE AWAY THE COFFEE,IN A GENERAL WAY THOUGH NOT WHOLLY NOR CONSISTENTLY THESE TWO GROUPS COINCIDE,IS THE ATMOSPHERIC CONDITION HAVING ONCE REACHED THIS DENSITY TO BECOME FINAL,HE PANTED TO KNOW IF SHE TOO KNEW OR KNEW AND CARED NOT OR CARED AND KNEW NOT,THE OTHERS RESENTED POSTPONEMENT BUT IT WAS JUST HIS SCRUPLES THAT CHARMED ME,I THANK ALL WHO HAVE LOVED ME IN THEIR HEARTS WITH THANKS AND LOVE FROM MINE,AND I HAVE NO ONE READY TO WHOM I CAN GIVE UP THE ARCHIVES OF THE GOVERNMENT,RE ENTER BUTLER AND THREE FOOTMEN WHO REMOVE THE TEA THINGS HOSTESS TO GUEST,LEND ME YOUR EAR FOR TEN MINUTES AND YOU SHALL LEARN JUST WHAT STAGECRAFT IS,IT MIGHT HAVE SEEMED THAT A TROUT OF THIS SIZE WAS A FAIRLY SUBSTANTIAL MEAL,GENTLEMEN TO YOUR POSTS WHEREUPON SAINT AIGNAN AND VILLEROY TOOK THEIR LEAVE,IT DID NOT BECKON OR INDEED MOVE AT ALL IT WAS AS STILL AS THE HAND OF DEATH,I WAS BOOKKEEPER SO IT WAS EASY TO GET A BLANK CHECK AND FORGE THE SIGNATURE,I'M RUNNING FOR REPRESENTATIVE ON THE REPUBLICAN TICKET SAID KENNETH QUIETLY,BUT IN SUCH A CASE MISS MILNER'S ELECTION OF A HUSBAND SHALL NOT DIRECT MINE,TO TEACH READING MEANS TO LIGHT THE FIRE EVERY SYLLABLE SPELLED OUT SPARKLES,GRACE BE TO YOU AND PEACE FROM GOD THE FATHER AND FROM OUR LORD JESUS CHRIST,IT'LL BE NO USE THEIR PUTTING THEIR HEADS DOWN AND SAYING COME UP AGAIN DEAR,NO NO NO TOTTY UD GET HER FEET WET SAID MISSUS POYSER CARRYING AWAY HER IRON,WELL WHAT CAN'T BE DONE BY MAIN COURAGE IN WAR MUST BE DONE BY CIRCUMVENTION,BUT THE BEAR INSTEAD OF OBEYING MAINTAINED THE SEAT IT HAD TAKEN AND GROWLED,MOST PEOPLE TALK TOO MUCH SO IT IS A RELIEF TO FIND ONE WHO TALKS TOO LITTLE,AT THE EMERALD CITY WHERE OUR PRINCESS OZMA LIVES GREEN IS THE POPULAR COLOR,THAT A STYLE IS RESTRAINED OR SEVERE DOES NOT MEAN THAT IT IS ALSO ERRONEOUS,FOR A FULL HOUR HE HAD PACED UP AND DOWN WAITING BUT HE COULD WAIT NO LONGER,WE SAT WITH THE OFFICERS SOME LITTLE TIME AFTER DINNER AND THEN WENT ASHORE,ONCE FAIRLY A WING HOWEVER HE WHEELED AND MADE BACK HURRIEDLY FOR HIS PERCH,IT IS TOO DIFFICULT REPLIED MADEMOISELLE DE TONNAY CHARENTE LAUGHING LOUDLY,THEN SHE GAVE A LITTLE LAUGH AND REPLIED NO MISS BETH I'M ELIZABETH PARSONS,WE HAVE HEARD SOMETHING OF YOUR STORY SAID KENNETH AND ARE INTERESTED IN IT,WHY ONE MORNING THERE CAME A QUANTITY OF PEOPLE AND SET TO WORK IN THE LOFT,IN AUTUMN THE WOOD CUTTERS ALWAYS CAME AND FELLED SOME OF THE LARGEST TREES,AND HE MADE A LITTLE DIP OF HIS CANE TOWARDS BRANDON HALL OVER HIS SHOULDER,ALL THE TIME HE WAS TALKING TO ME HIS ANGRY LITTLE EYES WERE FOLLOWING LAKE,DO YOU KNOW LAKE OH I REALLY CAN'T TELL BUT HE'LL SOON TIRE OF COUNTRY LIFE,MEANWHILE RODOLFO HAD LEOCADIA SAFE IN HIS CUSTODY AND IN HIS OWN APARTMENT,A MORE DREARY AND MORE DISUNITED FAMILY PARTY I NEVER SAT AT THE TABLE WITH,NO CATHEDRAL NOT EVEN BURGOS ITSELF COULD VIE WITH THE CHURCH AT MONTMARTRE,RUTH SAT QUITE STILL FOR A TIME WITH FACE INTENT AND FLUSHED IT WAS OUT NOW,IS THY FATHER WILLING THEE SHOULD GO AWAY TO A SCHOOL OF THE WORLD'S PEOPLE,THE WORLD IS ALL THERE JUST AS IT USED TO BE BUT I CAN'T GET AT IT ANY MORE,DO YOU KNOW I THOUGHT THE DANCE A BIT CONSCIOUS TO NIGHT FOR THE FIRST TIME,I SIT DOWN AT A SMALL TABLE A WAITER COMES IMMEDIATELY TO ENQUIRE MY WISHES,THERE IS EVEN A WHITE ROW OF BEEHIVES IN THE ORCHARD UNDER THE WALNUT TREES,BUT CRESSWELL ADDED SIGNIFICANTLY CAPACITY DIFFERS ENORMOUSLY BETWEEN RACES,WELL WELL DON'T TROUBLE TO ANSWER LISTEN AND SEE THAT I DO YOU NO INJUSTICE,AS A MATTER OF FACT HE COULD NOT SAID SOAMES FOR I ENTERED BY THE SIDE DOOR,THE HAIR WAS OF BROWN YARN AND HUNG DOWN ON HER NECK IN SEVERAL NEAT BRAIDS,PLEASE FORGIVE ME FOR THIS UNDERHANDED WAY OF ADMITTING I HAD TURNED FORTY,MONSIEUR WAS THE ONLY ONE WHO DID NOT UNDERSTAND ANYTHING ABOUT THE MATTER,AND MY POCKET MONEY IS GETTING LOW AGAIN AND YOU HAVEN'T ANY LEFT AS USUAL,THEY THEY EXCITE ME IN SOME WAY AND I I CAN'T BEAR THEM YOU MUST EXCUSE ME,YOU SPEAK LIKE AN EDUCATED PERSON SAID BETH WONDERINGLY WHERE IS YOUR HOME,THE HOURS PASSED WEARILY BY AND MOVEMENT COULD YET BE HEARD ABOUT THE HALL,AT THE PROW I CARVED THE HEAD WITH OPEN MOUTH AND FORKED TONGUE THRUST OUT,HE SEEMED BORN TO PLEASE WITHOUT BEING CONSCIOUS OF THE POWER HE POSSESSED,HE MENTIONS THE APOSTLES FIRST BECAUSE THEY WERE APPOINTED DIRECTLY BY GOD,A BRISK WIND HAD COME UP AND WAS DRIVING PUFFY WHITE CLOUDS ACROSS THE SKY,HE DARTED THROUGH THE TREES AND PAUSED A TALL MAN STRONGLY BUT SLIMLY MADE,JOHN TAYLOR WHO HAD SUPPORTED HER THROUGH COLLEGE WAS INTERESTED IN COTTON,WHEN THEY WERE OUTSIDE UNC SIMPLY LATCHED THE DOOR AND STARTED UP THE PATH,YET THESE THOUGHTS AFFECTED HESTER PRYNNE LESS WITH HOPE THAN APPREHENSION,THE KING STOOD UP AND CALLED FOR THAT PSALM WHICH BEGINS WITH THESE WORDS,GOOD GRACIOUS HAS THE KING ANY RIGHT TO INTERFERE IN MATTERS OF THAT KIND,OH LET HIM COME ALONG SHE URGED I DO LOVE TO SEE HIM ABOUT THAT OLD HOUSE,HE MIGHT HAVE HAD THAT FORGED CHECK FOR THE FACE OF IT IF HE'D BEEN SHARP,THESE ESCAPADES ARE NOT FOR OLD GAMEWELL LAD HIS DAY HAS COME TO TWILIGHT,THERE IS HARDLY ONE DAY OUT OF A HUNDRED WHICH IS WHOLLY JOYOUS AND SUNNY,WHEN DID YOU COME BARTLEY AND HOW DID IT HAPPEN YOU HAVEN'T SPOKEN A WORD,I THOUGHT IT MIGHT BE SISTER KATE OR COUSIN MIKE WOULD BE HAPPENING ALONG,I SHALL BE PUNISHED FOR IT NOW I SUPPOSE BY BEING DROWNED IN MY OWN TEARS,THE SHADOW OF THE RAFT WAS CLEARLY OUTLINED UPON THE SURFACE OF THE WAVES,BUT THE PLANT RAN AND IT WAS THE FIRST THREE WIRE STATION IN THIS COUNTRY,THE SQUARES OF COTTON SHARP EDGED HEAVY WERE JUST ABOUT TO BURST TO BOLLS,THE MAN ENTERED AND TOOK THE PAPERS SHEET BY SHEET FROM THE CENTRAL TABLE,HOTEL A PLACE WHERE A GUEST OFTEN GIVES UP GOOD DOLLARS FOR POOR QUARTERS,I EXPECT YOU HAVE BEEN A VERY GOOD GIRL ANDELLA SINCE YOU WERE HERE LAST,TO GIVE AN IDEA OF THESE CONVERSATIONS I WILL REPORT ONE OF THEM IN FULL,WE OUGHT TO HAVE MORE ATTENDANTS BETH SAID LOUISE APPROACHING HER COUSIN,IT WAS BETTER FOR HIM TO THINK THE GIRL UNFEELING THAN TO KNOW THE TRUTH,BUT UNDER THE CIRCUMSTANCES I DOUBT IF SUCH AN ARRANGEMENT COULD BE MADE,SOFT HEART HE SAID GENTLY TO HER THEN TO THORKEL WELL LET HIM GO THORKEL,WELL MOTHER SAID THE YOUNG STUDENT LOOKING UP WITH A SHADE OF IMPATIENCE,THE ARMY FOUND THE PEOPLE IN POVERTY AND LEFT THEM IN COMPARATIVE WEALTH,AND WHAT WAS THE SUBJECT OF THE POEM SAID THE PERSON WHO MADE THE REMARK,UNDERSCORE THESE WORDS FOR THEY ARE FULL OF COMFORT FOR SORE CONSCIENCES,IT'S EXCITING TO SEE EVERYTHING GROWING SO FAST AND TO GET THE GRASS CUT,BY THE BY I'VE NEVER SEEN YOUR DAIRY I MUST SEE YOUR DAIRY MISSUS POYSER,IT WAS THE INDIAN WHOSE DARK SILHOUETTE APPEARED SUDDENLY UPON HIS BLIND,DID ANYONE KNOW THAT THESE PROOFS WOULD BE THERE NO ONE SAVE THE PRINTER,THIS WAS WHAT DID THE MISCHIEF SO FAR AS THE RUNNING AWAY WAS CONCERNED,HIS CONDUCT AND PRESENCE OF MIND IN THIS EMERGENCE APPEARED CONSPICUOUS,SHE THEN ROSE HUMMING THE AIR TO WHICH SHE WAS PRESENTLY GOING TO DANCE,IT WAS A DELIBERATE THEFT FROM HIS EMPLOYERS TO PROTECT A GIRL HE LOVED,SERVADAC TOOK IT FOR GRANTED THAT THE DOBRYNA WAS ENDEAVORING TO PUT IN,EXCLAIMED BILL HARMON TO HIS WIFE AS THEY WENT THROUGH THE LIGHTED HALL,MY LORD MISS MILNER'S TASTE IS NOT A DEPRAVED ONE IT IS BUT TOO REFINED,WHY SHOULD I RUST AND BE STUPID AND SIT IN INACTION BECAUSE I AM A GIRL,IN THIS WORLD EVIDENTLY THE VESTIBULE OF ANOTHER THERE ARE NO FORTUNATE,OH WHAT A RECORD TO READ WHAT A PICTURE TO GAZE UPON HOW AWFUL THE FACT,I THOUGHT IT THEREFORE MY DUTY WHEN I LEFT SCHOOL TO BECOME A GOVERNESS,BUT I WOULD NOT SPEAK AT THE TIME BECAUSE I WANTED TO REFRESH MY MEMORY,THE MOST FAMOUS OF THEM ALL WAS THE OVERTHROW OF THE ISLAND OF ATLANTIS,THAT WON'T LAST IT WILL GO AWAY AND THINGS WILL BE JUST AS THEY USED TO,THEY THINK YOU'RE PROUD BECAUSE YOU'VE BEEN AWAY TO SCHOOL OR SOMETHING,THAT'S NOT MUCH OF A JOB FOR AN ATHLETE HERE I'VE BEEN TO TOWN AND BACK,I KNOW GASPED POLLY CONTROLLING HER SOBS I WON'T ONLY I CAN'T THANK YOU,THE PARIS PLANT LIKE THAT AT THE CRYSTAL PALACE WAS A TEMPORARY EXHIBIT,I THINK I SHOULD BE DOING YOU A SERVICE TO TURN YOU OUT OF SUCH A PLACE,HOLMES TURNED AWAY AND STOOPED SUDDENLY TO THE FLOOR HALLOA WHAT'S THIS,HORSE SENSE A DEGREE OF WISDOM THAT KEEPS ONE FROM BETTING ON THE RACES,WHOSE FEET ARE AS THE FEET OF HARTS AND UNDERNEATH THE EVERLASTING ARMS,THE RECTOR PAUSED AND THEN SHAKING HIS CLASPED HANDS BEFORE HIM WENT ON,BUT AT THIS POINT IN THE RAPIDS IT WAS IMPOSSIBLE FOR HIM TO STAY DOWN,THE GREAT HAWK FOLLOWED HURRIEDLY TO RETRIEVE HIS PREY FROM THE GROUND,HE WAS SUCH A BIG BOY THAT HE WORE HIGH BOOTS AND CARRIED A JACK KNIFE,WILL YOU LEAVE ME ALONE IN MY OWN ROOM OR MUST I GO AWAY TO ESCAPE YOU,HE SPOKE SIMPLY BUT PACED UP AND DOWN THE NARROW CELL IN FRONT OF THEM,AS ANY IN ENGLAND I WOULD SAY SAID GAMEWELL PROUDLY THAT IS IN HIS DAY,IT IS ENOUGH SAID GEORGE GAMEWELL SHARPLY AND HE TURNED UPON THE CROWD,BEFORE THEM FLED THE STROLLER AND HIS THREE SONS CAPLESS AND TERRIFIED,HE IS NOT WELL HE HAS COME OVER THE OCEAN FOR REST AND CHANGE OF SCENE,IT WAS SO DARK THAT I COULD SEE NOTHING BUT A FEW SPARKS ON THE HEARTH,WHY IT'S IN MISSOURI SOMEWHERE ON THE FRONTIER I THINK WE'LL GET A MAP,HE FELT A TREMOR RUN THROUGH THE SLENDER YELLOW FIGURE IN FRONT OF HIM,I AM NOT DEPRECIATING IT WHEN I SAY THAT IN THESE TIMES IT IS NOT RARE,THE LIVERY BECOMES OBNOXIOUS TO NEARLY ALL WHO ARE REQUIRED TO WEAR IT,TELL US SAID THE OTHER THE WHOLE STORY AND WHERE SOLON HEARD THE STORY,I AM NOT COMPLAINING THAT THE RATE IS SLOW BUT THAT THE SEA IS SO WIDE,HOLMES HELD IT OUT ON HIS OPEN PALM IN THE GLARE OF THE ELECTRIC LIGHT,I HAD TO READ IT OVER CAREFULLY AS THE TEXT MUST BE ABSOLUTELY CORRECT,UNCAS CAST HIS SKIN AND STEPPED FORTH IN HIS OWN BEAUTIFUL PROPORTIONS,HAY FEVER A HEART TROUBLE CAUSED BY FALLING IN LOVE WITH A GRASS WIDOW,YOU SEE MY FRIEND IT'S AN ISSUE OF THE MONSTER THE NOTORIOUS NARWHALE,ANYHOW WE'LL LEAVE INSTRUCTIONS TO SHIP THE WHOLE MENAGERIE TO FRANCE,YOU WILL ALLOW ME TO SUGGEST SAID HE THAT THAT IS A MATTER OF OPINION,DELLA HAD A YOUNG SISTER NAMED MARIA AND A COUSIN WHOSE NAME WAS JANE,THIS THOUGHT HOWEVER DID NOT ENTER THE HEADS OF THE ENTHUSIASTIC PAIR,AND THEN THEY BECAME VEXED AND WOULD HAVE SNATCHED YOUR PURSE FROM US,AND THEN YOU CAME BACK NOT CARING VERY MUCH BUT IT MADE NO DIFFERENCE,YOU SEE LOVING SOME ONE AS I LOVE YOU MAKES THE WHOLE WORLD DIFFERENT,HILDA'S FACE QUIVERED BUT SHE WHISPERED YES I THINK IT MUST HAVE BEEN,ALREADY A NORTH AND A SOUTH WERE TALKED OF WHY NOT SET UP ALSO A WEST,THEIR SUFFERINGS HAVE NEVER YET BEEN FITLY CHRONICLED BY HUMAN SCRIBE,WHEN I WAS A YOUNG MAN I THOUGHT PAUL WAS MAKING TOO MUCH OF HIS CALL,SATURDAY AUGUST FIFTEENTH THE SEA UNBROKEN ALL ROUND NO LAND IN SIGHT,ABOVE ALL THINGS I DESIRE TO SETTLE THE MATTER QUIETLY AND DISCREETLY,THE DELAWARES ARE CHILDREN OF THE TORTOISE AND THEY OUTSTRIP THE DEER,TO THIS HIS ANSWER WAS PROMPT OH THANK GOD NO AND IS THE RECORD YOURS,IF HE TO KEEP ONE OATH MUST LOSE ONE JOY BY HIS LIFE'S STAR FORETOLD,COULD IT MEAN TO LAST A LOVE SET PENDULOUS BETWEEN SORROW AND SORROW,OVER THE TRACK LINED CITY STREET THE YOUNG MEN THE GRINNING MEN PASS,YOU HEAR WHAT SIR FERDINANDO BROWN HAS SAID REPLIED CAPTAIN BATTLEAX,THE DUCHESS OF SOUTHBRIDGE TO LORD REGGIE OH REGGIE WHAT DID YOU SAY,A STORY CRIED THE CHILDREN DRAWING A LITTLE FAT MAN TOWARDS THE TREE,RIGHT WILLINGLY FOR BETWEEN US WE HAVE WON THE BATTLE ANSWERED ROBIN,TIS FINE FOR YOU TO TALK OLD MAN ANSWERED THE LEAN SULLEN APPRENTICE,WHAT OF THE FARM OLAF NOT YET I ANSWERED VIKING IS BETTER FOR SUMMER,NEVER MIND NOW INTERPOSED THE CAPTAIN WE WILL TALK OF THAT BY AND BY,THERE IS THE SLANG OF THE AFFECTED LADY AS WELL AS OF THE PRECIEUSES,IT'S BEEN ON ONLY TWO WEEKS AND I'VE BEEN HALF A DOZEN TIMES ALREADY,THIS PASSAGE THEN BEARS OUT THE FACT THAT ALL MEN ARE SOLD UNDER SIN,NOT GOLD OR SILVER OR PASCHAL LAMBS OR AN ANGEL BUT HIMSELF WHAT FOR,THEY SAID TO THE GALATIANS YOU HAVE NO RIGHT TO THINK HIGHLY OF PAUL,THERE'S A HEAVY STORM COMING ON I CRIED POINTING TOWARDS THE HORIZON,THOSE HUGE CREATURES ATTACKED EACH OTHER WITH THE GREATEST ANIMOSITY,I LIKE TO TALK TO CARL ABOUT NEW YORK AND WHAT A FELLOW CAN DO THERE,SHE ASKED IMPULSIVELY I DIDN'T BELIEVE YOU COULD PERSUADE HER FATHER,OH SIR SAID MISSUS POYSER RATHER ALARMED YOU WOULDN'T LIKE IT AT ALL,I WILL TAKE THE BLACK CLAY WITH ME ALSO THE PENCIL CUTTINGS GOOD BYE,SLOW TO WORLD GREETINGS QUICK WITH ITS O LIST WHEN THE ANGELS SPEAK,YES WE ARE CERTAINLY I REPLIED EVASIVELY BUT AFTER WE MAKE A DETOUR,NOT ONCE DID HE COMMENT ON THE LENGTH OR THE HARDSHIPS OF A JOURNEY,THEY SAY ILLUMINATION BY CANDLE LIGHT IS THE PRETTIEST IN THE WORLD,THE SQUIRE HELPED TO THRUST THEM ALL IN AND ENTERED SWIFTLY HIMSELF,SHAME ON YOU CITIZENS CRIED HE I BLUSH FOR MY FELLOWS OF NOTTINGHAM,THIS WAS SO SWEET A LADY SIR AND IN SOME MANNER I DO THINK SHE DIED,YOU RESEMBLE ME RACHEL YOU ARE FEARLESS AND INFLEXIBLE AND GENEROUS,SO I WILL GIVE OUT THIS LAW THAT MY MEN SHALL NEVER LEAVE YOU ALONE,TWO HUNDRED WARRIORS FEASTED IN HIS HALL AND FOLLOWED HIM TO BATTLE,I SAY SIR HARRY THE LITTLE GIRL'S GOING FAMOUSLY TO NIGHT ISN'T SHE,I CANNOT DENY MYSELF THE GRATIFICATION OF INSERTING SOUTHEY'S REPLY,BUT THE GENERAL DISTINCTION IS NOT ON THAT ACCOUNT TO BE OVERLOOKED,THE ATMOSPHERE IS EVIDENTLY CHARGED AND SURCHARGED WITH ELECTRICITY,IT MUST BE AS WIDE AS THE MEDITERRANEAN OR THE ATLANTIC AND WHY NOT,SUDDENLY HE HEARD HIM AT THE VERY DOOR THERE WAS NO POSSIBLE ESCAPE,MISTER SOAMES WAS SOMEWHAT OVERWHELMED BY THIS FLOOD OF INFORMATION,THE BEAR SHOOK HIS SHAGGY SIDES AND THEN A WELL KNOWN VOICE REPLIED,IT CAN'T HURT ANYTHING I'M SURE FOR WE WON'T DISTURB THINGS AT ALL,FROM THE BLACKNESS BEHIND THE LIGHT THEY HEARD A VOICE WARRENTON'S,THE WINE DID CERTAINLY BRING BACK THE COLOR TO THE SQUIRE'S CHEEKS,A COLD BRIGHT MOON WAS SHINING WITH CLEAR SHARP LIGHTS AND SHADOWS,THE FLOOR MORE THAN ANYTHING ELSE SHOWED THE GREAT AGE OF THE ROOM,BUT DON'T THESE VERY WISE THINGS SOMETIMES TURN OUT VERY FOOLISHLY,IT WAS ONE OF THE MASTERLY AND CHARMING STORIES OF DUMAS THE ELDER,SO I LIVED AND NOW AM YOUR TOOTH THRALL WELL IT IS THE LUCK OF WAR,YOUR FATHER THOUGHT A MOMENT THEN LOOKED AT YOUR MOTHER AND SMILED,SHE IS UNDER SAIL BUT SHE IS COUNT TIMASCHEFF'S YACHT HE WAS RIGHT,THIS WITHOUT RECKONING IN THE PAINS OF THE HEART AND SO IT GOES ON,IT'S NOT PARTICULARLY RARE SHE SAID BUT SOME OF IT WAS MY MOTHER'S,SHE MUST CARE ABOUT THE THEATRE A GREAT DEAL MORE THAN SHE USED TO,HE CALLED THIS SEA A POND AND OUR LONG VOYAGE TAKING A LITTLE SAIL,I GET TIRED OF SEEING MEN AND HORSES GOING UP AND DOWN UP AND DOWN,PEARL SAW AND GAZED INTENTLY BUT NEVER SOUGHT TO MAKE ACQUAINTANCE,THAT IS ALL QUITE TRUE MISTER NEVERBEND SAID SIR FERDINANDO BROWN,THIS KNOWLEDGE IS MEMORY IN ONE SENSE THOUGH IN ANOTHER IT IS NOT,THE PARLIAMENT AND THE SCOTS LAID THEIR PROPOSALS BEFORE THE KING,THE YOUNG GIRLS HAD INDEED MADE THEMSELVES SMALL INDEED INVISIBLE,I ATTEND TO THE HOUSEHOLD MENDING YOU KNOW AND CARE FOR THE LINEN,ROBIN WAS GLAD WHEN AT LENGTH THEY WERE LEFT TO THEIR OWN DEVICES,MARK MY WORDS YOU'LL FIND HIM TOO STRONG FOR YOU AYE AND TOO DEEP,IT IS THE ONLY AMENDS I ASK OF YOU FOR THE WRONG YOU HAVE DONE ME,HE KEEPS THE THOU SHALT NOT COMMANDMENTS FIRST RATE HEN LORD DOES,HE SEEMED TO WAIT FOR HER REPLY BUT AS SHE MADE NONE HE PROCEEDED,GRACE INVOLVES THE REMISSION OF SINS PEACE AND A HAPPY CONSCIENCE,IN EVERY WAY THEY SOUGHT TO UNDERMINE THE AUTHORITY OF SAINT PAUL,NO I'VE MADE UP MY MIND ABOUT IT IF I'M MABEL I'LL STAY DOWN HERE,I REFER TO THE THERMOMETER IT INDICATES THE FIGURE IS OBLITERATED,COTTON IS A WONDERFUL THING IS IT NOT BOYS SHE SAID RATHER PRIMLY,IT WOULD HAVE BEEN MORE WONDERFUL HAD HE SPOKEN WITHOUT A BIDDING,WE HAVE COME FROM A FAR LONELIER PLACE THAN THIS A LONELIER PLACE,MISSUS GRIFFIN HOWEVER EXPRESSED THE NEED FOR A LITTLE MORE LIGHT,IN THE SILENCE THEIR DARK FIRE KINDLED THE DUSK INTO A TAWNY GLOW,THE CLOUD THEN SHEWD HIS GOLDEN HEAD AND HIS BRIGHT FORM EMERG'D,LIKE THE DOVES VOICE LIKE TRANSIENT DAY LIKE MUSIC IN THE AIR AH,I'LL NOT BE WICKED ANY MORE SIGHED THE OLD BOOLOOROO I'LL REFORM,IN PERSON WELCOME ABOARD PROFESSOR YOUR CABIN IS WAITING FOR YOU,SEVERAL HUNDRED FREE STATE MEN PROMPTLY RESPONDED TO THE SUMMONS,IT IS NECESSARY THEREFORE THAT HE SHOULD COMPLY THE KING FROWNED,THE SOMBRE OLD TREES LIKE GIGANTIC HEARSE PLUMES BLACK AND AWFUL,DON'T INSULT ME STANLEY BY TALKING AGAIN AS YOU DID THIS MORNING,UP AND DOWN THE WATER WE WENT TO GET MUCH WEALTH AND MUCH FROLIC,WOULD NOT THE LOFTIEST EMINENCES OF THE CITY AT LEAST BE VISIBLE,AND IF I HAD A FORTUNE WOULD THEE WANT ME TO LEAD A USELESS LIFE,TO BURN WITHOUT CEASING TO FLY THEREIN LIES THE MARVEL OF GENIUS,ALEXANDER ROSE AND SHOOK HIMSELF ANGRILY YES I KNOW I'M COWARDLY,THE GREATNESS OF THE RANSOM CHRIST THE SON OF GOD INDICATES THIS,AT THE SAME TIME PAUL CONFIRMS OUR CREED THAT CHRIST IS VERY GOD,AS FOR THE ICHTHYOSAURUS HAS HE RETURNED TO HIS SUBMARINE CAVERN,I PRAY FOR YOU BUT THAT'S NOT THE SAME AS IF YOU PRAYED YOURSELF,FOR IF HE'S ANYWHERE ON THE FARM WE CAN SEND FOR HIM IN A MINUTE,MUNNY I TOULD IKE TO DO INTO DE BARN TO TOMMY TO SEE DE WHITTAWD,I SUPPOSE THOUGH IT'S TOO EARLY FOR THEM THEN CAME THE EXPLOSION,SHE HAD ALMOST FORGOTTEN THAT IT WAS HERE WITHIN TOUCH AND SIGHT,THE YOUNG MAN IS IN BONDAGE AND MUCH I FEAR HIS DEATH IS DECREED,ON FRIDAY CONFESSION WILL BE HEARD ALL THE AFTERNOON AFTER BEADS,SHE CEASD AND SMILD IN TEARS THEN SAT DOWN IN HER SILVER SHRINE,BUT CAP'N BILL MADE NO SUCH ATTEMPT KNOWING IT WOULD BE USELESS,STRAIGHTWAY THE HAWK GLIDED FROM HIS PERCH AND DARTED AFTER HIM,I HAD AGAIN BEEN ACTING UNDER THE INFLUENCE OF THIS MAN'S POWER,HE LOOKED UP RATHER UNGRACIOUSLY BUT MOTIONED THEM TO BE SEATED,PERHAPS THE OTHER TREES FROM THE FOREST WILL COME TO LOOK AT ME,AND TOWARDS CHRISTMAS HE WAS ONE OF THE FIRST THAT WAS CUT DOWN,WILL WHISPERED ROBIN OPENING HIS DOOR AS HE SPOKE ARE YOU READY,TAKE YOUR PLACE AND LET US SEE WHAT THE CRYSTAL CAN SHOW TO YOU,BY THE BEARD OF ODIN I CRIED YOU HAVE TAKEN OUR JOKE LIKE A MAN,ON A BENCH IN A FAR CORNER WERE A DOZEN PEOPLE HUDDLED TOGETHER,IS THEE GOING TO THE YEARLY MEETING RUTH ASKED ONE OF THE GIRLS,MARGARET BOLTON ALMOST LOST FOR A MOMENT HER HABITUAL PLACIDITY,DON'T I THOUGH I'M SO SORRY TO HEAR IT HOW DID HER SON TURN OUT,THIS SHOULD GO FAR IN SHUTTING THE MOUTHS OF THE FALSE APOSTLES,IN THIS WHOLE EPISTLE PAUL TREATS OF THE RESURRECTION OF CHRIST,OH EVER SO MUCH ONLY HE SEEMS KIND OF STAID AND SCHOOL TEACHERY,JUST SMELL THE WILD ROSES THEY ARE ALWAYS SO SPICY AFTER A RAIN,YOU LEFT HIM IN A CHAIR YOU SAY WHICH CHAIR BY THE WINDOW THERE,THE HEAD OF THE PATCHWORK GIRL WAS THE MOST CURIOUS PART OF HER,WELL IF I DON'T KNOW WHO SHE WAS IN LOVE WITH I KNOW WHO HE WAS,THE GOAT'S WARLIKE SPIRIT WAS ROUSED BY THIS SUCCESSFUL ATTACK,AND IN THIS LAST ACTION HE FALLS INTO THE CLASSIC SIN OF PRIDE,BUT MUCH OF THE NOVEL'S BROODING POWER COMES FROM CAPTAIN NEMO,HE WORKED ME VERY HARD HE WANTED TO BE BEATING ME ALL THE TIME,ANYHOW IT'S JOLLY EXCITING AND I CAN DO THE DIALOGUE ALL RIGHT,OH SAY THAT'S DIFFERENT OBSERVED MARKHAM ALTERING HIS DEMEANOR,THEY SNUFFED ABOUT THE FIR TREE AND RUSTLED AMONG THE BRANCHES,WERE I IN THE WARM ROOM WITH ALL THE SPLENDOR AND MAGNIFICENCE,ROBIN ENTERED THE HUT DRAGGING THE UNWILLING ESQUIRE AFTER HIM,AGAIN HE SEARCHED HIS OWN THOUGHTS NOR INEFFECTUALLY AS BEFORE,ALEXANDER LEANED FORWARD AND WARMED HIS HANDS BEFORE THE BLAZE,COME WE'LL HAVE OUR COFFEE IN THE OTHER ROOM AND YOU CAN SMOKE,SIR HARRY TOWNE MISTER BARTLEY ALEXANDER THE AMERICAN ENGINEER,HE'S ANOTHER WHO'S AWFULLY KEEN ABOUT HER LET ME INTRODUCE YOU,WE WON'T TALK ABOUT HER ANY MORE IF YOU'D RATHER NOT WE INDEED,AREN'T YOU SPLASHED LOOK AT THE SPIDER WEBS ALL OVER THE GRASS,HE SAT DOWN WEAK BEWILDERED AND ONE THOUGHT WAS UPPERMOST ZORA,THERE IS NO OPENING EXCEPT THE ONE PANE SAID OUR LEARNED GUIDE,THE PROOF WAS IN THREE LONG SLIPS I HAD LEFT THEM ALL TOGETHER,LET US RETRACE OUR STEPS AND EXAMINE AS WE GO WITH KEENER EYES,SHE POURED INTO THE DISH A QUANTITY FROM EACH OF THESE BOTTLES,THE RECTOR DID NOT ASK FOR A CATECHISM TO HEAR THE LESSON FROM,OPEN THY HEART WIDE AND FOLD WITHIN THE WET WINGS OF THY DOVE,OR AN EYE OF GIFTS AND GRACES SHOWRING FRUITS AND COINED GOLD,ONE OF US ALWAYS REMAINS ON BOARD WHILE THE OTHER IS ON SHORE,YOUR PLAY MUST BE NOT MERELY A GOOD PLAY BUT A SUCCESSFUL ONE,DOES YOUR MAJESTY THEN NO LONGER BELIEVE THE DISLOYAL ATTEMPT,VOLTAIRE PICKED UP SOMETHING FROM THE GROUND AND LOOKED AT IT,NOTHING MORE NOT EVEN THE WRIST TO WHICH IT MIGHT BE ATTACHED,SOMETHING BETTER SOMETHING STILL GRANDER MUST FOLLOW BUT WHAT,MOST OF ALL ROBIN THOUGHT OF HIS FATHER WHAT WOULD HE COUNSEL,WHAT IS YOUR NAME LORDING ASKED THE LITTLE STROLLER PRESENTLY,HE WAS LIKE UNTO MY FATHER IN A WAY AND YET WAS NOT MY FATHER,THEIR EYES DANCED BIG THORLEIF STOOD UP AND STRETCHED HIMSELF,TO ALL THESE INQUIRIES THE COUNT RESPONDED IN THE AFFIRMATIVE,IT IS SO MADE THAT EVERYWHERE WE FEEL THE SENSE OF PUNISHMENT,I DOUBT WHETHER BRANWELL WAS MAINTAINING HIMSELF AT THIS TIME,SOLON MARVELLED AND DESIRED TO BE INFORMED OF THE PARTICULARS,WE THINK THAT BY SOME LITTLE WORK OR MERIT WE CAN DISMISS SIN,NOT FOR A CROWN OR A KINGDOM OR OUR GOODNESS BUT FOR OUR SINS,NO NAMES PLEASE SAID HOLMES AS WE KNOCKED AT GILCHRIST'S DOOR,ONE HARDLY LIKES TO THROW SUSPICION WHERE THERE ARE NO PROOFS,OLD DANCES ARE SIMPLIFIED OF THEIR YEARNING BLEACHED BY TIME,COME AND GET THE BOOLOOROO SHE SAID GOING TOWARD THE BENCHES,YOU HAVE COME TO US THREATENING US WITH ABSOLUTE DESTRUCTION,I HAVE BEEN HERE THIS QUARTER OF AN HOUR REPLIED LA VALLIERE,I REMEMBER NOW AND I CONGRATULATE MYSELF DO YOU LOVE ANY ONE,SEEING THAT I AM SO FINE I MAY AS WELL GO AND VISIT THE KING,CAN YOU IMAGINE WHY BUCKINGHAM HAS BEEN SO VIOLENT I SUSPECT,SHE EVEN SEEMED MILDLY AMUSED AT THE ATTENTION SHE ATTRACTED,AND THE WHOLE NIGHT THE TREE STOOD STILL AND IN DEEP THOUGHT,AT LAST ALL WAS QUIET AND BLACK IN THE COURTYARD OF GAMEWELL,PRESENTLY HE CROSSED THE FLOOR OF HIS ROOM WITH DECIDED STEP,ILL AND TROUBLED DEAR TROUBLED IN MIND AND MISERABLY NERVOUS,I DID NOT EVEN TAKE THE PRECAUTION OF SMOKING UP THE CHIMNEY,IN THE STERN I CURVED THE TAIL UP ALMOST AS HIGH AS THE HEAD,OLIVE'S MOURNFUL BLACK EYES MET NANCY'S SPARKLING BROWN ONES,GRANDFATHER WAS ALEXANDER CAREY L L D DOCTOR OF LAWS THAT IS,WHAT CAN YOU MEAN BY THAT MISS WOODLEY YOU TALK MYSTERIOUSLY,IS HE GOING TO START A DAILY NEWSPAPER AMONG THE KICK A POOS,YOU CAN BEGIN BY CARRYING A ROD AND PUTTING DOWN THE FIGURES,I'LL DO ANYTHING YOU WISH ME TO BARTLEY SHE SAID TREMULOUSLY,WHEN THE KING COMES TO PARIS EVERYBODY CALLS OUT VIVE LE ROI,KESWICK MARCH TWENTY SECOND EIGHTEEN THIRTY SEVEN DEAR MADAM,THERE SEEMS NO GOOD REASON FOR BELIEVING THAT IT WILL CHANGE,POSITIVELY HEROIC ADDED CRESSWELL AVOIDING HIS SISTER'S EYES,I WAS IN SUCH A HURRY TO COME TO YOU YOU LEFT YOUR DOOR OPEN,DO NOT THEREFORE THINK THAT THE GOTHIC SCHOOL IS AN EASY ONE,WELL NOW ENNIS I DECLARE YOU HAVE A HEAD AND SO HAS MY STICK,DEAREST TEACH ME SO TO POUR OUT GRATITUDE AS THOU DOST GOOD,I SHALL BE HAPPY TO TAKE CHARGE OF THEM SAID SIR FERDINANDO,THEY WERE CERTAINLY NO NEARER THE SOLUTION OF THEIR PROBLEM,HOWEVER THAT WAS OVER NOW THE TREE GONE THE STORY AT AN END,SAID THE FIR TREE THINKING OVER WHAT HE HAD HIMSELF RELATED,HUMPY DUMPY FELL DOWNSTAIRS AND YET HE MARRIED THE PRINCESS,IF A FELLOW'S BEEN A LITTLE BIT WILD HE'S BEELZEBUB AT ONCE,HERE THEY SAID IS A RASCAL WHO HAS BEEN HARRYING OUR COASTS,HERE FRIEND TAKE IT AND HE THRUST IT INTO THE FARMER'S HAND,BY THE HAMMER OF THOR SHOUTED GRIM HERE IS NO STINGY COWARD,EXCLAIMED SERVADAC KEEPING HIS EYE UNMOVED AT HIS TELESCOPE,LENGTH OF SERVICE FOURTEEN YEARS THREE MONTHS AND FIVE DAYS,BUT WHY DIDN'T YOU TELL ME WHEN YOU WERE HERE IN THE SUMMER,IT'S REALLY TOO WARM IN THIS ROOM TO SING DON'T YOU FEEL IT,HE'S BEEN WANTING TO MARRY HILDA THESE THREE YEARS AND MORE,THERE IS A MORE OR LESS ELABORATE SYSTEM OF RANK AND GRADES,THE WEATHER IF WE MAY USE THAT TERM WILL CHANGE BEFORE LONG,I'M SURE ALEXANDRA HOPES YOU WILL STAY ON HERE SHE MURMURED,I SUPPOSE IT'S THE WET SEASON WILL YOU HAVE TO CUT THEM TOO,INDEED HE HAD LOOKED AWAY WITH THE PURPOSE OF NOT SEEING IT,THERE THERE HE SAID SOOTHINGLY PATTING HER BROWN FUZZY HEAD,THE LAGOON HAD BEEN LEVEL WITH THE DYKES A WEEK AGO AND NOW,ON THE PALM WERE THREE LITTLE PYRAMIDS OF BLACK DOUGHY CLAY,WATSON I HAVE ALWAYS DONE YOU AN INJUSTICE THERE ARE OTHERS,NUMBER TEN FRESH NELLY IS WAITING ON YOU GOOD NIGHT HUSBAND,COME FORTH WORM AND THE SILENT VALLEY TO THY PENSIVE QUEEN,JOHN WESLEY COMBASH JACOB TAYLOR AND THOMAS EDWARD SKINNER,HOW YOU MAY BE WONDERING ARE YOU TO BEGIN YOUR MASTERPIECE,TO BE OR NOT TO BE THAT IS THE QUESTION WHETHER TIS NOBLER,MY TONGUE REFUSED TO ARTICULATE MY POWER OF SPEECH LEFT ME,PERCHANCE TOO KAFFAR'S DEATH MIGHT SERVE HIM IN GOOD STEAD,SAID ANOTHER VOICE WHICH I RECOGNIZED AS VOLTAIRE'S KAFFAR,NOW WHAT WAS THE SENSE OF IT TWO INNOCENT BABIES LIKE THAT,TRULY SUCH A HORSE SHOULD BE WORTH MUCH IN NOTTINGHAM FAIR,IT IS MANIFEST THAT MAN IS NOW SUBJECT TO MUCH VARIABILITY,HAKON THERE SHALL BE YOUR CONSTANT COMPANION FRIEND FARMER,MY DRAGON'S BELLY IS NEVER FULL AND ON BOARD WENT THE GOLD,TO ASK ANY MORE QUESTIONS OF YOU I BELIEVE WOULD BE UNFAIR,THE REAL HUMAN DIVISION IS THIS THE LUMINOUS AND THE SHADY,WHY SHOULD ONE NOT EXPLORE EVERYTHING AND STUDY EVERYTHING,WHEN SHE FINISHED ALEXANDER SHOOK HIMSELF OUT OF A REVERIE,LAMB WOULDN'T CARE A GREAT DEAL ABOUT MANY OF THEM I FANCY,I SHOULDN'T WONDER IF SHE COULD LAUGH ABOUT IT WITH ME NOW,SHE SAVES HER HAND TOO SHE'S AT HER BEST IN THE SECOND ACT,YES BUT THE MERIDIAN OF THE PALAIS ROYAL IS THE MOST EXACT,SOCRATES BEGINS THE TIMAEUS WITH A SUMMARY OF THE REPUBLIC,THE MOST THEY COULD CLAIM IS THAT THEY WERE SENT BY OTHERS,AND EMIL MOWED HIS WAY SLOWLY DOWN TOWARD THE CHERRY TREES,AT THIS THE BUNDLE OPENED SUDDENLY AND OUT POPPED PHRONSIE,BUT I HAVE OCCASIONALLY DONE THE SAME THING AT OTHER TIMES,THE PHRASE AND THE DAY AND THE SCENE HARMONIZED IN A CHORD,PRIDE AFTER SATISFACTION UPLIFTED HIM LIKE LONG SLOW WAVES,I HAD A NOTION IT WAS YOU MATE AS SAVED ME FROM THE KNIFE,FOOTNOTE SUMNER TO SHANNON MAY TWELFTH EIGHTEEN FIFTY SIX,DO YOU SUPPOSE THE MINIATURE WAS A COPY OF THE SAME THING,NOTTINGHAM CASTLE WAS REACHED AND ADMITTANCE WAS DEMANDED,COME TO ME MEN HERE HERE HE RAISED HIS VOICE STILL LOUDER,THERE SHE SAT ON THE ROLLERS AS FAIR A SHIP AS I EVER SAW,STEAM UP AND CANVAS SPREAD THE SCHOONER STARTED EASTWARDS,DONE HE AIN'T DONE A THING HE'D OUGHTER SENCE HE WAS BORN,I WILL ASK THE LEAST IMAGINABLE BUT I MUST HAVE SOMETHING,YES YES SHE HURRIED PULLING HER HAND GENTLY AWAY FROM HIM,DO YOU REMEMBER THAT FIRST WALK WE TOOK TOGETHER IN PARIS,THEY ARE ALL SKETCHES MADE ABOUT THE VILLA D'ESTE YOU SEE,IN THIS MONOTONOUS LIFE OF MINE THAT WAS A PLEASANT EVENT,ON AUGUST TWENTY SEVENTH EIGHTEEN THIRTY SEVEN SHE WRITES,INDEED HE PERSECUTED THE CHURCH OF CHRIST FOR A LONG TIME,AT LAST HE CAME OUT OF THEM AND WIPED HIS FACE VIGOROUSLY,RUN BACK UNCAS AND BRING ME THE SIZE OF THE SINGER'S FOOT,AND LAY ME DOWN IN THY COLD BED AND LEAVE MY SHINING LOT,DESCEND O LITTLE CLOUD AND HOVER BEFORE THE EYES OF THEL,AND WHY IT SCATTERS ITS BRIGHT BEAUTY THRO THE HUMID AIR,WHY SHOULD THE MISTRESS OF THE VALES OF HAR UTTER A SIGH,DON'T WORRY SIZZLE DEAR IT'LL ALL COME RIGHT PRETTY SOON,HE WENT HERE THERE AND EVERYWHERE IN PERFECT CONTENTMENT,WE ARE QUITE SATISFIED NOW CAPTAIN BATTLEAX SAID MY WIFE,FOR SOME TIME AFTER THAT I REMEMBERED NOTHING DISTINCTLY,CRIED THE YOUNG LADIES AND THEY QUICKLY PUT OUT THE FIRE,I AM VERY UNEASY ABOUT IT WHATEVER IT IS I CAN'T HELP IT,THIRTY MEN ONE AFTER ANOTHER RAISED THEIR HORNS AND SAID,I ALMOST THINK I CAN REMEMBER FEELING A LITTLE DIFFERENT,THOSE CLOUDS SEEM AS IF THEY WERE GOING TO CRUSH THE SEA,IT WOULD SERVE YOU ALL RIGHT IF SHE WALKED OFF WITH CARL,ASKED PHRONSIE WITH HER LITTLE FACE CLOSE TO POLLY'S OWN,I REALLY DON'T THINK HE KNEW MUCH ABOUT IT MISTER HOLMES,THERE'S ONE AND THERE'S ANOTHER THE DUDLEY AND THE FLINT,THROUGH THE BLACK NIGHT RAIN HE SANG TO HER WINDOW BARS,MILLIGRAM ROUGHLY ONE TWENTY EIGHT THOUSAND OF AN OUNCE,NOT AT ALL YOU ARE ON THE CONTRARY MOST AGREEABLE TO ME,VAST IMPORTANCE AND INFLUENCE OF THIS MENTAL FURNISHING,THEY FOLLOWED THE JAILER ALONG A SUCCESSION OF PASSAGES,IF IT ONLY WERE NOT SO DARK HERE AND SO TERRIBLY LONELY,YET HE WILL TEACH YOU A FEW TRICKS WHEN MORNING IS COME,HE IS MY ESQUIRE EXCELLENCY RETURNED ROBIN WITH DIGNITY,YES SO THEY SAID BUT THAT WOULD I THINK HAVE BEEN WORSE,IF SHE DOES NOT KNOW HOW TO ESTIMATE HER OWN VALUE I DO,SO THERE IS TO ME ADDED SANDFORD WITH A SARCASTIC SNEER,FATHER THEE'S UNJUST TO PHILIP HE'S GOING INTO BUSINESS,HE TOOK HER ROUGHLY IN HIS ARMS DO YOU KNOW WHAT I MEAN,BUT A WORD FURTHER CONCERNING THE EXPEDITION IN GENERAL,WHAT SIR I SAID TO HIM AM I FORTUNATE ENOUGH TO SEE YOU,WE HAD METERS IN WHICH THERE WERE TWO BOTTLES OF LIQUID,HE KNEW THE SILVER FLEECE HIS AND ZORA'S MUST BE RUINED,WHY BANNISTER THE SERVANT WHAT'S HIS GAME IN THE MATTER,LET US HEAR THE SUSPICIONS I WILL LOOK AFTER THE PROOFS,THEN YOU CAN ASK HIM QUESTIONS ON THE CATECHISM DEDALUS,I DID NOT WRONG MYSELF SO BUT I PLACED A WRONG ON THEE,SIR KENNINGTON OVAL IS A VERY FINE PLAYER SAID MY WIFE,I SAY YOU DO KNOW WHAT THIS MEANS AND YOU MUST TELL US,THERE WAS A GRIM SMILE OF AMUSEMENT ON HIS SHREWD FACE,IT WAS IN A CORNER THAT HE LAY AMONG WEEDS AND NETTLES,ALSO THERE WAS A STRIPLING PAGE WHO TURNED INTO A MAID,DID YOU EVER HAVE SUCH A LORDLY GUEST BEFORE I WENT ON,THE SIGHT SEERS RETURNED IN HIGH SPIRITS FROM THE CITY,HOWEVER HE WHO SAYS LIGHT DOES NOT NECESSARILY SAY JOY,THERE IT CLOTHES ITSELF IN WORD MASKS IN METAPHOR RAGS,I SHUDDER AS I RECALL THESE MONSTERS TO MY REMEMBRANCE,DON'T MIND IT POLLY WHISPERED JASPER TWASN'T HER FAULT,AND FEAREST THOU BECAUSE I VANISH AND AM SEEN NO MORE,I NEVER KNEW OF BUT ONE MAN WHO COULD EVER PLEASE HIM,OR OF THE HABITS OF OUR PEOPLE IT IS QUITE IMPOSSIBLE,MISSUS NEVERBEND YOU MUST INDEED BE PROUD OF YOUR SON,IT IS THIS THAT IS OF INTEREST TO THEORY OF KNOWLEDGE,HIS DEATH IN THIS CONJUNCTURE WAS A PUBLIC MISFORTUNE,LARKSPUR BIT ME AGAIN THIS MORNING FOR THE THIRD TIME,THE DEMOCRATIC COMMITTEE FIGURED OUT A WAY TO DO THIS,THE SERVANTS AS WELL AS THE YOUNG LADIES DECORATED IT,REJOICE IN OUR PRESENCE SAID THE AIR AND THE SUNLIGHT,I LIKE YOU STILL RACHEL I'M SURE I'LL ALWAYS LIKE YOU,IS SHE NOT AFRAID THAT I WILL THWART HER INCLINATIONS,I DID NOT THEN REALIZE THE IMPORTANCE OF THE MINISTRY,I GET WET TO MY KNEES WHEN I GO DOWN TO PICK CHERRIES,BUT THERE'S FATHER THE BARN SIR IF HE'D BE OF ANY USE,BUT NOT MORE THAN WHAT'S IN THE BIBLE AUNT SAID DINAH,I OFTEN HEARD HER TALK OF YOU IN THE SAME SORT OF WAY,WHO TAUGHT YOU TO SCRUB A FLOOR I SHOULD LIKE TO KNOW,I AM MY DEAR AND ALL STRANGERS ARE WELCOME TO MY HOME,I PASS AWAY YET I COMPLAIN AND NO ONE HEARS MY VOICE,THAT WAS BUT RUSTLING OF DRIPPING PLANTS IN THE DARK,WHAT COULD I DO NOW BUT JUST LAY MYSELF DOWN AND DIE,HAVE MERCY LORD ON ME I PRAY FOR MEN WOULD ME DEVOUR,THE ARROW PIERCED HIS HEART AND WOUNDED HIM MORTALLY,CERTAINLY SIRE BUT I MUST HAVE MONEY TO DO THAT WHAT,THEY WERE NOW PLAYING WITH THEIR DOLLS IN THE PARLOR,WHY IT'S GOLIATH AS USUAL THEY BOTH CRIED PEERING IN,HE IS SUPPOSED TO SIGN ALL THE CHECKS OF THE CONCERN,IN THE MORNING THE SERVANT AND THE HOUSEMAID CAME IN,NAY NAY LORDING ANSWERED WARRENTON WITH A HALF LAUGH,THEREFORE DON'T TALK TO ME ABOUT VIEWS AND PROSPECTS,MUNNY MY IRON'S TWITE TOLD PEASE PUT IT DOWN TO WARM,UP IN THE SICK ROOM ZORA LAY ON THE LITTLE WHITE BED,THE GOLDEN FLEECE IT'S THE SILVER FLEECE HE HARKENED,NO I FORGOT ALL ABOUT THE BRAINS EXCLAIMED THE WOMAN,OJO HAD NEVER EATEN SUCH A FINE MEAL IN ALL HIS LIFE,WHEN DO YOU INTEND THAT THE JOHN BRIGHT SHALL START,LADY LARKSPUR STARTS SUDDENLY AND TURNS TOWARDS HIM,AND I SHOULD BEGIN WITH A SHORT HOMILY ON SOLILOQUY,BUT EVEN THE UNSUCCESSFUL DRAMATIST HAS HIS MOMENTS,LA VALLIERE IS QUITE A POETESS SAID TONNAY CHARENTE,THE BALLET BEGAN THE EFFECT WAS MORE THAN BEAUTIFUL,THE KING SEEMED ONLY PLEASED WITH EVERY ONE PRESENT,HE UNLOCKED THE DOOR AND CALLED HERE'S VISITORS TOM,IF FOR A WHIM YOU BEGGAR YOURSELF I CANNOT STAY YOU,NO THANKS I AM GLAD TO GIVE YOU SUCH EASY HAPPINESS,BUT THEN THE PICTURE WAS GONE AS QUICKLY AS IT CAME,GIVE NOT SO EARNEST A MIND TO THESE MUMMERIES CHILD,NOW SHE PUT HER HAND ON HIS ARM AND SMILED AND SAID,AND THESE SHALL FOLLOW YOUR THRALLS IN THE SAME WAY,THERE STAND SO I SAID AND GLARE AND HISS AT MY FOES,YES DEAD THESE FOUR YEARS AN A GOOD JOB FOR HER TOO,EACH DAY HAS ITS OWN GREAT GRIEF OR ITS LITTLE CARE,KEEP AWAY IF YOU WISH WHEN HAVE I EVER FOLLOWED YOU,ALEXANDER GROANED I MEANT TO BUT SOMEHOW I COULDN'T,AFTER THAT IT WAS EASY TO FORGET ACTUALLY TO FORGET,MAINHALL LIKED ALEXANDER BECAUSE HE WAS AN ENGINEER,HERE GO AND GET ME CHANGE FOR A LOUIS I HAVE IT SIR,COME COME I AM GETTING REALLY TIRED OF YOUR ABSENCE,BUT YOU BELIEVE IN SOME EDUCATION ASKED MARY TAYLOR,SO CHOOSE FOR YOURSELF TO MAKE A RUSH OR TARRY HERE,BUT WAS THAT ALL HER REWARD ONE OF THE LADIES ASKED,HE QUITTED THE FIRE AND DROPPED BACK INTO HIS CHAIR,WHY AN EAR A WHIRLPOOL FIERCE TO DRAW CREATIONS IN,AS USUAL NOTHING WAS DONE IN THE WAY OF PUNISHMENT,WHAT WOULD BECOME OF YOUR GUN WERE I TO KIDNAP YOU,NO DOUBT IN PROCESS OF TIME THE LADIES WILL FOLLOW,THIS WAS AT THE MARCH ELECTION EIGHTEEN FIFTY FIVE,NATURE OF THE EFFECT PRODUCED BY EARLY IMPRESSIONS,ISN'T HE THE GREATEST FOR GETTING INTO ODD CORNERS,IT WON'T BE MUCH BUT I'M GRATEFUL TO FIND A FRIEND,WHOSE NAME DID YOU SIGN TO THE CHECK ASKED KENNETH,WORSE TOM WORSE N EVER REPLIED THE JAILER GLOOMILY,PRAY FOLLOW US WITH MINE AND MY LORD SHERIFF'S MEN,MONTFICHET CALLED OUT FOR ROBIN TO GIVE HIM AN ARM,WELL SHE WAS BETTER THOUGH SHE HAD HAD A BAD NIGHT,WE SUNK HIS SHIP AND MEN BUT HIM WE BROUGHT TO YOU,THEY COULDN'T RUN NOR MOVE THEY'RE JUST PASTEBOARD,THY WAYS GREATLY TRY ME RUTH AND ALL THY RELATIONS,BUT HOW DID SHE MANAGE TO RENDER IT SO FASHIONABLE,HE NEVER LOSES SIGHT OF THE PURPOSE OF HIS EPISTLE,LET US BEGIN WITH THAT HIS COMMENTARY ON GALATIANS,IF SHE COULD ONLY SEE PHRONSIE FOR JUST ONE MOMENT,I NOW USE THEM AS ORNAMENTAL STATUARY IN MY GARDEN,IT WAS ALMOST THE TONE OF HOPE EVERYBODY WILL STAY,HARANGUE THE TIRESOME PRODUCT OF A TIRELESS TONGUE,SOON THE WHOLE BRIDGE WAS TREMBLING AND RESOUNDING,HE IS CALLED AS YOU KNOW THE APOSTLE OF THE INDIES,WHY A TONGUE IMPRESS'D WITH HONEY FROM EVERY WIND,BUT I DO NOT THINK SUCH AN INFERENCE IS WARRANTED,THE BOGUS LEGISLATURE NUMBERED THIRTY SIX MEMBERS,THEN IS THE TIME TO INTRODUCE A MEAL ON THE STAGE,RELAPSES INTO SILENCE FOR THE REST OF THE EVENING,BUT THIS WAS WHAT THE TREE COULD NOT BEAR TO HEAR,ENQUIRED ROBIN WITH HIS SUSPICIONS STILL UPON HIM,TAKE HIM OUT THORKEL AND LET HIM TASTE YOUR SWORD,MAY YOU DRINK HEART'S EASE FROM IT FOR MANY YEARS,I HAVE NOTHING TO WEAR REPLIED THAT DEMURE PERSON,HE WAS UNABLE TO DECIDE EXACTLY WHAT IT SHOULD BE,ALEXANDER WENT OVER AND OPENED THE WINDOW FOR HER,SHE HAD ANOTHER WEIGHT ON HER MIND THIS CHRISTMAS,THE ORCHARD WAS SPARKLING AND RIPPLING IN THE SUN,WHEN I APPROACHED YOUR ROOM I EXAMINED THE WINDOW,OJO EXAMINED THIS CURIOUS CONTRIVANCE WITH WONDER,I'M AFRAID I DON'T KNOW MUCH ABOUT THE LAND OF OZ,SHE SENT ME THE PAGES IN QUESTION BEFORE SHE DIED,I CAN'T SEE IT IN THAT LIGHT SAID THE OLD LAWYER,A MONTFICHET A MONTFICHET GAMEWELL TO THE RESCUE,THANK YOU RACHEL MY COUSIN RACHEL MY ONLY FRIEND,EFFECTS OF THE INCREASED USE AND DISUSE OF PARTS,THAT TIME IT POINTED US INTO YOUR FATHER'S SHIPS,THE THRALLS WERE BRINGING IN A GREAT POT OF MEAT,NEXT CAME OLIVE'S TURN TO HELP IN THE CEREMONIES,AND YOU BELONG TO THAT SMALL CLASS WHO ARE HAPPY,THE EARTH IS NOT DEVOID OF RESEMBLANCE TO A JAIL,WE HAVE NEVER UNDERSTOOD THIS SORT OF OBJECTIONS,MADAME QUINSON BESIDES CAN ANSWER YOUR ENQUIRIES,MEN SHOULD NOT SPECULATE ABOUT THE NATURE OF GOD,I'LL TRY IF I KNOW ALL THE THINGS I USED TO KNOW,MISTER EDISON WAS A LEADER FAR AHEAD OF THE TIME,HE STARTED AT THE THOUGHT HE HURRIED FORTH SADLY,BUT JOHN THERE'S NO SOCIETY JUST ELEMENTARY WORK,THE EXAMINATION HOWEVER RESULTED IN NO DISCOVERY,YET THAT TASK WAS NOT SO EASY AS YOU MAY SUPPOSE,IT IS HARDLY NECESSARY TO SAY MORE OF THEM HERE,LIEUTENANT CROSSTREES IS A VERY GALLANT OFFICER,AND WHAT SORT OF EVIDENCE IS LOGICALLY POSSIBLE,REMAIN I IMPLORE YOU THE EVENING IS MOST LOVELY,IT HAS COST ME TWICE SIXTY DOLLARS IN ANNOYANCE,SORRY WE HAVEN'T ANY RECEPTION ROOM IN THE JAIL,THERE'S MANY A ONE CONSIDERABLY OLDER THAN I AM,DISMISS YOUR SQUIRE ROBIN AND BID ME GOOD E E N,AND HENRY MIGHT RETURN TO ENGLAND AT ANY MOMENT,LIKE AS NOT YOUNG MASTER THOUGH I AM AN OLD MAN,AND HE ADDED SOMETHING STILL LESS COMPLIMENTARY,MAKE ACQUAINTANCE WITH MISTER JAGO SIT TOGETHER,A ROBBER VIKING SAID THE KING AND SCOWLED AT ME,A HOUSE SMELLS OF SMOKE A SHIP SMELLS OF FROLIC,THE REST OF YOU OFF A VIKING HE HAD THREE SHIPS,WELL I'M GOING AS AN ENGINEER YOU CAN GO AS ONE,ALEXANDER UNCLENCHED THE TWO HANDS AT HIS SIDES,FOR A LONG TIME NEITHER HILDA NOR BARTLEY SPOKE,I TELL HIM TO GIVE ME SOME COFFEE IF IT IS GOOD,AND GOD THE FATHER WHO RAISED HIM FROM THE DEAD,FOR A PERSON TO POSSESS KNOWLEDGE IS NOT ENOUGH,OH WON'T SHE BE SAVAGE IF I'VE KEPT HER WAITING,NOTHING NEW WEATHER UNCHANGED THE WIND FRESHENS,I DON'T KNOW ALL OF THEM BUT I KNOW LINDENS ARE,THE HOPE AND DREAM OF HARVEST WAS UPON THE LAND,HE IMPRESSED ME AS BEING A PERFECTLY HONEST MAN,ONE COULD HARDLY HOPE FOR ANY UPON SO DRY A DAY,IN TRUTH SHE SEEMED ABSOLUTELY HIDDEN BEHIND IT,PEARL WAS A BORN OUTCAST OF THE INFANTILE WORLD,CRIED THE LADIES WHOSE DEPARTURE HAD BEEN FIXED,WE'LL BE QUITE COMFORTABLE HERE I TOLD CONSEIL,CONSEIL I CALLED A THIRD TIME CONSEIL APPEARED,MILLIMETER ROUGHLY ONE TWENTY FIFTH OF AN INCH,AND THE DEATH OF WHICH I DREAMT COULD NOT ALAS,IN DESPAIR HE HURLED HIMSELF DOWNWARD TOO SOON,CONCORD RETURNED TO ITS PLACE AMIDST THE TENTS,WE WISH TO TALK WITH HIM ANSWERED KENNETH TALK,THEN GOOD BYE SAID THE RATS AND THEY WENT HOME,AND HE LEANED AGAINST THE WALL LOST IN REVERIE,I WON'T TREMBLE TO MORROW THOUGHT THE FIR TREE,BE NOT SO FOOLISH FRIEND SAID FITZOOTH CROSSLY,BUT WHO IS THIS FELLOW PLUCKING AT YOUR SLEEVE,AND MINE IS WILL STUTELEY SHALL WE BE COMRADES,IN THE MEANTIME I HAD FORMED A NEW IDEA OF HER,I HAD A HORRID DREAM ABOUT HIM LAST NIGHT THAT,WHEN I ADDRESSED HIM HE ANSWERED CONSTRAINEDLY,ARE YOU CERTAIN THAT THIS IS THE MEDITERRANEAN,DOES THEE THINK THEE COULD STAND IT SIX MONTHS,HE PULLED UP A WINDOW AS IF THE AIR WERE HEAVY,THOSE FELLOWS ARE ALL VERY LOYAL EVEN MAINHALL,WE USED TO DISPUTE ABOUT POLITICS AND RELIGION,EMBRACE HIM AND FORGET ABOUT THE NATURE OF GOD,THEY REMAIN DIVINE REGARDLESS OF MEN'S OPINION,I AM VERY TIRED OF SWIMMING ABOUT HERE O MOUSE,TWO HOURS AFTERWARDS A TERRIBLE SHOCK AWOKE ME,I WANT TO BE DOING SOMETHING ON MY OWN ACCOUNT,SURELY YOU ARE NOT THINKING OF GOING OFF THERE,SAID MISTER IRWINE WITH HIS STATELY CORDIALITY,PERHAPS SHE TOO MIGHT BE THERE WAITING WEEPING,THE CRAMPNESS AND THE POVERTY ARE ALL INTENDED,I SAY I'VE BEEN WONDERING ABOUT THIS BUSINESS,DO YOU THINK SO SHE REPLIED WITH INDIFFERENCE,THE HOUSEKEEPER LED THE WAY AND BETH FOLLOWED,OUT IN THE WOODS STOOD A NICE LITTLE FIR TREE,TIS LATE AND I GO MYSELF WITHIN A SHORT SPACE,ITS CURTAINS WERE OF THICK AND FADED TAPESTRY,BRACTON'S A VERY GOOD FELLOW I CAN ASSURE YOU,I'VE BEEN READY TO GO ANYWHERE FOR SIX MONTHS,ALGEBRA MEDICINE BOTANY HAVE EACH THEIR SLANG,THANK YOU BUT I DON'T LIKE IT SO WELL AS THIS,BUT THE ESSENCE OF LUTHER'S LECTURES IS THERE,THEY SEEM TO BE WE ARE LOST BUT I AM NOT SURE,EACH OF US IS LASHED TO SOME PART OF THE RAFT,NOW YOU'LL STAY CRIED VAN SAY POLLY WON'T YOU,HE COULD EXAMINE THE PAPERS IN HIS OWN OFFICE,YES BUT THAT'S JUST THE BEAUTY OF HER PASSION,A COLD LUCID INDIFFERENCE REIGNED IN HIS SOUL,MORNIN GIRLS HOPE YE FEEL AS WELL AS YE LOOK,YES BUT PERHAPS I FRIGHTENED HER IN WHAT WAY,I AM GOING TO THE COURT BALL ANSWERED ANDERS,TIS NOW WINTER OUT OF DOORS THOUGHT THE TREE,IT WILL NOT BE SAFE FOR YOU TO STAY HERE NOW,GEORGE MONTFICHET WILL NEVER FORGET THIS DAY,WHAT I SAY IS ALTOGETHER ON YOUR OWN ACCOUNT,THEY ARE COUSINS YOU KNOW WE ARE ALL COUSINS,SHE FOUND THE DOOR BUT IT WAS LOCKED OUTSIDE,AND WOULD HE NOT BE A GOOD GIFT FOR OUR BABY,SO I SET GUARDS OVER EVERY ONE IN THAT HOUSE,COME COME I CALLED WHEN NO ONE OBEYED A FIRE,BUT I STAYED THAT SPRING AND BUILT ME A BOAT,YOU WILL TAKE ME ON BOARD COUNT WILL YOU NOT,AND BESIDES SUPPOSE THEE DOES LEARN MEDICINE,YOU'LL NEVER DIG IT OUT OF THE ASTOR LIBRARY,WE'VE TORTURED EACH OTHER ENOUGH FOR TONIGHT,BUT I DIDN'T KNOW YOU'VE ONLY TO TELL ME NOW,HAVE YOU BEEN IN PARIS MUCH THESE LATE YEARS,WHY ARE WE TO BE DENIED EACH OTHER'S SOCIETY,SOME POEMS OF SOLON WERE RECITED BY THE BOYS,WAS IT NOT ENOUGH TO SAY FROM GOD THE FATHER,AND SHE WAS VERY FOND OF YOU TOO AUNT RACHEL,YES MY DEAR WATSON I HAVE SOLVED THE MYSTERY,AND THEY ARE ALL IN FOR THIS EXAMINATION YES,TO THE BEST OF MY BELIEF THEY WERE ROLLED UP,HE HAD THE FAITH IN HIM THAT MOVES MOUNTAINS,WE HAVE A COMMANDER WHO'S GAME FOR ANYTHING,FAMILIARITY IS A FEELING CAPABLE OF DEGREES,YOU WILL TAKE THEM FROM MY PRIVATE TREASURE,I AM CONVINCED OF WHAT I SAY SAID THE COUNT,BUT IT WAS NOT THE FIR TREE THAT THEY MEANT,WHAT'S THE MEANING OF THIS THOUGHT THE TREE,HE WANTED TO BEGIN AT THE TOP OF THE LADDER,FACTS FORM ONE OF THESE AND IDEAS THE OTHER,THIS DECISION WAS COMMUNICATED TO THE GIRLS,THE WORLD BRANDS THIS A PERNICIOUS DOCTRINE,THE CLAUSE SEEMS SUPERFLUOUS ON FIRST SIGHT,AT NOON THE VIOLENCE OF THE STORM REDOUBLES,THERE'S A WHALE A WHALE CRIED THE PROFESSOR,WE NEVER HAD SO MANY OF THEM IN HERE BEFORE,IT IS SIXTEEN YEARS SINCE JOHN BERGSON DIED,COLD IS IT MY DARLING BLESS YOUR SWEET FACE,THE YEARS OF THE DAYS OF HER DYING WERE TEN,I AM AFRAID THERE ARE NO SIGNS HERE SAID HE,ABOVE WERE THREE STUDENTS ONE ON EACH STORY,COME THEREFORE AND LET US FLING MUD AT THEM,GRAM ROUGHLY ONE TWENTY EIGHTH OF AN OUNCE,IN ALL THE NOVEL HAD A DIFFICULT GESTATION,ENTER HAMLET WITH HIS FAVOURITE BOAR HOUND,WE MODERNS HOWEVER SEE THE ABSURDITY OF IT,YOUR MAJESTY'S PLAN THEN IN THIS AFFAIR IS,A FEELING OF FREEDOM AND I WAS AWAKE WHERE,SAVE ME MASTERS BUT YOU STARTLED ME RARELY,BEG ME A ROOM OF THE SHERIFF CHILD QUICKLY,I RESIDE IN THE MARAIS RUE DE DOUZE PORTES,NOT ALL THE GALATIANS HAD BECOME PERVERTED,I AM SO VERY TIRED OF BEING ALL ALONE HERE,I WONDER IF I'VE BEEN CHANGED IN THE NIGHT,AND YESTERDAY THINGS WENT ON JUST AS USUAL,OH NO JASPER I MUST GO BY MY VERY OWN SELF,BUT YOU KNOW MORE ABOUT THAT THAN I DO SIR,OH SIR DON'T MENTION IT SAID MISSUS POYSER,SHE'S GOING TO PUT THE IRONING THINGS AWAY,HE WAS PACING SWIFTLY UP AND DOWN HIS ROOM,THEN HE TOSSED IT DOWN AND SEIZED THE NEXT,ONLY THERE ARE TWO SORTS OF CLOUD AND FIRE,STUFF IT INTO YOU HIS BELLY COUNSELLED HIM,OF STARTING I DIDN'T KNOW THE WAY TO COME,BUT I MEAN TO HAVE MY INNINGS BEFORE LONG,TO THEIR SORROW THEY WERE SOON UNDECEIVED,IT WAS IN FACT THE BEST WEAPON OF ITS DAY,THEN LORD TUPPENY WELL WHAT ABOUT AUCTION,NOW THE OBJECT OF THIS SOLILOQUY IS PLAIN,ALMOST INSTANTLY HE WAS FORCED TO THE TOP,YES SIRE AND READY DRESSED FOR THE BALLET,WITH ONE JUMP ANDERS GOT OUT OF HIS CHAIR,NO SOUND BROKE THE STILLNESS OF THE NIGHT,NOW LET'S DUST THE FURNITURE AND PICTURES,YOU'RE FOOLISH WHY SHOULD YOU DO ALL THIS,ALL THE FURNITURE BELONGED TO OTHER TIMES,FOR ONCE IN A WAY I PROVED A TRUE PROPHET,MY MEN POUNDED THE TABLE WITH THEIR FISTS,SHE HAS A SON THEFT AND A DAUGHTER HUNGER,THERE IS NOTHING ELSE THAT LOOKS SO JOLLY,SHE DOESN'T TAKE UP WITH ANYBODY YOU KNOW,THE GREETING OF THE APOSTLE IS REFRESHING,THE RAFT BEARS ON STILL TO THE SOUTH EAST,MARIE'S FACE FELL UNDER HIS BROODING GAZE,SOME TIME YOU'LL TELL ME PLEASE WON'T YOU,BETTER GO HE HAD COUNSELLED SENTENTIOUSLY,IF MISTER SOAMES SAW THEM THE GAME WAS UP,NO ONE LESS THAN THAT WOULD HAVE A CHANCE,HOW CAME YOU TO LEAVE THE KEY IN THE DOOR,DID YOU LOOK AT THESE PAPERS ON THE TABLE,A BROKEN TIP OF LEAD WAS LYING THERE ALSO,AND YOU MUST BE OJO THE UNLUCKY SHE ADDED,MOTHER CRIED SHE I SEE YOU HERE LOOK LOOK,A VOICE FROM BEYOND THE WORLD WAS CALLING,HE CLASPED HIS HANDS ON THE DESK AND SAID,BUT THOU ART NOT SUCH A LOVER MY BELOVED,ALAS I HAVE GRIEVED SO I AM HARD TO LOVE,BUT WHAT IS THE DELICATE MISSION I ASKED,IT SEEMS THE KING WILL NOT CONSENT TO IT,THAT IS A VERY FINE CAP YOU HAVE HE SAID,NOW WHAT HAVE YOU TO SAY CYNTHIA SPRAGUE,AND HE DESERVES A TERM IN STATE'S PRISON,MISS LAKE DECLINED THE CARRIAGE TO NIGHT,HE ACTS AS THOUGH HE HAD NOT EXPECTED US,ANOTHER CIRCUMSTANCE WAS MOST REMARKABLE,SHE PRESSED HIS HAND GENTLY IN GRATITUDE,THERE ARE FEW CHANGES IN THE OLD QUARTER,WHO BEGAN THE QUARREL WAS IT THE MORMONS,BUT WE ARE CARELESS WE MAKE LIGHT OF SIN,THIS IS NO SINFUL PRIDE IT IS HOLY PRIDE,I SHALL NEVER GET TO TWENTY AT THAT RATE,THE ROARINGS BECOME LOST IN THE DISTANCE,AND ANYHOW THERE'S NOTHING TO UNDERSTAND,I DON'T WANT TO STAND AROUND AND LOOK ON,I SUPPOSE THAT'S THE WET SEASON TOO THEN,THAT'S WHAT YOU'D LIKE TO BE DOING IS IT,I NEVER KNEW YOUR EQUALS FOR GALLOWSNESS,ANYONE IN THE ROOM COULD GET OUT YES SIR,A ROUTE SLIGHTLY LESS DIRECT THAT'S ALL,SAID SHE POINTING TO THE PLAYTHINGS SEE,A TERRIBLE THOUGHT FLASHED INTO MY MIND,I REMEMBER SAYING HAVE WE BEEN TOGETHER,WHAT IN THE WORLD IS THAT QUERIED JOYCE,I WISH I KNEW MYSELF SHE CRIED FIERCELY,REJOICE IN THY GROWTH SAID THE SUNBEAMS,PEOPLE SUFFER IN THE LIGHT EXCESS BURNS,SINCE WHEN HAS MALADY BANISHED MEDICINE,NOW WHEN HAS HORROR EVER EXCLUDED STUDY,HE MOVED UNEASILY AND HIS CHAIR CREAKED,HOW MAY WE OBTAIN REMISSION OF OUR SINS,HOWEVER THE GRACE AND PEACE OF GOD WILL,THE WORD OF OUR GOD SHALL STAND FOREVER,OH BUT I'M GLAD TO GET THIS PLACE MOWED,SHE WAS SO STRANGE AND HUMAN A CREATURE,MIGHT LEARN SOMETHING USEFUL DOWN THERE,I THINK SO YOU HAVE FORMED A CONCLUSION,THE TOP FLOOR BELONGS TO MILES MC LAREN,TEA PLEASE MATTHEWS BUTLER IMPASSIVELY,MAY WE SEE GATES AT ONCE ASKED KENNETH,I AM BY NO MEANS OLD SAID THE FIR TREE,THE DEPARTURE WAS NOT AT ALL AGREEABLE,THIS IS OUR LAST FEAST WITH YOU I SAID,SAID MISSUS HORTON A FEW MINUTES AFTER,I GET NOTHING BUT MISERY OUT OF EITHER,AND ALL THE BRETHREN WHICH ARE WITH ME,ONE MIGHT BE WITH LESS REASON THAN NOW,OH I'VE NO DOUBT IT'S IN CAPITAL ORDER,THEN HE LOOKED DOWN THE LAGOON WAS DRY,HAVE I TOLD THE TRUTH MISTER GILCHRIST,YOU DON'T SEEM TO REALIZE THE POSITION,IF SPOKEN TO SHE WOULD NOT SPEAK AGAIN,HOSE MAN'S EXCUSE FOR WETTING THE WALK,HELLO STEPHANOS HERE COMES THE DEDALUS,IMAGE OF WEAKNESS ART THOU BUT A WORM,WHY FADE THESE CHILDREN OF THE SPRING,DID MASTER SUMMON ME HE SAID ENTERING,I WANT TO GET AWAY FROM IT ALL SWOONS,MY OVERWROUGHT NERVES YIELDED AT LAST,IN THOSE VERY TERMS I EVEN ADDED MORE,YOU WILL BE FRANK WITH ME I ALWAYS AM,HER EYES WANDERED TO THE MAID'S HANDS,BETH UNEASY AT HIS SILENCE NUDGED HIM,I HAVE MY OWN REASONS MISTER MARSHALL,I'VE SEEN LOTS OF THAT KIND IN MY DAY,YES IN REALITY THOSE WERE HAPPY TIMES,SISTER NELL DO YOU HEAR THESE MARVELS,YOUR MOTHER THE QUEEN WAS STANDING BY,WE ATE AT MANY MEN'S TABLES UNINVITED,THESE HE GAVE TO THREE OF MY BROTHERS,CAPTAIN SERVADAC HASTENED TOWARDS HIM,MOHAMMED ALSO SPEAKS HIGHLY OF CHRIST,THAT WILL BE A QUEER THING TO BE SURE,AND I DECLARE IT'S TOO BAD THAT IT IS,COMB THE WOOL FOR THE WHITTAWS INDEED,THE HISTORY OF THE HOUSE IS PLAIN NOW,AND WHAT THROUGH THE LEFT HAND WINDOW,I WAS ABSENT RATHER MORE THAN AN HOUR,WHEN HE FINISHED SHE SAID CHEERFULLY,WE'RE LEAVING ON THE ABRAHAM LINCOLN,THINKING OF ALL THIS I WENT TO SLEEP,THEN THE LEADER PARTED FROM THE LINE,SHE WAS HERE JUST NOW SAID THE COUNT,SURELY WE CAN SUBMIT WITH GOOD GRACE,HE HAD HIS HAND UPON LAKE'S SHOULDER,BURN FIRE BURN FLICKER FLICKER FLAME,SHE IS WILD TO KNOW HOW TO DO THINGS,THAT IS WHY WE CRY EDUCATION SCIENCE,YES HILDA I KNOW THAT HE SAID SIMPLY,I THINK WE DID SHE ANSWERED DEMURELY,I WILL IF TIMAEUS APPROVES I APPROVE,PAUL AN APOSTLE NOT OF MEN ET CETERA,AND HOW ODD THE DIRECTIONS WILL LOOK,AND YOU NEVER USED TO BE CROSS TO ME,PLEASE WAIT FOR ME MARIE EMIL COAXED,THE INDIAN I ALSO THOUGHT NOTHING OF,SHE HAS BEEN DEAD THESE TWENTY YEARS,HEREDITY THE CAUSE OF ALL OUR FAULTS,IT MUST REMEMBER BE ONE OR THE OTHER,WE DON'T KNOW WHERE IT WILL TAKE US,METER ROUGHLY ONE YARD THREE INCHES,THEIR MASTERS SAID MISSUS NEVERBEND,BUT ANDERS CARED NOTHING ABOUT THAT,I DO NOT KNOW I AM DAZED BEWILDERED,DORCAS IN HER STRANGE WAY WAS MOVED,YOU HAVE BEEN SO ILL MY POOR RACHEL,HE'S NOT A MAN FOR COUNTRY QUARTERS,AT DINNER LAKE WAS EASY AND AMUSING,THEN HE TURNED TO ME AGAIN FROWNING,NOTHING MORE THAN YOU KNOW YOURSELF,WHERE THEE AND THY FAMILY ARE KNOWN,ONE THINKS ONE HEARS HYDRAS TALKING,THE CALL IS NOT TO BE TAKEN LIGHTLY,TRULY THIS SEA IS OF INFINITE WIDTH,THE HORIZON SEEMS EXTREMELY DISTANT ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_patch/AdversarialPatch.ipynb ================================================ { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "AdversarialPatch.ipynb", "version": "0.3.2", "views": {}, "default_view": {}, "provenance": [], "collapsed_sections": [ "zIVtueEZGlOe", "pa3x4VU2HDPD", "kFWZi57amziK", "fqxh12d4yeK7" ] }, "kernelspec": { "name": "python2", "display_name": "Python 2" }, "accelerator": "GPU" }, "cells": [ { "metadata": { "id": "pv2EIpnIHSUL", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Adversarial Patch\n", "\n", "Code from [Adversarial Patch (Tom B. Brown, Dandelion Mané, Aurko Roy, Martín Abadi, Justin Gilmer)](https://arxiv.org/abs/1712.09665)\n", "\n", "> We present a method to create universal, robust, targeted adversarial image patches in the real world. The patches are universal because they can be used to attack any scene, robust because they work under a wide variety of transformations, and targeted because they can cause a classifier to output any target class. These adversarial patches can be printed, added to any scene, photographed, and presented to image classifiers; even when the patches are small, they cause the classifiers to ignore the other items in the scene and report a chosen target class.\n", "\n", "You can run this on a free Google Cloud GPU to replicate the results. Just set the runtime in the menu bar above:\n", "\n", "**`Runtime > Change runtime type > Python 2 w/ GPU`**\n", "\n", "![image](https://user-images.githubusercontent.com/306655/35713295-6f5f8e90-077b-11e8-9c78-ede4ed549bd1.png)\n", "\n" ] }, { "metadata": { "id": "m87hXY8wHQ_y", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Dependencies and Imports" ] }, { "metadata": { "id": "gJ4qeEdVtkCj", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 442 }, "outputId": "c06d9bda-c12f-4dac-8324-493478357c48", "executionInfo": { "status": "ok", "timestamp": 1517597946679, "user_tz": 480, "elapsed": 5749, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "# Install requirements\n", "! pip install keras\n", "! pip install git+https://github.com/nottombrown/imagenet_stubs --upgrade\n", " \n", "# Create a directory to store our results\n", "! mkdir /content/adversarial_patch\n", "\n", "# Download a baseline true toaster image\n", "! wget -O /content/adversarial_patch/toaster.png https://user-images.githubusercontent.com/306655/35698271-658aba28-0741-11e8-898b-5a3134634e9e.png" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Requirement already satisfied: keras in /usr/local/lib/python2.7/dist-packages\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python2.7/dist-packages (from keras)\n", "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python2.7/dist-packages (from keras)\n", "Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python2.7/dist-packages (from keras)\n", "Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python2.7/dist-packages (from keras)\n", "Collecting git+https://github.com/nottombrown/imagenet_stubs\n", " Cloning https://github.com/nottombrown/imagenet_stubs to /tmp/pip-bhlPca-build\n", "Installing collected packages: imagenet-stubs\n", " Found existing installation: imagenet-stubs 0.0.7\n", " Uninstalling imagenet-stubs-0.0.7:\n", " Successfully uninstalled imagenet-stubs-0.0.7\n", " Running setup.py install for imagenet-stubs ... \u001b[?25l-\b \bdone\n", "\u001b[?25hSuccessfully installed imagenet-stubs-0.0.7\n", "mkdir: cannot create directory ‘/content/adversarial_patch’: File exists\n", "--2018-02-02 18:59:06-- https://user-images.githubusercontent.com/306655/35698271-658aba28-0741-11e8-898b-5a3134634e9e.png\n", "Resolving user-images.githubusercontent.com (user-images.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", "Connecting to user-images.githubusercontent.com (user-images.githubusercontent.com)|151.101.0.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 37989 (37K) [image/png]\n", "Saving to: ‘/content/adversarial_patch/toaster.png’\n", "\n", "/content/adversaria 100%[===================>] 37.10K --.-KB/s in 0.02s \n", "\n", "2018-02-02 18:59:06 (2.14 MB/s) - ‘/content/adversarial_patch/toaster.png’ saved [37989/37989]\n", "\n" ], "name": "stdout" } ] }, { "metadata": { "id": "lgCXsKXjtGVK", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "import pdb\n", "import tensorflow as tf\n", "\n", "import math\n", "from matplotlib import pylab as P\n", "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", "from collections import defaultdict\n", "\n", "import os\n", "import os.path as osp\n", "import numpy as np\n", "import pickle\n", "import StringIO\n", "import PIL.Image\n", "import scipy\n", "import time\n", "import glob\n", "import random\n", "\n", "import keras\n", "from keras import applications\n", "from keras import backend as K\n", "from keras.preprocessing import image\n", "import numpy as np\n", "\n", "import imagenet_stubs\n", "from imagenet_stubs.imagenet_2012_labels import label_to_name, name_to_label" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "F7Bw7EX34Wy6", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Hyperparameters" ] }, { "metadata": { "id": "zTtUa8qb4VOV", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "TARGET_LABEL = name_to_label('toaster') # Try \"banana\", \"Pembroke, Pembroke Welsh corgi\"\n", "PATCH_SHAPE = (299, 299, 3)\n", "BATCH_SIZE = 16\n", "\n", "# Ensemble of models\n", "NAME_TO_MODEL = {\n", " 'xception': applications.xception.Xception,\n", " 'vgg16': applications.vgg16.VGG16,\n", " 'vgg19': applications.vgg19.VGG19,\n", " 'resnet50': applications.resnet50.ResNet50,\n", " 'inceptionv3': applications.inception_v3.InceptionV3,\n", "}\n", "\n", "MODEL_NAMES = ['resnet50', 'xception', 'inceptionv3', 'vgg16', 'vgg19']\n", "\n", "# Data augmentation\n", "# Empirically found that training with a very wide scale range works well\n", "# as a default\n", "SCALE_MIN = 0.3\n", "SCALE_MAX = 1.5\n", "ROTATE_MAX = np.pi/8 # 22.5 degrees in either direction\n", "\n", "MAX_ROTATION = 22.5\n", "\n", "# Local data dir to write files to\n", "DATA_DIR = '/content/adversarial_patch'" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "U_zb6nIdHI4E", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Image loading" ] }, { "metadata": { "id": "499h7GM2tIyA", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 717 }, "outputId": "5431e4da-cb03-4897-f21d-0a83cf6c7910", "executionInfo": { "status": "ok", "timestamp": 1517598005544, "user_tz": 480, "elapsed": 2431, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "def _convert(im):\n", " return ((im + 1) * 127.5).astype(np.uint8)\n", "\n", "def show(im):\n", " plt.axis('off')\n", " plt.imshow(_convert(im), interpolation=\"nearest\")\n", " plt.show()\n", " \n", "def load_image(image_path):\n", " im = PIL.Image.open(image_path)\n", " im = im.resize((299, 299), PIL.Image.ANTIALIAS)\n", " if image_path.endswith('.png'):\n", " ch = 4\n", " else:\n", " ch = 3\n", " im = np.array(im.getdata()).reshape(im.size[0], im.size[1], ch)[:,:,:3]\n", " return im / 127.5 - 1\n", "\n", "\n", "class StubImageLoader():\n", " \"\"\"An image loader that uses just a few ImageNet-like images. \n", " In the actual paper, we used real ImageNet images, but we can't include them \n", " here because of licensing issues.\n", " \"\"\"\n", " def __init__(self):\n", " self.images = []\n", " self.toaster_image = None\n", " \n", " for image_path in imagenet_stubs.get_image_paths():\n", " im = load_image(image_path)\n", "\n", " if image_path.endswith('toaster.jpg'):\n", " self.toaster_image = im\n", " else:\n", " self.images.append(im)\n", "\n", " def get_images(self):\n", " return random.sample(self.images, BATCH_SIZE)\n", "\n", "image_loader = StubImageLoader()\n", "\n", "for example_image in image_loader.get_images()[:2]:\n", " print(\"Example true image:\")\n", " show(example_image)\n", " " ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Example true image:\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Example true image:\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "5CpeX6o_HC-R", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Patch Transformations" ] }, { "metadata": { "id": "888RmSmVFKCJ", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 715 }, "outputId": "8ad26246-ea0a-4a67-9aeb-081dcdb89f86", "executionInfo": { "status": "ok", "timestamp": 1517598007997, "user_tz": 480, "elapsed": 1124, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "def _transform_vector(width, x_shift, y_shift, im_scale, rot_in_degrees):\n", " \"\"\"\n", " If one row of transforms is [a0, a1, a2, b0, b1, b2, c0, c1], \n", " then it maps the output point (x, y) to a transformed input point \n", " (x', y') = ((a0 x + a1 y + a2) / k, (b0 x + b1 y + b2) / k), \n", " where k = c0 x + c1 y + 1. \n", " The transforms are inverted compared to the transform mapping input points to output points.\n", " \"\"\"\n", "\n", " rot = float(rot_in_degrees) / 90. * (math.pi/2)\n", " \n", " # Standard rotation matrix\n", " # (use negative rot because tf.contrib.image.transform will do the inverse)\n", " rot_matrix = np.array(\n", " [[math.cos(-rot), -math.sin(-rot)],\n", " [math.sin(-rot), math.cos(-rot)]]\n", " )\n", " \n", " # Scale it\n", " # (use inverse scale because tf.contrib.image.transform will do the inverse)\n", " inv_scale = 1. / im_scale \n", " xform_matrix = rot_matrix * inv_scale\n", " a0, a1 = xform_matrix[0]\n", " b0, b1 = xform_matrix[1]\n", " \n", " # At this point, the image will have been rotated around the top left corner,\n", " # rather than around the center of the image. \n", " #\n", " # To fix this, we will see where the center of the image got sent by our transform,\n", " # and then undo that as part of the translation we apply.\n", " x_origin = float(width) / 2\n", " y_origin = float(width) / 2\n", " \n", " x_origin_shifted, y_origin_shifted = np.matmul(\n", " xform_matrix,\n", " np.array([x_origin, y_origin]),\n", " )\n", "\n", " x_origin_delta = x_origin - x_origin_shifted\n", " y_origin_delta = y_origin - y_origin_shifted\n", " \n", " # Combine our desired shifts with the rotation-induced undesirable shift\n", " a2 = x_origin_delta - (x_shift/(2*im_scale))\n", " b2 = y_origin_delta - (y_shift/(2*im_scale))\n", " \n", " # Return these values in the order that tf.contrib.image.transform expects\n", " return np.array([a0, a1, a2, b0, b1, b2, 0, 0]).astype(np.float32)\n", "\n", "def test_random_transform(min_scale=0.5, max_scale=1.0, max_rotation=22.5):\n", " \"\"\"\n", " Scales the image between min_scale and max_scale\n", " \"\"\"\n", " img_shape = [100,100,3]\n", " img = np.ones(img_shape)\n", " \n", " sess = tf.Session()\n", " image_in = tf.placeholder(dtype=tf.float32, shape=img_shape)\n", " width = img_shape[0]\n", " \n", " def _random_transformation():\n", " im_scale = np.random.uniform(low=min_scale, high=1.0)\n", " \n", " padding_after_scaling = (1-im_scale) * width\n", " x_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\n", " y_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\n", " \n", " \n", " rot = np.random.uniform(-max_rotation, max_rotation)\n", " \n", " return _transform_vector(width, \n", " x_shift=x_delta,\n", " y_shift=y_delta,\n", " im_scale=im_scale, \n", " rot_in_degrees=rot)\n", "\n", " random_xform_vector = tf.py_func(_random_transformation, [], tf.float32)\n", " random_xform_vector.set_shape([8])\n", "\n", " output = tf.contrib.image.transform(image_in, random_xform_vector , \"BILINEAR\")\n", " \n", " xformed_img = sess.run(output, feed_dict={\n", " image_in: img\n", " })\n", " \n", " show(xformed_img)\n", "\n", "for i in range(2):\n", " print(\"Test image with random transform: %s\" % (i+1))\n", " test_random_transform(min_scale=0.25, max_scale=2.0, max_rotation=22.5)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Test image with random transform: 1\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Test image with random transform: 2\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "-pdqHnwkA0mN", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## ModelState\n", "\n", "This code handles loading different Imagenet models, running them, and storing their state.\n", "\n", "It defines `M`, a `ModelState` instance.\n", "\n", "### Available models:\n", "* xception\n", "* vgg16\n", "* vgg19\n", "* resnet50\n", "* inceptionv3\n", "* mobilenet\n", "\n", "## API\n", "\n", "###`M.load_model(model_name)` \n", "###`M.patch(new_patch)`\n", "###`M.patch()`\n", "###`M.reset_patch()`\n", "###`M.train_step(images?, target_ys?, learning_rate?)`\n", "###`M.inference_batch(images?, target_ys?)`\n" ] }, { "metadata": { "id": "TDQD2R6QA00p", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "#@title class ModelState()\n", "\n", "def get_peace_mask(shape):\n", " path = osp.join(DATA_DIR, \"peace_sign.png\")\n", " pic = PIL.Image.open(path)\n", " pic = pic.resize(shape[:2], PIL.Image.ANTIALIAS)\n", " if path.endswith('.png'):\n", " ch = 4\n", " else:\n", " ch = 3\n", " pic = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], ch)\n", " pic = pic / 127.5 - 1\n", " pic = pic[:,:,3]\n", "\n", " peace_mask = (pic + 1.0) / 2\n", " peace_mask = np.expand_dims(peace_mask, 2)\n", " peace_mask = np.broadcast_to(peace_mask, shape)\n", " return peace_mask\n", "\n", "\n", "def _circle_mask(shape, sharpness = 40):\n", " \"\"\"Return a circular mask of a given shape\"\"\"\n", " assert shape[0] == shape[1], \"circle_mask received a bad shape: \" + shape\n", "\n", " diameter = shape[0] \n", " x = np.linspace(-1, 1, diameter)\n", " y = np.linspace(-1, 1, diameter)\n", " xx, yy = np.meshgrid(x, y, sparse=True)\n", " z = (xx**2 + yy**2) ** sharpness\n", "\n", " mask = 1 - np.clip(z, -1, 1)\n", " mask = np.expand_dims(mask, axis=2)\n", " mask = np.broadcast_to(mask, shape).astype(np.float32)\n", " return mask\n", "\n", "def _gen_target_ys():\n", " label = TARGET_LABEL\n", " y_one_hot = np.zeros(1000)\n", " y_one_hot[label] = 1.0\n", " y_one_hot = np.tile(y_one_hot, (BATCH_SIZE, 1))\n", " return y_one_hot\n", "\n", "TARGET_ONEHOT = _gen_target_ys()\n", " \n", "class ModelContainer():\n", " \"\"\"Encapsulates an Imagenet model, and methods for interacting with it.\"\"\"\n", " \n", " def __init__(self, model_name, verbose=True, peace_mask=None, peace_mask_overlay=0.0):\n", " # Peace Mask: None, \"Forward\", \"Backward\"\n", " self.model_name = model_name\n", " self.graph = tf.Graph()\n", " self.sess = tf.Session(graph=self.graph)\n", " self.peace_mask = peace_mask\n", " self.patch_shape = PATCH_SHAPE\n", " self._peace_mask_overlay = peace_mask_overlay\n", " self.load_model(verbose=verbose)\n", "\n", " \n", " def patch(self, new_patch=None):\n", " \"\"\"Retrieve or set the adversarial patch.\n", " \n", " new_patch: The new patch to set, or None to get current patch.\n", " \n", " Returns: Itself if it set a new patch, or the current patch.\"\"\"\n", " if new_patch is None:\n", " return self._run(self._clipped_patch)\n", " \n", " self._run(self._assign_patch, {self._patch_placeholder: new_patch})\n", " return self\n", " \n", " \n", " def reset_patch(self):\n", " \"\"\"Reset the adversarial patch to all zeros.\"\"\"\n", " self.patch(np.zeros(self.patch_shape))\n", " \n", " def train_step(self, images=None, target_ys=None, learning_rate=5.0, scale=(0.1, 1.0), dropout=None, patch_disguise=None, disguise_alpha=None):\n", " \"\"\"Train the model for one step.\n", " \n", " Args:\n", " images: A batch of images to train on, it loads one if not present.\n", " target_ys: Onehot target vector, defaults to TARGET_ONEHOT\n", " learning_rate: Learning rate for this train step.\n", " scale: Either a scalar value for the exact scale, or a (min, max) tuple for the scale range.\n", "\n", " Returns: Loss on the target ys.\"\"\"\n", " if images is None:\n", " images = image_loader.get_images()\n", " if target_ys is None:\n", " target_ys = TARGET_ONEHOT\n", " \n", " feed_dict = {self._image_input: images, \n", " self._target_ys: target_ys,\n", " self._learning_rate: learning_rate}\n", " \n", " if patch_disguise is not None:\n", " if disguise_alpha is None:\n", " raise ValueError(\"You need disguise_alpha\")\n", " feed_dict[self.patch_disguise] = patch_disguise\n", " feed_dict[self.disguise_alpha] = disguise_alpha\n", " \n", "\n", " loss, _ = self._run([self._loss, self._train_op], feed_dict, scale=scale, dropout=dropout) \n", " return loss\n", " \n", " def inference_batch(self, images=None, target_ys=None, scale=None):\n", " \"\"\"Report loss and label probabilities, and patched images for a batch.\n", " \n", " Args:\n", " images: A batch of images to train on, it loads if not present.\n", " target_ys: The target_ys for loss calculation, TARGET_ONEHOT if not present.\"\"\"\n", " if images is None:\n", " images = image_loader.get_images()\n", " if target_ys is None:\n", " target_ys = TARGET_ONEHOT\n", " \n", " feed_dict = {self._image_input: images, self._target_ys: target_ys}\n", "\n", " loss_per_example, ps, ims = self._run([self._loss_per_example, self._probabilities, self._patched_input],\n", " feed_dict, scale=scale)\n", " return loss_per_example, ps, ims\n", " \n", " def load_model(self, verbose=True):\n", " \n", " model = NAME_TO_MODEL[self.model_name]\n", " if self.model_name in ['xception', 'inceptionv3', 'mobilenet']:\n", " keras_mode = False\n", " else:\n", " keras_mode = True\n", " patch = None\n", "\n", " self._make_model_and_ops(model, keras_mode, patch, verbose)\n", " \n", " def _run(self, target, feed_dict=None, scale=None, dropout=None):\n", " K.set_session(self.sess)\n", " if feed_dict is None:\n", " feed_dict = {}\n", " feed_dict[self.learning_phase] = False\n", " \n", " if scale is not None:\n", " if isinstance(scale, (tuple, list)):\n", " scale_min, scale_max = scale\n", " else:\n", " scale_min, scale_max = (scale, scale)\n", " feed_dict[self.scale_min] = scale_min\n", " feed_dict[self.scale_max] = scale_max\n", " \n", " if dropout is not None:\n", " feed_dict[self.dropout] = dropout\n", " return self.sess.run(target, feed_dict=feed_dict)\n", " \n", " \n", " def _make_model_and_ops(self, M, keras_mode, patch_val, verbose):\n", " start = time.time()\n", " K.set_session(self.sess)\n", " with self.sess.graph.as_default():\n", " self.learning_phase = K.learning_phase()\n", "\n", " image_shape = (299, 299, 3)\n", " self._image_input = keras.layers.Input(shape=image_shape)\n", " \n", " self.scale_min = tf.placeholder_with_default(SCALE_MIN, [])\n", " self.scale_max = tf.placeholder_with_default(SCALE_MAX, [])\n", " self._scales = tf.random_uniform([BATCH_SIZE], minval=self.scale_min, maxval=self.scale_max)\n", "\n", " image_input = self._image_input\n", " self.patch_disguise = tf.placeholder_with_default(tf.zeros(self.patch_shape), shape=self.patch_shape)\n", " self.disguise_alpha = tf.placeholder_with_default(0.0, [])\n", " patch = tf.get_variable(\"patch\", self.patch_shape, dtype=tf.float32, initializer=tf.zeros_initializer)\n", " self._patch_placeholder = tf.placeholder(dtype=tf.float32, shape=self.patch_shape)\n", " self._assign_patch = tf.assign(patch, self._patch_placeholder)\n", "\n", " modified_patch = patch\n", "\n", " def clip_to_valid_image(x): \n", " return tf.clip_by_value(x, clip_value_min=-1.,clip_value_max=1.)\n", "\n", " if self.peace_mask == 'forward':\n", " mask = get_peace_mask(self.patch_shape)\n", " modified_patch = patch * (1 - mask) - np.ones(self.patch_shape) * mask + (1+patch) * mask * self._peace_mask_overlay\n", "\n", " self._clipped_patch = clip_to_valid_image(modified_patch)\n", " \n", " if keras_mode:\n", " image_input = tf.image.resize_images(image_input, (224, 224))\n", " image_shape = (224, 224, 3)\n", " modified_patch = tf.image.resize_images(patch, (224, 224))\n", " \n", " self.dropout = tf.placeholder_with_default(1.0, [])\n", " patch_with_dropout = tf.nn.dropout(modified_patch, keep_prob=self.dropout)\n", " patched_input = clip_to_valid_image(self._random_overlay(image_input, patch_with_dropout, image_shape))\n", "\n", "\n", " def to_keras(x):\n", " x = (x + 1) * 127.5\n", " R,G,B = tf.split(x, 3, 3)\n", " R -= 123.68\n", " G -= 116.779\n", " B -= 103.939\n", " x = tf.concat([B,G,R], 3)\n", "\n", " return x\n", "\n", " # Since this is a return point, we do it before the Keras color shifts\n", " # (but after the resize, so we can see what is really going on)\n", " self._patched_input = patched_input\n", "\n", " if keras_mode:\n", " patched_input = to_keras(patched_input)\n", "\n", "\n", " # Labels for our attack (e.g. always a toaster)\n", " self._target_ys = tf.placeholder(tf.float32, shape=(None, 1000))\n", "\n", " model = M(input_tensor=patched_input, weights='imagenet')\n", "\n", " # Pre-softmax logits of our pretrained model\n", " logits = model.outputs[0].op.inputs[0]\n", "\n", " self._loss_per_example = tf.nn.softmax_cross_entropy_with_logits(\n", " labels=self._target_ys, \n", " logits=logits\n", " )\n", " self._target_loss = tf.reduce_mean(self._loss_per_example)\n", " \n", " self._patch_loss = tf.nn.l2_loss(patch - self.patch_disguise) * self.disguise_alpha\n", " \n", " \n", " \n", " self._loss = self._target_loss + self._patch_loss\n", "\n", " # Train our attack by only training on the patch variable\n", " self._learning_rate = tf.placeholder(tf.float32)\n", " self._train_op = tf.train.GradientDescentOptimizer(self._learning_rate)\\\n", " .minimize(self._loss, var_list=[patch])\n", "\n", " self._probabilities = model.outputs[0]\n", "\n", " if patch_val is not None:\n", " self.patch(patch_val)\n", " else:\n", " self.reset_patch()\n", "\n", "\n", " elapsed = time.time() - start\n", " if verbose:\n", " print(\"Finished loading {}, took {:.0f}s\".format(self.model_name, elapsed)) \n", "\n", "\n", " def _pad_and_tile_patch(self, patch, image_shape):\n", " # Calculate the exact padding\n", " # Image shape req'd because it is sometimes 299 sometimes 224\n", " \n", " # padding is the amount of space available on either side of the centered patch\n", " # WARNING: This has been integer-rounded and could be off by one. \n", " # See _pad_and_tile_patch for usage\n", " return tf.stack([patch] * BATCH_SIZE)\n", "\n", " def _random_overlay(self, imgs, patch, image_shape):\n", " \"\"\"Augment images with random rotation, transformation.\n", "\n", " Image: BATCHx299x299x3\n", " Patch: 50x50x3\n", "\n", " \"\"\"\n", " # Add padding\n", " \n", " image_mask = _circle_mask(image_shape)\n", "\n", " if self.peace_mask == 'backward':\n", " peace_mask = get_peace_mask(image_shape)\n", " image_mask = (image_mask * peace_mask).astype(np.float32)\n", " image_mask = tf.stack([image_mask] * BATCH_SIZE)\n", " padded_patch = tf.stack([patch] * BATCH_SIZE)\n", "\n", " transform_vecs = [] \n", " \n", " def _random_transformation(scale_min, scale_max, width):\n", " im_scale = np.random.uniform(low=scale_min, high=scale_max)\n", "\n", " padding_after_scaling = (1-im_scale) * width\n", " x_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\n", " y_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\n", "\n", "\n", " rot = np.random.uniform(-MAX_ROTATION, MAX_ROTATION)\n", "\n", " return _transform_vector(width, \n", " x_shift=x_delta,\n", " y_shift=y_delta,\n", " im_scale=im_scale, \n", " rot_in_degrees=rot) \n", "\n", " for i in range(BATCH_SIZE):\n", " # Shift and scale the patch for each image in the batch\n", " random_xform_vector = tf.py_func(_random_transformation, [self.scale_min, self.scale_max, image_shape[0]], tf.float32)\n", " random_xform_vector.set_shape([8])\n", "\n", " transform_vecs.append(random_xform_vector)\n", "\n", " image_mask = tf.contrib.image.transform(image_mask, transform_vecs, \"BILINEAR\")\n", " padded_patch = tf.contrib.image.transform(padded_patch, transform_vecs, \"BILINEAR\")\n", "\n", " inverted_mask = (1 - image_mask)\n", " return imgs * inverted_mask + padded_patch * image_mask\n", " " ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "0VmOv_gEA-9z", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 119 }, "outputId": "6f52e14f-f951-4790-da19-8aa241a90bca", "executionInfo": { "status": "ok", "timestamp": 1517598047735, "user_tz": 480, "elapsed": 34835, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "#@ MetaModel\n", "\n", "class MetaModel():\n", " def __init__(self, verbose=True, peace_mask=None, peace_mask_overlay=0.0):\n", " self.nc = {m: ModelContainer(m, verbose=verbose, peace_mask=peace_mask, peace_mask_overlay=peace_mask_overlay) for m in MODEL_NAMES}\n", " self._patch = np.zeros(PATCH_SHAPE)\n", " self.patch_shape = PATCH_SHAPE\n", " \n", " def patch(self, new_patch=None):\n", " \"\"\"Retrieve or set the adversarial patch.\n", " \n", " new_patch: The new patch to set, or None to get current patch.\n", " \n", " Returns: Itself if it set a new patch, or the current patch.\"\"\"\n", " if new_patch is None:\n", " return self._patch\n", " \n", " self._patch = new_patch\n", " return self\n", " \n", " def reset_patch(self):\n", " \"\"\"Reset the adversarial patch to all zeros.\"\"\"\n", " self.patch(np.zeros(self.patch_shape))\n", " \n", " def train_step(self, model=None, steps=1, images=None, target_ys=None, learning_rate=5.0, scale=None, **kwargs):\n", " \"\"\"Train the model for `steps` steps.\n", " \n", " Args:\n", " images: A batch of images to train on, it loads one if not present.\n", " target_ys: Onehot target vector, defaults to TARGET_ONEHOT\n", " learning_rate: Learning rate for this train step.\n", " scale: Either a scalar value for the exact scale, or a (min, max) tuple for the scale range.\n", " \n", " Returns: Loss on the target ys.\"\"\"\n", " \n", " \n", " if model is not None:\n", " to_train = [self.nc[model]]\n", " else:\n", " to_train = self.nc.values()\n", " \n", " losses = []\n", " for mc in to_train:\n", " mc.patch(self.patch())\n", " for i in xrange(steps): \n", " loss = mc.train_step(images, target_ys, learning_rate, scale=scale, **kwargs)\n", " losses.append(loss)\n", " self.patch(mc.patch())\n", " return np.mean(losses)\n", " \n", " def inference_batch(self, model, images=None, target_ys=None, scale=None):\n", " \"\"\"Report loss and label probabilities, and patched images for a batch.\n", " \n", " Args:\n", " images: A batch of images to train on, it loads if not present.\n", " target_ys: The target_ys for loss calculation, TARGET_ONEHOT if not present.\n", " scale: Either a scalar value for the exact scale, or a (min, max) tuple for the scale range.\n", " \"\"\"\n", "\n", " mc = self.nc[model]\n", " mc.patch(self.patch())\n", " return mc.inference_batch(images, target_ys, scale=scale)\n", " \n", "print(\"Creating MetaModel...\")\n", "MM = MetaModel()" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Creating MetaModel...\n", "Finished loading resnet50, took 9s\n", "Finished loading xception, took 7s\n", "Finished loading inceptionv3, took 14s\n", "Finished loading vgg16, took 3s\n", "Finished loading vgg19, took 2s\n" ], "name": "stdout" } ] }, { "metadata": { "id": "zIVtueEZGlOe", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Display Utils\n", "\n", "### APIs:\n", "\n", "#### `show(image)`\n", "#### `show_patch(patch)`\n", "#### `report(step=None, show_images=False)`\n", "#### `cross_model_report()`\n" ] }, { "metadata": { "id": "xtFDYHWaGxLP", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "def _convert(im):\n", " return ((im + 1) * 127.5).astype(np.uint8)\n", "\n", "def show(im):\n", " plt.axis('off')\n", " plt.imshow(_convert(im), interpolation=\"nearest\")\n", " plt.show()\n", " \n", "def show_patch(patch):\n", " circle = _circle_mask((299, 299, 3))\n", " show(circle * patch + (1-circle))\n", " \n", "def report(model, step=None, show_images=False, n=400, verbose=True, scale=(0.1, 1.0)):\n", " \"\"\"Prints a report on how well the model is doing.\n", " If you want to see multiple samples, pass a positive int to show_images\n", " \n", " Model can be a ModelContainer instance, or a string. If it's a string, we\n", " lookup that model name in the MultiModel\n", " \"\"\"\n", " start = time.time()\n", " # n examples where target was in top 5\n", " top_5 = 0\n", " # n examples where target was top 1\n", " wins = 0\n", " # n examples in total\n", " n_batches = int(math.ceil(float(n) / BATCH_SIZE))\n", " total = BATCH_SIZE * n_batches\n", " \n", " loss = 0\n", " \n", " for b in xrange(n_batches):\n", " if isinstance(model, str):\n", " loss_per_example, probs, patched_imgs = M.inference_batch(model, scale=scale)\n", " else:\n", " loss_per_example, probs, patched_imgs = model.inference_batch(scale=scale)\n", " \n", " loss += np.mean(loss_per_example)\n", " for i in xrange(BATCH_SIZE):\n", " top_labels = np.argsort(-probs[i])[:5]\n", " if TARGET_LABEL in top_labels:\n", " top_5 += 1\n", " if top_labels[0] == TARGET_LABEL:\n", " wins += 1\n", " loss = loss / n_batches\n", " top_5p = int(100 * float(top_5) / total)\n", " winp = int(100 * float(wins) / total)\n", " \n", " if step is not None:\n", " r = 'Step: {} \\t'.format(step)\n", " else:\n", " r = ''\n", " r += 'LogLoss: {:.1f} \\tWin Rate: {}%\\t Top5: {}%\\tn: {}'.format(math.log(loss), winp, top_5p, total)\n", " if verbose:\n", " print(r)\n", " \n", " if show_images:\n", " if show_images is True:\n", " show_images = 1\n", " _visualize_example(patched_imgs, probs, loss_per_example, show_images)\n", " elapsed = time.time() - start\n", " return {'logloss': math.log(loss), 'win': winp, 'top5': top_5p, 'time': elapsed, 'loss': loss}\n", " \n", "def _visualize_example(patched_imgs, probs, loss_per_example, n_reports=1):\n", " for i in xrange(n_reports):\n", " show(patched_imgs[i])\n", " \n", " predictions_str = ''\n", " top_label_ids = np.argsort(-probs[i])[:5]\n", " for label in top_label_ids:\n", " p = probs[i][label]\n", " name = label_to_name(label)\n", " if len(name) > 30:\n", " name = name[:27] + \"...\"\n", " if name == \"toaster\":\n", " predictions_str += \"\\033[1m\"\n", " name = name.ljust(30, \" \")\n", " predictions_str += \"{} {:.2f}\".format(name, p)\n", " if name.startswith(\"toaster\"):\n", " predictions_str += \"\\033[0m\"\n", " predictions_str += \"\\n\"\n", " #predictions_str += \"\\033[1mLogLoss: {:.1f}\\033[0m\\n\".format(math.log(loss_per_example[i]))\n", " \n", " print(predictions_str)\n", " \n", "\n", "def cross_model_report(meta_model, n=100, verbose=True, scale=None):\n", " results = {}\n", " \n", " print('{:15s}\\t Loss\\t Win%\\t Top5%\\t Time'.format('Model Name'))\n", "\n", " out_start = time.time()\n", " for model_name in MODEL_NAMES:\n", " model = meta_model.name_to_container[model_name]\n", " r = report(model, n=n, verbose=False, scale=scale)\n", " results[model_name] = r\n", " print('{:15s}\\t {:.1f}\\t {:.0f}%\\t {:.0f}%\\t {:.0f}s'.format(model_name, r['loss'], r['win'], r['top5'], r['time']))\n", " \n", " def _avg(name):\n", " xs = [r[name] for r in results.values()]\n", " return sum(xs) / len(xs)\n", " \n", " \n", " elapsed = time.time() - out_start\n", " print('{:15s}\\t {:.1f}\\t {:.0f}%\\t {:.0f}%\\t {:.0f}s'.format('Average/Total', _avg('loss'), _avg('win'), _avg('top5'), elapsed))\n", "\n", " return results" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "pa3x4VU2HDPD", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Serialization / Deserialization\n", "\n", "## API\n", "\n", "### `save_patch(experiment_name)`\n", "### `load_patch(experiment_name_or_patch_file, dontshow=False)`\n", "###" ] }, { "metadata": { "id": "Pg2jx3tJG4Dx", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "import pickle\n", "import os.path as osp\n", "from datetime import datetime\n", "\n", "\n", "def save_obj(obj, file_name):\n", " serialized = pickle.dumps(obj, protocol=0)\n", " dest_file = osp.join(DATA_DIR, file_name)\n", " with open(dest_file, 'w') as f:\n", " f.write(serialized)\n", " \n", "def load_obj(file_name):\n", " dest_file = osp.join(DATA_DIR, file_name)\n", " with open(dest_file, 'r') as f:\n", " pkl = f.read()\n", " return pickle.loads(pkl) \n", "\n", "def _latest_snapshot_path(experiment_name):\n", " \"\"\"Return the latest pkl file\"\"\"\n", " return osp.join(DATA_DIR, \"%s.latest\" % (experiment_name))\n", "\n", "def _timestamped_snapshot_path(experiment_name):\n", " \"\"\"Return a timestamped pkl file\"\"\"\n", " timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')\n", " return osp.join(DATA_DIR, \"%s.%s\" % (experiment_name, timestamp))\n", "\n", "def save_patch(experiment_name, model):\n", " \"\"\"Save a snapshot for the given experiment\"\"\" \n", " def _serialize_patch(dest_file):\n", " patch = model.patch()\n", " serialized = pickle.dumps(patch, protocol=0) # protocol 0 is printable ASCII\n", "\n", " with open(dest_file + \".pkl\", 'w') as f:\n", " f.write(serialized)\n", " print(\"Wrote patch to %s\" % dest_file)\n", " with open(dest_file + \".jpg\", 'w') as f:\n", " PIL.Image.fromarray(_convert(model.patch())).save(f, \"JPEG\")\n", " \n", " _serialize_patch(_latest_snapshot_path(experiment_name))\n", " _serialize_patch(_timestamped_snapshot_path(experiment_name))\n", " \n", "def load_patch(experiment_name_or_patch_file, model, dontshow=False):\n", " if experiment_name_or_patch_file.startswith(DATA_DIR):\n", " patch_file = experiment_name_or_patch_file\n", " else:\n", " patch_file = _latest_snapshot_path(experiment_name_or_patch_file)\n", " with open(patch_file + '.pkl', 'r') as f:\n", " pkl = f.read()\n", " patch = pickle.loads(pkl)\n", " model.patch(patch)\n", " if not dontshow:\n", " show_patch(patch)\n", " \n", "def get_im(path):\n", " with open(osp.join(DATA_DIR, path), \"r\") as f:\n", " pic = PIL.Image.open(f)\n", " pic = pic.resize((299, 299), PIL.Image.ANTIALIAS)\n", " if path.endswith('.png'):\n", " ch = 4\n", " else:\n", " ch = 3\n", " pic = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], ch)[:,:,:3]\n", " pic = pic / 127.5 - 1\n", " return pic" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "tHxkTVjRG43F", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "areas_to_report = list(np.linspace(0.01, 0.10, 10)) + [0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50]\n", "\n", "def calculate_win_rates(models, eval_samples_per_scale=100):\n", " start = time.time()\n", " rows = len(models)\n", " results = np.zeros((rows, len(areas_to_report)))\n", " for (i, model) in enumerate(models):\n", " print(\"Evaluating %s\" % model.model_name)\n", " for (j, a) in enumerate(areas_to_report):\n", " sc = 2 * math.sqrt(a / math.pi)\n", " win = report(model, scale=sc, verbose=False, \n", " n=eval_samples_per_scale)['win']\n", " results[i,j] = win\n", " print('Calculated wins in {:.0f}s'.format(time.time()-start))\n", " return results\n", "\n", "\n", "def plot_win_rates(wins, labels, title):\n", " assert wins.shape[0] == len(labels)\n", " for (i, l) in enumerate(labels):\n", " plt.plot([a * 100.0 for a in areas_to_report], wins[i], label=l)\n", " plt.title(title)\n", " plt.legend()\n", " plt.xlabel(\"Attack as % of image size\")\n", " plt.ylabel(\"Attack success rate\")\n", " \n", " plt.show()" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "bMz7G_MjH8Cl", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Experiments" ] }, { "metadata": { "id": "kFWZi57amziK", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Whitebox Single Model Attack" ] }, { "metadata": { "id": "gXwuxoYem21m", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 952 }, "outputId": "439df092-3ac8-4166-8ae6-9b64aa87d3a0", "executionInfo": { "status": "ok", "timestamp": 1517444196847, "user_tz": 480, "elapsed": 1886154, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "model_targets = MODEL_NAMES\n", "STEPS = 500\n", "\n", "regular_training_model_to_patch = {}\n", "x = 0\n", "for m in model_targets:\n", " print(\"Training %s\" % m)\n", " M = MM.nc[m]\n", " M.reset_patch()\n", " for i in xrange(STEPS):\n", " x +=1 \n", " loss = M.train_step(scale=(0.1, 1.0))\n", " if i % int(STEPS/10) == 0:\n", " print(\"[%s] loss: %s\" % (i, loss))\n", " \n", " \n", " regular_training_model_to_patch[m] = M.patch() \n", "\n", "save_obj(regular_training_model_to_patch, \"regular_training_model_to_patch\")" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Training resnet50\n", "[0] loss: 15.848367\n", "[50] loss: 6.62066\n", "[100] loss: 4.2461815\n", "[150] loss: 4.9246216\n", "[200] loss: 5.3818893\n", "[250] loss: 2.673112\n", "[300] loss: 2.516276\n", "[350] loss: 5.628107\n", "[400] loss: 3.3912237\n", "[450] loss: 3.2927089\n", "Training xception\n", "[0] loss: 10.044142\n", "[50] loss: 1.9359984\n", "[100] loss: 3.404768\n", "[150] loss: 1.4373296\n", "[200] loss: 0.84405035\n", "[250] loss: 1.297935\n", "[300] loss: 1.2224761\n", "[350] loss: 2.5895066\n", "[400] loss: 0.7304306\n", "[450] loss: 2.3524048\n", "Training inceptionv3\n", "[0] loss: 10.15593\n", "[50] loss: 6.7058516\n", "[100] loss: 6.0991573\n", "[150] loss: 4.8568587\n", "[200] loss: 4.0369062\n", "[250] loss: 5.3691416\n", "[300] loss: 4.1206374\n", "[350] loss: 2.1025534\n", "[400] loss: 0.13320415\n", "[450] loss: 2.4082727\n", "Training vgg16\n", "[0] loss: 13.917677\n", "[50] loss: 6.105081\n", "[100] loss: 3.397616\n", "[150] loss: 2.1753328\n", "[200] loss: 3.5649805\n", "[250] loss: 5.422268\n", "[300] loss: 3.606423\n", "[350] loss: 1.4018068\n", "[400] loss: 5.21554\n", "[450] loss: 3.955655\n", "Training vgg19\n", "[0] loss: 13.522253\n", "[50] loss: 11.481941\n", "[100] loss: 3.2137012\n", "[150] loss: 6.9497967\n", "[200] loss: 5.9846754\n", "[250] loss: 6.001512\n", "[300] loss: 4.7060533\n", "[350] loss: 3.9285967\n", "[400] loss: 1.4345224\n", "[450] loss: 2.9930954\n" ], "name": "stdout" } ] }, { "metadata": { "id": "YjuFKAwe0LnP", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 1424 }, "outputId": "086146f2-d1dd-4278-8f7d-502738fc306b", "executionInfo": { "status": "ok", "timestamp": 1517444199325, "user_tz": 480, "elapsed": 2444, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "m = MM.nc['xception']\n", "m.patch(regular_training_model_to_patch['xception'])\n", "report(m, n=16, show_images=3, scale=0.5)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "LogLoss: -1.7 \tWin Rate: 93%\t Top5: 100%\tn: 16\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nIOpwOBxX8N+KEYxZc8vPcAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 1.00\u001b[0m\n", "mailbox, letter box 0.00\n", "radio, wireless 0.00\n", "parking meter 0.00\n", "padlock 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 1.00\u001b[0m\n", "manhole cover 0.00\n", "parking meter 0.00\n", "stove 0.00\n", "combination lock 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nGHIKQAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 1.00\u001b[0m\n", "mountain bike, all-terrain ... 0.00\n", "crash helmet 0.00\n", "parking meter 0.00\n", "unicycle, monocycle 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "{'logloss': -1.7488509155993057,\n", " 'loss': 0.17397373914718628,\n", " 'time': 1.0763728618621826,\n", " 'top5': 100,\n", " 'win': 93}" ] }, "metadata": { "tags": [] }, "execution_count": 31 } ] }, { "metadata": { "id": "Nt_3I_0em8ht", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 119 }, "outputId": "7b317044-eddf-4d32-a732-3835427d6197", "executionInfo": { "status": "ok", "timestamp": 1517444760863, "user_tz": 480, "elapsed": 561084, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "regular_training_model_to_patch = load_obj(\"regular_training_model_to_patch\")\n", "\n", "# Load models\n", "models = []\n", "for m in model_targets:\n", " M = MM.nc[m]\n", " M.patch(regular_training_model_to_patch[m])\n", " models.append(M)\n", "\n", "regular_training_win_rates = calculate_win_rates(models)\n", "\n", "save_obj(regular_training_win_rates, \"regular_training_win_rates\")\n" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Evaluating resnet50\n", "Evaluating xception\n", "Evaluating inceptionv3\n", "Evaluating vgg16\n", "Evaluating vgg19\n", "Calculated wins in 560s\n" ], "name": "stdout" } ] }, { "metadata": { "id": "DgJL6iGJnZvn", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "1f159de5-eb59-4625-ae57-d0ac7cf5df6d", "executionInfo": { "status": "ok", "timestamp": 1517444761483, "user_tz": 480, "elapsed": 518, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "regular_training_win_rates = load_obj(\"regular_training_win_rates\")\n", "plot_win_rates(regular_training_win_rates, model_targets, \"Single-model attack success rates\")" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfIAAAFnCAYAAABdOssgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xl8VOWh//HP7HsyyWQjAUICEpYA\nsoissggEFPelXitaaqveUtfe1qW2xdqXXe791VZLvV6r1qW2brgWATdEEcGwyRa2JCRkXyaZfT3P\n748JAxFCWCYbPO/XK6+ZOTlzzpNDyHee5TyPSgghkCRJkiSpT1L3dAEkSZIkSTp9MsglSZIkqQ+T\nQS5JkiRJfZgMckmSJEnqw2SQS5IkSVIfJoNckiRJkvowGeTSWWHHjh3ccsstzJ8/n6KiIr7zne9Q\nXFwMwIcffsiDDz542sdevnw53/ve9xJU0tP385//nCeffPKE+5xOWRsbG/n444/jr1977bXTKR4A\nhw4dYsSIEaf9/rPNmVxLSTpZMsilPk8IwR133MHixYtZuXIlq1at4tZbb2XJkiX4/X7mzp3Lb3/7\n254uZq+1YcMGPvnkEwCi0Sh/+MMferhEZwd5LaXuIoNc6vOcTicNDQ2MGTMmvm3evHm88847mEym\ndrXUBx54gCeeeILFixcza9YsFi9ejN/vB+Dzzz9nxowZLFiwgFdffZVx48Zx6NChdudyuVz89Kc/\npaioiIsvvpg333zzuGU6dOgQ06ZN45lnnqGoqIiioiK2bt3KbbfdxvTp09u1EHzwwQcsXLiQ+fPn\nc/PNN1NRURH/ub7//e8ze/ZsbrvtNtxud/w9+/fv56abbqKoqIjLLruM7du3d3qdli1bRlFREXPm\nzOH222/H5XKxc+dOfv3rX7Nq1SruvfdeFi9ejNvtZv78+VRWVlJaWsp//Md/sGDBAubOncv7778f\nP97atWu59NJLKSoq4vbbb6elpeWYc/7Xf/0Xjz766DHbN27cyFVXXcUll1zCggUL+OCDDwBYtGgR\n77zzTny/o193dL6Otm/atIlrrrmGuXPncv3111NZWQlAXV0dt9xyC5dccglz5szh8ccfP+H2byso\nKODpp5+mqKiIaDTKli1buPrqq5k/fz6XXHIJX375JcAx17K2tpY77rgj/vvw2WefARCJRPj5z39O\n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\ntm0AVFZW8tOf/hQhBL/85S9Zt24dAAMHDiQtLQ2VStXh9hNpbm7GbDaTn59PJBLh1VdfBcDr9ba7\nllqtlhkzZsR/d/x+Pw8++CA1NTW8+eab8Wtnt9vJz88/4Tkl6dtkjVzq88aOHcujjz7K0qVLcbvd\nKIpCWloajz/+ODk5OSd1DL1ez9KlS3nwwQex2WwsXrwYtVp9zB/ye+65h0ceeSRe65o+fToFBQWn\nXfasrCx+85vf8KMf/YhwOEz//v3jo7xvv/127r33XmbPns3gwYPj/f0qlYo//vGPLF26lD/96U+o\n1WoWL17crun+22644QbuuusuioqKKCgo4IEHHuDOO+/k73//O1OnTuX555/nmmuu4fXXX2f8+PHM\nmjWLp59+mh/84AdceeWVOBwO/vM//5M5c+Zwxx138P777/Pkk0/G+6Rzc3P53e9+1+7DxKBBg1iy\nZAn3338///rXv+LdETqdjmuvvTZeU1er1Tz88MOYTCYWL17Mfffdx9q1a5k4cWK8NmwymY57vo62\nG41GnnjiCR599NF4qN59992oVCpuuOEGfvnLX/Loo48ihGD27NlMnjwZu91+3O0nMmzYMC666CKK\niopwOBw88MADbN68mUWLFvHGG2+0u5ZLly7lV7/6Fa+//joAl19+Of369ePiiy/moYceYt68eWg0\nmvjPIEknSyWO16EjSec4n8/H2LFjKS4ubtdPLUmS1NvIpnVJanPNNdewYsUKAFasWMHgwYNliEuS\n1OvJGrkktSkuLubXv/41wWAQi8XC0qVL44O7JEmSeisZ5JIkSZLUh8mmdUmSJEnqw2SQS5IkSVIf\n1idvP2tocHe+01FSUsw4nR3fYyudPHktE0dey8SR1zIx5HVMnERfy/T0jgfenhM1cq322LmepdMj\nr2XiyGuZOPJaJoa8jonTndfynAhySZIkSTpbySCXJEmSpD5MBrkkSZIk9WEyyCVJkiSpD5NBLkmS\nJEl9mAxySZIkSerDZJBLkiRJUh8mg1ySJEmS+rAuDfK9e/cyZ84cXn75ZQBqampYtGgRN954I3ff\nfTehUAiAd999l2uuuYbrrruO119/vSuLJEmSJElnlS4Lcp/Px6OPPsrkyZPj25544gluvPFGXnnl\nFXJzc3njjTfw+XwsW7aMv//977z00ku88MILtLS0dFWxJEmSJOms0mVzrev1ep555hmeeeaZ+LYN\n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\nkiuvvDJqfdntq5899dRTbNy4EY1Gw8MPP8zgwYM7u0ldxvbt23nyyScpLi5Gr9eTkZHBU089xezZ\ns/F4PGRlZTF//nwMBkNnN/WEt3TpUl588UX69u0bem/BggXMmTNH+rIN3G43Dz30EIcPH8btdjNz\n5kyGDx/N+gQxAAAJb0lEQVTOrFmzpB874MUXX6Rnz55MnDhR+rIdHA4H9957L3V1dfh8PmbOnMmQ\nIUOi1pfdPpALIYQQ3Vm3nloXQgghujsJ5EIIIUQXJoFcCCGE6MIkkAshhBBdmARyIYQQoguTQC5E\nO5WVlTF06FBee+21Ju9v3ryZoqIioCFt444dO9p1/0GDBuH3+zvczubMnj2ba6+9lueeey70XnV1\nNddffz1er7dN93r77be54IIL+Prrr5u8/4c//AGbzaZKe9VUXl7O73//+85uhhCqkUAuRDt9+umn\n5Obm8vHHHzd5/+OPPw4F8i+//JKdO3d2RvNaVFBQAMD777/Pli1b8Pl8ACxatIi77rqrzaUWv/rq\nKx588EGmTJnS5P1nn32WjIwMdRqtIqvVygsvvNDZzRBCNd06RasQkfTRRx/xyCOPMHv2bDZv3szp\np5/Ol19+yeeff87WrVu56KKLePfdd7FYLMTExDB06FAefvhhdDodDoeDu+66i0mTJuF2u3nggQc4\nfPgwAHfffTdjxowJPcfhcHDjjTdy9913M2HChND7FRUV3H///fj9fhwOBzfccANXXHEFe/fu5Y9/\n/CMGgwG3283tt98eqm4FUFVVFQqwqamp1NbWcvDgQbRaLWeccUaL33fZsmV88MEHxMbGkpqayuOP\nP86nn37Kjh07ePrpp/H7/aFqTwDnnHMOb775Jps2bWLVqlUoisLOnTu57LLL8Pl8rF+/HkVRePPN\nNzGbzTz//POhClGZmZksWrQIg8HAsmXLePvtt0lJSeGMM85gzZo1vP/++5SUlPDoo4/icrlwOp3c\nfffdjB8/vkmbly9fzhtvvIHZbEZRFObPn49Go2H69On897//ZebMmdTW1gKwb98+brrpJm655RaW\nL1/Ou+++i6IopKSk8PjjjzcpwCTECUURQrTZhg0blHPOOUcJBoPKM888ozz00EOhv7v++uuV1atX\nK4qiKLNmzVI+/PBDRVEUZd26dcqGDRsURVGUzZs3K1OnTlUURVFeeuklZcGCBYqiKMrBgweVe++9\n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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "rzBPR3vtxUoI", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Transfer Attack (AKA Blackbox)" ] }, { "metadata": { "id": "iibw1L5NxVK6", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "LR = 5.0\n", "\n", "STEPS = 500\n", "transfer_ensemble_model_names = ['resnet50', 'xception', 'inceptionv3', 'vgg16']\n", "transfer_target_model = 'vgg19'\n", "\n", "\n", "print(\"Beginning blackbox experiment with ensemble: %s and target %s\" % (\n", " transfer_ensemble_model_names, transfer_target_model))\n", "MM.reset_patch()\n", "\n", "for i in range(STEPS):\n", " for mm in transfer_ensemble_model_names:\n", " loss = MM.train_step(mm, steps=1, learning_rate=LR)\n", "\n", " if i % int(STEPS/10) == 0:\n", " print(\"[%s] loss: %s\" % (i, loss))\n", "\n", "transfer_patch = MM.patch()\n", "save_obj(transfer_patch, \"transfer_patch\")\n", " " ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "n58wsOFdx-XB", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 1339 }, "outputId": "85302a68-8bd6-4947-dc75-dcf80fcb3474", "executionInfo": { "status": "ok", "timestamp": 1517536335092, "user_tz": 480, "elapsed": 2786, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "m = MM.nc[transfer_target_model]\n", "m.patch(transfer_patch)\n", "\n", "_ = report(m, n=16, show_images=3, scale=0.5)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "LogLoss: -0.4 \tWin Rate: 87%\t Top5: 93%\tn: 16\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 1.00\u001b[0m\n", "piggy bank, penny bank 0.00\n", "balloon 0.00\n", "soccer ball 0.00\n", "pencil sharpener 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nIIh54qLFjO/vvcWrP7QhiL//+/8xvV6PE7fgFVmDEFlXacWxD5jOr9KTEl9JMlfZvfaD7+L7CW+/\n/a77Lk2eFaxS+3lVVRIEPu+++wMAnnuuQgjDk088bq99P0RgaAVJpjZUjewcyqxTVoNqye/KOkIJ\n3fI6PaQ09LyWmeDbZlGHmWrKWrCY2c8Txris+ZapIfHjgMCtEkVjSIsMnIJHCWsQ7cm2MVWjhEfg\nuuvaNEjR4Dv1mV/V1Mp03rnSKCoUVbsKmRpZNlTO16Eylowv3b3WaKTS4By4/CBkOOwROV8I2/2v\nu8YZxoAE5fB+rRuLhbdppdpgmtPKuGlsVa5dagRoDvb3u9o18BP8oI9UdqyZRrvwPfvqomzf91cf\nDzHRh8fD4+Hx8Pg5jk+1ElVByNa2LdmbakE6bajc+pGVhrxq0M4v09QVsa+RrmM3jEK0yigrW5mu\nDXqMogGpWzSSdR8jBGXaruYem4OIdG4rlY+Ocp587AUCR0lKFwWeCshdpVeVDVVVd04uUhnqpiJy\nlVlT1+zv73eVF2iqqiF0lVOWpdR1RdKzq2UUxrz44st88UtfBuCrX/0a77//Dn5gK8HZsmSVVkRO\nForwiYOExq2eAs3OxiaRk8FOZ2NK49O4iIWP3/+Id99/h6WrNAvAZFm3PT6Zplw8e47SyWxprBv+\nyYmLZM4sY6FVGJ1MjhmOelx4xEYuTycrprNpd++KvKFuKvp9i0H3en1MvSJbtR1fm2vzYDxHUdYd\nZaquS9ZUyFFuP/N8rmlqhdYOt9JWe984v9XFYsWjT12iOLLsgPHJhG/++bd49UdWphr3NGtrQ6r2\neomQ+aRB/HV7/V/5wfeZTuwuoSgMQkk+uWm32x9//AmPPfYkT1x0EuDYR8nTCkMaC/+VToJ7vH+H\n+XJJ7hy1jk+OkdKjdhjeZH7Ct/78T1m5sbu5OSKMVdftf/31Vzk6OuTlX/yKO1cfpWKWrio3Evpx\ngPJaupimqQWR4zB7yuKAA4fhKhFgELjdLFobMtPQ+A9yZGWnKDLGJiIo5xvhy4IkkDSO8tM0CoE8\nlckqj6aWlK22XEJlarQI3bXWlvbURiRLRS0FjYN6fK3wTJdcg8EgjbAx0NioY61L+o4XatMWmk5R\nJZW03FbZMm9qkKCblor2QDVqf5FNB+jUcpZDPF/YsV5WKTdvfcLYjcXd7Qs8/sQLRI5NUZYNZZlb\n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\nBQsWfAL+L3BKuVKANsKdAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 0.69\u001b[0m\n", "tractor 0.30\n", "pickup, pickup truck 0.00\n", "harvester, reaper 0.00\n", "thresher, thrasher, threshi... 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 0.96\u001b[0m\n", "cellular telephone, cellula... 0.03\n", "mouse, computer mouse 0.00\n", "printer 0.00\n", "iPod 0.00\n", "\n" ], "name": "stdout" } ] }, { "metadata": { "id": "ds2GeStmPXLP", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "transfer_patch = load_obj(\"transfer_patch\")\n", "\n", "m = MM.nc[transfer_target_model]\n", "m.patch(transfer_patch)\n", " \n", "transfer_attack_win_rates = calculate_win_rates([m])\n", "\n", "save_obj(transfer_attack_win_rates, \"transfer_attack_win_rates\")" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "hC6A3yHnyHgD", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "2b4ee8a2-a17d-4575-c7a6-f36b19a0a2bb", "executionInfo": { "status": "ok", "timestamp": 1517536422707, "user_tz": 480, "elapsed": 595, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "transfer_attack_win_rates = load_obj(\"transfer_attack_win_rates\")\n", "plot_win_rates(transfer_attack_win_rates, ['vgg19 - Blackbox transfer attack'], \"blackbox model attack success rates\")" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "fqxh12d4yeK7", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Whitebox Ensemble Attack" ] }, { "metadata": { "id": "9JRiHUrDypcn", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 374 }, "outputId": "42d0e9af-4e7c-4f00-ca6f-8b15a1065923", "executionInfo": { "status": "ok", "timestamp": 1517433869970, "user_tz": 480, "elapsed": 3784518, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "# Cross Model Attack\n", "STEPS = 1000\n", "\n", "start = time.time()\n", "MM.reset_patch()\n", "\n", "for i in range(STEPS):\n", " loss = MM.train_step()\n", " if i % int(STEPS/20) == 0:\n", " print(\"[%s] loss: %s\" % (i, loss))\n", " \n", "cross_model_patch = MM.patch()\n", "\n", "end = time.time()\n", "mins = (end - start) / 60.0\n", "\n", "print('Finished in {:.0f}m'.format(mins))\n", "save_obj(cross_model_patch, \"cross_model_patch\")\n" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "[0] loss: None\n", "[50] loss: None\n", "[100] loss: None\n", "[150] loss: None\n", "[200] loss: None\n", "[250] loss: None\n", "[300] loss: None\n", "[350] loss: None\n", "[400] loss: None\n", "[450] loss: None\n", "[500] loss: None\n", "[550] loss: None\n", "[600] loss: None\n", "[650] loss: None\n", "[700] loss: None\n", "[750] loss: None\n", "[800] loss: None\n", "[850] loss: None\n", "[900] loss: None\n", "[950] loss: None\n", "Finished in 63m\n" ], "name": "stdout" } ] }, { "metadata": { "id": "BmXd9EQ8zLEN", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 351 }, "outputId": "c47ac528-705b-453d-ea2d-c074702ced19", "executionInfo": { "status": "error", "timestamp": 1517537661444, "user_tz": 480, "elapsed": 510, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "cross_model_patch = load_obj(\"cross_model_patch\")\n", "\n", "m = MM.nc['inceptionv3']\n", "m.patch(cross_model_patch)\n", "\n", "report(m, n=16, show_images=3, scale=0.3)\n" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "IOError", "evalue": "ignored", "traceback": [ "\u001b[0;31m\u001b[0m", "\u001b[0;31mIOError\u001b[0mTraceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcross_model_patch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_obj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"cross_model_patch\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'inceptionv3'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcross_model_patch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mload_obj\u001b[0;34m(file_name)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mload_obj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mdest_file\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mosp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mDATA_DIR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdest_file\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mpkl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpickle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpkl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIOError\u001b[0m: [Errno 2] No such file or directory: '/content/adversarial_patch/cross_model_patch'" ] } ] }, { "metadata": { "id": "v6KF8wyPzRxb", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 119 }, "outputId": "d413023d-425b-4d36-b687-14f1976988d8", "executionInfo": { "status": "ok", "timestamp": 1517434432186, "user_tz": 480, "elapsed": 559174, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "cross_model_patch = load_obj(\"cross_model_patch\")\n", "\n", "models = []\n", "for m in MODEL_NAMES:\n", " M = MM.nc[m]\n", " M.patch(cross_model_patch)\n", " models.append(M)\n", " \n", "cross_model_win_rates = calculate_win_rates(models)\n", "\n", "save_obj(cross_model_win_rates, \"cross_model_win_rates\")\n" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Evaluating resnet50\n", "Evaluating xception\n", "Evaluating inceptionv3\n", "Evaluating vgg16\n", "Evaluating vgg19\n", "Calculated wins in 559s\n" ], "name": "stdout" } ] }, { "metadata": { "id": "cyizEs0rzTo4", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "9b776dd8-fec4-4a58-d572-5d3a52509af5", "executionInfo": { "status": "ok", "timestamp": 1517434432827, "user_tz": 480, "elapsed": 624, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "cross_model_win_rates = load_obj(\"cross_model_win_rates\")\n", "plot_win_rates(cross_model_win_rates, MODEL_NAMES, \"Cross-model attack success rates\")" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "Q62RjnzozZoy", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## True Toaster" ] }, { "metadata": { "id": "jyz1ibVVzbsA", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 1424 }, "outputId": "9c0b9b06-fedd-4e21-b4bd-84f622e36623", "executionInfo": { "status": "ok", "timestamp": 1517598053101, "user_tz": 480, "elapsed": 3564, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "toaster = load_image('/content/adversarial_patch/toaster.png')\n", "\n", "models = []\n", "for m in MODEL_NAMES:\n", " M = MM.nc[m]\n", " M.patch(toaster)\n", " models.append(M)\n", " \n", "m = MM.nc['inceptionv3']\n", "report(m, n=16, show_images=3, scale=0.5)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "LogLoss: 1.8 \tWin Rate: 6%\t Top5: 37%\tn: 16\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nBP4HELuQrosRCRcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "unicycle, monocycle 0.94\n", "mountain bike, all-terrain ... 0.00\n", "groenendael 0.00\n", "crash helmet 0.00\n", "knee pad 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVEAAAFNCAYAAAC5YlyiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvWGOJUmupfeRNHO/kdVvZkVajdai\nv1qBFqMlDaSujLhuZqR+kOYe+Wa6B1BDqBaQDhS6sjryhl93Mxp5zuGhRETw+/p9/b5+X7+v/1eX\n/tU38Pv6ff2+fl//f75+B9Hf1+/r9/X7+heu30H09/X7+n39vv6F63cQ/X39vn5fv69/4fodRH9f\nv6/f1+/rX7h+B9Hf1+/r9/X7+heu30H09/X7+n39vv6F63cQ/X39vn5fv69/4fodRH9fv6/f1+/r\nX7jaX/nL/7f/9X+htcYKZ86J80T1psbZD47WEBGmO6hgvTHW4ut6I2K4+y+fKRiq+Xck4P1+c70v\nYg1aU/74jxd//HihqhDGGIO1Js0EMyMi6L3z8fGBtYP3uPj73//Oz5+fHMfBx8eLtRYA17o47MDd\nGWMyh7NWMKfj7iwPrHV6N8zyH4nF+/1GAv70AcCagY8JQLfG0RVVEBxTQRUCxd1xAG2oNswCEUFV\nkch/771jls9lzsn7/eY9FmstxpzMOUGV4zz4r+cH5yufxZzONZ2vry/WymdwHAdKfo4SfLwOPj5O\nXkfPz0ORlt8LVdzz96y1iOWIB+FOLM/nHI61Ru+dRXA0QURordNaw/TI57GCtSYiwloDFzATej9A\nIcIJFjGF6Sv/rIITjDW5Zn3fsZhrEbVGRISzGaqKx4Iv47ou3l9vrBmv14tW92eWPxcR+Fy4OxFC\nzJXPEFj+5vV60bsRKrSmiAjXHIyxGCsAxQl8wQpHVWmt0VrjsPyzWf4+QxBpKPlcruvNWvn7po/8\nzhE4IBq8lqDNcBXey/nz/cm1Js0OPvqRa0kN8WCtwXsOrjkIEfp5IPHci6rmOqr7f1+TP78+CYG1\nFj4XTRqv4+SPM5/Tceb9qAhNFEVy3dd6WwHvr8V/+/uf/Lf/9nf+fF+oHbTzhZnR1t8xy+f+8eOD\no/Xcl4AG+V2FWvfBWoufX7mfAeRHJyJYI9e1eOT7Ow5QBZS5gjn2unZUMjaYddwnEYFoMN2ZayAS\naMs9dxwH1gw14X//P/7PfxjH/tIg+nqd9N4JAfe4Fy0euYgRmmbwWBEgQkTkw/W9ACs4iQAgkZ8R\nLgQB7sQa+XdiMsbgunLxEFGLp5N/O+7FlP9Y/a6oTTlqoUFrjY/jIzekByCYZgAQmYy1WNcAHLF+\nf6aHIyJ4OL0+35pAy1ehCL1pBXXBVOrngzkXc+XCAlhB3reDiKL13/f3J5TwWtgVWMIFtTxoWmv0\n1hBtRAxkPR3A7rnwwPE5MQE16N2YrRFSB1Yo7kBAhCAYkn9EBKI2g2pDgGYNENaajNiB0llrYeqY\nKh5Sf6cCNIGqZLD0qID2BLdVQRQVcGA57jBnvu9wwZpwWD1jEVQak6hNJPfmzQ2W72XOmYfRNe7D\nWnzf2xOAzDL4BHlv+/4MQZoSIVy+iOmsVQfsWti5f6djCKFKxGI3YgcLxLEWEPocUASEYP1ETAlR\niJGBCc1DoDfOftLIwJ/3n+uXWouxuPfS3j/7GYjmd1xrIQFmRjfjaHm4nucL5DMDrC9mOCZ6H+pR\n69V94ssRCUyUFYs5L0Q6zTrWFLX8+f399j3klhdWPa9rTeaYhOT9tNozbkYfRnjQerv37QrwuRjj\nYs6Zn5fRGWfcv2sfskauoXor+VyW8D8r2P/SIHqeZ2Y7LYOgSN64z4WSD1bqJUO+cL699PPsHK3X\nRqNeRGZ1MxZrTrwymtYU67kBrvdkrYVK/n4zIXzVS8sTbK3AGuDcv38v/tw4+9FlyDBpiAUQtJZ7\nWT6egBxCZU2wiHpZeT8AIobUomlNObphJrTaoHMtQKg8JL+vCgGEKa0OEkeIELwyyOGLtYIIwaRh\nXThfJx8ff3CemYHEfnZj5GLzqECci8znZCnoJblwK1ovz3sPEUKo70pGzuWI6P39dpYDldmMizfr\nzrpWa7TmdwZIKB4TZ+X3jyAis1m/76tegQbigtQ6Um3oGvhw1pU/e7RXHczPRteDzHQ9Mw9wWlPO\nszPn5LquPLjmvANnSGAqNGu03jiODKSIMz0z7lgZRF8fJ+fxwUKqImoZBGU/jwywc3oGRrj3gcpO\nFiZo5P1JHk6xJoIAHwh5yEQEaKMrd2aZgSTu4B4hd4BnCopVEHRirjzITSEy4B3WeNd+62o0MxAn\nYgG5BxVhrNqjmpmgKGgoZvl9jq58/HihfTKmI2ZY7/w4z/vQkhDGyH1523nUs1gEawazsluzTj8P\nmuZ6bGq1b/LfVx2AP//8YjGwAJMM1oe1+1C/fGfSBlZrosn9Ln05XkndP7v+2kz046D3Tu8dUUWk\nMa+LIQMiGGPgazEjNxKV2osIr9eL//jjb/SeWZ5XqbpickmgsiAWvSuv10ctLHCCCAcRvBYVKLF2\nprEY7IAtGWwxTKvEq3LA58rM61t2LKGI+L0werMMmCKM2ogArlm6KROw+3lEBCJPwNnZkVc2vDey\naP6dLxZ4EJ7BGyJL6DpsMhPIzzPtd+b+8fHB+fHikPx+c2XGNsZAPCpIOqL7+xnaMziNOfHP3DTX\nuw6WncE3o2lCCt0MMUUlMyygYI/B8p3ZJTyhVXopmfWgAazccCJQG2l6ZjGzsvkW+RxEBDHNkwtY\na7LGkxGqtNxEGCaCYZgY0mHWwQFPdtMKQtqlNOII+st7OY7GefY8nM2y1L4urloLSmQl1RqnNZoo\nXS/GGMwq67se98H8XlVaSgZ03VkpC5GgNbvfx14Xy8EV3PMfeNaOu/Me78xw3Zkrs+pwwQViOkez\nO3NewZ0gaG8creezxbnw+/DZGfr19UU/5P691E9LvpB8HmsiGrSmfMiBHT3hFc0qqxfsttd+RGTg\n8gxea628VzSrjQhCBWkNunEUNGOS7+DH+coMGXiPK+GFmEhA0yzhM3vN59fk1+BvR8Ms19pYk3GN\nqoyFf3b9pUF0ZyEigqmSGzfyBfiDhagqYpl1jbVoFQh+/PjB2Q/cF5c7IZmON8tMRnriW621O9t1\nAvc8fcelhAdzOSqCSAWr92BckzWdkNw8r/O8T3h35/0erBn3/ec/VVqGo3U6CoBmpra+QRAiwvFL\ndhZPCSjfMgdyM7/fb+ZKmEM0g/mYk7UGSmLIAHgGUncvaCNL18yeewWKA5NGyKrANAsegfN1Ypan\n+ffM0Vpu3hXBGBl052duqDuIqmKmfPz4wD5OpAlC/p69WX0NVmUA+zmY6J1NaJAYHoGvBSqI5iaa\nazJnZgmqit2YWWaoIkJUAJlesFAdems4EgM9Ds6umCrX9QbynvKgOWmWpaxJwiprClOyAhBVVAVT\ny2zKpIK8U4kkSvwSbOZ4I4BKZJJnAjOz/OmRSfuCOaOysEwY1PYBtjAT3Fdi4yFAe7J1d0Z4YZCe\n9+IJG6jnueIbyomCvCoQ3+/E/YYQAE4zmilhDT3y/dwQhigikQfhO99h1w6W5byqPPCABGbCcSrq\n0BxmtDsg6rdK5U4CFGI5yxejKjcnEhONQKXTIhhrca2Lroa0xqEnJhksIwKT4Mers0ZHIlhLbwhm\nJxqHGXPkO5AOpoE1owk0BROYdRj/s+svDaJrLWTIL3jMWpldua87RU+MJrFH50pi5DhuINprUwqJ\nvWg4TTIgnOeJ9SMxvCo735V15aIMqIVr1og17vJtiHAcr4QcKvgBhatefH5+fgseVqWM3Ke5qGY5\nXYtm47jajG6NE8/yqb73jQdFBtyO3dnb1/VmXo70TvNA1bnWYI28166OwE2osRxfE0WwZpUxrDvb\ncXfw6y6fVDXJtG+Eyiao3jMJsHBhzMGczngvCAO0cmklIjcvyyEejDEqMDaBaA1mPvfe+r2huwmq\nQi6FqAAZCZZUlrLLU6iN5c4sUnIWSZd4X0vcUzXX0nKudbGWJA7dD7zKUveJ+0TEUE0Cq6mgehCr\nSDW9cH9IPLXE1vZzMcv1O33iAmqJo601uC6rZ27fvscqskbudTHGyCy/ApA1q/eSGXIG1byHo3Wk\nK04G1Z0xB8EEmmRlNX2iAT7jfu+IZaIwglXPVqMgGfes/MZAoPiGhiF3IFEDikiFJF96N1rviYne\nh8hKQrU1bBljZbZr7qyVh6LOxHd35aQEC6/nMzARRnz7GVFUI2ECdVqAr8F7XvgamKz8xwwVJ/xC\nzfl4VTVVyYRAQRjCdVB7wEECIaEMbVIVnuP6b1zO79N6b3wRufGHDKxxM6Wryj/VXDxrLa7rjYgw\n3m+u8YVEcqHWhBadVlCB1+9CMsNaK7jmqvI7iRarxeqx7nuTWvRNjF6BdJeIvRvned6L84YlrLDB\n3hBTZCRTK5IvRBG6ZYbcpVjeyhB2mQbQYmE98RuZji+41rwDbOjkvS7WrEOnQP3WDClyJSI3ylgT\nHQ9gb60CPhNV5Wz9vv99aO3AOr6Vu5ONO+embXRaZagZmOf971Flamxsj0VT5dWEZfn5Yh1wTJ7P\nMMlnEJrPdUXUIbSeko/MMt/zyXCDJ3M2E1o78tn7wB0iFhotA++6kCrR9sF2nnng5jPolSH5HcTy\nkJX74J1zFkHyZOF8+3dXZ01nXeNmjWMtWCshk+XEum6YKlj4Gsz1ZLL7HbiDzPz959ERaRCWJEnB\nP7nO131/AeBSB6vj4WSd4/Xdow6SuBMILZZyrSREO3XICchemgFzPQoFQ5gKvb0y0FdKvhMOwjFX\nQgtbVABBQ9HCtnO/5T9qQTOhrSz9WVLZaKoc2iGch6YSYs4M/J5qkGsI8XPld6sDNnxxHJlsCUmM\nAsSE1aAtiLDEQIshDVloCCMmZkH7luT9j66/NIjuF7EXDPCtvNgbwpCdUdQLihCuazLGQvGUgozJ\n0Y2zJ4OYpXfDA67rykBinVDhfU3GtcCdc8tZLBGd76XOWgtZmbHiRsjOkDO4y49+Z3LWhNYTkkhM\nz++ywk3opuCNw5SuKQnpPQkMwovYeH6/2VmbSbAVSDOYVV4TxBqIOxIZQIIo3EoRTRxVi9G9sci1\nCYjMnP94NY7zIFQSByuSDTLYXtd1vw9I1DLRSzAMj0nXjrXCJtUqmxTmvICZ76EOkCioxYqNdQSJ\nZ3dKkNlAVR4iiV/72ofqN4IR8Hr2IY7WIRKy7z/f0XP/peLQeLJvn8SaHM348ccH5+ugdQMJruvr\nhjkyA/wObwzGcKYnwbIZejO7JXmpNmhc13U/zwy0CQt4gPuqclhRM8CI60qMM5zWW2XSEzWltRdn\nwUr5mbnWtJ90ktzKPZSSJDsKD31fjDErILZUMgAjPAM7Sbzsz70hlWt8q7S4DzWq4vM5GTg2SWKw\nS+2hqMMloQrRQKJgEle0gWrD2vwFMsq1KkxTmjszlGMpy7N8dw+aCkdhqkbj8pmyM6dkcXWfrDtB\na10x2ZzDyvJeFipgXUGEE+49MsNZPumSJX4rfPgfXX9pEKWkJU7wfr/vTCwJG4r8yXJjB1CVxpqD\nr/mVC9yDMd80VX58nPS+dWDGXM4Yi+sa/P3nJ6LKuzSLmHLqwXmeaDOIPMWtd9aazFkBs8rFDbpn\nphaJu4rRMGKX6bVo3FcGTZHCYh3OTq/jXEWw8CJ+/D5MvisVTLOsnjM36R//8Tfa0XmPYi9VEB+4\nPxncloepKcEOJsoYK4mZyO9hGP0wPL6VqKqZmcxH/RCFYUo8CoWmxpJUA1wjsxY1HnJLjTETv23T\ncgFbsriiqUJorYKo58K9JWqxUEtcbbknY+oKkWXmWgvRDOCboDIzmiVpuKERCBBHxSrzyEAqd9ac\nBJ5Pv2GYnTll0M3DAwmsKQfHHYznfGAXLA+5WRh4EkwP+ekenOdZd7RQE5R2P8vjiLtk/vBOa9C+\nsnJIEmiiLb9TYotC64FWQFdT0PwMbJM0KeVjeb63Mbl2iaqK1ncVEd71e+b0xNJFbvZ6VEkvONYO\nmiWWqZGBLISCyCA1dk8mB9B7Z4xBq0w5WPhwXIRWErveHp13VpvjDg37oFu1Rv78/GKu4FAp7StI\n7Y8x8zOuudDWac1QF16vRju23vk5PNlkWhGXNzltBizELQ8SC6Q1Xq/XPw1jfy07f/64g8gmex7J\nj9RDWojFwyxuWUJAiBFawW0zwCTfvcW5XyNP4eVZ0lzX5JoTC8OaMefECvTfWkvV1Gmu+348caRZ\nG6tIBS1pi7uXrMWZM0kOcLqdibWVhLHbxv9Sa1rpZ2aO7qxYDwsqIKZ06wkLmGK98xFxk0FBSmY2\nDLI3t4YiXerPRj86rTR2Y81cwOfBx3FU+ao3mTVnnuxQC9kdjyQlImZKyNxxTxlZrvu9qTMDjiJB\n9GgpXJadYYO0R4e51lW45EPQeSSh5MlLELKrj6dEcwKPJwBq33j1s1FS/+moQYt8T62lLMl2sK33\nv3/3/h3wHBqb5EGSid4kR5bMeuPQADMKDy4oJYKbMJuRZNX+2W+JdWVP0E3x0+hFGM21kJvUATVH\nzFFbeWhKZvWtWVYqgMTEvSGaMImXQkJ5Z1VzKxA6L9ObtMyqYzE8stowbnXBo9/2+11nII4bBqKw\nTErfDVthkM/SRJEj4a/wwu3lkXQRgcrxZKZFRlplsastviboEqQOvz/n4hqOzyhhcmC2aO1AqzIw\nTWWNigADlrNYmHau+ZXfB09cVzt4wlKxqrL7pVr6H19/aRC13vCRcpcxJ8QDgKulHGWsmQJnKWDG\nFCtpS9TmM7GEWrbanDy93u/B+33hQQraI5nU3Q0RkVIG0eBHMddSpXWyeF4MLCzhxjVTp6ksf8T3\nCCka91GLv3P4AVZyHFGiCUc77iCCbp1oJN55l/IPCaGanTpmxlnf7Vpv3u83+CY+ErusbYS705px\nnr0yImhbAxrZ9dV754A7u4YHSpnf9KFwE8/576UR3CSMiNDPLYp/goeZcZwts4JSXrTdBaWacIQ8\nuOTeTMMfoqsdPeUtrDwE3Rl1SKlqkhaHFQyhvwRAETDbpWjcRFnbeLAI2qJKuPq+PhN/lCxJzYQI\nfZjsCIx83xEwyC46bY/8KSLuYJpE6GITeRFxH/YJUwhmTmsbB4UmVh1aj3ohIlUKrQvWoDVJgT+p\nV95if49RsGPcxJr1hMI2SUYshIaq0HpjmNzQ1ca6ezWwNLXiJPRei+7OrD2gpvQjKwtKIpVyM8vf\nGUGCP5VtirLwkuylomHzIZk7CVsoL/UdhJQ1qQ7wyfiamEzkaMzhzAFjBDYHEULvJ8uhaXUzLZgz\nD5216lY8NbLdEk5bY2UybQ333NsmDVGrBOmfx7G/NIhea7LmZH5rF7w7kdy5Zrb8bY1eLqoMmBlw\nqj2r7bbHFJUvgjmyzc09N+9p582SD8uydoajYyA405TAIJ6s6DvR812alMFo4ZI4YgrQ80yzZSB5\ngmdJWEygCkfp1HbpLff/kiWEJkYj7HLXibgwOziOE1UyyFyTODrzykBUdEEy05Lf3zRJJhUrmRiM\nyio2gcQcxcZnGbgJIN8sfm1OIXGy1NQlfuytIbHovWe7pDy4VrDQ1mhHYoxbo3u2Tm+dWItrpoZv\nsSro1bOttWDtQPuByxPCdwtgwif2TRVhRQrOYp/z3Z3H636O3zthRCMxTLdfKx95NLs78GWF9By6\n34Ple+yOK+5unfvv1s/PyE2410z2ItQ9XVlGtt7ykIc7eO+KxWtNq+5mhv2dNcmc+m/LB2s8XVyK\n0+oZZYvwQ8IlXu13Rq1EkkKaTP6KJFO02U3KUGTV8oFfO9t/Msm4uYynGsigmtn+mtmBloE69/iK\nPAyChD4AIopsrb+bCUtWodlSPVFNwsfJAPn5+VkypuxYaq2xRhLMIsIsbFc8lThbV3ocL+CqzrZF\nXN+INi0ieQ2u9+SfXX9pEP38zLaxBIZTWuHVCqhujH2aSfZX7+6kJnnbKxyjMNAC7TN7qHxRqqvp\neKXcaC2OMQBljYtrBovB7IqGI6zCKvPEBojaNN8B8DGyp9mOMzFJtDSEjxhbJEXNFEnWmtGOg65b\nIK4wM2S1wtNcHEGIEnfHSsF7ag8z6Bq1mSRKSLxAM9NObFC5rqBryqikpax/WeMIrw2122TjxgLX\n9ypANZsESFKv7y4iuDOaZOeDo3XO88R9YiulJA5Y03tBHxVMuzU0uLPN+W3jRaUjWyEFwViZ6Xnk\n89qlaKojenbRSGoXmybGu1f0rQmsYLhJov983R1lm/n/1p3y/WDf72xLwNydKzbhxl3ipojeWEUq\n+UwsOj9f8JI3rblYw1LR8L6q9EwSRI4jO2dUMIlHhysNwRLGko4ez8Guq0i0uW68eVYlxc7sW3ta\nHSMS75btX5DPddrK0rcqsBsaoeRNYthd3rdsr/Zqdqi18Z0kFvG79bYKnqro9r8nbAeBzwcTdSJV\nAZLPYe+/ELItGDh7Z55HEcsD9wkrDxJsMb4qKG4VQB0YZ1VER+sckl1Ys+CuOSbWOhzpaeA++Pq8\n/mkc+0uD6J8/f+ZJmCh/dWfkYkwMahACTY/MlrR0h+yFGMzDsSVZ2lVW8pyCT5fCXIHMmRlrODEn\n1zsB7z4EWYs1rzT8iOrh9ol5yTV86zmf8s8ibikPJISQ2WfqJ7OwIplzM1o/7ixGVPGR0gyvJgM8\ncN3C/UQvcoM74/2ubMFQHKrDBfuWnez2t8qKen8wJhO5Repagdx28wDZ9SSm0I0Wkc0Bs8TUh3Ec\nJyalWriy8+Y+tUWZsw6QkpDsbLy0YzSrMn4uwjXL09q4Yo9ZhMZM1l4N6vtkyQynZRa9M0JDHi2j\n2W3CAhUkxixG/unnhgfvXHOTF37rUd2zfH6CagVKTVz66Jn9rZX434Zjdoa/D0n3JHOmJX7Xe08Y\nqVjjtRbXp93B3X1VBfLoQRPHU7oFaoljSmt5AKvmfe/9Yhkkfe7WyYQwBW7Fw3cNcK6JfA8CYDub\n35mYFiThhU3qDY9sImau700WmQS4f/2CJ+8DN42B8ufWqjK5vuuGiNJD49Eyo+lrIJ66TftoxKXY\naWhX/vbHST+E16lcX0lMv34cfBS8lBDMxOeD76dwxlO+OGc2qhAMn6xrZEYtgkSv+6I4jn98/aVB\ndPjKL5X0L6LK0TvWWgYV0yopjtI1Zrm9rlwoHp6Lfi3oitlRL2ndJ3TvKXWCiVuSH+aJK8lU4psE\niFjZt24Jjc/pLL8yCzP9dQGacRxPB9M2KFkzsMSnkdrsodVqp2UyMVeqDkjN5/JsV/WIO3OLCoZE\nsGpjSNNkmz21oXsxt8qQejGrXn39Eo+uFY86QJKUA7I7J1ktFMeLdd9dQtc10a7083VXAeGL2Q1b\nB1SvswBSLXy3/EYVO477gLlWZqprzmSdpd2uSVbB/hqLsZ4uMakgZfVc9uaSyubSrSsKnjDWUibX\nIz4vsxCzZFv9G6mTh/Gv5fl3hh647/1WZZje73xO4PZsyM2p8mSGEpkdbyJO7nI1mCvv8fMM5nVV\na3Gtqyblm6DVM58YYzsOjvPMIHqvRU/yE27yTrQjsgjSqAPIfaNaUMKGTxIGEs323CWA2A2TAIzr\nnSY6HnUvjxfEnBeim0DaB1l2/t0uV2uxSgtr5ZLWe6dZ+TqUKch3/B9JT4Y8+NLAxUTo3vmj5Xru\nLTW9r4/GHx+d+bcX11dyBBuqMnn4kTmSOFsXGUjJRpMon4zwScyJiaNH7oEH72+84t+Yne+9I5HZ\nGLusOBKHWRH8l9eLdpz018lhLe3E5uQtn8xZmVA8usENYX7Xne5yZb/Ao3WUwL1z0llX2tNJCY99\nZRfRlj74/dnPCSzF0B8lyp5zMa6Lr/dXli1EtqD1nnDAZnPrsxbJYG+iaK3Fe7xzIRmIZAubtJ4a\n18r6usqdGWgdOK1lX3ZrvTbtSrkL/ILlbFnRfiYRghE4j6tQZmSJoxLxTRJU0ATFzlqqGGKu+/n2\nCij585qNDq+Tr+vNdb3xuZgrpUparPUut4/XR+pC++IMQayVtd4jddm2ZenqNXi/33Q7SBVEL6IF\nfAlzpfOSteP+vgCNPNB2C2trvXC6cWdb+T6Tod0OYcdxcBwHYvvvaBId07EiTp6MNf+OohzfMNlN\nZuZzzrK6Hc58Z8YkRb5IPBDD9FkEmdXheiLNbgOTkIHEk3nHN3OVKLbzbgSoy9cTzNWqGmkt3cJM\nafatelHlXaRU70bvx52FRyz8WxspgNnT2RcRfH193X/O6tLv3vobRsnd8DhpuWXAFgNL8lLNOOXE\nIhCed3L2fB/hzvhxwfIb6rpjAsJo2cY5hMw2l0Ok+xS1p1QCPa0c1yw57CY0Pauy/MfXX9s7f6Qd\nl5gi02kEp3UO66xwjlenvw6sdcySqBlM/BCOqQTlsSjGXEG4saokSguvxbzWnR0hwY8fLz7fyjWC\nj7agCWo9WxLZ4m2InieyLL713ydmlQFxIXokrSiD5Xniu6QMRyLQQxHNTWS90XShEZgU/ssbJPB4\n1+YSeAvHeQJp7RW+y7A8zYtepGlmH0dlKZuY0fZ4iWphvzEXpqBFdgUbi/pgXW9GlI50TtQXZq8k\ngYptl3WxYrDghgLmHCCeGWZPPZ5mu1Zmoe3EV6BL0aGpvfVs54uCTP6LGe3otVEy24umoJltvdfE\nvLLpAXFN1rxoDr0fTBNaeyF998svlsIyQc4zs/mP897Um+kWDY7j5OCsAPNxl9jujquyhqQOeBNk\nx5HNFIWxmh6c28rPHzeuu/1XdsZWAvDyG+0Ya5AVztt4a5WYBSHsg2XMtGFzyX57MRgSHKaF/wdE\nTx1n4bDuk/dYiA6kr8xALWB7qC7wKY8/qnVMGl17+hyoVqa72zwbxkdlrlpGMsnKq4PGz7Q+lA1z\njYQ0jg/WWvRj45clP4xgxaxAl7rgcV3gUhjlmfh9eOLimmY7ebgph8LZj5sYyi0thDbsVYqWMgDa\n2mYj1ShiDUcLc1/MGYyzQThSjfKxHKNE+CacLQN8/+eJ6F8bRI92gq3U1fksDCivPME6WiRSBq5N\nQiTGtux7iyjffm5bufkNjt++FeISAAAgAElEQVQs4v3Zxst6sp4mtGJ+PWZ1b2QW48rdDiiaL8nd\nMWvbs+bOdKPw1lbSmx18s1RM+QZljBER+Hz8J9dazJH42bq+4Og0MWjZmdFaYpkegzkTnE9fULsD\n6Hd2OC3SZkERFFZqyHk8mUm1GOLOuBK70lYthH1h1ogbly3fyHlVtjZpJDyyLcjYgm7N77y2s1aJ\nundLb8zFxeQL5aX57IEb1xPruILx9O8vYJR+dXq6PWlLH1jxhCgMYWmWY0oefue5PV83oSKoKN0e\nQ5aIb+a//pBJ3yVnaRqd2RSFo97l/zcsdl8bMtg4pFYGLCVBSmXA7sBasPKdtMIlrUT8Ed+6+FIm\nUAegIOEVxOQOHE2V0J4dZeRh08t3lFB8La73YM7B9DS/zu6ffn+Hez3Ox5pudzlt6AO4rRx3tfb9\nGWS2eN4HScI+357Zhpm+7dnEYpMIFc+K7TsmvbvpIhyRxwHK8du+USQo8W7+HUlYSIIk3eYiVrH/\ny2/8N8GNbFK4O7beC9Xnu/+j6y8Nok0No6VBqqZgfcsYrP96awn8Lq4x092HWnCL0r4U9sQ2Mdms\nYJ561hoeyfg+LuuZBR1nx0qo7eu7UDhu+YxqZpW7myQ330Jqc/RI6U+WSZafTcqaYBX2GMTKbMrX\nJFa6VcWMctpJA2SPJLRc02+zH/1uYbyuxPqSqd+SLyHbyf1Z5HXoaPzKvJ/H6w7sMSZrTN7yJrZG\nULLFLe+9FUsPy+W2l/OoTpcVlWGnG3uQmFM2HFCyk4ekUQVcc9HPxZcnK92Ojyzh4mFtvx98O9C7\nWWZD1Quuy3EfyCwZTDi6gkYDy0N6y3zSMckJ18y6xH5RU6yVln7XSoKBiCQrE+BIzDO2y3uuwccA\nvMp5yWkG6htn3YREKcu93KC+MeJZqWSbpkiul7UmWG7e5aU79SC2hKw+t+drT4JI4hbvZ+DIY7S1\n426BBggzKNPrFVfiqktLYrcN0Nc3GKVcvqpH3swwknQVsbxXHt+HB1rLZ3McJ631Ys+LQCWDaLOD\ncGH6YA7nkovW92eV5nY3kBRMtIKbzd/3K779FZ57sSLTQuoNFny0WmP1Cvqa1ne9Dt30Ic5y35cn\nXKL63x2Q/10c+6f/7//H10dPyc+8jK+RASUB+G8AvaXPqK90TtqjNYLsA0afwOFbTeszRfM8HRqi\nSpTT+VwPlpe9yyk+husuq/a1P3sH5rWC5dXlwspTTB5D2G3dp2owFm4TcCRmvZxxj5iQWXZ3c0Fl\n4qKBkEwtEYgJe9zJJsBSc6dMqpz8lkFsvNM9tUI7o0hNamYqdxAt/C2zI0mvTcnmBZNWJRf3Qu2i\nhWC1DIQxaCG0CuJjpQfonAMJ5eN43SYvTbYEbWeWwTWdNhZtXHfQnCvAZjHyqdIQMjC4GWEtR8V4\n9oTfOG/ha749XjUDb1Y5Ue7uGYBc+v0sNza3O+Z28PguVYvlSe5VRrUJk2avm/k++pFssuShaiYI\n1QAQebiseKRqqgqSpigMcHWsJRnHsmyv7Adr5fN0Ka3ue6RblDtLdnddY6neQe9784KPyXRBWjwV\nSLWzdtodpFjOksrC2RXSo99ePp/9tFuMvx2SN/OPVbUWdzt0U8MOfQ6AXXLX/cwx+Pz85P1+cxxZ\n9Vk7yow5YaD0VC2f06PR45lwEDGRytI31DbZ+HIedjfZuNeLKRbbWzbJWW/5HK6ZXXR5XqcU8J9d\nf23bp1UJYU6TxuDJWrJdsmFWZfXwW7TbW0vThmIC3ZOwuK4rS8AqQY+zf3OBCsaVc3fcQXujVybq\ncLP0id+URAoj9GmHVNVULtVL2eeT3hsO9BuUABAjrda2xV+s8VisVda7+5ybZqkn4eALNSNWMN7v\nMp3OFjefZc9Vso2j7iN7uDMDZguex2TNLEt2VsEODjMSk96B7iZFKAmIV//8rD7qxER380C0yEPE\nFwthVZfYKt/T6DubbMCjAcytls0BGxrYOsqIN1qSpePjVf2RmeE0UWgNXzOz6/FsitDyYY0iLSQl\nT14QQP4dr3cEsoQR49n8kVKl3VlmZpz9vH/3fI+b3MoAAi67c0oLbqk2XgmEah+sg3cHtq57PMuT\n4aR6w8E6SaRXU8TcpfWRv3elA9UosnGUCuVunoD7OdaNEDHRNug9M9LtL3xLk9jk65YXUdMDnLVm\nQWKSn0V2dV1kN5usxzt0k500/baHd8bdnwMpQMkMELnIkTLv/D7XpB9Xmoa/BCksN9bFWpkU+R79\nsWZi9PFULUElOqP8ShG8kopV8WGUJt3dkZXexSo9TcfNsrKq/c/28ODfuO0ziuQodfUveOZ+KVIv\nNWbqQqnN1Foj6mHNOfE5iDZwLa2jQLN+y0w+v978/PnF+5pY7xz6tDvmSIfHWRyEWAH8p+zEHqeb\nnOEEkHjaFlxTC1Bjz7HxO4PJFzwLA8su/72hrKRF7d6I1dGzVrkYZenutSFjSRJrd6mchijSIttf\nPQNoOtbPe4O7e2JVrdH8aZXsdmBWxEaQ5dfcM6nSkGMbdeyMBMnTfs20cLuukYJl5y61Npa9DxyJ\n1E+GGk0bht2mJ9s8WJtB78z/jPNKKh9cEkJc3/67SNr+Wb6IGwOTCrJzPe2kYYtwA93jH1r5nSr0\nnAFlksGJjQ+uhD5273gGjqei2e/wMdReudFX6hHdU6zvvZPzogTuWPe9xXPrTht0RZdjFsQKpgx8\nZrUm0/n6/Huux/UB3TFLKCYxwm/SIQ9MjCXfpjCUPlNIDWqun9S3auxgt4PQt/lntd+u8YVc8mCZ\nVfEp+Xv2/t370wob3VDYzjZVg/Ex6J9f9yiWMQatL169I12gDGDMjFZDH2d4zQR7IB+NbMxI56vs\nj889ubvW4rZ2TOhPWaukVJ4JgVtWaCFkEP0m+fpH11+rE/16fwucD/bxXbuX5cTMjCJKV1qyC5+T\nNS7WSGZQ9Sh5A/ewM1/Znvfzzy9+fn4x3GnkvKXv+k73ydFaLfDEWFJaxB04LezeMJAl4yKgRNt6\nh4p8sFrGIjlvTFi1SPRbB461lmYpVKugZ6/7vveqXMmQEdUCW+U42d4Wa+QpalEO9yVyrvEqPheX\nXwmHjIuP1x85RsHajWkl1kWZX8P7PYjIZ/P+/Ppl8Z+9I70jumrzBY97eiQpsNLv9WnTzPbcvbHy\nNisb80gcdW+yrav8Jn1TI8m82hTyba2oJglhG4ZRKhPMg2uXpxGRpjHLcWa+JMkBGEmDR5JHO5Pz\nJyPbEyV3QEmnqcqCtAKhRBkypzO7RNz6W9WnVVVqDUtsIlNuF6adWefh5sk+e1rWeWHYPrO1dl+b\neHJZ39aN3w0nPTpzD/rjgatiK3e8jHykw/EYga+1g2Q+l+3G9fX+yfsK5td1jzo5jqOC2bzf8e6R\n3+91jKxGjiMz648jdd1//PEfxAqO48hq0srft8kvGXZm/O32e/Vvrk+Z+pT861silodwnrgJSwSr\nJgogAwljke8qXHKMSmQDjPbS18q/cRD9+fNnnVj5510mtnIcF037Cfcs/w41pqZRyRzjJkO8MMpe\nZdWeopn2eo3Pa/Dz5xc///xkBvSlCG/mfITZ+2F3SfH++/2rl+bdAeEpClY1lmzxdE1v/IazemQL\nowospPCa7P912W2q1XETjsyFr+BaTluBewqB9xje2/k+SjunHZ9JlM05sajOr0gN6p391hXLuSoI\ntGpK0ODXdkh9eqDvDHzbskWZVK+cQSUiNPPEbM2S0NGabFnQyJ9fnyUk9/R41V445y4R97C2fJ9j\njJsZnTVyWes5jem4pa7vxrc0cpqmam2CCewyObMxqhtrwyt4OW6x7n7w/P6/tvdGwHU9PeDfJVBS\nWORcA++az2govNLlPbOvms9zU25yB8+1Rx/HBCbS+q2zXb67fWZOUl2pZhhj3Objc1ylMz1u9cVK\nBxDW9Mq28v0d1iqYfyP3AGeB7o6rxKBbkSxeMqufP38C0NU4zs7rlfIi0dxb1/pizQn1d3LdTET6\nL6TgLqV3gGz3z+b8pfM8kf/4LxzHwddXHtipIa91tomk6rDbDP91PUF0X1r8mook6Sz5Xcfy+3BB\nBYlnHthxNPrdfeZse0kKVvm3Luf/759/soXKveeDTyNYOF5nLXZBSJbZJLEuX9m+iWypD7fPp2qS\nH+P9zimKMbhmSnje78FcwpyfvL8Wx8uqMyl7Y3en0xjjxktuIFqk+oSz2yY9EQtKoDLXwjb3i1fk\nXgweDk66Eq0qb1tpG8mhedNzsV/D0e3i46kxDAcVQ7dbkT7dNl0sxztE/NqOSY442AskRvVKU0bV\n/r7b8nZ/8s6Gtiwr9OnK2n/3DiZNbgE4kgJ5mY62xed7PBkSzqGB1EH0vq4MaiZo5LtaI6VQAvzQ\n1915ln6jcqsTtp9n+o0mpueRnrJ3O66l/Vmw54xnibzfsRSBt64Hg4/IgXYpVM/1ueU5qUGdXO/3\n8/dF8FDmEtw7KkdWRvi3/vjKfjXZ8asaKvYzljKtjhjEyu4cLWG3eOScofcbH8XO+2Re474Ha2TH\nkWqZgzjDJ+/rzXXN/Du2avzxxl+5JW+4l1FKrospszK4eh7xwCVbLqSWQfXjOPHX5O9//3uuFR5y\nU3WVvCmf57ue2/f59lm25757jFK+4cQ7ix1pkzl90SPQ1/ktw+RJMKoSlIiqKrJCUbV7am1Ijg9U\nEcKEU7PJoEk6YSUn8AMnJwJn9rynUvzj6y8Nott7clyDcW1rNOc4jpwX/b7wrbPD7wFTQmJxM7Lz\nIANX9XvXBn/PlUHzyrk/e2zw+/1mfb7BPvkYe3b1nnv98z6pd/854k+mGus+SVtrhCrT4Zp+n/zu\nz7gLPDhndqPcQLdH3k+kV4DqZK4cdRGeL3kO583INjrLRbazbST9LDUciZWdFvYsQtOa41543Q6A\n+yyN5YyRGXoukvddpu7Okk22HEeRevdi9ltms9YCOQvvtOqtNtSzBL2JYCtbsZaTAfYM8TEG0zLr\nGl9JLEikp2brHfHadOTGjzICRoQwLZZLcEsB/eTRK2pECur7mXOhxrhxsWTuQeLAPO0Lr8oaVf0X\nSYuI8B7PHKprjptgbP+pNN+QlN9i7pm4pKeL02KvwbjJshbJ2LO0dJzp5CWWB/A251lz3FDRdsQS\nEbSkWk6W8DPK1GXrKz1wTX9Rn6scsSwzYxGwVGPsl7XmmzWtBgkmVyBSUsK5mLZNZp4W0J38ADf+\nCVujm+2g+9qNBDsTHe+LWdnkzvb3JAAV6M1ujuFefxHYUc/ey2h8ztuuTgsLz7ZgQ+5hjI/dH6bE\nFIYE7mmaLpK+u729yk/gzdfXO0nh+W/cO594WWJLc+Up3a3dGUyeKs986+xxLRIK7nIcIHafuARz\nlo1eCJ/vN3NkubZmjWEOoUv/pZR15yaszIQpD360XXeyVXCL1RW68FWyq2uO+7PMLMcgADEq8Hvk\nYvRtWDKyxZQrRxsMwHJ8xfTEcbMfXmldk9G2atTcxNvaMEb7hfH1knsQ6xb3s3UHd7Z63Vno95HB\nu71RdxteXXuo2YogKjvZi148bct8lvb1u0yowR4ZsqqkHJ5m2Xvo3Ne8mHPUgLCDVUFTNNsXrT1y\nJ8rdZwuxRdM491TFewaO1hof55lwhyfWun1DNRzxI/WfqhnkarR0tFVT3B8B/c780hyj3L0iDWT2\nyN7eWo7kVd2cXmmeCw6KWn8rza33IZUGwYAu1gRdhrbGIWey9KUbxzNB6GrYS4iowKU5YuWqd5jM\ncykXJCVTe3x1Ho7l6l8BMDvQqk3TqY6y7wqEtK+DMuwpN6p5ve/g94t4fj7Y8z6AM9A2qDEq+9rl\n/Q6ed9XiKRu0gm1EJHH9tQhPnF6W3VKrtRZrJO4K+YwkKGlYyrWyY6QUBioQwlyLT8/zY6ygjZoQ\nm+krYwZf1+TPr3ljuf/o+ovZ+bgdqNfKbhwoiQfFUNcgtpg5XiBPmM36VSdHqqQSI4scZJe7l8pE\nFqF7wFzKQT4+PpA2704hKaPh3q2C3WSM7BX3WxaUZgXjSiMNb1mWvMfIElVq5HBviGTb5qwyLEc1\neLLXMwMkfZeY+dJzf6bIt2layXkzvPCbIIeMbfbXgjsT+C4c351fKYwvSRdpx+dI4aNPuf3tjZT+\nM7/31/VVwSAxLXamp8qM9DV195sUWe7ZjEDa96Wvaz3D3oF+C6Pdna+1DblzjPJhQjQlrHrcq+Gi\nteyRxtIcJor8C5dbvM2arGJeTXIMR8i8vRWkRkmnd+V2ccr7m1cGySZS1odRWsqWTRSriI2aE79x\n7y1vEvnWJZd1dWqB64BPEGRrT+2uZnqxzKtIoTQLzktJ3e3dZQN4K9/RHYQ1WJGWd2strvHFmtVk\noUJvnfM8OI+zPBmEkE3KFU25M28RtDBkr/9mbIy4Pv993VXEGKOat75/98d8ev/MXZKo3FNhv//M\nDqZbxQFkUqDJbWipClvTKse5Gfa1g+iczGvdGHC6WSVUlqqaTjueeVvTB9f7QqMMfCaIXHx+XXxd\nA9PO9HT8//Pn+z/tkf/++ounfSZm0Y96+CNoLQX4goEL61o1sfFh9zC9+79VW3bKiKRMpzcihD6D\nv/9ff8cly35xoR/G+Sog+TwQ7YxrMMuwdtvmqUKs7KvdeFw/OpnNOj4Goak9zVKqfBSb8tEbdh55\n72MkForSVPP0uxIf6tSIWdt9xcJVQUVVidbSao80npVmsL7PAfK7Qynhhrhx2zmvas9MNUNoPOUO\nSWw1tbLde5bA09zwbW76nLdUKsmkIkBWWsH5cri+7sDmkV1Matkvf10JFxzHgZ9ekqjUc17vmZMA\n5sTXnhtf96F6C8yF57+pGRQU0WselbuzQnLc7nozFvj8vDvg9FtTQcIqxpZQ56Z6sNQt6t5ytj1M\n0H3eXXEbJ+/F3JpI6WpXaj53RUKW22blAXofQtvV6IWv9z01Qf5TNfG0hUZlYhPkwIzH3m/tCmPd\n70uxaqqwmmK6Xd432eWEpg5bQpHIKbe71N4qgn2/a2amd11bpXBVEH10oqFPmZ73ksMhGU+pn+sq\nZV9zrfuAzuf1cA9Aao/XSGzTjLN1pOWhE5UAmFm532cJP8ZkFo67HbpWBN8HR/6iyCHqczvUPccn\ntJaG7WPmz3D8GxuQZNtlRzXw7ul8c2avr0lq9x65RcmIekvbNeDoiltmotqV14+PNAgOYc7F19dA\n9BPIB3ue6cLej5zjHbHAU7DeW0+SRIQxLnwODlN+/O3Fx0f2X7+/Bu/l2ZPclOhWXSiDRWOJ3h6d\n09O1HSGdy9XwrzRWmL4QV5ZbWc/VJtpjlVVpnRy9YJvZf8B+QxCEtbKPfowGPBMJn0yhFmZI2u3N\nqGeVwUFtT6B8yCSgStcHQ/qOgVlrv3ocBIXrFXwgYNrQbjiLL3KY3bVdw4MqnzNAzDlLyO6YwzwH\ns0+i9crABCeYXDQ/iygCIr+XIMhy1rVY7zfX12CVLnZdq/B0xcQIy84kKeY25JkgC8lH/KJ5bGk7\nmEPOqLG/z8bPQ5xsQ3UYY7HnN6UcKw/mPBzs3sQbIhIR5tYkVlda4vqzfBWi3Ng31pjMsiq4SB6Q\nK+GaMnUrzDXXUD+MdjZa7/gaOIqUAkZtey6kpR7FNZiWdvlbNbNIeCLWM4lXQxllotzO4w7Wqpoj\ndyqD3SNXvku3bmyS3Yn2wEYqcitSrhpeufXJzcphrH7+KLJsreNuFIkIjlKfsKfKBjiBrIms3D/a\nFQ3lfPWsSqsVGTJ57iHQU4Ko/Z+Hyb80iAqWQ6Bi0ayjCGc70NI5srTs77J0l2a5QStL6cVkhgTS\njKO/OF8/SHfyL7QwvnGemMLr9eLjj4OjXsLywJvgA3rrvM4s1+Y7rddeP158nC/++Hix2zPngG6d\n1+sDfXWmO19zEE25fKElNxlFLqgkeL8iQfBb3gMQSqwE+KX3LFUjxy8fZ+d19sTt1u52SQ1n9hU/\n/ckPzvoN3F9+m/b6bSknN3GitkdOJNTowHZ131kae5bSNy/PLcbfra1ttzCSuDSQDvsmQGO8suso\nT//3r0O/5mK+sw2WyDG2c058TKItxDrZ251QyGpb61ldU5Kje+ecfH3+yc+fP3NaQuF1EvB6fdxz\nnb5fOwNd5MG8yUJVyeaONTn1yfolcsqmS0BpQNO82ZLgqCAX9TmJ72qRG8kWL4k7gLg7vt2Sbj+Y\nxB7DDFkO5WSYpXUQqnegzOkLRQKtxBv3ZFGRZ2x42xCAWH6GyG32fYvzXe7Dcv/SqMMkf+A5aNK7\nVvB7tI1wvl788cdHJij9qD72p0lljD3D6ptlYClqkPQauEmjuz8/98xGa55ju3DPVtJAkSQEo9+K\njqeL60C0hvGN6ybd1sqKoWvn43zxtx+vTJ7e7xtb9Ug4BBXa8W/sJxrVr3uXOdU5sZazrsFV2dF2\njLdbppGu3xplmiALvo1uWOHMEqlL6dB6U46zFc6SrPuai24NzhrfocY1023m3OMDjnbLa3rvxEyd\n5Y+PD+LVk9m1ZIkZ1y01igi+Pr/ISYyZgY1rpIZtd/5ou+Umplqu8I6aJDbbkwUOzUCs0lgrbsLi\nDsa/XCXSlufkv3G8rumxuSGEPTaBKhl5ZFMqQv/xoxb208q3N5aJsmYxqBR+vUYaS/eU3aDKR22K\nz68vvr6+vo2XzntIuCH/fJTfa68y2oudvrb5syl2fN4bQyn8y2eSe1+fvL++uN5X2ppZZlo7m/me\nCbo7sYmX3muee2f69ciavvXKW/W879HC+zu0MqLZUj14yJpZWe/367ugfsupYq9HIIhnBExLTWYX\nZRV0oT0hoBlOfJUfAEXInk85fPZeo3EaRz/Sdaul74BYujtJNQxPrlsqtN/zfZ/+jHAxEo9N2VNm\nfovg4yMD6Hm+OM/zrmT284Mv3Lmfzw0bnHYfKGMmtGOiHLa7AmdBMXtUuaQQPgLj8aNN9YnQWqpk\nRNJa7zx/0HpnrIm932ms/pVrx2aje40Paj15pzG5qj05u+oyYz/6v3E5//V+E5+OhnMeGeBE05T3\nGoNrzQTNI1suz7JH03rJF1/gYJYbTr7y5Y73m+vnT2S+6SyOj2pV1BQbvz6yY0KnpZOQToicLKpN\neP34KPKnE2FECGj11db84y+9+OFwFAOuAeqC1LyZWIuzNX5+fTF03EWjVEeIvhoawWUXNKfFiyb/\nwQrn4ie953zvUw+m5QC5JqAFjLtNPkQwTeYTuFUDEcKf7z/v7HSbVOxWO8hRIfMajDVS0mHK8fob\n4rWAfHAYtJ7VAKQfozajNRjzorWTiPWYi7S8l/xvQotA5qKtiflCKzjtxb/eF0cU2XJ2rDd+nCcf\nHx85GjmCP8cnX1+lAY3HmCY3gvPHjx+YSR20OWp5sZiyOLqymuM9krCK2GcMkFmV9iQZj/NVmz8N\nl6Mw35gTKTef3gxOSn2QxhZmRnqlp9h9kuNS2vmCcSU55JRzfb6fnN2TUrCjpU2da1nfoail45ha\nTbyMoEt2cCX56uh0Ls82YInADDSUo1odmzZOO8slTTOrJzgKV05d6KrOqcc7IUJYYyFqmZWpMFFc\njGW5NlrPdmr/EE6tUSEBOnO97AzTNEdVv/RkrcXPr09WTdu1Wo/nboz5/OQaNaBvD3+ERznSs1Ll\nfaUZziyXq5Uv1HqqYZZM1nJGBF0P3FqaY6sw/GItY+hK+0sEkYXLlRNKz0zkcvZXkry9Gf+Ticl/\ncRD9/GSMN02ULj+Q8xm10VpjeEqL3mPcQP8+aX89NXPDJcvH3X9rvfOhiflERJ3MB9aPJArMMbfC\nmZ7syCwxndZ7dstUa6SzQetHKrQnJt4ZzsppgopUJ0seBDkGt2btVKYnbBlRbpBZIx2kyV0mZxcX\nWEtjEG3Chymv/jfafCfbHimMb9V6Z6sx1uTn3/+8s6LMbMvJnSgzW+H1+sBLPnV+nGhktnW9F2Y1\ndliE9HDPMca9Jyv9/lmmLTXKIbOxB1v9Lkzf7ys7RNLx/ePDGVfOZUppVZ76JukXMOdgvb+Y1T0G\nEGubQk9OSRWFWec8OiIHaw2OI1tpe+93ltRaTkbYHVlamuysCJ5serO7UP3/42LOxOCzgYLsnPKF\n1Jz06VeRUXZnvRtb/Q6zbAOYKG+BW1Wh2+U9fWB77wSLFnLL/Kxw0Jx7BCsEx1PpMLcXQ1YXickv\ntFyqrDS1m5zb9yeqj8RNsuTfuszwIgj3PVo6SyXj/+LsB107EULUZ3x9fTLGdcsAcwqu3ATPfs43\nMVdO+e7OOvI7i0iV4r0OEruNb9J0JP4f5t71x5LkyPI75ubuEfdmVfPR5Aw5L3C4g3kIEPZ/EPRF\nf7cESMJK0AoLzeqxD8xwOcMl2SS7KytvRLi7mT4c84jbM9P8Wn2BQpPV2Zl540a4m5ud8zvn0f65\nsp3XcUYgc/K/s2WYL41trRnS6CaUzh5wTookDAhcVx7tR/cnx9+3WGz/nfc3HAdBxbUW1GXmn3ck\nmSLeSVSaDyftgsxDCk+7lnNhA3B+ECmR1N1jmrcsjBqhYwJI2aD8L89jKuUwl0SH2sgrPGy44ThV\nAiX0dhE/ax0jyDsTaKBw2gPNuMjNXBrLp43NIrwM9oDkAi3yNX1cqgvWumDNCj86mjksZ6SMgEHQ\nNWVgpAOcFrnltp4Psyr7SEmZTqrZkRdmNrmAOT65QMHrpZbg0xWVlHpGp9aQ1ZciJTJQuztyDA/G\noC33/D3O4+w8Yt2Qwzu9pETFxQljTtDKar/7QLKGBENJ7BuS6hUKhZxQ84qXGCbO4YNZeNyfNq05\nMDQjBcsnNWpKpRBqg9BwLpEnBQBdcE5/xSMVwAFJGSkyrTDS2ZKZlTJVFgWqDmCCgBuOnRPy+fsC\nQAqGKzPWByRlZER2uwWMGSlYreM8KvduAe0I/aSwLZDgSE1YGvaEotH6UqWiICVG4CSFDIdMzz1i\n8GMUUCZ3iGaUOWQSclau7eYAACAASURBVHlzVqSckEPyNc0sx7ZReVI4aMq1UoIX10SVwGUgBn4l\nnzIqGkUKMGN6niRPDtDTPoLA1Dk9z5ZPKEnJhdQzo5qgd4vcJYFVfh9CzmmDbS2Gvk/R20vOWJaL\nt7vvjLb5VutEb+uCpRZg9FOyoSpwSRjCHpgURfF6xu9eljlWmDln1LUQPhCLrJlhpP41QS8Ayjqe\nJCQGwEJXKVGxUjoUU+zMhQdAuB469saqKOV8isVZxcYiO46zGigiWAJ4MXzQZhbuKB1AqpS6jM4q\nxT3yY5QVAB96QylhXVSBLpl6Us2QFLNlI58TkY7q8Oh/rl8bYomGGyYmwSILxmhYlgytGb2N8Hnz\nurqxh6tKgIo/Q59jAszKnHELZnbG3M7+KTcHpgOoFmg0/FNK0LWeGsEZBHiZBgAsFUmAXi8tbJ4a\nSU9QXc5FMud08g2mOL7WekVZgxvO8DktBjxThmXOSF8OvyuYMxWJnh4Iur7zJBJFCY0PV5U5eOEh\n1HJDndV5KRWagCHtTA8YccQXd4xSaJqIsDhVRVeNI71xA24NKgozynggdupDe3z25Ouyf+hCY0Oy\n0AODFd2yrOGIpOYBiMVUEwYE7aDhZfJahztSLiGcr4Qyh8qgtRaFKwXyMP7dtu3QQuh5toEV1I3M\nhYr0LyFtX3jNzopSE8ZwtG4Ytp9E+XMgNQx90BBw9IY6ShRLgI0CiQwntkCuvux8RgEEgUwAlEsn\n6/yjUlC0cqDEJsjpSPt9r0+6iPZ9uybMvaMLoGWNARLvSAKVp94tLrzRdaHKv1+XGyS0gwCnzE2p\nZdt3ZlLnrOGw4Y3aRkdzJoZKTLsHmANPWxzlDaJPvuTo0c6jSgrfskiE081qtjVIyZDhWDQjFYeH\nVGIeb9e1IpWEOoOy8kBJCetSUG4FWR04Lt/41UAPGZLRxZOToCYQrgCHjSOGEpGUOafnif1ieIIJ\nSTYJCmhGykzLBABrBL8gFrZL+iTn0UxUkFEw8gH1BASvUQWoTzbAMQja1pJR0hrH3RwtgYp0yPkz\nptRqLsziM5ztCpubYvaUqPRMUkPCdHm3r/ca7Zh4zQeRv1PIjPo1dHveXOdgaVoNe2ePdKL3NCbT\nw2kthCZqJuHoxuugkXJQ8gJk4JAE1RYbS0BjKHNgP9UkwuVA94XSOzXlUCZ2fhaSeKLQEvKoOHVq\nfnJD4TqZ9RFOLOcGOf/dhJ3AU/juB80QMUyTkHqpMriteL4+VzeMnTrO53bWfE1XG09IDpHozecC\nH/1qVdmUe30dttOdleMckI4x4vvQGECHVEBUuqOlA2MQCjNiQ1fRrw2vU5oZWGHWeb6/eRujjR5B\ngNfCX77NOlF+WA0zaqMPIA8FtCCXiA5wQ/Lokzz1VNjXunYq9wO9zYuVT//scRzMF0+IqrQhxYLa\nxtW303zdDBIyEPeIJ5DQtsXDnjL9yi6sUCcLNEWKpCWGhyF7CPVDlB6vXDJutSAv+XzghxDFd1sX\n1NsKFYclUm9u93ex21Km0ZqR/LMoihIAwmP1lQQK8P1mvaq7qVV046CqW8aylrDK9nOhKqWii1MJ\n4BGZ4o6ZO077oMKWK8/dBh/AUjLgzqqrjZi6V8Y0iJDlGkcm844SVdNzbxKYVknwiJ2YR3RyIGUK\nsj2qYOPxfzD+lxHBVH/wfmHPsPeOPhrtw+6YVuG5sbk7fByEfpz9NvYkZ2U9e28SbY6kihQItskg\nMHf00aHIqPOoqsbNo1f2EZ09x1IKTw/iAZaexgKPyvLaQKY7Lwkrdbbs5fxc5lDndCHN5yze4/x3\nc+Hog5pie8L8zRp1jHFCz1vfT5q922XRbMfFZ2CLorCNtCxYbvdw7j2BbWJhsgj2s4Bqj8HkhWcL\n6SSlTXkdUgDYZQbJKdKQM9JF43eZVmTOSkjZZ4zLAMBFuRTqSG0tp+2Um5PEZzdiBBiFg36LdaL0\ncA+6WYR9leyGrOzVGRhk1togqKT72UNxUL40uZVjDGz77H2uzJ1BABvg503QWoeEtCephrXc4ONJ\n0K6AgjISjJnoGJbTiH4wG3js45SOzJ2V/63E19Xz+PJc4UxZTVkUiMXFc0FRwbIW3G+suPX+gpTY\n1+vWIMkw+kH7Y11QK1Aij7z7FXo3hxjuxodcZ6AdyUPWDrgn7E2xffUR3//ee9h4nBrAUkoM0YDj\niB7bk4QMCClNynAh25KLCvvT03/Nr6GrDCHnyaUiR1ie+w1JKxJYRQFPRze72gUiEsJ7O98LAPTA\npo0xYG3yWStS5glM4ddIwP2k+YhmZmrN9o2FDtkvMfi05p5/MkXr+mSzdVzxwEw4nXCWa3HoIdb3\neHhr7Zc8KiptF5yR1KIhko9+//ydrDExwIdh2Nc3k8k8yOXSpT4PuK4KNoUlFjAfaM1wPB5se+10\nlgmIFUzxtbDgmEpCHyH/6nOoG4PRuMfWdUWuBcvtTgpbIvCHixRtpDwpREz0OSEKYhoEZ6jhNAHE\n+5PE1FbTywDiOwlL/F6ROuoIeygr4CxyVqDPGwt7sguSGSx+xyFsgDu4wbL2JZ/g970+7XHeGcXK\nIx0/2DkQgCZGucZN0PcD3R1IhamJItj3xolr7FKPx45hhvfvDGukPN7XBb3HjaWCMSJxMbPvNMwY\npQEe7c0oM/FEm9wUMXMxtNPds3e6hfp+oBTmcnu4mZDS04OiMYgB5CBPNJeCFNbIlCheN+3IwgU6\n5yvllNVbjuOroreMBzpKzhAZ50M+WQN9TDo4LqdHRE7z388cnoGtOX71qy/wne++I80cjnW9MU3V\nHSMZxAan8qkgZ+LNzAeJQd3w2HcugtE2GLTfcEgE5qt3M1ZLWZEKj22swFfIFHnPaguNPUsR3rwO\n2mrDt60xHBHMr+E/uasS4JFzRrCzYhHm/eayIKV+DoFa276mZ0y4NJxz8VZlrHOtC+q6oOQlKkb5\nWvUuWZGBsxLqnZrZYxzIFp9lKChSZvSIhiphnIBlVpoz0oa5V4D4wO4gSMWCmt87UpwsSiWascSg\nyyOUD6FzhF40e2IB2O9LQYCfgJa2kaCk83uNARMK6yGkJR37gwJsAG1c0GTNGXVd8e7dO9xeXlCW\nitfHG/ao6qk9vjZgd79+3zm4iqHRiPbDkAFJs+BJyHmFV0c/KGfDE7MglwTVDB1XVd17J/9g4f3P\nz3acqMMBVrgmQDNybyFM8TUL6prLaQv+ptcnRuHxwg7jQlhvK5b7DWVdTvr1aA7xETg5kAQ+WIke\n5tHj49F123YAE+F1+XpZQVHkzu/LCzkEWGrG0Z3YvNODHpNR0OVUa6UOsqTgcHJCuu1ErIkbVAqP\nA6MDQitkDb2baKJMxTOQBlAUUjOZoSGxOA6By0BrB6UZShJ+KUS23dcKSQNjOO4vK3yQZ8qF5SLy\nP++2qtwApoGBx9ULzrt3xa9++SX+m7+uGG3DZ+9fqHQQhWiG9AQIF6wUYrkeG8722PH6cWfwnjuq\nZiy1okWmlLuEPpELpotBcibRPrE1YMjog8MxOx0zCeastlRmwFgkRfrzQ1NgfVopwWlxZPkYJBZx\nnINBDr2i7zg6f6ZLaIEvIhQ1jIrb7cbhSM4o0Y/PdeWwUfjg1TSdT5xUTRdVyoKalvOYOyLwTYym\njlLYzpAamy2pqPHZ2dkyIbjb4COOnU1x2B6aWMA9vPCyoBQ6kkTkrJtGukLozp5gVGms3inBkwD8\nuEeQYO/oHvlZoMU5S2KCAjjQYvyJnr1nVr+Celtwe7nTUdjZqmjtQGtg8q1bAEUuWZl7WFsHoR8i\nwqgXTWjtgHshXFqulFSzdCpd5n3P1AVu3Pv+QLaBnAvNHyLkvQ6L7+nArNoVTPLdD4zRUesCFdpX\nL7j2N78+6SL62A/aAxVY1wW3+zvcX15o0xOJ3sa4wBHuJ+dzHluP44hkB04g/6U3nFJUZWXGwjKm\nFSBgpEJhRnnMudgIeZqlFNzvd0AMb5FIOL3pxJplJC0w5wPg89isgi4RHREDh+4T/BBRIOGD9hE3\nk1Dftx0MI+souN8LkA7c7ndWG3VFPwwqQOsWR6ADHplAPAIbNI3A1/EPMHvH0euBwvOKD9uBvQ2s\nejXPCcwgjozgE4N0hIfbsO8PvO1veP24Ax5kLAGONki794CmCHd6efodZlk44Dj2nSi9WSk6O3Kj\ns9IYTv1rzZzaDhiS0BoooZE8VRRC3zm/R/yofKkx2JNLQO9wcIKdc3k6Ftt55Jvxuu40eWgpKGVh\nLzw2SA+A9tUSuAYrs71DYMn1kEOjGs3RripXLxZj8hOmm4yHyFlBpie+QnLAbZwKFbFx2iPndSRz\n4u1cyAGDzgiPgIn3g5wBN+NJovB+p6Qw9JfOqTgKK2TA0JpgjATkdIKs5+bNnzUzo3BJ4izSKvhE\nxgcUfWcwanqmMfAUd/VS5/XgJP0amCEA5czJCktqyhxQ9hKDv3Q+FwdAh6GRVia+n+0pBaHovTfA\nHGu5sTUfQ6rf9/rkgyUXRdKC+/0d3r17d4pdPQTRvKAhTg5bIiV0RihyyJdyWbBOJ0i6KE+WONGd\nmscZoZOQoH6JnssY6NIY3TAMHTNbfkbN0rd+DNKuWxsYRpBJ6wPDDUXz2duT6AEON2rp3SL36Qnn\nZ4wetsGHcTh92TgOfPgw8NXHD/jJT7+LZgf2toG8WmrhPCa2o/EIKWdfLFQK5tCgUyWnnGbqXz0V\nuHdoueHjZrAhyMvCnpt31MyhXlJq7yAD3Rq8s6p4fbzh48eP2B4B0nY52Y4WIIg2oqeIKau6+rKE\nDXc83g60doBEoxzRDp2hgbEwLVrZinBOW0vwXufRl3KpGDhiKhFCyiLp1CieAxVcAXOqs9KdJgsC\nX1Q1fmdaV1UVWhjhSyh1TIxb+2cL6NkCSEyKfSZszX8/+5VHintjDFbHM9xw7nxPov85VS6VKaZp\nICbjwZtV+tHdLrPJtEDy5zqqGVQsWlUk70/5Xyl0jK11Oa2Ygoho0QlZLjCrV8tC8jlwm0jAMRr6\nOKBakBRYlwIb9eQ5+GBWmjueZPPATMQ1i0C6nFEKlRnDG3qfy28UDe5wz9xsO3XaCDchwMtnA7Di\np6oEwNm6UR0QOYJ2VZA9YUgKQDfgyYJ7EWaY3/P6pItojn7F7X7D7XYjnm4+ZMEC9Kep9gCHAyLX\nkc1tIAnRdlMnCMQCekYwj7P6THPnlxCEwxmznCV22qkaGNi2Da+vr+xbasK2HeidJCYH7ZBHfPi5\nJOgL+3G8GQZST5xaiwCYsbSMd7aUsDcDVDHaQB9CJBpo9zvc8ff/8AX+6Cd/gb5tUMIesZbvILvS\naOiC1qmFzfUG96m/Uxx4xPWbsOinRj0P6NB6x34MdPMYroRTbHQc5qeE6jlm99TYGgn+7n76q1Ps\n5lxUBBoDkqQasqkE647hHUffMHYyQCUnpDzgc6ELwX5CXA9BYO+utFUzppZqKiHivvSGEI3UA6au\nIl2+Pdd0QopLZhRMag0I2Y3G7ypx9J+P7nyfvV0eeY8BS3y65wI5e3+XPAyUMwFhEB0Y1mBGuR6P\n+jh7nXPjPqu7kAeVUkkcS1MPe/EM2P/OGOiXlMtxai1FOINoMXnmND1fPNqsqJVtCy7iMSRrjOsp\nhZI8Pp8d2gvMCu/zKfNKc9B7oOIyvazriknptz4wjkZTxvxcYvHz0B7TWszWm8UU/9qsLoDLqTII\nqPbD6dGflS+hNweOTTG0Y9839NCNm2RkFTQhWCgnZo7RaWhAP+BIET3+La5E7/c7ciHjM+d0aiBP\n65lPSyX/erjh6APqipQVw6KvqkGs1hQcS2bwzB4VDzMj+J+EOkgSZNGzaXza1DAtnQO9Dby+vmE4\noKlg7y3cdZww7oHoG2NgRcXihtFI/nZ3tNxQwkaoMWjS6U4ZVB0kM8CAbnqS7aEEMv/uw47Xx4D3\nj4APrKXCx4F7XsgFhaAdA90AdVazKUXwV0x1j0FOIuk/Bs6s6TKp9/fYWsfbduClCKry2Div+94a\nZA4tlhRoPcPtRquo64xhYP7OxZOMjKdUwoXCVIJxDHh3dKfTBsb+qdml8Y1xUhxz5z1wJWU+V3y1\nlmvhc2CMS6aG0dFHB7CerAU41R3nNDvz6Oeg6QKgPVeQYrOeR0qybofFwnke775epaRAxEnsOqMN\n2KDyQ9IFB5nX7JxSh5jbx2yDCCRH0FoK15cmaAnqfeU9tO+XkcSiwoTH8E6CDxHGCpsuoaxhtwTc\nFblS1J+SIi/10uWaR7BcLOQa7zSIaVkqhhMn93VtKmldAKlrdFI5yWlK7N3hBFb3qOjT0xAPEm2V\n2RLBgFpGSgy1A66Yb4WckTCz4BrNwhAhfK6OgYe9QcWxbRu2xxE2UodYKHaAS4URZp0Zqucu5+fz\nTa9Pa/v87B0GBmaeDKUNQclxoDu1irSiEePfbZxSieMEHDuk8YGgkwQhmw+RrwrtjokLqAfp1wZ9\nxxZecmDe6CGAFsW+d0B2eGqB+GIDvLeA1E43lEn8f1KzJRa0++1G/Yo4JIemL1wQzUju0Ui9RMBh\nDY5cb3h7dPz2d6+4LR1fvX6Fo77glhfkVSH+gJUlKpGClDJ6o3Zvag/nDdd7D3xdBsAsJ5jj9vIO\n+9Gx7wfksxWlcJrfzDj5HlxUcilYqp7pm92N8OtynJPQUpazCt8jJ6f3i9B18iPjgdOAWqjiSR8K\nTtjTRUqfPcrThhkOFJowopKJIaDFAMrdMfpxLuao5ZSSzdiT+T4Gf6kYWklsug43QMSQEt8T+5CA\nPC16IhfrwayjA1+zfs4en9lAcsJ1QnoOk4GRcOaGwQTejfCPuAe5sORTmjRbEGfPV+i4os2VAywI\nkGuBRtUoiAwmY/9/WUuoTQTW5awePQlyJQF+ngYVA2pTsWDoo4fmNIaFRpngZOj6YAT0XETVFL0x\nnsWjSMklwToVGm/bAXFS0SQRbFJDekTpF9sd06RSdRoxQJ/+EYT7wZwvCQYxRojlQbtuH1Q1TJBN\nTsFRFTCVNypdLt5y9kFTiX7vHOd/w+uTLqLrWuMhHOhtR88JS43jWRwvAfa1m3HnGo6I02UVeOwH\nZUpZ6cXVQneGAtJ5pDntjipsZjvg8tTLkgtSIqKoazodUL0HzWcQumvwM9OGWDpWb2aGtl8yqQT2\nw/Zthw/DmguSOZo3HkuTYgjDz3JSNCRkW84+b64FzQT/+Isv8Cd/LLD2xpt+fY93NR50F+TlFhNG\nwi7e3t5OIftxHGhHwFjO1Eu+SqmQlNGGhSVwAQsziWgLnPpWiEFUCQBG2CkjjKgdl+bvPL66Yz8a\n3t4e/0xbOiVjpVT6uWWc0RUSOtUxwp0lDs0VGlN3ANcUnKVUOFkEcOqFMSZDNao9Z+yGqJwP62kQ\nCPVAFobfjTGr4yuzXYzRHMMv2pEKFwwknLZAxlN0qGbUytwrlUTZXuQtMXqEoYuWDNZmoKHEEXfA\nRqfg2w3DCyoEWsFojahIpw1RS77UD87TFfWSeg58zKZ8h9E3dSmRGmDnaa27IWuBVv5JKcFbQwZ7\n6xCC0feI5ZgD0RQ2yTnwMrEznnpWizPKI+eMGgOeiZbc2wyOA1QrSroAzBq9/WbjRAOKUmuaa0Fq\nD1LIzgWQhdNuW1SVEgm7Dhe6z0aLDVhzRD/HkCooZnNAmczIKFYEF/dbvIgC4APqEovSc5WhAIRu\nA6SIFSYIwEPXBcQ/R0J9kjN5Ism8yR5V4GRY0jXh1jldTcTGIV1VaM7cjXFPOA5mwBgS9nYAjYDo\n0SPfZ2obYwrLoVY4Q2KC2o+GNBzjltDM0TYmN77cb0TcjQOWFA0ClDtrYBuoueCzz76L3331AT/6\nwzsE43y429FRyyTeBIM1UkQfj8fVRG+sFEd3iM7jMvWpy7Jg27aI7ghLLY5zKjpGB7Ke7YruAust\nNraQwjhCjTnQm6P3B0xI0nl8fMN27Ce1KaWIpGVRHpuInDi5cwqtyn4zdpRcketyVjoU72sAIZ6r\nbHrcJ+1pxkbMuI9rmJOQtGA+FHzQ6U4T49Gxu8E6vdl0rEwwsRAYnDPgQrJ8cG09JulsQtr5s1NK\nl4vJroGiSOUxWaMH50CzgKM42wu9dRwRxFjBr6dDKxY2u1w2KQvgYc8UuslkEvW7kdOQEmolPGQa\nVPpmERhI2d0S1eDcZNqMl2GfAWMw3mb2Lqteg7JpsD37wk99aPyTfzd7uMvthn4cfOZyPf+eCyal\ni3ZcJwpurKFecAY/+nCM+L5jjDPNoNRpGaWaw93Pk9T8OSMROjMX0GmYIWsg5GdP5Lhven1asr0r\nvCdoLVhrJRFdCpZ6D/2d4KYFmjtSeoTMg2+o946uQPYCEcUKQLthgaIuC1qjh3xvW/wsgXVDLopV\nF3Q/4ImTXpbsCbcS/b2Y8m8dSDPgLvpnSxLgtqC3jg9yAL2jaMbNDemxoyY5+23bOHAYY2dLit2v\nEKkGc/gG7G9vsFrQS8WQjuwNLxXAsuNHf/JD/J//7m/x3/7VX6GOCvUET4pDFdkVJbHqFhvwdsC7\nY/Q9eogJagm9OaqUqLQbugxkeYchL/jNFx/RHju++75St2kLHq1htIG1G1IX5JLhw7D7gbYTkptL\nQusP7AMQrQAG9vE44cmtcREaYwTvgD7tpApZCnxZ0LPCYwFlD7wjeUyzYajxUIkDCYqsJZJQLdxP\nAqU9Be7EpKVcodOkoNeCkEuAuK1DhJ/x6ANH54ZXQauqGOC7o28Nvj141M8T5cajtfk0XgiQKDNK\nHlIwN3TJaMEEdR/oqhxeSAyAlIF7A04YcEpoSJxc64wO2blZDW6AdrAvmmjIx76z545wKC3LCwhI\nZk/WndZT+uBnHHTYlV2x9Y6Pbx3jw0fsx0GO6+0zKBa45SBUAdICvNI7kjnVLzpwHBvGOHBkIgET\nHKmsEOEGKCkj54qJtBThzskkUjLPRmKigCZBWTkgDD9nVP2g9EqVJ6PQdpowFielhF6pD07uwKDO\n08bA2AeOVzuHWtNe3aShWYfYAQfgLZx9ZjBpaOdkn4MqGySefasBJGkuOFWD83llnrs7aqXspli4\nHvJ1NCQKjOxCM+OHEJPOKWE5+6w+0D2F3o49UUYH8CZmHMl1nOdC0LDtD4yQibhRwlTusUBuG46P\ngJVOirgmyHCU6N3N/OzTb+30zNdcmE/TGo7tgHUDQFmI+A6TA1UEOBr+/Kc/xb/53/8ttqPj5bZg\nXe9RNfkZiNbd0dsDx7ZTKB69PmkNzQRJKFMyYXpnd4/r/hkejwf7Z6qnhxpAODXo/x6dekwAsE6d\n7ircZBTUtlKXeukbp/ZyGhUuV0scy2OCX2ulpnTQZ58jwG0eRdlTFYj00DemM/ceAKS1c+gk4IYo\nQlzhs8ZwdEfz/VpMov3i+XZWiTYGelC/WpC6eA9dJCB3KhYUsSjj69WVGXFyrDb97OXSDHENL6f+\nWHIELUpnoqtU9uyddK1xtLMFM8MWn4+WORdoirysUqGRtjm98KNNOY9ApEbvmAL7cRzY9wdap7Np\nHtvFQTqVOcbRqFfuR6hB+PkjZzSRiFjms0KMYD1717MdcmpmAbgbersikvuUGIa0S0S+Hl7n1MSO\nMSK6OhxioS8tKnE56LYzTbA00LxTUI9w9GUe7bs5jmOg9Q2PdCAHpAdi6F3YHss5ZgfAsCvb7fe9\nPnnufMpBaspXSf729jH0e9GzHDj7j4DFgpuRW0ZKpDW1bjiOBn1svFmcO1OLi0+tm7K0DyZiViZ4\n8qjFRUQiB6cdJGir4Oz31ZLxcrvx9zVDbTtkVLy73VAj5rnmElPADZoEKU/rKocFOUfy4sYKOUEB\nQ6DLOpIyCgTd8NO/+DOqAPaB9z/8HEnGqVWEcOHf9gce2yv60VBLwZKVk/DB3TQXoUyo8Fq23rHt\nH7Cs38MXX2wBr20YCRwCmCGroAiJOFvbTyi1eIIrqxQHJToqrNx9CaG5KkruMZh54rqGjEYRx9JB\nSRSEbqgEnFWngKeG0Y0DF+vUraaEPgzWSHhvWzvdaACgmH1APzdRAEHhooBfnqDLoh0+HEcP6+O2\no7eN/VTlJm9PCZ8uDaPFsdnLtZzFYjGcw4yI/jqPtaoC93wutmxxVHQcUfVwLsDO0pT3ZFguaG2n\nJM6YaMrvOeHPFVrJ7ZzOq947jp1xKW2ng2+tBSoXP0LAY/F0cSVci2+TnZlHraH1nT+/74CwHVbD\nkqq9Y2sHllJRywp4onB/WABZpkWa19Hd0RvlTz0yl1w4yJmblIigtyubSSEhgGCb41n5ISLIiN6l\nA5YMyEAy5pa13XEc+9kaoOLG8dj6+TNqUbIuSkKtBWbA7ZawLKSNsV20n/fRN70+7XE+RLylXhXm\nPvt4zbDvkUMfcp0BP8O46O2dkcGGY98R4zbmiLuf1WprDbloJAtShJsWxbmAHu30Zs8dF0Zv79kP\nMYc67Y0aAW01Jdxe7nh3f0FN9BuXpPjKGaM8kzVHuCzGGDCtEAgRdIM3Er/AoA5GFgxH2x9YSsVn\nn32GX/7mFX/z0z8Atg+ANxwRLd3aA2+vv8Pb45U6N1CGNPoEczgWOt+RxLGNg8aAAZSl4jjoaDm2\nHVYZbCZjwNqOR+voOyf3h00ZU4aJ4Wgb3Dt8IBJWV1QtkFVOx4sH7o1bB2LCnDCzOzEGrF0LLCsg\ncEOxcVaDDRT0t1wgGg/j4I09e4izsiyFg5Rux9fkUKdZKucz6JCT63gwRyeboXEImBKQEwdx4mCQ\noKToj46gm1jcbp3vUEGQMiapiGFtz26XeQ+0voeUjT07ah8bYdghvyqlcJrUcGoeTQyKzI0n5eDj\n5nOQNIJ+5e5ox8DjQa2wtRr3R1RefSBZx1oqLBJqYQPb2wPYNm4eI47tbWNCQ6KDLaWwo6aMz14W\nrOsNy8I4nY+vD7TtgDWDLwtyefoM3NGisrXp0MvAGIL22C9VxaC6hCFxMYhLEeWiC8xbxHfQqSVT\n8gbHUhSeE9ka7bNO5QAAIABJREFUyfHx9YFuHdu2YUCwPQ7s28ARFu8H+LPWG09ESQQttxh8EoA0\nvOPMG/+G1yeOTBbkQjH0vICEH7PJzuk7WY6qirLWs9yeO5WYUIx7DGhWWDNsx1vIXAYnlmf08nSq\nFNgANPmJSGMXm5ELyfE1ry4AsFvQmTAIQVbBvRasdcHLeoMAWEtFgmKPKtNTQofj8aBV1IcgSUPR\nyvYDDEUqkMhPnKQiiMDQMNqGP/vJT/H3//HfY4zK/CYbaEfDXgRvnQmXx7ZjWQtsmS4uR4+YhvnK\nVVF6QQeHKOaCL7/8knIop+VONSNLQgMw2o5927HtDW3wyJedk1/3AUc/taG1xsaW+L+tNWw+Pd5c\nROo81jlOCtDm28kfdXeM1jCEeeYTZzY3z5R21JqRMmE1PEYa1C6OKzp7Za0f5+fGfhwrxZNPGkfx\nac5wzKN2gUuLCTydblrYe770lnFUB6N4uUiMGOjQZDApTmYWMqd2yvYOOWBeMFqHrnGcD8Yngd6X\nSwnjSdjvF+cTnmAZESEczqJE6REBLMxohyi87Wh+4PHYWNW7Y983HPsOQYrcLbbC2r6RKSoCjMY9\nw2gmcDMY6OkvuUKyQorGgkNgzqYHHo8eEecd99v6VMWxD+094DFGsddoB97eCCrhexO8vLwg3RyS\nC7pPVGUM6wCMKLQK54kQ4ZBpxor03pCXHKT+ea9Qmzor2ZQyUvj4eZ/wXugtZiClRqtLsPdvMQrv\nvNHdcQTqC2nmzCS0o/OigTfVkgki4PHo698nF/aeZoN5TkLLWpHDPuadi1XLDb0vSOqw7ufNxdaB\nnemTU/xLuyihBxyEMLb1tqx4WW9YakVyYCkUONNEUDhx3Tfs2469HSg5ILtxtK45Y8mcyKM7enJY\nb1CtyAp89dvf4Cc/+Qn+zf/6P+NXX3zAe9ng7YHeBLhlPPrj7N1RHXBZBG2ks19VFFC9IacCMUY+\nvO0Hvvzyy6ia2HucDfRpmWSYgxCb9ujYOwBwYJKyYVkq3U0HKeQ5Z6x5YdUS/cr5OXFhYgyu9YGj\nNzweO243VrIwRjrMY+U8hcyFOJWE2+2G+30FnXgJj41ylnVdUZeMrE/ZSDG552dHIwP77+FKA0tf\n8aAWJQUqs7es80QyZVKzrz0AVtCDkh8PIXrOGUnIUh7hEJvQlNNWmUjy8vj+QxUFAi1P6QPA2ffr\nvTOUMSVoqtSEHkf0nAcOM5gr0IEjH7iZn++NA5UbMAwHmMLaj4a3QZAxYy9oy12znvEfdCixl2/W\n2foaVF8wkz3BF4eC19q6w9QBpZHBB/vmCML8vh8n6YpzBTk3o97ZMhtjYN+O82tLAFCsG5CeKnlJ\nqLoAUlBzAGMGjRgi3AzqjfrSMQYkK8xJets30v0XKAutyKmqiXE9EnjL+bybMaCvVmrLyrf5OD+6\nw5S94db44aaUsa5rHLsyNBmS5DNkjn1NJT4sJSw1w9ZbLCYJWzAmp62t5oJcYkGJG9w7m+bjCcR8\n5p37M3zXMSN3JTOoawKkxQSLlbNxzmN+jqCuzF3vaefLif1YuGMYF4hlfYdbApI5uu6Q0U/rWRXB\nsb3ij/74j9GG4Be//BL3zyN9Eop+cJESn9pOPthded3oHpqe5xtKWdCbQ9OC733+Q3z/+3+I1v5v\n3JYVORdq9JTpkWNY9IfDBw6mr7YxwjIag5tMe+UjHFrLuqIuzJmXrNAaMAtBHDUjh3w0VkMxOKFb\nTeJYa+itxYCnYQ+BdLmRirQsBRpOn2aOgY5VExmyygEehC4tbsrBh1UiBXPOoXrjtB5h15z9QhtE\nv5l3aAjeIUF/skmaN4zRMYIRWkpBjuHcGPy5J+Q4HEgGOSNfJBbv0RXwA9BM+tcIJoIDpqykBA7N\nRCE2j+HMHMy07Vys9/04kY3lSY/ZS9hkXTAO9n2ntK2sC6qR3SlCWeBIiQaUMWhlBdtfvbFvzLA/\nRc5MVKUHn9Egj8cbv28hem60AJxM4wQSQdKpcHGOYZ6KoKgix+9cNIf+FuezLCKwTIWHpoJaycU9\nTwG6IivlcJCBvAA1jDSM8U5gbOdltZ1ZL2PweSwRRz0lYKUUxriXfy7Xen590kV0fxxAXNh9b/j4\n8YEkQQhxPaMKGOtazlApx4D1g2SdOdUzOfubKqT/LJWTudkfU+NFmn1UDbkLm87t3DWhtKCKhy7t\nqRekWTA8EezcEbq+BNGKMQxHGxzebBup/CnhfqsYXs7j9fydl9sNK8fT/GdyCDJqzvCckLzj5f0L\nJCm++O0r/tUPP8dSKquwxwGUAesNox8wUXroJaFkOrRK4YIzj8vuAnOglhdIuuHXv/4lfviu4Dvv\n3yPLju2xEZk6f0dnG2XJjI9QMWShZTAvCXWtIa3xE4I7fd6aC3IpgZxzSBybz77g6GD6ZfQC4zhl\n1mHyVE061QFq/RpOxcRVS6gecuJwRaKCMgr2Synn18/NjvcPhdQ516/JV2QEF4GF1clZuKazEhrW\ngTYMre1RZd1D5QHALHidcbQHQj8agGgL+ZEI+uEYCrh3HN3OaTcJUoTFJMVJLit6gZq7h3JiNLzt\nB/Z9x2NZUOuCl5cXVu+JLFkHe86tNQwHbKoqkvKPPPn+EYxWd5jNrCKgN4uNjW2UlBJ0KRjdsWVC\njfcYZAGA9QuqzTiUBo/TkqrhODpcwxmUSEwTESylnp9V7x0W/cizqhdavFUVlgqD6ZytFRNKuCwl\nIFkkoiJYo1ycz2iXMbDtbxARHAfXjlxnyGDHsT2QEk858kQ4+5denzgyeT+BwSVl5NBnutPBMfsk\nUyyL6P8cjX9PgayeDojeyCm83W/ng3MNmNiXqpkXM0F43HnyHwOIRMrlmi4C5yKRiuKYkoeksNHx\n1ncsTrkJnA/9277hcewhx2A1eAto7SkaTryJ1R02OhIcOSnyctn79v0N+PgV/vqv/xq/+eIf8e6z\nv4Q2wfHYABlIbjCf/nUJYXT08pT2PhuURL193MgwTYq63PGf/tPf4e3tDX/6N/8Ky7KgfXjF8eC0\n3npHxoCL4N27Ox6jhSMKUFSoOFIBsGiwW2lvXW93eIp43KUgNcUIa26N9zTsAg+XnFCXmFpnRUEO\nWYxjF4HWghLU8VwVt5c1wuccBQUvLwrGy2S0fpCqviwY1rAsBUdvKIU9whQnCIuI7PN1ovomW13h\nwurRAXiQ0+mjdQA8kqoazCLDp3WIG6xHJvyUe/kFHKbu+2nBdodZsDtDibKFFlK1Y39sEBHclgK0\ngZlzBISMzEdUiY2U/gkuceDhV6ssCdm11jnM01KRHVhUkSsZFKIpaGO0EB/HwUFVaExhzupcEl1C\nh1F/ubIomAUIcEn6ejy37Lmzx709djwee1SqDJab/INpfGAVLWjR9+TAkIqA49jjPuIJB8mxt42V\naq7QxSAasT2DqMhpG08JERetEDc0DOSaiWJUOfWsGs6/x+PBz2R7nGCib3p9WonTAJJk1LKiZCYm\nTqDypMFYG5BlJh2SKOMBn51NfURjPilQb+vleRXGE7TtOD+Ms/8khjH48HR/Ov6HfKr3A2/7xrgG\nFB6p3IGsYT2k3bD1DmCnXU0Ee9jjZq9y5szkrKdcKkWWzojj7fAO804JSV6waAKy4kDHd97d8KMf\n/wH+p3/3b/GLX/8GP/nhDdu2oaysqJISOptzwW19HzrLgAknCqvf3t5w2IDeVpT793Fb3+PXv/4Z\nem9obcfHD6/Yf/dbJHM83naULOjW8e7dO0aPdAGkQTugQs1jKYqHN5TKuI/1dj8BJCclPkTlx9T3\nZebWay1IrSELsNQaoGK+j3Z0SpSC+r+0emodl2UJ2lDGLd2BByU4kliBHoPuNIm8ojloSIU9PD6s\nHT2mw6rLeT+484FtzLyGmYd0Ss6JPkCuKVMl9eQjPL9kOnzsqqbFUxQL9Lp7LE5uEimj8ffGn8fg\nPwNGw8M6YAM17qN5vJ2V5roU1Cpo3WAx6MuZmtV5DC6lABFd7LLDwh6qhRI8AyhSHx2wmQ9/kaTG\nGDjaQBJFqlQElKeB4NSDzkUICG1nn2moc64g6I3IPw3E4TwpnOoVECLSe0ebSbAAEMOl3hmxDQDD\nyQxwOEwYM+myEF9YgDLbfENOmdVxbKe1d99pjbbB97AsEgMm7nePxwMaIJLf9/rEOtE4Drt/7c8Y\ng0OZmAprYUa7uQS1ifKT6eWefSoAqEtGjWz5KfwmQJk33nFQhFtQeFTXxF6UEy5cVzpstmbYjj0q\nAMJBUllIVDce+1RJunnsB2b/e98fsOB7ilyDnmvRn+/dcIyNR8cgaCNRh+nCRrH4wGf3FX/ww+/j\n9e0Nh2e8NTDnRw3WAZshZZV9TzGH4EpTnH56KRnWGpak+IMf/QnW9e9gZvj5z36GX/7ye3hBQz8O\nbI8DWCtqDgSeRkJoj2NuTKBdOFOuteD28nJyYPd9Z191PuzxmXY3FBHUSmSbloQqM3JlJjFOpYBB\nlRHLpbAykLCqLkvE5CrwkhRHS2j7HsL8jjEyEi6BNBexAJGYn+oPbnBPsJAxTtakhdfc7HL6pESM\nn9kV0JbzEgsmJ9glK4Yl9g8HEWo22I/Nmb937wd6VLcJGRCDy4AOvldWXRzmWTvID4g+5xSht8bq\nfMkr9LZiLQtUO4ZxYk/jAys7AKgr4TClVWipwOOB3gdSJqxkEr/awXF3SoSbzGibMWKxMQ94B9F3\ns/eTUjnf3zRubNuDbYExp90KMy60pWast3JKHDVienrn6fPoB0lZQbAyDPRxwKHncT7nAkiHp0HF\nSPQ3XRj9knPGbX0hyKjtEBuwcVAtEdfvcYwArPN+2R9sEQJ2Vp9uHaN/m22fSgT/7B++vr5i23fM\nfJnpkCChJXbEwUlqEsIrAO56+xHDmmVBrpFG2ZiwuPgKPdolb7AEGQKvgTkLvmM39kMGgpg/QG9y\nDGqWZcG6rugBlEBhZvxj+4gPH19Dt8rFeK0VU6E4F/NZ7RIjSZqPZNK4ixUcvaMdA0fqqFohMLx9\n+C1++N3v4sd//Ef4D3/3D/j8s5/g3bKipgHv9VwsUuYEt42GnHisOoLAP8ZAKhwabUfHVx9e8fFt\nQ1bBj370B3QupRHZ8sFzLQur3FqQExcfE4eMeMCd0+C6rmfvkYJwi4n6wB6So6QXGJmbyeQcZAy7\nJrg100JqPkIQTwoXm42hBzxlZ46SAU2VOkbrUX01aJYAtDj//khIwml0j4dGJDiSM5PJnpwyAElf\nU60QVWjvO+U4IfLX6XxyQ9JbbJgZx97OCA9N7IXnEpNgTchYqG31HIO2DpeGAuB2u58bh48D8I5l\nqVhqQe8db28f0doeErDEKrsssdlfPIcUz8uwqTLgCaDAUWxg+AOeSJ6Pgxz6ODCaYVnK+b4n7FhL\nRgklwxywzU1GMyfZs69pZsi5YHvMkLqZCgqUQrI/N01+hhBWq5JmYN2AFsW75Y5J0ZqJEn0MaGtc\n5KRRRTEZraNzsfVyCfa1RB86+KAQjA483vZI+wX6PvB47AAY1lhrxvvP3lM/et163/j6tIOlfYeJ\nYWsFBsfHt1fs+x5T+OX6ut5gG/FW2Qx1VGLbjEf/o3FHYeWUMBKip8O+aQbTJXPiAjyrXchFJLdZ\nAcf3mR/CFPSXlJGFizcp6xlLpctn4/QEAOUut2XB7XaL48Oll6RkglgzVUWWjJIFis5ArNcNbRi2\n1jCSoNQVv/r5z/Hll9xo/v3/+5/xRz/4DH/+R+/w/gZ4mtHPFMiPQazXektYFh659n1HXiqO3qFl\nwfvvfIb/+qtf4//7j/8Zre243RbUXGC9YYkgut4P6kKXCl0q8ZVFYJvDW8doHpPy9bR2mkdV/nhg\newudbotAPUw95T+JPVaAdHY6XVznyWJgDEFKlGOpTK3fdlo7RQQmV3IqP9NIinQNkpDH8bEFQb9G\n3k9D8qlcWIFgaA4bcB/IMUQcPrF0wGgdj8cbXl9f8fi4IWuJ4MOG223hAKiWGJb1aEuRlD/7juyo\nakhqFBKnMEuCRQjCqWsoPjoX4YSMEqGKGYie4dXrPzdoXNHVc8PunSL2XEi/Fy2oa8WQ4OyOPSrh\nUEa0+Xtf7TJv17E+ZZKzjEj0s80C0Cp6qQYa3OaGFDKl06qZkJNBvCH5jA1p3KQHjQcpAbVmrPc7\nljJJb+SB2gTi9I6k41zIRztw6AMAILKjGeHPZjwpJJCt6gIYDhhzXkiFkowslIE176Gc6PCRabP+\n/cP5T5yxdDwwwOgJEXpxZ2ZOXhQeeefHMcj1BKC1oZQdy7Kgop9yoikS3tuBvXPqfrvdsFTKONq2\nI0FQkoaolxi6Ho39uYO21iJ9lDck3EF1jmF729H2HvEIO9QA73wga61RQU9i1JwCAK1NWxuBBvoU\nlSsYsDPGgRPJ7h3aG96XFT/+4+/jL//1X+B//F/+N/zqv/4a62ffwz52lOMBP5R5TMOoC+2kz6w3\nVoeSSEWyY+d17hs+//xzePouvvjtb9DHgX/8h3/Av/7zv8Gt3CJIrcATgc+aCyRllELsWksdY0tI\nyZHEkaP6SClh35kC8NVXX6Ltx5n+iWd1QCfzcpKWegpCj6ezCjyjna1DpGCGsfFBnswEEr+WNSMn\nICfgkHG2bGZErztwHHNhYHb6XHQuclRUtnJ5/kUnlo9WR5hj3x/Y3h74+OEVHz58RMkVy8rQw5wD\nX4hytWwSf77HfXXsPX7GYFSNP/08UWghfcwjSUASOZYCQRtsMzg4wed/RzF9UrJj54BU8rR/HmdV\nnbLAkzM9oq6oNaN7xngc6N6pUY7hqxkZuwg2wzhPBWHHNDstuOqTLNZwHICP/WyJzM+C8j6c7TbJ\nCZJo27Xgj1KtwRnD1Mnyj0Vfm9LBc04yKJxPY1prlaabPtCxYZwC+8aYoZSwlgpATs6uaEGOTbJo\nxZrL2YZJSVDDeOKnle6bX5+WJ3q/4XanQNZgMAVSa9CFQWJMz/SwgsZEexhkEyzN8Z2FWdpnYztl\nZhWFVq3WirIs6MdBgEMIeCfvsNmB/diBoAnNC59GgrVLKC0OjGb4avvdmV0DAFUknEgGLQJxypsm\nfMGHYdsotk+a0MaAtwYX4H5/DySH2YExdkp5hmMQrY5uHfjyK/zg2PDht7/F559/jn/4+a/wj7/6\nEi8/VvTHb+HHGpsAFz23hGWpHMqUjAQOmLoNJE3YWuMQwRn5/O52x49//CMeaaf7ywS32wvMDmZE\njQFX5tuLJwxL8ZB35JygCej9wOPjKx4fP2B/vHExLAUqFHpjEHf4bIEcY2B72EWaM24061rjOBtH\ncQvsWaa9cVaSjMO9YQwCaAjdCOvgk822HR2PxxbidR4pcwjvl5ohsEgstUgGAFQXpCTIOrPKqaA4\nF4g24NIhskDzwvv4dofmhKMdZ+y3G/WlbTiO/oCd+DpgMjiROG2WnIFBUr575MUHTNnHEbZYi55h\ng2hCXRZopuSt2UDrA2lS8n1uFtEGe3w8B25c5Eicb9sbrPPEBBBROO95c+pSZr8aoJwo5QvByPar\nYxj5usfxpHYZna2VGNwmRWSQsViRMCAMN3QDD+U2IOAkfl1Xwk+mVde5wI9TwF9RtKKWfEJUxtGI\nMzRaYEXYk2ZNM+cHBdUNGi1A1QJZb19r59S1hKnHnyKt/+XXJ11Eb/cF3/nOd3B74RStrGRc0mfb\necxQAXpMU+MoY2ZAUmRNqHUFgMhJyjh6w94byrpA8iVXeDweKEjQIhTxDocGhFUzdWrt+DqxRSFQ\nJKLrhuHx+hGvr2/oraPUgkNIlhIRBsadCoKoZDt3zn2nrKM16guXoCTNCODZR2xHg/ncPABZFK9f\nfoV//Plv8OWXX+LLDx/xf/3t/4Mf3P4U37tTdkOuiSB5xlDyLrNWqFbUzMrt3XiH5oYSFKW//9l/\ngYjgfuciWkpCdoGiACmj9R2lLGxDHDtUGCvrodmbR9wJ8uB73E5lRZn2ynD2MHAwhy+dQ5rWGpoZ\n0qCpoTXCIu73G3ulwzmciJv6nw4J89kmuDzXYwKZo+d6W99BZTsrIwJlFLUsWEPjesqRzDD6AajC\nMqsteWJJzsnzWirGbfDkEX3y+/2F7RsY8MB1D+k1uOp9YG8tjqsSBgAOR7sb1KmjRU9sV1WFj8GF\nYy5K5mePW1VR1zskZzgQsh8/q2yGvEUlV9LToK/Dwd79bMFMi3UKw8WEx4wxTvZszgxhtM5rttYF\nfdDdxJtQgKfFJkUVzmvhZ990RhqPNrF4oUkFgxzZimBF+Pr6gWCdWtGPcZ5C5mehSKhaTqhPH4NK\nF6NVeM4nSslI0e6Y8c4iEdroHk63hN5DT66KZSmh221UUPye1yddRMtSsNyWyEYHAMNaMslCOr3T\ngOmsYgY022n/e7++Ox8uWENvO2CGmoIU3g177/jy4wOvHx+oWtFSwVIzdK3QBmQdkBSsx3cVZgjK\nOKUeS73BTfE4On7zuw0fHwG3aIZbNtxfVmB0tGM/e2GlLIyC8ILtMGj+DFoyjrcDKRteaoK0V9yW\nH6IB6L7BsQPlwFJWOOm/yKWjlIb/4b//7/DFB8H/8bf/AZ/94ffw7gefI22G/KJ4Wd5jdMF47Mh9\nYF0Fqg1yS0j3G6oKXsTR4VjefY6UKn75X36B7Ze/g5Q3jNcPqH/4I2RsARTr8CDi9PGAbg5pC9Az\nmNHE3TprxXo4RurwszGvqHlF1YyCRFCJOQ4bkAA5iyrWWpDFYFKAweNg7wdaF0De05qHAeSC49hY\n8ThbJyUJCq1fKPUO9wnSDdxaTGcNCZ4TlvoOQwW+81bPOWG933G73bHGpjnsgCSyZiGCDsdICSNl\npFx5LH8pSL6gSMa72x0lqv1SCvJ6g5QKMy4qkgyZTlPcVsprHgD6cBxtwCShpgVDBeqCjERWbKgZ\nmuywXiAYKLmg5BV+kLbFZNY76nrD7V1EGB8d3R4Y3lCXFTXcXTkzwbOE6YHyr+hh9o7cK095B9M5\n8xKWzJnO4JW0+/sLNGd4X65NLWdom2oaR0LCUlbUGgqYTudV74w0z8ohpNaCvu/QxAjj52N/AiD7\ngWPfkbxjNJLqj7cHWzTDsNYrNsWywDNlUSkJxDra9kALMPN6f2E+kzPnSwRwb2QpxOI6o3OyJKTE\nTVpLgq6VIJy9IySw3/j6pIuojxmGpbjFYnpSr5eF0oOAMMxqotaK+8uKtS7M0bYBa419y6c+Z7D9\nOXg6Dnx8/YhRBiNcLZ3+aIDNfmBWG2DmjhxQZUPerGPb37Afb2gHsWA5ZyCOzP7UiJ+LOndMRc4a\nlGzKufjGQz0Qk1OR8Ol6Ri4rkBWSieFTVVjr+O53P8MPPv8c28Z+8HfX76PmAs0LjsOwI0F7x7rq\nCSMGwFC53tCcR/LPv/8DlKXibd/AiC4Kp1dJ2LY3ZGWqwLa9IqdElwoYCW1ikNjpk6x42xqGOF6f\n4pOLZpoGJMFLgbeBNEaYAgy9J+T7C263O9phsH6gNcBtpZ13dCovUoYqq90ZtsjUVYdkchSmfRIA\nsmR0HHG0ZPSzqSLXBff1jmVZowLxkEot8L7R7eWOJAqTGVR3vXJKxOcJj/5FOGTKSdAm/LpkpCyw\nJkDIkaRQanS73cH44EKnzUF1hqqiLAvlUebnIGZYzJrdQg7GoeZEwa3pBlHFcrsh5+glq4duk1bb\nWq/naCZnniDpiProvWOkjlQSirO6LIWJnwPMX2+jQ2vGslK6lBSnPdr6wQBAR/S/hZQvGHKmldSR\nkMrkUCSUsBjTOecoeunBZ9+baEWCmEvNEBe0Yw9LeEJRqh1KKdwcEcyIfBHELCrkZ3nhGLPN9kS3\nPzm546yAn3Wr/LqnPvc3vD4txUkVR2QQlZxQw4NssQgc+5VFPSd0y7JgDQmGDcN+UHbiTisfe0np\nnFJ+rdfpQGuUosAcyY9zcW7Nkd2hpdBSmCl6zpk7WFHHUhOYKCnQIlgKs8AhoM9erwvPPm1CqjxW\n0cIYMc0pnFBj4GgHxmjIkpCXirLcIUVhMrAUWl9/8Ytf4Bc//zmyJPz85z/Hz/7++/jhX/4Ya85I\nWuHeMHJGTh4aSj0/eD5MhU6l+zu00fH68Q2iCX/6Z3+Cv/jrv4L5A90ZE/Lx8RaVTEZrO9juj95g\nomvMh6GNBw4XHD7w1duGxyM0tRVAoeC7ZOLQtG1ozgVKQxb18vKCdhjafiAdkZsOMifNWwyYeBKY\nQA8Rg2oc41NQx0FEn6aG5DOOY1Cp8XAsGqkJT1bC7h3HvmPsNBvMo2ZKDhWhZGhZ0c0B55CB+UEV\naTisMEO9G/OQpg2xDznbTkUVSUr49QuKJHISaqTL5mApdJyBdnC+L8h0ooVMie+YRoOi0LzwXkmC\nvTeoJNSUkW0gZ7IS0lOrYvrop3a47cfpaZ+DG4Cuu1wrTSUA1QJlwRJtoOQAhmGPhS9jQE/ZWibT\nE2yDuQIGRQ3NpqQETQWSFMt650KVJdpfb3RJpYSlVKylord2WjS7zHiXDC0LIATZuJFxQNZp5eaR\nKyS9nW2f6bhKYKTLKTsM6ZyawjoH04hNcWDARzpNO0m/xY6l2+1GyMS+ox33kDbVszpjg5kiX1Ue\nJ2vYyPZ9R+uPU5OYUuJxNPpllOAsZ5Nbo75ojcFwpRTmscTxpveOboY1MZ9lMV44+m4T3ssdUMFt\n2zBCVnErBTXIOT4KRl1gd37g/z9zb/Zj23me+f2+ca219646E3lIaqJGS5Yste1GpxN3G07bnXQb\n3XYHQZAO0De5yH+Um1wkF50AToAgie32RTo3DgwPGkxZlETJlCiSEiVOZz5Ve6/1zbl4v7WqBFhy\nbhr0BgiJwzl1atfa3/cOz/N7at9OrwFySzgJyq5Hx4pAWC6HmCTbyDnfAQp9IWM0MQcePXjIr/7K\nr/KnL32Dlgu7aY/SvouxhZM6OMmb0Wt4Wf+eSymcnZ2Jm8c4Hj+54BQjyg/4wW4LDrl0Osw6ycBd\nKSUMSQy013SEAAAgAElEQVS1CRvUKkXVcgEc+5JjifGqyq6SRz94SZT0JWKSllAyDdN4wA0T1o84\nq0kuYIMhWEftkpwcY5cCiatFoibyFpENjRIi3tqu8xWYTe6ZWIBcVLpQfGR0nqFrGHNKxI5ea4jE\nZlAWLRs30aTaKnnjFbJO2HIVeS3OFwmgq7VJGBoIek60dX1sIVVUjLIUbatzyPQKTWt0LUQiOQfa\nqkk1oI2FNSJYK0qHNmsrXAVl5dmJRehdWuueerA6luz2TMusVwnop3W4y9JTFZJoZ/0w9MRZWfqs\nYxvVKSCy9NOsUSCq9UC/nNg2g2SUClcHFwiWr6fsar12hgbTl77NgraCWsypb8X9gPGKnCIpyM9y\nGEQBojpIvdLlXX0Grp1ozt3gu7HA9Rl9EWoWAl6e/CCi/iYSLGUM2oEuCvLVbF31PYNqV1yBn/f6\nQA/RwfV4iM3Z0yN7kzg9ZMZ43ZNraage3RFY+iZwGKTSyFk+aFpfAQtSSrS8HrJI+6QUziiUkQG+\nNqaL7SvGrnZBIzcvsokcBhnQL9OVv1+1grWKVpAMbm0wvdWoSsYL2hpCmAlRUgdXeZMdBqlCOnty\nHCe8HUlZqrGGbCK1UXzxi1/gaT3w6U98ksvH78syQXlaC5ubJTsDNYvlz7JVIau9sJTKbtzzk3tP\n+cY3X+FiXnjvvbe5PD7mcGtEa0Ocw/bQiA1uYDDSJoYQUK1inUdjSUskpKU7wBrj6K8I6tawZlfl\nrNHK9n+m8eMo1XPHkg3uSg4Wa+tkIjmYcjhhre+tuKXWRCwZ25/pnE6bJnLT+Pa/b7mJLKsbDoZc\nJF4kJ+K8cLy8JHSvtjEGU9doFNO3/JFcGipGSpbLu5QsKg9VRfeZuu1YN7ZUXXNlDsm1Ek8ncquM\nwx7XRwpySHU4R4zEebm6/JsVeIs3XYMpgJoiStArKV7JlMRWoVlru3zJbySict3RlzNVKYGPxwSp\nEMLcW32Fn3Y9dE++EeMctXv5Rfjfu8H+/6lXv/faKawvYUYopt4Vib1T3md0T+Q1AxnRwtZtXCMV\ns9wdgoVspVCV2ha4Mp4wqGi3UaDRllwrqUim19jZGfO8sJxmYoyMjNLF6CpJCr2lx7BpbuOqq60N\np6WD/FvUTcAHrROd515x6u0HmJvQYFa8Vu4osfV2277hePVDK6VI5ks/kK4E0gmqyHx8t3EJHk/a\neWMMzo+Mo+8upQVtV/9v9z3XJvMc56Wtd0ItSimRg4iNUy3kmlFK2OaSqyOzVG0VpRiMBbOh6QRk\nOyeRvRijmKYJquF4OpG79jCEwG5/ECcXio9//EV+8Np3+da3X+Xu+cRzk2hPjdO4YaLVgraK2JNQ\nc854OzCNE6TGfn/GXXML5RzVKJ57/lnOzg5ok3HG0XKmf+6k1TNO4LRKBPgrTGM99NYq1hoYRst+\nHOWGR8AN1jpOywljPdNuL0sK61k96FA2MlFtjVgSyyIVBIjtMppOb+oVTy2NYmV+F5bM0kPbfAe8\nyPedtjmbdDpLd8lolmVmWRbmeSb2+VuqBRVURx9mWpYKSCRKsCzL1t2o1kc3SroKhd2+zhZH0mS2\nqaqgGUMI5KkyNUk6UN2WWXMhh8iyxD6Pl4NmsA7nnSzXqmSCyaGcIYvELKcIxUCvkBXmSp+8Lo/6\nRV5LJbWeV5TEH2/UVRzPOiqzm2mh0YrI3XSXY9VayFEOpDDLRTetUJTaEwD0VcqpMgY/WJwX+65x\nFrbZLoQlMhf5/ZZlppUikrKVqlVlVRivdUiqz58Hv8MNDbckkOabXAtzmGUEYcVBJ+9xX1R1RUJT\nAsCRWcpPV5o/VUXrbnHuTrif9/pAD9HLy8tNDmTc1eB7mWOHEUgbD2yupEbZGJqrlOan3Cqs7c3Y\nxwCG/U6cFiVlvJUPQogBNLgqlO7B2J5FnyXHXq20d7P9/itdqbUeyztJtk3MC1WB7w9QqgVqkjiL\nWkBl4aCagd3k+0LgKsPb9q+xEsG1UlAzo/fUmnj85BFvP7rH91/9HhcXF7TUUG6i6YVcE1SxTFon\nENkWxHLpamVwI6cQwYw4OxDDItXAMPLixz6C84bdzjGoHilrYYnL9nCV0sHGIJXVMlOtp7XKYRxY\nzAqgMDhrJDGzL/hiTsRUOOw8Z2dnWysrDAP5GlGJE6XEiFiYxF65Xp6T8VxlConjROyTMn81RTbK\n024vyxV6ts4s8iht5cBaK6aC5JwrK3zNUvqlrcNP5UEZY8hd17mOCFwf35hrH771cF9n61ZpchNK\nk8BG+mI0JeJywrUJ7SRdNC+JGEW2s0IutHZbtVlrk8Vplble6xnqWmsMKxRZBPC6u+YkmqX1tIaV\nR1EFNt7/XFZrqjab3VWsjVe2WvnbtnWGzjlqKYSuMV25AK2JNMgYQc+tyyzVUYXOi0og10RNYtCI\n6/uRK0uPeZEK2/TnIkin0d1OGkUsmabA2gHnPNrJWGPyAyEElhTIObGkRYwidUD3pFPRGve/WkZp\nAV7nVNGubQS41irGamzPuFJKLvacIyH9/PX8B3qIppg2jaTulYKxqudtr9ZCi8KQ4mmb1a0ZNNNO\nrKHzPFNrYewxFbLlM5heqttRNrnLctqG6zFGmlXYnJiawvbs6ZqFi6k6/cwYAQ8vS5SH8Np8xO9G\nFAYTMqYo/DBijOutQcRhO7Gn9EPUM44epRrzfElpCuvlxgwhkBOypLCWmhdyrewPE60VfvHzn+VH\n7z7kGy9/HXe+w05nGFO6PrtgVcU4K2Lq0CgxYgdZyrQqHul5jrz//kPOzm+g9APm5ZLz8zMGmxl0\nwXDG08sZ1zxuGiDL3CyqbmWskVwTo5f3ZfAWayYRdiMuHPHJy8z3FBahKXVSU0E+SLWl7tOWg21Z\nTnjT52Tj2FtwubTGybMbRmKJPb6jbqoG4xymVZxxTIedzBxLRXVN6yoGt9bhJ5mJ7vWB1ZzhF7EY\ngzwnwgEVELG00oamFS1GYkrCLbXTRuZqQUjsK+tBawPWoUqm5izb7e6W0drIwdovytYaLa42WJnF\nlg4CiUuiLoU1z6l1WZluEsandEOVQo7yHlVtUJPs/WoWJcV1vKMcpJ2GqjXOSAieygt6vQz614Yr\nTe56UVhrwVpy6iGBfX6sqiQ+gBzOGFEyaI1wIfplEOKCoMZt58dWUsokjcDAR4dRQM3kJEYCowR2\nglWwSLSJtR7dI7GtGzC2jxiimAdqa6Qc0TRMBWPlgLdGo3uRg1NCfwqJ2H6a5SDJtL2yN4q8JHKK\nxOWKk/o3vT5YihOrw0EoMaVlVJM/UmtNhvVauJurL34V/q4g11olytiOV6Lp1MnoSinGcbdt6Ydh\nkCTNKgLgeQkorXHeUxmhQ09Wixq1kVRPgoyrJUzmNmgFTTbKylnOxwPjcCAsC6dFFl7aCL0mpQyq\ndZGzgB40Tb63qmhVHEQximsppYRqQnW6OF5y+0MDN26c8dxzz/LMM89weXzMd/76B/zG3/+wpBTm\nSGwJaz21NJz3tCjvV1N0vBukWPjyn3+Fl1/+FqcED+69T84RM0jkybjfkauizUDLKG0oSKV2Op3Q\nTlihMSfOxwmtfJeoSDum+uOknae1iHUO40VrGEumIb7oWiKtRcARY6DERBtFz8hut4mqjZLwP21g\n50ZiEXp6bZkSGxlRFLjOpKRIiJ5kOHVBupXxyTT6flAWjNoxOMPhbIdSihTlkLqOd5PLNqGa/AxX\nVsC0l18Tc2Xw/UI3ltF5odBX0LWwpIzu3uzW+hGiDcbI0uPJ5QUUReybeddb62VeOtVKLoBSZC64\nVqvOeMAQT5E0Rwqi+Cjj2EMcFbn06ONrW2kR7F8tXaHgtLBD0Qik3HTFTMnduKBRVkj/ThuGSTo7\n7wdyTpTQrro/I2OE3AlYRhlyvQIqx7hQO9xZYlss2jmmaY9zFmchx5kUg2isK9eqfUsMksWEMjg1\nsiwLgwVkX0VeMlglFXrNGydD7UcUtUsNQRvF4CwxLsKgNXKOmGkid8OH6Nb7aOSayeRnvT7QQ/Rw\ndsB5R1gW3OC3WaG1lljqlfOn1g2WvMImhAcofvj1tc53RN7AJmlZA/CMMUzDQGvSNtQcCSlynE+y\nWO1b55YFTiLzukor0sLnKsPuXGSeFM0iD8Eg0QRVwRIWmdNRIFZiFqiC6g9w7V7eVIu4sbS4VlIs\nhJQ315Q1XSBvPU8uL/CPHnLx5BE3btzgyZMHJG3Zn59hjaZkyxJnSq0M40ALMBmRw1hrqTRu3rzF\nrWc/ygsf+jClfIVpOvDpT32SaXCUHLFGKpkrXV2lpkjtlP45BBwSFKeNpaFRLaKa6G1LzeQI4/6M\nw2FHvmywRlPANoqxtlcIdiQvjWIUSVXoIOSrD46+2oizcli1jEKSzHvdMGG10NhV35anMJNCIIVI\nS5HWiffFCqwldvq6tx7XMXPZCmHf9gtanqFIi320g0YbGSdIxrtlwKBj3NB1Ms+rIsdB4c3AUmZy\nlOWJtWB1TwLoc8+LEAmh08WMZYkJk2TO7q0YE5xxpAIpBoqqJCuYRYpUnblkZjMLEHsqHe1YN3xf\nqQkipFyEvWlM10qafqFYsfOmQu5RPMYYnPJUxfZ5bKz7BOkYSkocyyJz2v7vhEglhLItGXSzzgpw\nqNUsuD2ZyYkm3Hup/GvecqRaueIbrJ/10xKJqTDuDzifKF4O+WEYqdTOC8i0WslaNMLWatxgWaO1\nlWoCi7aaJRRO5YTp2uFWTbeZyve9GwcJR/xbzrEP9BDd7/fs9ztOy7xtc22XcJgqEQJicRPEnfcC\n0V2WeQMmGGP6YLxuervUWyTvPaFv8GspaC9c0lJzj7JQGzTYdMtiCDMtd5L4oMV9pOgJmjLDKbZr\n0BQ4N+CcSCdiOnJxOnI5nzBGMZqBOAdKCrRW2O93W0WsFKwheOh1DigyqxwTajAMZuySJXj0+AHz\nPPPOT97m8hS4//CCZixusChd2LtJqs6UZOOK4jCNpNrQTaG0JSyJs/05++lA0g7vLWFeiOUS5T2J\nwtKjdmsJcgj1GZZ4jgeMN7hhQrkBrQu6apY0s6SZG7sb7Paeirz3ucMqhNQE1CqVv7WiwaupX3xJ\ntKxWoYtIwLz3jB2zB/LwD9ag9Q5tLUrNOOMYbKcedYtpjYkcFsKykI2BXDANWq2kFIn94PN+kIA1\nZNSh9YDrZo91w7+OflANbbp2mO5uWXOprLTHxirKtYTStfupKTPPsvzaTWc4Y8lGJFNr0myuVy24\ndFojrYmPXStNNbIcbQWWJYKTSyBbGYfVlAnLTAjiCKIvkVoTdOH6al3fKfbRKJWx0xvpf612JTIE\nnLNbuF/NheYUg3WYmJirYCZrlKVTU+J3Kxu+0NCUkQvHdwWEMcBCSTJnN930IDLBSlaGhurLzUbq\nFnDVu85TlMVj06YzKgQdOE0j1u5ZFk3uFe86lqmr5KzLtyiS/uuMIepCjoGULLvdiHOGnNk0psYY\ntFLY60kIf8PrgwWQjEPnfzqBGbdM6Ymaq++2UbF2YBwlxyYE2ayGEPB61X5GybOuIiFaN4TrZjV0\n0hK6MacgkQzI1lL3D9IqiZovZWM+eC/2RSPVQ4x9cdWro5ASuilxRgEhR0Fp9QMTrGwgl4WSk8Rg\n2EFarZS3isegthlt6SCUZkRCM0wjwzihFLz44kc5v/ECX/7q17l89Xv89fff4O33PsanXvyoVG9N\nobRARjSGoS/cpDooPHj8hCdvPebx46c8++yz/Oi9+5yeXJBCIB6fELWCZilNM4eF2hKWglMiwLbj\nxLAf8ePIMExYM5CrMFTHw0gqcQMnxx6HS9840zfYwttwKOPQyuBthWnY5D3WWkpufaNrGN1AbVKh\neyWHqsR3yAaenLHDiFUIRb1IjPMqCldN0XQl9rC79S+DImuRXgmSTyp264btQytLEdNVCWC0lQ9T\nk27HAqgrZ4tSbF1QiYUUw8bTlGdLDi5ljWQj5atNcIqJeUlMO7YRVSqSDmC9gFe877CZWEhkBjcy\nTCPK9wowy0jM9xC/UuPVTFM7lIcSlWAOa0Nrh3XjtkgrRQhqqjvsWkb0ytfAMXYNbVQrT0Ba3Vyz\nZM13nqmxHt3dUijZ4LtxkIWQn6QLrBU/nTF2gHqKy6YSUFqDcaiCRDsrxe7sgIkC23HO4bwn5xMh\nLIxOCgLlHEvJFJW607AzKUq/HNb3vC8AR69ZKgIAyhPWO0ZF7x7kgluJ/T/v9YGL7Y2x6OUo1Ym+\nQqKV3MhhoSCuidYKaYkcLy64fPKUsAR2u2FjZi6zgCYOZwfZ4FmDMo64HDl2R1M14kiqrVCNwjqL\n925bVK3tLK2IWyIXWk6ss1KQ23nYTfgyoieZDxmtcbqRlGaZhr5JtKI3xGBGy+7swDgdKDXRjJYb\nUhkcGu3W2F35vVVteKdEBO00xhvm0yVpaXzpC7/E9978ITdu3cJ7AbbYnMTznmW7qOsVUDjlDMZy\n89YtfvTjN/njP/5jfnTvKdU5Hj18tFknT5dHCfnqh1RHQmC8kYG+NUz7M/Y3z9HGUwtYvxPM3oVh\nLOD9KFHEiEe9NXEVSQ7RlYFCnCtiRHDdhaaswbgBh2bSCkmMayxLoq4QXqPR16RuS9dXOtvNBYpe\nYVzZB1cdaKMrOtyA9ZIm24xARrQRPWNBoTTYYcS5Hjdd1pGEfPCoRbqFFFDW99/TiHa2a1JjyYQo\nkdTLItVvbuCHgaoNp9OJi+PlpuNMKTGHAFS8lRwj20dL5/5MNMVG05RGk6Vaq9CMxplBtuGrwF+p\nXp2uSEYZNVjrqSn3n4Okpjp7zcm1Igq9EOfpWlNB1YmhA/riKgVaSd0tJCmutcqyx3uP815cf95J\nQVGEJ+q8xAC5boJxfuyjgtJJTqLIaSi0UWhnaSmC0l1bPVJaryz1KqgXiZTRE1opvO6z2Cqw66Vn\ndIkjzVGSoPQG6zBW47wAUU7hxJnZS/dgZaYsemFRO/y81wd6iGptmJdL5nmWSGTr+gNXt1lmKY2o\nF1STueE8zxtuS6Qn19MY5aWMpinFOI0sOdFOJ1LOErvhDFTZGANXuUvd/WCNgqJRVVw8p+MRbRYJ\nb3OacfTsDzu0dtAp3SvdJyWJMRByzMgcAk0Zhmnk7GwvgAtkUUFrpPlpF/6afgB1gbt1OCutyDCO\nxBh5+PA+998PvPfuuzjlOF4G3n3nPXZG4WoUx1JXNyjtCKeZZWlkLSCOm3du8+lPeaZxDzxlv99z\nvtuL4cE58iL6utykvYupV1Ct4rTd2JXT7kCpilgrxe0ZJ0OqA1rvUCUTYt3aIOOcpHimKjPgVnuk\ng0OSTfvPa52BOis2Se8kEjqXHoWRSLVgU+qczkZVCP7t4kJ0tuPIfpq2zfcaWrc/HDDGSppmll9v\nvVRgOKGANa3IpUERl5CxVhQPrVGNopVMy4VSs8wXqzyX2ck4ab+fpGpTK9xbFmPWO1gi8ykQQsaO\nE9oPsn32V8GGwOaXn/ucf9zJosish9Lg0SayNEHXpZqpPcFgnCbpWgYZd9VFbREiVovA3RlNMY5a\noNSAURrr1siXXoE2LQGNvfqMKQn2r9SOq2zElOUzuCy0griYNBvtabffy3+rBHtXqqAGt89815Pq\nKt1mbrUvXLtszRqqVmil5Z9vEPUmVms/ooxUmdY5se/mTAoBpzrKTzshOvUdSWlX8PVWIIeMbQYG\ncWXllqnLfE1aBpOfhOHQORc/7/XBiu1PR5ZFsqr3+wmhljesUqANpzgTYqakzHKS9L3SRbnWGPb7\ncatexy60Hqaxz2MQj3atPVcnczg/Y5gE8eZHz9k15FfLBa2aCHWLDL5LScyzzEe1FfrQbj8yTSMg\nBH3bYRiiVw1CBxoU2g64kLh1x2Pd0GUfRdoOLeQikxfRZhrLoRnm2CEezmNNw4yWOUWMEVXA4bDb\n0HoxF1566et85Jl/ilaJkAJ+GKlVEVuf36pCMZb9zYkQpK05OzvD+wc45/jkpz4pP4gms+jd7kDT\njtIqaq6U0CG4FrRS6BiYl0BTjmHaM935FH/1la9wfHSPT3zoOQadaTUKkKPrR50WnzNN3FmhZEgZ\n3Qy2SNXUtNpaY2Ndb0kbpTVpDa8BefWKLzQyr4sx0npVq4ymVZGJ+WnkcHbObrcTB1GKqKg7alCC\nAN2wEycMSMyEQuAv3QbbtBJJT5/bQqJe+4CmkpmGUQ74TWjf4z50R79NBXcKzDHx9OIC7SzjfseN\nmzdRa46Xs+x6zvlunNiNI2eTwDq0t2JS0OIC0jHQau06WZmn68Fh3CBjEq0xbs2978m5pYi4vsuw\nckosS6D0Sn1l7wrP4SoeZ14upbJ2ntE5McTkQphnaik9mEDkQ0aLGkk22rIMTF0lsVqCBfvY440b\n5DRvrXKt8p5p49Cqoa0UN67JbiSkSMuJoYLrl8V6MOaciU1E9OM4YpyjxLrtLVpV5NrQUXYjNReK\nyphRUmslYjtznI+0Jom2ViVh5dZCy1cc3L/p9QGL7Z+KPsuaLZ9lFexa22Qg3yna0JcL2zDaY8wV\n6dx7aTmdc+LFrUUqvHHgoM5QSnE4nEFvOPeHPSbJDRhOJ07ptI0SZBYr4nMaVCWEGu89u3G3jRDU\nGi1gRVZRS5KwMTuhjOf2M2fcOL/F5enI/UcPyblgFZRcgKusIKsNu8ESsrSQ2Sb5YZcFuz8HVbl1\n4yYf+9Dz/PZ/Xnjl+2/waAl8/MWPyvvSwFgJCKPUvlg5UVSBcWR/5y5v/fjHvPrdn/TD+MDSxdiP\nHzxgdJWpL3FyE/ut8zc5Pa0cL06i2W1QFNhhYJjOeOaZ53np1Z/wyvd+yI7KnbNb3Nwbbp6dUeqM\nQdEZOzQSmkwogSUuFD3gGNB1ujZTlANV1au88nVWOkyT6BL7hrxpha+gJkGaWWP75WSAiDaOYfTs\n93v8MEgVQ8U2qXyUlfRWobf3PHgj3FjVZTq1NFqfk+d+iK8UKEXf6sO2zFsNBlJxt545NGA7NHmM\nCd+f3XGc8MPIZBypZHbnM3OS5do0jAKeaRJL4bwHZyhN7IjT4QBJpFPRyjYdZYhZlkxTt5bmPtOr\nFFJSZBM34hX0z818ohQ5kPwgY6mMGARK14nWWjmdxCKrENdd7cYTlEbVKjCY/vVSDjIbNeK4Ky1v\ns/nrSprVxLBFxXRDBLoTn5wjK4WrQvEX7XVmiYFUssyWY5CFsdbUJZOUxneIytWZYaj0dAPdaH0e\nXU3FaSUdJZp5EUaHGDsMFU1N8l5sLqqf8fpg2/kebrbf7wXGUZsI4KeBvCyMh4nxoMlZfkCjFpmT\nsQrVJDPFD5bj6QRasdvt5UFPkRYy9XSJrpXbgzgdWhGf89m0kxvH+q7JlMVMDpXaRb2tFRrrLEX4\ni5NS6Fl+b9cap7PGMHgCEaomxMw4gnIRxhuc9F1+8Fbk4y9+jnb8ARcP3iReLHgb0SZS50KsmTTK\nrE3lQEgz7iAuj4GRsWjiMXK6vODyycKjh+/x3PPP8uCNt1i4gXUH9OlHDKaRtSW0gcsQiPNMU5X9\n7sBufBbFTV579Wt8+5XvMVtYTOPb3/4ev/yrn+Hi8sitsxsM44R1FeUkU33c3cKpgTg/JMWnYA68\nd8/zC1/6j3jzoeerf/rveTwnho88h37mLjE+opaAUYlaG6FAaxpTLTlljqeFXAKuaFweCFogzXZr\nqRUNRU2FnGT2qK3Gmk6vL1C1wfkBj6Gogs2K0RrZNKtGLgocuN2I3Q2ULFv55bTQmsKOgywfvcMU\ntY2GrLUYL/PB1BI1RdELawN2kEwgQU2JZqtVdMkQFfSFSCvytYrW2GHE+IE2JW6c7TlEyS4anGfa\nefbjQK5gmqPpjE8yzpimgaYV87IAoEzFW4tF5EXZOYkRV4qhBpklhqc0bZh2OxmVqIKmYHQhhyBu\nPezWdeUqh4dXVuakrtOXvMOVRk0LXjn8oPHWEk9H0ryQZ3GSWW1w1pHXBa5W1JYwLtKKp8ZZOocg\nbXyM8udcGRcrKb6pRNXipBJ/f4dre492HudHBP/XUN6KJXgJUDItNEJJxCUQlEIrcNpgB89Oi2km\nnxa8UjglSRU5i0tuGAaZyUcxXuQSMVmjVWV04wZwSSViNJvd+We9PlgUnrIY172qGEKSbzLnjDWe\ns7MJpTQpZeK8oFRjHEe0aoRwxRhct/EhyIO3wihWKrZz8sNLKW6VJkiGtWRiC4iijVJF6FbJWWF7\nZK/TUuWFHim8zvCwE+zoVjKZ29SiBFdmPG+//T73Hsqmf9AWOx148uBtjFqwJsGSKKpwWhZu7g69\n0jGEFLGDZ/CSLkqWGdCDR0+4f/8+jx48wOjKy9/6Np94duRjZ64rDQbCnKHoPr7Yi3tHZZ555ja3\nnrkl4m0FN27c4HA20KrCuZGYMyHP7Kc9jSIUppoIJZOjxMgeT5UXP/dJwpL4/d//I9744Y8YD3t+\n6e99jhdeeIGnP34qYXI6EmshNfEntyY/UwCtDLmJ1bO5htEOM3pqVbLRL7CEUxegrzEUg4jHu6uE\nng3uvSergF6JWUqsiiu6LcZITYX5eOJ0mjHGob1Da/laYVmuHaKGoQ2YwWxKDZD21BsroGwQa6WB\nWjsOrmt/V9yhUgrremfVdaXTpLrtUjbu3vZIGyCXgrdWhO8lE5eEsVaC0gDPcBXGVyBr0bW2bmOm\nKlmIKUlqrZ0VMR32xNMVyav1WHBlDHYQ5kJDVAfGrp77fphqYVlY6xmcJ1nLRW2kIIDlVqS9NpOm\n5VXqZ3DFb53h6jrbbLNa4X3fP6zyK8Ab16FCmZh7jMs1fbj8mTXDMGGs55KLbqTRnVPRv17OFKUI\n44i1sXcHMhqTqOrMcjx1ob/uxgS27lN4q5YrkpN8xnXj7/ZMVCHzzONRbq7SKtM0CEzBaJyT2aMh\nddq8BMfVJpKglKSC2O33AJ1NaLexwFIXXBPArNYS/yrCXYlo1l2Qb6xm1A7r1OY/tjl2x8vVbZuC\nCHJxTdMAACAASURBVM+VkrHBLu/RVQbZUEF3t1VR6GK4fPSEV775Oj/8ydv84mc/yjOHM6qdqF3/\nKnSegquV0+WlRIIYh7YSmzJqSzidUO6M0xK4dftZvvDFgT/56kuE99/hYn/G01PiiSqYSeOaQreB\nMD9htzuw203MtZJK4t1773Dz1oGPfuQF3j8+JVH59Gc+wm6cqCmhbaWqgNIjVEPJ3QaoFHrYQxp5\n8eOfxo03+P0/+iPeffcBDx8/xp4uOBwOGNbLJ5LLAs4QY2LwO6w2tE7hWjf0dc020g3VP7xaaVAS\n80Br2EHgKXb1lSsrsSUlE0PFmCMKJ3R4JfbvFRaz6mVbEWNFCAFtKso5BK/cCHPoGljZruiWesLF\n2spmVBULYK1KJFpWCXQmSfaQ7okMcoB1ZJ3pHEpERA8iQC/9INtC+XKVS2WRZ1kZTTOytGtV8taB\nbWaZUkIV+X3FldUo9Chq3SVFWkL2vPJoKrHrUTfPuzaYIkFvJSdqqxL0mJIAo7L4zNexhjcWM47E\n3dTxc0WQg/OMy+Jp15rt2b/uQLwONF6DC1cdbs7i6LJKuo/WRFEhCoS+4FGQi6hLBqNxuxHfCspb\ncU2FxMla5uNJdMClcHk8yuVglWQpec9ut6f29M8QJBXXWk9qEs2iu2sRIOWrhZz8nBSq/R2eiSql\nKLFweTpJ9vmKJTNFBNqqUGuRFinlzfFgtYBU1+rmOjRBei1xQuz3ewEYdOCr0lfOiRACRovVbxx3\neO+6GyaLc0l7nFHXRMJQilhRte5Mx1CIx4QaZWEhwOAGWeJDnPG8/fa7nH78Nue39pRyhvMHzs5u\ncHzygJYLikSOAbMbUEax2++Yzs8Z/IhJMkcM6cQLzx64ffcFHl9Enr1zi9de/z7WT+zPblPbQ2Jp\nUCq1y2YOuz273QR9mXDv3gMuTwumO768sRhd2O/3hCVhTQSVWMKRabiJ1fJQneaZpEZeePHThOr5\ng9//v/nEZ7/IX33ndR48us+/+J1/yXPP3iWGmZwCdX4qRqUGqih0E6G6rmC1pWKk8lESlaw1AoZQ\ngsZrSmHdVdYNPWq4NWEKGGeprXcCTebJhhXQUbYLNISZaZpkvu4dZonkIqQf26CoBgqMN+zGCd+l\nLjlHcfQ0qTYlQvcKbOO7rIlaKd5jbQeE16sEBt0UKUe8GyBfZQOVrv3Uvl8mMbPkwONHDwkxMx3O\nsM5RtMyf3TX74Uovy7mDxKsoHkpdYTzicKqAbNdWL7veKFBohdFQjabFTE2imZQua6YFybqSirqK\nIcEJmGMcp66bTbKdp6JaV2FYhbaCo2th2bSxuh+s62fIrZdLkfGYWglNyCU2WU+149aNNiMdR6wR\nG52MYAaPm0bG3Z52TB3ukjet6dzt3mdnZ33OL4vd2i+QUtom51qXkWJlddvsduMGdP12jn+HASTz\nvEasCrlpGPutYAewZeNKlpS3rTStoPp2Tg7Mnt7ZriI6UpI26/z8BiEIikwZ+m3e8+6rzEhSljdd\nwANKMrmR3KW2DacVfhx6jLCH/mbHJcKTC3TIAoFoidp9z6NeMBrOD2e89cbrfPNbr/Dhf/abfPfl\nV/niL34GNdxAk1AtMo0Tcb5k2u9E1O53qNpYTgFq4enjh+xuP2Yub3Pv/kNunJ/z/DN3eP/RE954\n8y3+wWfuYH3BDY6kKjdunHdSVMO4CWt2KBa+8uWXeO37r6N2Axq4d/8dbt64K+8xlcEocU7pAE6G\n6/iJW3deYKkT/++ffY3PfP7vc4qRV1/7PtNhT8qJN15/jS995iOEeGKnFDEs1BZRbhKgROmtvLZ9\ntdBEaqQEQB1CwPkRjbRXYmssxJxocw9Rawh4+NqFWUqi1CYOm/5r15/XulgQ3sJIGBJpieScUa6I\noL+nGEz7HYN1zKdLTqdMKxmjENZnXDBKMU0D1g6sqaRKNWzfIOcSJeKjpN7aZ2ouhCpVzzpmstqg\n+q+REVTldPGQ0+mE64GLcnk4rBaZ3kZ3z5EUF9KaplkE+qKU7projgqsckioJhblmAWAU1MmFhl/\nyX1bKFqhVaOZ1oXpgbgs/YCRzkCAIDLucruRlgy6FVybsGUNfWubRXNFAiol7NL1IrzOt93iflIG\nIy6lhuqcDCUOqNLArJ51zZICfnUIDhLV3ZIS84YyDINwEuZ5hq7/dd2oEksmhyBnhLFoJa4s7eyG\nxVNWXGTWCs8h9cKLylas/azXB3qIPnl62VMPHXrU3b1gu7sjbFCItlr6SqK1Hn2xbtH7A6aUaMtK\nXfONVCfxrNi1/QYvWRYJP5NqtrCoUxck26vtfG+7BJ2mmdzAMCgBJXR3SEqRcJkwcZEDpyasafhh\nQvmFO3ee4/adc750+AJf+6uv8eTxQ/6b/+q/5PU3X+PO7du8ePdFntz7CXBi3E3bg2YwLKcTLSTm\n0yW73Tm73UTWmnG/4+nTI8sSqVXy4M9u3WJA3ktbIVM5zjO+7onR8rw5cOf2bfxwIDWLbYbbN57h\nuedeoNRALQlVK8UZxmFkGLr4PFvuPv9hvvHt13n1By/zW7/9r/jmd17h937vf6NU+LVf/8fcvHGT\ntARayThtaDmTQyRXjamytVW+R0MoTaoV1WTjapUhZVl+KO1RRiy7Ik1R3aYZqFkkOmvUrzWGnMSX\nnkOgWMNgXJ9xd5mUH1gTQLUSYnoqjVClIhysWGbXl+DSKq1k6KOl4/GCMM+9W5GN75p/LhVod9Xl\n0rFpiZISqitNAEJYuLy8FLH4OPWWVroet7PcaLfRw0BTIiAXDLAG1Eabb0XE/XkOxOVESlEE7NOE\n80b2BNb3iOtKLnKI1xzJKaFVI1fhRKxjMwBrRhRCnq+qbm04qmIwMvbKkso57CbGaSejlFbAiezP\n9HmsMQajrrCA1NqJThprBDS9zq0V/TCl4YwcZCHIz3LNRZNxSqdwaQNVU2LBkLFeZuSSxWs69Fvj\nd55pv5PPkDFbnHpKiZjlwJ72O0Y/MOx2EoCp1g6WTnGymJMhxSgVd4hXaQk/4/WBHqI5ZSyWYbDs\nDzcZRsealy2zxy4DagXd/fPipa6bFQ3YWj+hxKTNArp0mtKWF96rVfnByiA5qbIBDlZK01XMbd6s\nXxhDTWUbvgPMeaGEwlAmVuqOcQKjNV5zMT/l4YN3+Y9/4ze5OD7lL//yq7z08rf49V//x9AS3/zG\n1/n4R54hp4ZVEGtgbJlwOtJy43h5KYsgfeLy+JgXXvwo43STD3/047z0jZfJKnH7zm12hz1tXtBG\neKDOCK9UYMUDl5cn3nr7PjduPcsLH/ow9y6fCGmpao5Pn2CdSENahOoapWViiejhNj/8ySP++//h\nf+Hf/Lf/HT95731+73/933nr7Xf40pe+xMdf/CRv/OAHfORXv0hZIjHMeHNNWpIr2ssHxThDKr0N\nrqBqIkf5oNZeYSi0xB1rWW7kqigloY3Cak2pkbA0irXEdCKXSEwB0zypynZcWwWqIBHCRYDMSnSn\nIG33HBZ83mGKjARCCJRu23RaqpScI047cKITpsoc8vrzpIzDKJHItFY74i0x+KlH38iCRTLAFN4O\nlHIS4pVS6JbxfsTvdsSYyEWg2BJZ08EryDMdTjNhOZFOQjoCUE5meSJ2v4pO2WzEKUjUil7HXD3j\nPWe0XZ1YhVIjujhJ+aRcC24T31rIiXQUY0AphVMXphvbKzotoyxnLAJvXhMnhism6XqIdjCJAtHr\ndrZqaaJ91mvyrjYiL2pSZBltxN5dKkk5TD9US069VRf85e7Q9yMlUpGYGrQh18bUY7slJHCkmioI\nwlK2UdHgB5E2tUbJ9aeWUD/r9YGj8CoFlGK/Xx09dP956weBxHSNo99mKjnnTsIxG9DDe08IgXnu\nP/xSOB6PPzVTWmnnChnW12gYOvCXIi0OTuOdv4IllKss+lJTl0p0VJih69TAG40fNON+wk4DxjSG\nUWF0pMaFf/Ov/2tKSfzBH/4Rd567y+c//3nee3jBd7/7HX7z136ZTOMwjQJH6PniVhvBdmnF0yeP\nuHm85MfvXuLGid3hFsfjff7kz/6CL33ydxmVo1WJGck5E0wAo7l5+xZ3794lqUAsmcswCw9TG07H\nyI1zDy0RjgkznaGrpepGqpW/+trL/MG/+zJLNLz09W/y2g//gHfee5fpcIabdrzy3b/myb178KXP\n47Sg3tZZWE10RqzpCxiN05YMLPHIHCKcNJeno4jmh9iXIpJw4Ca5FK2R+fborZCZ6M+ESj1HvvMG\nmmTjeD+KA6dXgvM8o5uiNBFcCxdV/tcmSWtFG2F55oJTVqJjamW4cZNa03Zhx80HL8FmrhlsD2db\nNZWtibd7t5NZszFPgSvPeUqZHI79g1uxdsG5gVgrx9NMQz4LqCvSeu15Qy0XmftWwd/lJuT1nDO0\nitIWtdoza1+oLaeut9XbbFIphfUeVaX9l+JBTAZNK0qq0hEAZrCoNTAv5S4+l6iV0slbrTQyAUX5\nKd3vdc+56ETpWYddg93n3fXazHlNJlWdf9CawimDt54aE+EUUEVE/2nJzJcn5mXeZGrOjzhvqM1R\nWut5XpJvX2uldn10UZKOgFKYKt3Kpk/WanOgGWNEU/xzXh/oIVpKAsxmvVx9vM5ZpmmU9qLzIdW1\nVkE4oSN0adLgPNY4skpMw7hJnE6n04bQW1uOkldSu2L00yboLlVgJc4OODdSSiQsiZTFt5163gx0\n+YtqoNu2vBhHj7UyW+2GK27tJp6/c4OvffXPMd7zW7/1W7zz3rv8z//29/jlX/5l/vXv/jb/9n/6\nH/n6t1/nH/7KZznlI4fDhEFiN/ToUU6TQuKZ23dEwO1Gitbcee55Tu8HYqrMQTR4tRSssngrF0tq\nkgbpppHz2wOJLBTwVqlFHFxKRSiN+bQw2EmWKwu88c49/o8/+Pe8+daJG7fu8pWvfIUln1DGcuv2\nbfbn4ga684kX2XnD6eIRaZFZKFVaasnLinivBYjbNNM0UVTukIdMimLr9NMgOUxOY51IfEqWjmL0\n3dDQt8M1RVSVDw21iS9bWzkImth+bY/P1VpISktIxCwuJD/Kz2wwdtvg57iIEFtJ0qNRht1uR6Ny\nOp2YwxEK5NpIfXlXS5CwN+023sM07tnvz7bRTCkNZwe0sjx5ekntz2ZNEe2bMErHntmlNeMwilee\nKxhJLEJlb63Ll/yAUprgNaWIySPHRqoF70dqEX/7ukugNqyexCvuhk5pUn0UlvoFINI3tCL1GPCa\ngyR6GoMTwrnEJcdCzIHkK4f9XuarEZIxmP55Xqv11YjgvUfpiVpXE4WhXoeftKso45pFFZBrZRh3\nDHbAaIVTjpAXQj6Sl4XTLC13Tglv7Pb1VvKXgIyQdFEnRVbojI1cCl45xnHcFmG1tW7SWZdNXZ/8\nt5Dt/zZU3n/Ql7WW/UFmlaXK3EIZgxsHpmnCeXEJ+VGYjTlHUg4ys7GK3W7XBfaiEa0d5WU3v22X\nbhjNbo2P6PY3pRSTn3ob6dAYnBsALYPlVLaqY9WWXUU4iC5uv98zDJMg2wbJ6y6tCnouF3TNvPD8\nHZbLp7z00kuEkPid3/lX6Kb56l/8Jf/XH/0hn/7cF/jyS9/h3pNE1QdiFnCwVQXvNLoP9ZfTjNMD\nn/j0p/nQRz7Gw4snzKGQs+bJ05n5VEgh9RgUSQaIudK04+kSeHBxyZ3n7+IGSwxHJifjB5phORa8\n8VhniKXy9Jj56kvf5SfvP8Xv9lyejuJEaYXz8wOf+vQnpHOwli987rN87EPP8/TxA+bTpfjEu4Rr\nBRlXFKkU8WV3t4+1Iiw/HHYSgV0jNS8CsyhJBN5L6NWXyIucWeM71lx6LSzP7jKBvgS0jtEJ9Wkd\nAbmNPq+3nKv9tBObb4OSKsvxyNMnFxwvLghB5DC1NGhKMr9KExtlg5AyyxK4OJ24vLwkhGX7fjES\n932cZakp8/PU84Tkn6XaCOHKsSOBa7pX7FfZ59ArUsRi2RTEVogloaoksK4WzeV45PLyKeEkSQ8N\nEcYP1uF0V5U0aFXaYPnf/FPqAQGTdVJZjKT+72KM1FjQVaFKJS+BeZ45Hi8255GA0u1W0RljGHY7\n3Dj0dIiZeT4R5rnDQqSVb0UkUEYJrCYtUgCtv8fanYh0yaKNoXatcc65z6zHDg9qWzdUivw3qRb8\nNLI/P+vW75GEXE5NK+wgkSNKKdGbtoobx54LpTa+wc88x/5DHZD/f153n3+mz1a6D7bKQFo3qUaU\nHtEaVPOd1rJsrZX8pzIzmecTpwt509fMpfUQzTkz9YNa+JCi5aNmlJ5oXTcqgW9WQudm0auiRdMI\nCBlKGwHe9g+iSYXYKsO4Z7cfOS1P+i1vUKXSQuBzn/g433/jPWYa3//Ba/zSL/0Sv/sv/wv+3f/5\nh/zFV/6cT37k02h7xp999RX+xX/2D3n09BHjuafEWfJirKZkw6P7j9jffkJ4XARgPXlO71feufeQ\nN9/6MXc++zEoQRxVWsYBze3Ynd3iez/4Md/87o/4wZtvkUthHByXj+4zL8+wczuc3XG28yirSK3x\nk3cveO3N++RmqVnaZqUVg3G88PxdWsl8+9vfJp4umerC5z98A1UDugnCzw+DwBusZZz2hGvau0ru\n21zPODX8cC4f+NZQCM4u5crpNItueDygmkYhCawGQ2qhazdFBqOVoVWJjcyt9pAyetU2stRGjBmt\nC8qKRdRaK3kc7Zq9M1exeHZzQ60F5zwhzaSUt5C5VuUQVVl4CCdr2Q1dTmP7LHY5cjxe0qq6NhsU\nh9Ywyqwz5SO+O2Rqz6bKMbGoBaXAdIp+XaErnXSk1uC22LAWUpV5am0KlTNNGxTy2Rjsmk8l2WKp\nZPk+S9mwfs454Yr2l1KKQt0uoZKzXGiqyGEsTRhLmGk5sRtG7DThjeg3U5KDd9jt2O/3pJS4vLyk\n5EBKgisczQBKE+cT4bRAzzaiaanUs4zxsk+UYcA7w6Am0WsnUVmcnR0IITBNE2dn55KEQW/bkfcr\nLAnrM+OwY/ADg5+wfob2lBwuWLiGH0xykdSU0cZiRwGtt2tJpn/T6wM9RG/cuPFTC6Qrhp+5au9Z\n5UxsNw1NE5NkndfcOF2cuLi4YPAiPxLoqnxQYm8nJJBLZiK1Oypqd3PEKEmWo1a9GlbcvH1TfNEu\n4Jy0xznnDbxrjIGQtlbAOseg96zxso1CjE857G6y94Yfv3OPy3ff4+7du/yT//Q3eOf1t/jjv/x/\nePOtH3P7/Dl+8KN3aX7HD994lYN/DmLCDrIsqK2x2+0Yx5E5NN744evs9xOD35NPRx49uejVTyCX\nwjANYA3G7YjJkkLlx2/d45VXXsXbhm2S3CibUsO02zPsLXO+ZA6Vl1/5IY+fNiqWXAMaA7nyzDO3\noTa++8or3H90weTh1e+8zHu/+Bx3zkbycE5uFec8gxXdnR08WCO43p6DI3PDAZPTBqpeloXj8ZJl\nPlIbUoFukcaO1rqcRSsR5zdxiK3hdkoBqhFToqKxLm0idekkRN5jtRG9as6ktiIIzYbNW0X2MRXQ\nkVSunhVnPcZYif7Qlka+SqX1fsuEXzsYYyw379zpc/zCssyiz+1jDlXH3jk5SivkBiks5CIt9rQb\n+lhAsp5Kx8Q1I46j0U+ygc4ZuoFB9yo25ojvuWHr52uVOp1mcWrpa7NIY9QV7aind57fuMFu3HH5\n5AmXy4U4iYyV2bGxqK7d1g2ctZsO9noHV2mdulSYQ8C0iu3w65Yr8TRzvDjKgu3M4d1I8pIEGkJg\ndg43OMbdwDRIqKRNcui13BhiZBxHAc10udy8LNv3TWukJXA0R6ZpYhgGDtMOg+LR/SPzvIiCQ2ty\nKcINzhnnPLvDOc4FlP47PBNt/U33zm+zkZISxRgiFe/tFZW6Ndla6quWbt1Cigj/ClwxDANej8Qs\nFjqlVJ936m1WupxmYEbpDgOmcQozSmv2w74zES20HcYIOq+1hnbiN163tGkJHLlk3A1ga19gBbQ3\nhJA429/kE5/4GH/28nd5/e33uP/+Pf765e/wW7/xm7z54Lu89fr7PHjwACjce/KU82c+zDde+Wv+\n3i9+kqYLzjWJlO5Z8jdv3uTWjZuE05ESE94NPL6ceTovmNJkBNAa2g0YN7EfD3zxcx/n3oPEt771\nCo8evkPThd10YLSiTTTeUBQsRfHm2w9580cPSMnSlFgBay1Y7TmdFh59/00Jq3MeZyu/8Asf49k7\nE2euUssZWEfeKFgFbQyHaUethePpifBHW8O7CecV1nmM1iglWUvLEtBOnEl7P3G2P2cY+tyqXcVn\nl06FMr2CEdG9os4nYq9U1hl760uRtYuQNISI7kBway2onuk+n0hBnDy6yjNaSq/+B6GG7dWB3W5P\nnGeOxyNwFfK2tuDaGkYtoylnhfu6smuNMSzHEyXP3UWk8UZ4lzGGTe9ac0G3iul5QaVrKWVBZBmH\nQ58lFlSVOaUE0WmKMXLh9AupFslvbz32JYelwzokHcAoQ8uyfKQv7AY3MDrPJbJAdUpfuY26HfYU\nIlkJtrBmUUOcTjNPLi54enniOB9xznF5ecnp8oKdd4zD0F1UXZR/7X0Th9EOVN2CKXPXu47WYAeL\nnaSwSqcFP3m8EytvzsIPDWFhZ/Y4I+GIq7pBNygxbc/AOO4oxyNaWemeTKa1SNEW6wTN6YYJP+x+\n7jn2waZ9pkTs39QwDOJOiHGrRs8Oe4xRNMS11KpC09BNMzrJCy8xbQfoOkvaTRNFQbiIW0aMSJPW\nYX/pOLmEdyM379xG18rlMbI/O3B+86ZUJbp1snXDaNGdDcNIYOm3baKUxHKqXD7RjHuL0pamFMqA\nc4plfsIvfOqjfPj5u7z/8BEP7r/Ho3v3efuHPyE7MEphlOKUZ1578w3++T/5R3z5T/6Uj37oE7zw\n3IFhKDgyQWVSWdAG/tF/8mv86LVXef/eN7h4+pT37j/hGA378SY4Bb7LMpTl4sF9njypEI+8+JHn\nOJ3uU0KiwOZKSvVILgNP58b3X79PKQOliT5umJz4uJsiZkmyvXF+jnGa5+7e4B/8yucZByDPAh3+\n/5h7k2fJr/NM7znjb8jMe29VAVUAQYAESVAkRZEUJYpNtaixLbXVjvBCDtth/wN22CtvvPfOW4cX\n9qLtjcMRjnDYbi/UWtjt1twtdbfUGtichIlAAVWo4Q6Zv+GMXnwns8COELdgRlQUoqou6lYO53zD\n+z6vcZKJXjPWNA2hE4BHPWRiWgm5ot2IGQdqVcSUKVnsikq15YTp2Iw7hmFstKUWa6skd13m0l6C\n6Jq8xiCLtJBkBlmKtMfTNEm30eaxnfcyC2sXrHaawYzkUtgf9oS2bKmKk6vFOS8Xd/OUOydzRhCN\n6dHffhL6KwVGDoajWeO4hDw+5qVSs7TIQzeiK6fUhlIiBoUularFUJJb12OUo5bCVARKrVsSREmV\noiNWK5wxqGooJRJKPPEolK5SFDiHd7J0PabkprhCkpGa8x5TISfJROr7nrHrOdLihT4hPwyKrila\nYoxcX1/zwQePyBW2057dbkcOUdi8pSdvt+2yEKu06zqUsY3UFKV61cJ1tU60s8uyUKB1JtJ5mN6j\naxWFQZL8rBDntoSrDTjeYqStpZbCYb+XEd8wYI2n76rsYDajXCBaRk9Hnam3CInrRzw+Yp7oRGy8\n0JJqs+sFUgp0vUcrkWaUmigx0Tl3ilUwRmKQtQbvekyNsoDIMsdMaRXNnmmpf20k4L3nbLvDasN+\nPWBa1lAqFRuDzI4alVs36K2qmTXIoSKifEctGswe543AHdJKjQXTG4xzaCtwCWsL/djxd7/2Vd5+\n912y0jx5cs1b776BHjshFIUFY+C9D95nuHWH/vwef/ZXf8OdO1/hrLPEFPFO8fTmCWFfmfcBlaB3\nlkNWLCvEsiXrnlUVUlwoujDYjCoTb37nB/zu//dHvH7/PWJcAQnpIjmUX1nzRMyBH7y35/6DPWtW\nTNPU2uxVKPUK1iWw3W7RFdIy8enPfJm7z5/j3YEaJ5YlojxUJdBgOe0yOgmb8dnCQaO1RSthc6Y1\nE2PF6J6hl81qreoUfqaQrykFyTsCilV0qhNBOiKoTuUZtGKZJxkL5EKMWS5T7+jbIhClqBpiSahm\nI9XOYjqDaU4cwS5KtX60daaWiyRwE4mucE7MCUcNpDYWI98qpYiMz7XqmtqCCJ3GFIfBYbXBu+4k\nQteqUoql86I+yCGQGkXJGIdSYkqYg3xWXOfRTg6wUgPBNfZt31MSzFlgIMfn1Wgh21ttmwa2ZT2t\nYpRQStGNcknEZYFcGLzEe+QYxfJcK6pI1HJt6bi1FJZVFk7X19fEXNDestvtTsXMh51LiYq2kiWW\nC6whgDr8ULWLEv1tKYXUzDf6QzwLgJoExrIcDoRVuKzydUewexYhvdJkFMsamFJmHCXqRrdZrLMd\nqROgCnCyyv5YB9Wt64ptkIL9ft8cIbHFmQrI2Ft9ItP0fc+6RJYloLX8mrEOZyzrNP/Qk7ZOc3Nf\nHN/YsgF0SrPd7tgOI+fqQiRT2lKXRWyhJTPPE+fnuw8hsTLTJFvFvh+omaa1MxgspohOVChCSuI/\nVMF6ma+VvPK1n/1pvvX66/zBn/wJr776CR4/uubh02tMlfTBYivf/Zvv8vpbb/Op177An//e7/Pm\nm/c5O7uL6wT7dnXzhGw9OVSuHj9lvrlBKcXDB4/53T/4U6y1bAeNdQu7PvObf+/X6K3i5vI+t88c\nN2HL+jAQSmWJlcePn3LxvKXayGHJfP/1d3nyZOKw5AZfSHLBpAS60g0btLYcDld85jMf4+tf+2m8\nN+S0YFSlVuE9rjFQa5Q2XffUJdAPorQotafTHteP1GooORNCZl2CZApZyTmKRZirQthpHNEqyQG5\nJkC6j5wyJUuOUolRwMoc00WlnT2+d7zvMJ0sSypCETuOZY5zw2EY0dpQa6EqLZvb9r6stWKzKu4V\nigAAIABJREFURK6EGAk5nILyjoYNay0W9aHt+jPpjtbQOnVO8GItbq6iRD951D2DmCYo9ZmBJFWc\nUTjjIEnKwzRNwtHtHUqJltla8PZMImpKPGmuBcLTXHHH4qJW5nlmWRbCspJSYBxHhq7HKM0c4sn2\neFQapCYz9MYyA+uysswzCjkIj8/pcaa93W5FaugEJLLZbOmsJU0HZEHf6F0xsDQpYa2FTpnT51ki\nTGQJbFucj2kuMmUVJVbpONaV8/PzBhJKDaAthZpGMfYDqYFIUsj0vUipQgjYrmt6WTlzjJdC7cc6\nMnndB/y5o/eONUXm+UBO0nYvc6TzrbIzFqNA1YLXiowmLxF3ITbF7XDGMs88evCAHBfCUtCqYGpC\nVY3RHTUnlpTI1tJ1nmGzFXJLyeQ1CO3aigNmPVTWeYvqe1QplCXAEsizxLa6UWZ0bhVOou87GWTb\nDmcGaPzCWg0hHlDmA8gHfus3vsGDd97kjbfe4WMvfYrRbLn//g9IGrTyXL838+1/+S/4lW9+g+98\nZ+QPvv8G5uW7vPj8jhHFy3bg9tkZT/MVb98yPP8Jy+PV8sFSeO+d1+H80+R4i8OU+Q//3tew0XJ4\n/S941V3z6tdf5R/9vx/wYN4T6Lk8rPxPv/cdvvalV/ja5z/F/e+/yXtvBpbacamfcHBXoMHGHhe3\naN2Ra2KfH/Lc85Zf+OXP8BO7a8aasN2OFS+2vRIxNbGu8qZUZcY5oDr8IGmUKSUUC9poioqkuMic\nAHAdpFIwqrCGiVgDPtu2XS5sjWNZDWEBTCCFAFX4m+uy0Pey7VbmGKvs6QaNso5iJes8a4v3Pcwy\nJwOxz9rWwlvXnRaRIIdbbZbSZ5wFh43NhYPGmAK5kvIqNlYluUZ9N9JVi6uWshZSOOp0M2OUZEql\nDcX1ZKUFjOI6kW55ibOepsxaKqYz2N7Sjx3jdqD6DY8fP2IJCyVKVEnvPdZqwSGumZxoQJxKqQmr\nG0U+V1ynyKGyThMxBNbme98MoogQji9QLSVn5sNMiFJsKBSjNRys5dE0w2Hlxe4MvWTMofJct6O/\nveWFj93jhVvnEAOTcxjn8cMIY4fPivn6SRuD1NY6i1crpkTnENB5U9WQZYFrasIpi08yjtBGM5mJ\nxQ9NyWFIlbbUQswzTp8ulKoKrrMkFZnCSj+eo7RHW0/nIZTHpHmPjhXv5HL6UY+P9BANcSGlDqUk\nrjRnT6ix6QCP9FsEBlJFDJ/WJCgr41v2S8dms8Eow7SdWA4TGE1vveTxaEXnJJdFVQ0V9tMMaBE1\nt1gKIeG0jJpaefz4Ebdu3UaVSmphV8APQRaahR+jJQunNKOeQnLCY0qkkrBdxzxF1uz5T/+j/4D/\n7f/4bb7z3dex9oJxt+Xx1SVGKfrO89d/+X1+41d/nTu3nufm7df5sz/6Z3zi3/s1Xv3Yx3nvzYf8\nzj/5Y976wbs8unrMbhy488LLdCVx/fpDzu9smY3my1/8Ct/8+W/w6K/+kPPhgpoU/+gf/1O+9eYD\nanVio80r14fCt/7NGxweX3L/rffYJ03KtlU6CnKllIQhU1jp+8oweL759S/xlS/8JCleCiy7fzYr\noy38pPIyLfbYUkuVMYkxp8ri2CLL8ypi51Jkg37ctNYYKMXT93Lh6XykGWVqEdxdDCKpcV6WP/lI\nXqfJ4JAd/vF77FJGdaI7XFqM8tjSFXzf4bKI52kVSA4RCS1L9P0AeNZ1IStQqmCcVLraKOIa5Pdy\nxBUwzuF1T9WVkCNzWp45kUIiF6ngiYVSZQMv0qINnbesaW1C8ITWHusHhlGqTGXFTbWfbgBwXoIT\nT35zmo+9OcFSSigvi7ijKsVo1yRYMqZKtdD1rj3/i2Q1NQehOtKg4MTw9d6Tc+b6+pKzbqBXhn7o\ncRvP5tau5UQ5jLEC7FEabS1d37Oo61Pbfow+9t4T18A0S5Ls8e84jgG0NegjXrC9nvJ7AoQRIb8T\ng4HVHN1itdl7Y5TYZWttWyAafL9h6Le4zqNUJfmOdd6L0SdHvO5/5Dn2EQfVCbGllIQ1BqeVSHOM\nPQ3qjwepuMCyeLrrceuaKFFwWtY7Nrsd2rpTe9ZriRU42s20tS0MbKEq2PU9uiIsxyapck5C1KqC\nw2GPQZ2SJ0/tfXvxylrJpdKNCoslNzmM0a6pAGRzK+Sgjv0+022e5z/+rX/Ab//j/4d/9q9e5zou\nFA0aSwiJhw/3PLmOvPDSJ4nLRF4vefH2PV547h4P/+Y+h8v3efDgLeZUeDIXNrlw8dwZn371Zdw4\nMCnLFz75InfvXPDKV7/OX/zxH/K//87v86+//5DsFGtK9EPPuPHsnrtLzoXvv3PFzdVKNQ7jDGrN\nEBTOVCgJYwvOV27tKr/2Sz/Db/76LxOmGaq0mrXI4kPRMqpQsuhpovpaK2tY0SngrD+9qVNKJ8H0\nMQe9FFFlaAw5yFIDZHmRchEARgiEkMGKnk+SIite6xbRW4+R8qBbWFoMVBobNIsedWpwkJglVM64\nhmprTijV3GklJjmYaxHpnDaERZwv1jls5/GDHKJVK0LN5HVh7KwsRcJMpGkQleRZhhjIazyRyvrB\nMHQDGYmQ8brCOlPjKl1VGw+krIhVoaxj3DpCCmgrz6cfhW5Ea18roo5wzlGausR39sT0VNmc/vsU\nKY0sb2I7vI9L2BPeDjE3yGbf0NUBiRC5YdmdM24v6MeOajS5Fq5vbnDOsXG9ELcsJ4XFUYd6dAd1\nnbgPZyVYu6olYdU7AQeF3HKjSmFZF5bpcDI4yMXwbJwnFKq26GsHfkqJaTqcnIxKZxY0fb9hGLJo\nazUSNVMLN9fXWGU4O/vRU9GP9BDd7kaM0Q09p3H+uACSm6WkRC3iWEE9Q2ilWiBrPJrry2tpnbyn\nGovfblBrYJ1njHakkglLRKDJMq9UzqKcZV0j5ESKAWM8mkCule12h/WOp48f0wZNIvs4yq2aKLcW\n12x8VYT3MRFDbrfcSlojOSe6sWPTDURfefrkHZ5/4ZP88i98lRc++Wn+8M/+nPcvb3jy/lOssTy8\n3PPtt+7z2qsvcbh+wDe++kt8/gtfxtXMxfN3GM9HDnFmsT3JjOy2O5TvePHWbV5+9TWu14LNB8gB\n2w88vJx56+ENxTmK9vhO4TrP2Ht8t0VVS2Bk89zIvFzJtvNmRRXVomo1ZzvDxZnl57/2Gr/17/8K\nJkSCrqR2qcyzOGQ+XKWcdJetXVaVRiSXOVnKmRBX9vsblkmg233nsKaihg6rDIOX9Meu8+i2RDgu\ndUIs+M6If7xBsiucwsoAckmtAllY10Cuin50UMoJKSdQYUk4BZ4ZKZQWPurRiWM9UP4t0hcY7dv2\nVrocZ2XjqzJNztQim1MmrmuzOkNJgXXJpwvfu4odxcWjNVhVWMNCDAu6+fFTViwxclgTymmUTqeL\nKvFhV510ECVJZhBKYZwoGCQZQDoArxu7sz47RI//tpNLT0NOgXUWvGTXdc1mbXHO0lPZbkdqY7Ma\nr6jKkhrucImJ/WFG90Jt6ltrXdohenFxS7gHVcj5tE17SonBdxLWp1uHV4RfADKfvbqa5RzZbtnt\nztAGSIVKAuypyxFDj7xXtdIyh19n+rFD1cS6HFjnnlozxulWEMC8vxGQivsx3s77oQdKk1wYaelN\nYVkCy7RKlpKqaCNvimMEQm5SG4wEdMWc6Lc7us1GQs20JaVMmtdn20OtWEJEd46zi3Ns5ylTZp4l\ncXPc9Kw5E2Nr9dsmMSdRBhzJ3CfwrtbkVjktazw5PkII7cMi2kSlQeWCVnDnbCsujP0T7p7f4sVX\nP8WLn7zHw+uZ3/6/fod33nifjOX3/+RP+Tu/8J+x6xOf+exn2dx6Hq8N2zv3+cRPfo6v2J4/+Mvv\nkYIB43nu7l2eu32bL/7U5zgsiTVHclz4/htv8c57D+j7M+LhCtsPDZtmqK6nFkfG0I3nmOxZwszh\n5ilpmbFVsR02nO08m03h7//qz/Ibv/Jz1HWPyhWVlpOkLB0XKsY+o2EZZP7WWJNag0qFuC6SJ9UW\nficuaM7ECEErain43ot0ZhCZW8rh9OFe40rJCq06IdJrJLlTKbphYDuOlBRZw3IaGZQGrabBL3Su\nmBaBXQqndvEkUWoRFqYtRzabzclkcfxw2mowRaGiVDumMfurKlRbJNzQNqdcFPBJTlIMpCW095k7\ntcY00pTSipKiUPmXhbAuoCwUTcgr0zRhrcd0x5gaqLE2aY6SrCFrWeZJ8HzHy8IajLPNU78QebbI\nstad4nOOj6NJxRghk43DtkmM5Ps11jFYw90X73G+ruyGjcwQHaw5sbtzi4QSHkAp5BgFY2eNRGar\nSt9LhbzOy6lzk2VjxB1n13BKJ1ha9lSqBddGE8PYsdkOlNLh/XpaEorMLbf3WW4XpKHrRAHSd16W\nyimyTAf5umob1lHhneNmWQjL/CPPsY92JhoWkSxoQWRRxB9sUA2gALVGUnO7SMCUZVkiJiRMN4rU\nI16zVZrx4pxuHMTRpFemcEC1rerxxXedzFCrFZ7o/vq6tYzPEG6SX1NOG1fXZnvWNmalkm18LAod\nodCyzo0i5MiyRhF3A7oWzu88h9GGkgK9NeRSics1PC187mMXDFbxD37lG/zF2Xf507/8Lq9//zu8\n9/67/N0vfZ6u70B1uGHL3Zdf4yt+y0tf/CaH7e/xJ//0d3n33Xd57rktr7zyCdGx9o6t63nvB29z\n8+gDxn7ghXt3uQyZyyWSMNy5e4v+/IKcNGtaiBbGzotmc5UP2DCOnJ2dsdkUfuPf+Qq/8vNfxJQF\nax37/VNiXrBmg9acqhetdYM7rMKjnCvVe3I7LGltWDRWIkWMoe8HciyEEk7jkBgjfd+jKnhjwYh8\nUeyItbFlJe7FGsHcKaPZbbbsdjushpVCXWWG13s5yOphIYdAXkOLs5ARTUoJSm5bWHuCo1BrA/Va\nqUxTOllUnfPUkAXH5qII95UlRgExG+Mks7woaqmUVFFVo4uAfr329GP/DLzhDBWpiCuFkLKwRbVC\naysxw6WQlsScr+iaxlN7jcvu9P+ptcqmX0knUUqRal45tFUnkHQ8FPY3l1hrubi4YNyMQtI/5TU9\n07gOw9BYBEfko1TrtnOomrl16wKAzlh6bVFVMa2BYdjix4GhG8nrwnKYTocbVWJLPvxIKRHDs8sy\nhEDfDyezzH6/53CYn6l1tht2uw1nZ2f0vT9JoY7b9NL0sSLbbSYIrVvqL/hOMs1SrqQwk7zFaMkT\nG3rPdrtjOUwsy/Qjz7GP9BC9ub7h/OK8OUgy67xQUyXGTFhSi42oktNOJVnBgh2mwDA+y1JKzcli\ntENlmXnN8yQLoHWRCNicqc7g24zVe0/x4o2uLS7gpE2DkxMqpUTXuxZ/K/MkbQ0YQ6cMIRjmsCfn\nQIyl/b3HVsqy6QeWOdJrwzQtEvdqOqwDc7iilshPf/IT3DWOYRVoxLfv3+d8M/ITP/E55ieX3Ewr\nGYfrz7l1x5PGzIsvfIrO/xGVwqNHTwhrZBh7lqdPefv1tzlcPuXOuOGVT77M9WHl/afXfHD5gH7c\nEVBcTguDEgxeXlf8eIFv8qlaFX3vGUbNL/7Cl/nFv/MldD1gsCxzxLiOKd6g23MWS8YUc2IXqCDC\n+Nryy2ujKQHEeWUtM1ZB8oIwzH2GDOsil9GyzHLh+Z6lpZbGEk8OFuM6rFF43zf50SwVyWYUr3dc\nn7FgG+pQo0hxJYbKQTniGoiunma2gFgZP5Q5ZFq1BXxobhhRRtOPAyoJrFf0r3IIzM1x9GyGJ/bU\nHIVKta5yEY3dBqWMCLyryNZjTqAdxooongpdN6J1JIYIJZFVQcWATispmdN70jl5/o8z/JRTw7g5\nrJEYbF1FeXBsy6c5QYOa0LSyRxzl8bnr+4G+X5jn+URQc7aj8z2605QUGawS+lbV9NZhtaNME6kW\nRusl66gFCM6hmQliBWVbDEuR0UvLtvpwKkGqgicshWbz/eGcquNrczw8Q1iIMXxILhlOn22Acdyc\nFqGUQFHCGBAteqAakUO6I7jF2ZMO9m97fKSH6OEwszs7x1pPCAuHw0xcIjlW5mnCec+47RmGIzC2\nsp8kKG4zbptQ12EVjMNAiiuHphG9vr5mPUyonPDWkZusZFk00/7ARbPfdV3fbl9ZMNGkMUtY2kZW\nXrjQkG3GCLMxlyyea6vQSQKuREcnf8Z4B0WhjMN2PbXKU60wxGWWyhVFVpVH777JKx97hdsXt+hv\n7XB/ObAsB2LV9LduyRtGK4r1mN5w/f77fPDg4WnkcHN94IOHD1A5MNgK657RKDbDyLR/yhtvv808\nz3hvubm5JhrD7tZtbm0NFIMxDnJguxlJRXFx+y4v3DvnJ157gW98/Qt4lbEoapaL6mq+IlaFo55o\n8rnpIYdhaO3YjGqBgoKzE2tvaqaFHCPjvbtY3+GTQhWFouAbRCIE8SyHcEPMgVoTRYnnfhhGsYU2\nuIUYJgQTCC3BMeU2xhFoTFwWwrwQY6ZWxaQU2cmHyvhGAdItGSFGceoYQ2mBZSFF2daWQmckP16P\nLd/IO1Cp8WyP9CEBSS/rxGE/iUJASQJpWhuZvvFxu37AekdIklhZjUVbGWsobcSKmCKmVrqWNKpT\nbIdHEkBGLgJHUT98yAg4R6PV0SNvqEUxDFtSlddkHEe0McLxVYj/PYtWV7c56nRYWFKg1/Ykcj8B\nzrXDaNUiS4S01HUda27Ju2ukb6SlkANxWokkumELbUQW2ijBebFxHmfFAFWJgaUbBHZ9YvxaqWoP\nhz1HFmnOiWl6Vjkeo4CEZfCMwpZSYl0E7eh9h6aKGqNmUpDYIWcsm/FHWz7hIz5EJTPHULIcYPub\nibSkdkhVVMpsxh3bC4FUPHryGGMEZluVZrPbkmoRPBaKZb+XFnyJdN7jtWI6HCTcyktg2X6auH7y\niO3Y4+z2hM5bpoNUOgUuL69wnUUZTQpSleQoVjGllFjTFKhYUTrjnaUiFY2znWgITU9Kmd3ujN3Z\njmnac/xMe+VJJRG0YzkcsCnx7jtvcu+VV/n1v/9NLl55ke9879/wvTe/yuc/9xOotBBrpGrFmgvr\nOqPCNf1mw8P33uX5O2ecjT3pcI0NB3Y68+RwxYM18/DpnkeX15SWyV2mhRQXzjaezWC5uY5olUCp\nhvfbcevWOXefH/npr3yas77SWQWrE5xdzRIpgSfkJJVP+1BlZO4oVWARqVJr449witqE8dP+wObe\nC9IRBKhdx0Xf0Xl7WujIgWSZ1wOpJvq+Q6lIPwyM4xalREh/hE+kGEmxsM7T6fDOIUqOT/selmUh\nhto+0DIj3Z2fn8AgWuu2vZffk7maHFbHSswYAYIY+8wVU4thWSbCcmj+dcWw3aJxRGeZDwfWGAlr\nwjsnB7aWg8L1Pdb3uEETkjBfTYTOW7zVLPPUQg1BF2GnqrxCHqg8c+MJWxUBJ9cqowet6ZRpphOR\nnRUU3nUMg2+owCZqD4GwrHj7jAlqlMG6TmapSzyNDWgBbwZxWIUkbFWNIlpRBdBkVKoq7NGp1j77\nKUaCi6cMqWP1OQwj4ziK+D+sVCTBtB+b/TdlBtso+loE9c+CJJ+J4o/yp6PwX9xnnbx/2/O1xoRX\nmmMM0Cl+phV1IQSc7U7V+d/2+EgPUYkyLYSQSLGc2sGc5dckhdMzjjuqyozbM1I1rOueZQ7Ei8Rm\nu0FhW6VYPuRAEVmUkLPr6YY2VrEuC48fPqQfn7V7R3lEKQVv3MmmZrWixsTNfi9C5N2W2BYjNdbm\nyS9Y0yohY6il5aL3A77vKUrshbFEBJptqCVzdZCcpqHIv/3+u29y1yl+9Zs/x9nZc8SgENNVJS4T\no93y4MEDHr7zOvnmAxEH9xu8tnz87j3e/t5fc2e0sH/C4/feZ3f3k5zfucdwcZs3vvt9qXBURZfI\nbrAoIrUWpsNCVYW+29INnt5bzkfLi7dHBpMxGWIRF5Cx0uqsUZNMRPhBrY1XShwiJZ9oVmJ2EI2u\nsZZh2EiFnyZKKQzDBlMdwTisM/ReExbDfj9J6+uebfv7fmTcbLC2FwpRfhaQFkIghoChknJoXceM\nKvUUudz3PTlXFA5lDSoLVk63PCODyKF0cznJcjCcqhjZ+hdEllioWtwsyyIfUmeNHAqlEpYFtdnK\nTFUbjFKEnFvek8diWXKkKnHiFCpOazRy8CsDy5QxSjSfcxY5lG1zzuOS66gkqFlQgBVRQiht0TqR\naqYo8G2Lr52lBrkYfNfTNz//NE0ydshVzB8tVrgAaE3fj9Q6i966jbRSSqQs1DNvOkIuJ+ut1g6l\nJIkzV0U2hqJkBNcZS8mtMzP6BPQplZMCxjnXsqAksVQrhU7yNdY6ifPQ9cQRtda35+TZmO+oXECr\n5lj7UKy00fTdgPOyKwkhsIalyRi10JwKpJKoP5rJ/FHrRC0K3eYVmtu3n6OUypOHTwARKmMM2jhC\nPmrlYF4WYoLHTwvKGLy1shvKrfJoN1uk5UqrjFfyhhh8JyX+GrlOV2ig856YE3OY0dawG3a4roci\nwIv5MJHSjTApZ6EQOSee55QKuWSUAeM1ushsK8VK12mxQaaJVOSDARXfGWrVrEuhN5o6H4i1MDrL\nwzf/hs4OfP2nvsh+ceQ1gUrkVDisMzklHr9/n8v33uRqUngnS4/LR494fps5LIHz3vPxu8/z7nRg\njY6rw0xFUh5LSXireeneXe6//YjLqyescaFeVS7OI9ZVtkPltVeex+cVlsKKZlkb9sxUVCrolCn2\nWAEpYXpWWQx635NjJjXKuGzxj1k7whrtu4GUivAdcWjtoCZSaeW6Vi1C22Jth7EV5z19P6JtzxJu\niOt6EnsvjVjeWSMEqSRkodRav+12h/M9xg0obXHOs4TphGyLMTKUyhGXlyugMrGRxaxG5mNyG8vl\nTAVlyGWloiRvvs1QqTBNy2nkYn2PTxXdWba7c5mbZokgXtcVu0woNYgkrBZyyIyD47C/YdpfiS3R\nenSzScdSsVFGVVZrIuL0Ug1ogxKKfc0SRw2aXCDFQi1ykZuGizxeRMsaWBfRUNZxg61i7fSuJ7pE\nnWdQ8rpoY8hF9L2mOvzosVYWNsY6nOvIqA+105ElJxlLKE1n/SmhFzhdukftsHEW3cAfpoFdVAik\nsKJyFKXBkdjm+5M5QxmN69rXtX+XMYZhGEX/qZ6BuY0RHfpJdZFLixCSZZ42qsUr/xinfXovMpZS\n5Mnc7raUUjnsZ7S1WGdZW+JjLJFU8ql9UipzPe1RTzVjP7AbdzJLiVGcL4oTpdu04bZRmrFlNXXW\nMVtPmBemeaaWo5jYnMS767rKIkgpxu2GoZNIknTa+HtZKKwyQytkikgM6IYBYywpR2qJ9L1DGy+O\nmc5hjMdWy9NHH9B7h9aVcHNFUpb3Xv8er770eXTnePTu+9x/9C53nr/N+fY2Slvm+YBSmXvP32V6\nes20P/D6977H2Wt3UfnAxfMv8K//5Z/x1Nwibm/z+Ooa1w9s+g4bVr761a+SQubq6or333+fUGRZ\nEkLgY3cu+PTLF7x895x0mEmdZk17lhDJqVBCJoeVs3Gkc2fPZDBtM19iao4ziSNW2qKMxbTKPueM\n1wY/bokNjuzdAHomhYVlPbTlm2HYbgFhXWorPMw5rPRKOoUlTicXSggLwtL0qEYt//DD9Z1g97oR\n3w0Y7wjzxOFwYE2xoep8A/TK4UApz6KHa8HERFX11KUszmGURQMJ+eB1wxY4LkukUcmI9KrrN+gm\nP1r3E73TuOFMqqOUCNMs2ktrOBwmDlkkegoDyhBTAqXpOonZiOsseVBVi6IgZfHRe4/rPKFkahT+\nwJqipLHmgipKQCaNfXqcGUr1LqkIzglVTXUtLtn506xVa43vLCGBy2KtdNbj2vb+pBdOGau07A00\nhHURiRtSLcfSIpUbD+rokprnQj9uGTabE2zkmACQkkTLgLT+tco4qdQqizlaflop2MY1EDj4gO/s\nqdtUyogrj4IqDcJsZXlVCvSD/FtSlfHZj3p8tFDm7Y5lnTAtITKVjFKacbs5zUgysplVDULRjz27\nsx1aW8aNkraiSMvijBV+aAER+iVxlFgLymCcYbs9ZzUH0hrwvmPwPfubSw6HeArOK4D1jmVZRJeW\nCl0nuCylFGqN7QWr0q6TWZMM2mOIOC8iYmUMa5hIeabvHFGLH7vvB7zxxHmm3w7ixgmRlDKq68jr\nDe+89W38eJf//h/+L/zzv/4WL336Vf6L//y/5FMvvMDXfvGbvPyJu0x65C//xZ/zrT/7V/zgrXd4\n5ULz4pnnB6+/yf37D7gfL0nnE+PZOS+/9BJhTWQNw7DhrTfe5PGjJwKK0Jm7zz3H1jtevjvy5c99\nnLNeM/YbjO4o5QAq4e3APC2Ew0p2lU5fcMymkdwgiYDQWuIxSik42yKxrUNbS9UGTDk5g1LK9N1w\n0gPWsLBECUkbnYA4tJFlwNqg2EYLwjB18wkMoq2la5EgtSTCqgVirCVwrFAxzjO4nq4fwRiMUShr\nTgyEaZlPs7CwLC0ZUlGyZEGVIjO3YRgZNiNZlcaCk27Ke81ms2nLlPkZrUm7k9st54pWmnHsYA30\nnWD2tHHMIRIXoRB522Eb/9Z4z2CtxIDMgYIcpBrVtv6JZZqpOQtBTEs1pipYZVlKIKUMGlKVoLm+\n6/BKlCylSFBb1/WneOBSCl1nm1yrYDtPv+llzlgiHZ1YZDsZ45imtNBHZ9VRs+oMnXM4bwiLjFhy\nSgLdHjy9l3GQURoamjCEROHAZrcTqHaVbs91HuONJJ+u4LqOJUihc8y4omoUFmqitnSFY0V6stu2\nn2OS18f5HsLCsszUKpZx5zxojcv9KWL6b3t8pIeoIKt6ai3i0U2i17ROKrmu6whxbd5fEUefn59j\nraNkjR8rvffEIFnaRQHGykysisbuOCsJIdB3u1YhGp6ujylIfnjX980Tv55kE8MwcDg/QqemAAAg\nAElEQVSIABej2+KinMTRMSdSCQy2p+sNKntKS5Q8HhD90GFdJUSgiO4tJyHWZApZFaKqAktIWZYf\nIbC1ig/ef4OQ3+PORc+XvvIVFtPz3/2P/5D/5r/+rzh77jZnF19FdQOf/eSn+OS9e/zRP/m/2W4G\nzkbPk+uZF5+/x5vvXPHug8f89M9+nfPdGSlGLq+ueOftd5n2omCQOW7k7q0dn335OT77sXOe6w22\nFLzrKQbs0OPKgA6OagurEh94FwR6oUrl5vJa5pRaS5heo4SP447x7FwcRbWiSzmNW6yz1NKQdwpy\nTQICOWLT1DOLYswC63DO0A09nR/RVlrh6OQA1yis01AcvpP3VT3Ow5GYDe0cxShCDGLj7CSvPYRA\nzpGUKtN+z/76Gk1l19B/OaynP1NjgBIJBLztGLsR5RROKQarKEoRomDwTA0iQW6pnDVklPVsnEOl\nTF6uuXoSWHNlzWBsx9nFLSqGXDTOO4bNlmWZsOtKPxxtjTL348jLbPbM0ohM67piOskJOmphJd9o\nQSVImy1DQ8sZIyOXwXck353kQEf513FhM44bcpFc+nk54MeBvh/FsVW1RDYXMWof55JFi3xIVBEt\niTfKode7o021Ie6UwpqOVcdm7Q1Y76ApC1zvKXknM9QgtuojzF0hcqzj0k/roynAUpBYFWI9bfaF\nwrahIoeztZZ5Xk+fcW29gLXbRfujHh/pIXp9c4m1pum7WmlvLGh5EZRRDF7sWKlESoHtdkfXDcIh\nVQtoi9aVmBJaSQWDaqFWzZN7zFY6AgpMA+0CzcM7MPQisp2W+fR7IoJ2AsZtUQix8RQFVBJIVYNR\nsjHV4gihOlKOrFFWW9ZacszEmFnngCpXUBS5RlAyZwthxgOds3inGX2m3Fzy7/7SL/Df/s//Jw+C\n4q03vsef/Mk/5+e++HmsMdy+uOC8P4Of+Rk+eOOv6IzhyYP36O2GnCtPLm+o5/eo3YhyI2m9JufC\nfFiYb/bkkshRQ0qYPPOpj53x2ZefR80ryveNU1DRxuGUkO696emGHu0l511pCYBLQRQMrh9bW+3w\ng5VwsJ20/UuUGBaFoEYpAoXwfYPgGktuHITOebS2eCv5WuEg88u+H9sSx1HVMVE0shzkgFg/1G7X\nZv/UxmB8w80Bh3VhWhY6aluGydLPqmfRxiVJoquuYLRCW5HSxSgMTZUKzw3y3nM1UYsiTHumy8eo\nWgnLxDTt5SBwAsnWykqMC5qkNa4E5jWzpEqohsfXEx88uWF353k+8eqn2Zz1xJrJqaK0ZdxaKILA\nk0C/TK7CG625UJKoD0xsWlYr7E3nnITkzYHpMGOKfL6WMDXwhwQ2HiHVKWXUGohOZs4hJ1ISB6HQ\n/SU0kiCHFGi0sk243qAyqhKSjLlCFv21qpWu76TSMx42QtVPJeJtz5oXauMTSKRISyKwBmm7ZTkY\nh4EplxN3gapPiQHKigzqOAKQvK0jgLs+k+O1yjun5TSzHrdbwhwoCHdVITP8wo9xJXr/3fsMQ8/u\nbIPzMsw3SqrR6/01Xey4uHVGVc9cMWJRq2hbWEM+Da5VqcxlaaFbDlUKSrlTJn0phb5z4pdvT8q6\nLrhxe/Lun11coCd3cir9UAtAKyiKzJQAqi4/NHTW2siWMknMrokSEDYOHuPltlvzwnxYIIN2YN2I\nsho3Qry+wRYgRKqdKNOBhz94i+nymu+//ZB1esrr3/0e3/jST2JNh3IOQuTll1/mlVdeos7voEvh\n/QfvcrPfS0xsqlzeLPRug7KO/WFuvNUDEv8s9Kjt4BlsZGMzbhyx/Y7FrFQrFVWKCldFMzgy4jZg\nEDmQAsZ+IDrXLoRV5oNewshSSiJ/0up0kaWcG0xZLtDz83O0VdzcWJRGWiknW9hay8kNlUuhVp5p\nBXU9wSUOs8jUtmOLDW6id0kpEIdTyYl5DUzLcsqnl3lgAmvprZCgttstKa7iN7cW3WmMQmalgPcd\nLjxmXQKHVSj0y7SSQmToHCmuhOlAjivD2Rnu6LRC3EAKDU4TY+Lq6sB7j/dMxbAkwweXb/Lu+4+4\n9dxtPv6Jl7n3/C022x1GZcIy03nHskgCRD3mhX3IJ+69Z7M5Q7fqX4hUUhh4IwuTWithXZomNnJ+\ndvt0iB6lQceRWkora1rxWJQCpcR8EmtpNt+K70Z625FKZk0RVZvdViHZTVkSZaXyVQzdSPQ/bC3V\niPTJGEPfyeHe9z3KioZVqFOS3Ksq3OwXUgz0vT9loHlgs9kA0l3QQNkSm94Wze3vK6VgrCeVCim1\nBNueGArzsuCVRusiBP4f8fhID9GXPvFxLi8vxbusPK6JtdGK/TzR9T1dvwGjcVmWCnSdUMPnmZwj\nRQW0NdgmU4jNdZRzFiiJNijr2HY9yzJxOMwyRjDgUhX+aJXZphk6tl3X2p/COq9448k1oa0m54Ze\naz+HxZMW2d45C6WI736ZE8Y5+nEk2orJA+NmoPcdkzoQG1otK8vZeEYKlcSKGhQzGRvBJsUyX1NM\n4T/5zZ/n/v/wvzK+eMELdxxVr6hefMxJr9y53bO1ijBBuDE8uixchUpUiRIeo+aHjHrHzbxg+4E8\nHajG484X6qRJyfLkceXmxrNPHRsPuAXfS1BeDIWaEs5prAVnNqJemAslR0qW7bTzG6YlsN9PDC6z\nUYW63nAZrknKY/uRwfYMaLqUCUZkJCqJjERh2W3vsKzX5BJQWqLZrDfstrfFprpKW9p1jqUorPaU\nupJjQcWKqQkT5VK9vt6jnUhxhnGkrqvIXpaFMUY0W3HaKMOcMiknQi04WzjfGlzpOPMFx4KrlZun\nT0hX16JRLIWncQJtRKKXFbVorB9ZVsW6Km5uFEoNxMuC84mq4Pz8jOv9DdZqHj0O3MyRJ4fEu5eK\ndy8P7LMlmJ613uD6wPhXj/n0y/f42lc+x09+6iXG4UA83Mcl+ftK7UnZMccbqoHtnR1n23MGL5rI\nJc7M04J2HZvtyGIszhooAcWOeZ4JMZNKZrfZyPcfnohNcpoFSm0csakfGDpKVnSdw3WyXA0h4TuR\nGy2LjAvy0S3WsppoLXRuSam5zliVqdq3SO1EjgGTWtT2OIjEyrQcrG5l2t9wWCPODXTnz1HdHrsd\nMEafyPXee/HlNyVKCqUdjhJyN6qO6/0NOUPfyUG/zGsjUwl+c5qvUKpSqhQ+qV2cf9vjIz1Ez862\nXOy2TJNsSYdhEJG7UtwebtGPA8M4UkrhZjpgVCGXyDiO5BIlRA6F1RZrHb0L/5ZWVLHkTAqButmS\n49paocowjDQsISksxAbSPZKHpsNEmBfmaaJzns1mw26zY43S0sc1YPGkEKlESOJsyihZHpyiLQSp\nt6wTlCyC/RrIYRZlQgrkKHNSjAXViP9kSoH9vGevOj712if52td/lp/8whc5RmeUAhcXF9TrS/K8\nkg6BZV653B+YUyOEZyF+Tw0M0ncOVRPbix5CprcdG7vl+ecv0F5TCbKAKhqvOjYXZ9Sc0K0KOcwz\npURcEXRfDLMImJ2VGV/b3iql6KzAq+ckDpVeW6wSSk5ZpMq1pjuxLY9jFGNkGz038IO3wkzQ1hAW\n2aQ7Z1iXiaJlJmtUFctmqhJL0Vq0/XQDxogTKCXREVZIMbHmJ2ztDqs0TidUKdi1MDhD7zvyvCfv\nD9zsr7h68pQYZLPcn2boEYVhXgJnZ+eUIgqH66snGC2yu6pAWUvIcHOY+MHDJ6xrbPi+jqc3E49v\nZi7nxHXQrKYjG0NEc1hvmGfL5ZMP+N63/5rPvPICX3jtFe7duaB3A/NyLZtz77F6ZF0iJlsUBmUL\nyzqzpkTJCmsM57uBzZBYloC1G+K6p699s9oubZst2fFHbezR9dR1jnVdORyu2wjFs/OS/mCtZxw3\np0r2+ANqizbP4rJqcsZ5WahVsTOezrckgyjKgBrlonO7rTxHKaGdFElKKcK6UJJYT8/Pz/GzzEX7\nvn/GDmjvw2WaSPFZhd6Pw2lUc3PYY9qhG9fAYV6wTngaT58+gZI4u7hgd7Y9QU/+tsdHnPa5YnzP\nrdvnaANXV1eUmjg7O0MryzoXmWMoSGGmpMS8v6F3lrNNT3CasR/l5rJOMruXFrDm/MlhIuCGlUo+\nRaiqImODNUZiLpL2pyO976TCMxIVnGMB3fSnrmtxsrptRAXc2jlLNZw0gd3g6McNyiisMyzLDYe9\nyFEG29NbQ1Rgx04sqUsQFGDXkRUYIx7ozbDBjJ7Pfe7n+Oov/6ZoWDdepF4lMq8LO7OhxkRXLdfX\ne55eXfNoWThUxAkzJ2LOhJSYQ0SXTN8ZFmCoHf3mFmfbc8aNAZWpNZHLymgkIkIXhXc9FfFV+zKz\nv5ka8QdCjOQS6RSkWskh0zvPpm9yoebKQQlRPFXJdo9hQidN32vmeaZq8crHLLEeEoPcNrVlxZiC\ncQaPdAZrXLAlEWeJhCDKrHtZFtALt+7coVeaqBRVGeZpaUBliWwxxqLVjRx2ubA1Fm8UtkCZDnzw\n8D6khNWSNzVNe6zvOL99i2VZmNfArt+Jq6W3LKFwfXXJPK8436O0YVpXLm/2GD9gfUcoipupYvyG\ny6trPphXpjkxR8NSNDMQspasJatxzrKGFaM1h2T4i++/y7e++xafeOUlvvxTX+De7Y6UxAww2J5d\ntyWmxOF6Yk0wbAbymlCmZ9Nv6DpDsALdqDhKmAgEYsxoLVLCo6mgHzqUlowjdMV13YfcWzKPHLNY\nIn3XnUTvRypUdYaUV2oU5cPR1KIqDYQuRoxj5ajNiraGNVVijgw54orgAEvNkCNWW7yxkrmlNd4a\nsm0A7SKRIqVILHpKEn2cUxb7d5GlkvM9qlQONzfUErlzcZuaIzmt5LWw3++5vLzEOcc4juKmDD/G\nOtHLJ0/F6dK23+NuZDosXN+/z2azwXvPNiWU4SSkrbGyv7nk9u3bjMPADMRlRdi28iIZpRl9TymZ\n/X4vH6xeZjxxWVnbm0BVyaXXTkC70/U1aVnYbs6pWeYzXRMOr3MgLE8xzlJzpcRCXGZCmCFbjLNs\nNxuwjopms92QSyHXdNLh1ZjpesmEkkxwjTWV3lqSsmgr0chWO7zuWFOmGwb81vLa517jcFh59P5D\nci0cnj5hoy33djturi6J00Stig8OC49DYrUbkXKkSIxZNtIhsN7cQBG1Ql4KZ7d33LlzC+cm+rHD\ndIZykKTOzhquDwdicaCcuKP6Ebfs0aqQjeSs15go6JOtcuzNqRq11jKYLTTR+pILKmdSWnCtCi11\nxg+jVAIYSs1UDFUbSgmtqpEKd7MZpE3LAd+E0jmsbXEnVVZMcOu5u5xd3GFJmZuba0kf1StVaUqO\npDUwbCPnXkOuqDCzf3JJ2B/waMp0EKunUnhrqMMG33dcPr0mtZZzXivz0qDFUTb9ttNkNNO0ssTE\nlMFkTY2WKRce7wuxLjx6MnFQI7U6qpHI6lgSuRSoBVMquUo1qCosqWLoWIvh228/4m/e+2NefdHz\ni1//WS6eu8309AG2XAu7wBjInpI6Sg7EtCdvPbX25JApRbHMe1QppBAlCLHli3lv6IeOs/MLUC17\nyLZc+u5Di1kluliZTcuMNRUhTxljUE7jq0PXQo4O69ryaVmIzRmllKZWEf4Pw4BWFe+NQFyozRkG\ncV1QOWGVZvA9pRp0rsR1PR2YqdGfKB+i7ysjYYTryrLM9PPMxa07OGvpjOX64WNMfBayF0Lg5vqa\nWopQxrRrwPYf49z5Rw8egDaMuw3DdkPfjdx78QVyzrz33oO2je0F+OB928ArppsbvLfcuvUcOUSe\nPn0ipbntSaFt0BsdZp4meeGVxlmHHjeC2YorZKFkmwolJvazWN9uBgEahHnBGXvyUO/3+9PmT2sR\n7lPkBcyN2KOyCL3tutL1PYf9TdPcddQY5JDX7UVbF/5/5t6sV7I0O897vmGPsSPiDDnUXNXdVdUT\ne6BtUi12S4QsyhB84R9gwMOFDfvOf8awr3xnwPCNYcGAQPtGtAVapGWq2d1ki82uHiqra8jMM8Sw\n52/yxdoRWW2KJUAQUAyggJN5TmXm2WfH2t9a632f12QlRhWYokZXiaAdOognuMprJmNQJlJvZGnz\nZz/4EaOb+NLX3sEu+epFmVGuV9xOM08OHXfecNM5IkLUCbMwJVEish77wP6+Y1Ot2DQrri7W+HkS\nkXaWkzKDUQk/jxJ1O8+U1YZkNFM/k5aF0OhEn2vzjLwswQVSKxKbPFPkViDD1mqSc/R9C4AiokPA\nE5hmj9YZ1Wotbz638Ei1QElSUlgt4voQnCQULH7neZBI7Kpa0bqWth8Yphk1e57f3nH14JqyLNnv\n7pnHFptKXnrwkLrYCus13kB3YHdzi02KMExMfUvUBq1F69hsL3BeIpHH0WNtIcAPr7k/Hmm2a7Qp\nGeeZYZxJNqftem7v9+i8wqkS7xSHY8ehm7lvR0avQGX06gTuD+cFphQoSHEWCaoxYpt0EazF2Aqf\nIsPg+OnPb7l5/of87ne+xbe/9hZT/zF37XPWzRW5qUhBeKjHcWC/30FzKSBoNy7U/hcZ7CdXkbUl\nNheZoNZwileWJWSGm2eslfA5WxXnOBjvPSwyK1kAQZnnmLw4Mwk0ShxnOmeaZ4LrGccZZTJ0ZilU\nSZZr9DiQjIQIZsYuCQoTLAkUOkl3ORw7AdUoWVjGGM/EMLM4GXWS93HbtYy90L5Op9G+OxKdBPMV\nRbFYZxNVVUnkkMkZR/n8Z70+1yKq0MzjRKhrVvVatslzRGvDxfaKp598wtAONE3D9mJ9Dprq+hbn\nHHleLXiyxOwmgo1ClJ8lN1wCxuTCT/1AKAJ1XdM0ayY3MhymRValZfC9fP3YSeE9cShjjOJwQriG\npxnMpswxGrohnVsc5yMuAcaS5TkpRrKsoLSGKbKwK+Vk2h1bYqap8q3AWArEO+0n5tHjomKOjo8/\nep+3v/mbXGwf8PD6Af/of/tHfOndNxjmgbY9cF0UTFnO0xDZZw270RN1eWYpGg3ZsmmdXOT2vmVs\nA68/WlHkkq0dPEyTQ+mMZn1BnhvJuVGGzXZDtWpoNmvmqRfiv3d4ZTFWombzukK7RNFKyqqI4BWT\nc5KIisiFQnAS65KiZGd5BzpjHPuFxRkgimMma+TUr4FcGTwJN43E6NFEhsmTlMXmNXkN5jigrcz3\nbm6eU9UlDy4v0A+vcUPBZlVyUZeMbctw3IM/SkTw5NHa0LVHeahWueQCFSUzEa8U0yiulmkQavo0\nzWwvH9D2PW03cBwGpgAqy3HRcDspxrYn6AJTaAaneLofmb1icFFkQtmJOSsZU1YbMrPYVoPoQTSg\nlZgGgg+SLaXlwZJCxe1+5vf/4J/z3ge/4re+/TbXm8f0U0s/fcJ6vYEUWdcbYtLsdy3T2IOfqMqM\noEReaBZX0cmxVZYl8zySFn22jXppb1e0IeD8SEwlxtSLpTTinDxc51n2CDEGQi3xHwo+9b6p2VQr\n0bK2EaXEIJPUcm8YyVDyC9YOkDjk/oiKi0tweR8Ofcs0TQttv0ApGP2ESg6HKCjmcV6MIB4PzIss\nKvgZFTzzmFivVhilzotjGU3khOAZppGmaT6zjn2uRfTBw0fSspYlZbUmGcvhsBeXBIrN9orjfsf9\n3V5gquv6HCfb9S33d7szH3BmgvRCCiUxrC98saf/ItIm5XmOqo24WhaHRb0ssWLkfHossvzsePAp\nSp72sriqtdClirwEI6ejaZqJSuOnWdrIRSgseD0HPlBZuVEH3zK7HqNzMgrwCRdHopuxMgZiihP7\nT57w7JP3efsLD/ne977Hn//oT/mTf/aH/Pv/8X/Ky49fIjx9zl3QfOgU4+qaOM0Mh2FBsR0pR5Hc\nZFnBBx+9x+HunqumoSwsRPFLq6jY37fM82OqQq5T17dEY3j58SvYQhiMyhiMLXFBoXKNNopitSLP\nKkIc5XRiNEVZoPMMN48oE6myHKM0zo8L3yDilYBaktLMbqQ97M8AC6UUFxcXhDnStwemYcJqhY4J\nN0x0U8eocpKJ5AqyvGJzcUUdHMfdTk5QKpLmntcebglzwbjf0919QphG8pjo+hk/O9G5eiExreo1\nicA8eeaY8ERcAOcj0yigYWMzMlszjJ6bmwPHcSRoS7m+4OO7Pbt+4jhExhlcmqnW0oL2AaISeEck\nYRd+ptJK7KNaLwBhsCqTB8piIlFKOJcyLwYIRC2xGX1M/PAnH/P+hzu++e5rfOXtazZV4nb3MUZX\nFMUWYywxTWQ2Ya2hMBq/8Dnz3LJaNZR1ibWaqiqQGJPIKT74lImUYuRw2NO2R7CnkDvJFDPGoNUS\nOujDEvGRnR1tsqMwkPQ51FBnQldLKTEkiW0Zl0QCrS3ROIKbGbp+odiv8DGxu7un3UtQ4mazoSjK\nBVySY7XGe8fhsGcaZhJiMc/KYtHBunNagYwr7Jk9emKtaq0Z3bTEkOw+s459rkW0qFdUyqILWcQU\n1YqiqsUyGAKFzbi6uOT+9jnjKK1bXpas1xsRD48jm82WoqrP85CTXi44AeQWS0ZLQMLLlFK4GEhR\nFkHZwgY9gRU+3VZJ0mAFyIZdW3P248/TzHHsF/0Z1GXNNM9YnQiLfq4bB5qmxs+KceyJs6OwBpVb\n6roiRc04BHQmOfXBOWY3YaJDmZxM5xgLd+ORX/zLH/Hum9+iLgv+4T/4Pf7n/+l/4J/+k3/C7/7X\n/w0//PDH/PTJU/appF+2kMFrhnFH0rJt/OjJB7zz5d8EnbC5wuaBrLBokxiHFqMju52n7xw6BFIZ\nmIJk3/jgiOPAbn9L3w4UZUNKin5qSdZi1pk8REhkmaEsCzbNmsxo+rEjOqjzjKrIyBR4LbQjbySN\n0ZhMnEMIB9SFyDjq5WdeENFMQ09V5Ggl8rPD/QG/uqSqZQadVKBZr8iNpjBQ55aHlyvwnjR23Hz0\nhDSP5Erhhl5QbDGjyMXq6OeZrBA76P3tnmrVEGLg7v5IVtegM+YE+/sj0yz32P3T52AzsnJFNCW/\n+OSe54eeMWq6MRGVZY5wvO+IaLQtZWmUEpk2ZPoFWNhasSgqZV5stxdLK0sRkznkp4AdRqDOwUdM\nstzuHX/0/Z/xyfNbvv7ll/jW197Gu5nd7XOsUVxdbshtLTlGzqGTzOPLRXCfL6CPk0HltCg9vSes\nMdR1zTD0DP2E7fqzKyhFh1aJzGryzDCnQPKOEPJzuF1wXiRV88zQT6KSQfKfTnpR7x1unAXj5wOl\nuT4vpWyesbrYMI2O6ebZWYx/KoyiIy9F2rg4rWY/kVlZfOVVKUtq59HGsNqsSW27BBMuRLFMOkgJ\nTCwYhoHd7m9wEdVGCPH1quH64UOazRYfI103CGQ2RLxbU9cV+/tb5jBzOBzQvbTTKctwQayCylgB\nHVgjvve2Qy0Z31YLYedk4YwLeiwEefL4uLSXyqCNXiIn4gLAkCA2ZRUYKFcl8yC6MZUZolYYDOM0\nYUxGShMA8zTgQ2C0erE8KpxfyN15gdKGSpXYXJNlG1SW0Q8TKTiKMsPGAkuFSyO1V7Q3T2l3N8Sw\nliTPlx7w/O6e3c0t//gf/+/87Mkn+JQtkbATRWmZvQA0nAt88MEHvPba27z9pbf44Q8+pqhFWqKS\nZKGnFJlt4m7Xoi4teWFxSXzNYzsw+4kPfvUJzgXefvsdJjfjDwIXPtzvuLy8ItMGyoqqKrEn73ZZ\nSUSz1rhpiYMx6mwlzDIBctRVgVuIHev1ipQU4zwtFtpM/i0xYlIiLwuaiysGLb5tYmJVFhgSVkc2\nLz2gMICf6fs7dvf3HG6ecbFuZPnUHkWcvdDrT2YMrSz3hwNls0Utqglja4rygqfP78CKJMl5wFhC\nvqIoa4aoOXSOm9YzxAxlK5J1TD6IQ2thaZ6JScsMVHuIy3zdGLNElghrwFgrD4elgJ2KL8vp1VrL\npKCIljA7ovcoIlOAX/yq5dnzJ/ziycDf/Z2v89Jrb3L//Am7/Q3bZk1RV2gLdZYtue3iOgshYIAQ\nhfGQ0oKUs1qWNMvhYru5grTHuRk3TlilZcGYTihJ+XUMjva4X8YVSRCtzgluL3oUUrCGQQDe0cuc\nWzbsci+MQ3eeuRa2pihLVGap1zVxGBZjwQq0YugHQhILqc1zsV7XNUVRLdd3Mckg3WGxWpMXldhZ\nQ6DwAoUGUSzmxoC65Pmzp59Zxz7XInr96BE+Bqq6plmvyDKDn720F1WFm0bcpEnJgwoMQ0siCGRE\nQzdNhHDPdnuFttlybC/JMkeeF5gsIyxthsR6ZBiboRX00yDFkrSATxbfNRAJJPXi9330uODR1pCX\nslEuVyWbTSNtSDtI8T92zNOE1tBs1mdyToxgbU55WQvQIikGP1NXuXjxy1I8yCbQM6BTxAWHT6Bi\nQM2ecbej3d9S1hm5gdcePeJbv/Hb/Or9X/Kzn/4FpU6E+x3d7khe1Gi0REyoiM0N1mp+8fP3eOed\nL7FuSsji0oZNWFhE0wO7/ZHrh485jh394KjLjONx4HAcGYaJ9Xq9hItV6LEhIrnsx/2Btj2yalZc\nXGzBaPbHAz5FylxOk8M0kBaQsjaGMAy4eTrn/oAGLYUGmwlSL3lMzGiyDbkWWpHympXRrE3OZrOm\nKQvmoYcwU2WWw90z2mmgb3ey0DoeWJUF0Xl29/dst1tUTKgw48eIrVYM48huf6RcNViTMcyeT57e\nkBUr+tsjt3c92EA3wTh5PAGfFCrK7LqfIlO0zCniJ8/oxFllstMoSU5MiVNIHxhVvAAJp5MNWeG8\nx4fw66Op5XXaaIOwJ2QxKhbVRCBFjY+Kw2h57/0jz27/kO/8u1/ky196TFNA3x/w44CxUGX1WV85\nO0f0J4eeQKlDSiRrMGqJEgeCl0K62WxEmraMwqosw2rF5DwxOKxRjKNEFGutKctK9JhdB1oAKrbK\nl2x3g0rixpIwKSGlFcbgp1kAJEnGA5N3S1tf4RdZlTIsygwZA9T1CmMMq5UskU3VATQAACAASURB\nVK0tznHYzksSQCCRG4NGOkdjc7J82Rt4h7WyzFQGttv1Z9axz1dsf7URlL8B72fRPvZi48wExk3S\nEZNpilVBSBMoS1XVhOAIOnJ7e0vXyRPp4kIE+n625JmEhXXHvQiJ83xJAhX4RAygyxyVInh1Zhsq\npYgkCRcjiMQiecbFXuqdCKW3zYpiVeMmR1TTOVhLaZkplaWg7pS2RKVZNWs2m43YE/sDKggmTk4f\nkSyTFtcqLambvYdgxE+/REmHaSDbRPLS8oU3XuPR629y89FHvPvl17j8SJP8PXM/MaIwWUNT1aAj\nPjqM0YRpwMbEerUhqzUGi46SLa/zjOgTt/d7vqBf4TiMeJ9odMXQzhx3HZnJudheozVUdY46VnJa\nXHimw9DTHu6J0eGIHFrZhpZFgSXCQtt6dPEKjsg4zByPu2WWPFKUK0xeYIuC9arCZoYUIaNgZUvc\nPOKCQFxUbtlYy0VhMCqgmOmGPc+f7+j2O3T0i+3SU5XiqumGEaVzfFAMwwg+4LWiGzt2+z1ZWTHM\nnkN3y7Ed0Spj7GZ2h4HRKYa55ThHJp/wEXxhcN4xLwL/hCGpjBDTGbgiWVHLgwGJdz7dZ2ZJGf10\nWxpUWpalcuJMMQpFKOlPidiFSpUFg1FyYktGo1NOUBo0xDTQThAo+T//6D1+8t5H/P3f/RavvfoK\nffeM9rhD5wV5nol+NokihMCZlRuWYhqdRxkr8JZFe53n5bllVguoWousgBiDJLXmGe3Ro5Ilt4Ki\nFEhzRBNxwZPcBMZA9LhhWrzwicIK/T+zWh54RvCUQ9uRF5mMxTYbmbV6QReeFr6nBAoB1wgoKNOC\nw1PTxKHbMwwdSTUS5e09RSH7lhNPtK6LJYspx+q/wQCSyU/45NEx0vftiw23C/RDK6e2GGXWUmaY\nyTJPI/M8MA0jJl9zsdkyTCPDPJFPA1lZkGJg7AcypUlKM00OYzKajcAOxMOcSEoL5WlyDF1HCLK9\nF4DwAoVG0GeSOChC/jwXr+7sA8fjUZ5uMZFXJVbDqqlRVnGx2qBtjo+asqopihJjHONkCZIULm1Y\ngjwfGIZWbrKF9D31A7W1NPmaGBKH+zvW1y+jk6MsczKt6Podb7z5iK984YI3Hhf80Q9+wi/vJvZT\nZAhgtehwSYm6LgUBqIXwbhJYowl+JqWCpODQ9mhjqcqGsrmkNhW7ewFS52XGqqolDmIeCM7jJ0/V\nNJjW0h6ORBz1quS2bZl9oigqUhPxw8jlxUZIPzYjxSURU1l88szzRJYX6CRRvzqzrBpFSJ4QZySj\nylMWUqhIiYZI5gf6tuWD93/ONPasCosfB5T3WK0ZpmmhA+VEhCSvs5IwBYLqadYN+8MRFxJ+nJlc\nJCbDqr5gf+iJZPjkmWLk4GBKGUN0HPoB5/Jl+SOAEoXYHE8jihcxzGmB6rxoKUOU2N/4qROnNiJ9\nS24mLryAFEGlREjpxf+fFmdOmFA2SesdIUYj5HwdwEQCBhcCQ6j54Gbif/n9/5v/6B9+hy++9gqZ\nrtk9+wRYHGIIyNp7h1Y1WkFYyGLSXWnqZb9wWvydgxu1PhfhlEThMpxGJYvO2mih0zfN+sX802Zo\nDWEaSM5jVCIu35vRmiovWNU13TygUVRFRZhmDscdMTgI5vzvkAeMoa5X5yI6TTJaO3nzyyon6YQ5\nSAeqlEKbExSe8xzY2pymac4dQFFUn1nHPtci2s8TKQSsWjJenDsLY2MPwzRijFz4i4sL8qpknkaC\nkx9WfzjIU9FmVAsEeRgG3DjiZ8eMWkLTpPhpa9DGMC4SHNDYhTA0z7K4cnNgDDNllZ9bGGst2604\nVXb2Vm4IrSXz3gWMseRFRW4XK6KKWGOpmxUmzxlGeVJOy82okmSMjw6i9+RZYlQdfdeSmbTY7LSg\nAYNmngNDd+Tu2VNef/sdlI1klejvrh9d0+0bivlAlQe+9MY17z97jxhKcmOXm0WcRYdOlAVFVjG4\nmVwrVJjh9IZFM4wTxhS8/NKbGJ+YDj2rsuHhA0s7dHT9EUOGm4/088T98UC439Gsa4w1WAUqRUpj\nGMaRKY5cNBvKupH56jjz8SfPSXmOHiaRvGzXKMWi+SxxMXG4uyM6T1bmGMS1lKaR4tQWx8i0v2U/\nDrSHHVPfY7XCjx4dkjhhkualhy9xvz/QjSM2qxgnx+3dgTlE8irnru14fnekPfZYW1AWDSkanj/b\ncVhSVts5sR8dTlmGFOk9xKImREVAy3bdCv4vkmiakwXyBfYtnpbq6YU10QgiCpWkFY9RnYE2KiGW\n4pSWn6FBaUjRwOK8i3GJHtZKWvzkl+sPMYgeNzLRz/LQHWbN7/8ff8x/+Pe/yysPL9luB7quk4js\nqiLTuaRv+pkUPMHJaCqlxKSUBLpZg8UugXanMUwUYHQ6JaIGprFDJX0ucMMwYHRGWcifEWOEqqRU\niuPtDb1vRdBlhcDm3bQsdnMmPzNNM8REbg1+mtjfPCfpSrCITYYtK/I8UJfVOd46BSFCxU8pcIiR\nsizJluA7CU+UEYGKCasE2J68dE0nvupnvT7XIlqtGg67PWN7BB9ke9d1dEOPj4G8LLFFhS1K2Rgq\nxTxMzMOATgY39qAVq6whzwqKsmR7dUl/bLm7uWHsesLiaHDOsbu7p1pJsqHIMYRn6ZxoTQHGYaDv\ne5S6JC2iXpmr5JRZfp5Djf2Ai4FVJSfXpm4gBrJcMU29LKIyRUiBce6JTtO2LSpBZkTK0ikwwZFp\nxTwKkquuZU5m8oS1BfNhWJIWA/c3z+naPQCzSnzw0Yd87atvkxvP4aNfsn34nPTsnne+9Dq9uuDp\nbcf+0HIYjpR5hQ+J57s7qqqk8JrSJIKbyIwUnbv9SEIx9DNXmzeYDjummAhRrJ3zPHHc7YijJk5H\nBgqe3t3y9JPnvPX6q1xeXEAccfPE/u6emCzjNPHJFPjqO19iHHuefPQrVHlDvl6zipGiyHlYbZdo\nWkcMnlyLtbXb3bFerzAatI6Y4DATTG3Pcbcn9fd47+mHjiLLya1EvxRZDkk89c+e3uJiEPueh4Sm\na+Vn92w/YbQF8kVcntMNoj8dvMGpgv3k6FzibhiJNgeT45RmcsI20FqT5ZI8Oi8JnCbPiCFirYYo\nRVYnIaYLw12ylNyS33T67zSPPJPDYhSdqNZofVowyQxVJaFSBR+XAhtRWmhZOlpiMASl0daTkiN5\nx+QtuwH+4A/+Bb/3977Ha48WKMk40O5bhmGgLisusktya4neoZIYIkKKVHVNkWcoJDbDmpywICpT\nklP06VQtOWKLbz3KKTXq5XohTIHSZmRE8cV70YdnZc00Ow6HA11/YJgHlFJ03UDykYeXV2QB/KFl\nN7XUm4bgPHkpQXTEeFYAzEt89SloMgQh/1dFibaSqKq1JmQ5bpo4HDphRKSFXOY93TBwCsL7616f\nr8QpX+HmHYf7Fp97ERnPjrGfmNyMyQrq9Zam2ZC0oSwyNpvI3egYpo4yW1iHzmEL2TZH5zlFIbf7\nA2mx6OmkcS5QBKjqiqtVwxxF93l7eytbRv1CT5plGWqRTA1DzziOFDaja1v8AiOe/RLXa2EYBDCS\nlZZcl6BFXqHU4ucOhr7tmIaespCI3yFfYd1MkRSOiXJds1pv6Y67M0V9nmfyJJKT588+ZrdbnDir\nmtvjiMcyzjm3vYLqmt/+3t/j7X3Pk+ct1QfPePo8pz6WeAz3bcez3Q1vv/4qekzkWmJx87Igs5bg\nFWjLk/c/5vUHG4ok7dw09Tx9+jHHYaQqXmVlc+6f3fHT/YFMZ/TR8ed/+RP+zt/6LbwLfPTkQ1wA\nTMHkEsP+yOHqGlRgd3OPqmYyF9kPA3VTYDO4vNhAdKT2SJHXFEoUD3bOsJnCtx3T4Z7+bk+cHbiE\nzR0+JDZ1s3ilBXLRth1C0xIr4DRKccuK8qz5nfoBk69QUS9ZSA0+GVzS3HQHVFFx72d+db/DY9BZ\ngTI5PizLFQxVmYtjy1rQGmtF6oWR6OIpxLOYXcnee2nPJVTOBXm4z06WJicZ02l5FKPMVG0yWBQ6\nLTZJWefhMcQUMSpgFwtsVIqk1KItTei4RBq7iNYy23x2d8+Pf/ZL3nnz1TOwuSxz3DQyDB1GJR48\neIguK4ZpXCj9QrVX8yxcVMWZ5eqDx1q9SLSAPBeBfd8TZg8midqiP7Lf78SbX9fYsiB4x9S3dO2B\nLK/Ik2F/ODIMA1qFs499HCVqOXUDbn+H2x2YTUk+zfTIA6CqqvOD7bSjCCHQ9z0R2MTAatWc41iG\ncRT9rBPt6/7+gDU50yTpAm5BWuZV+Zl17POdic6O2YtwPZggtsxMU+WBmBTT5M6ateOxoy5KqqLG\n2gI/C03mYr2hdxPROcbxxXxkmkZSjDLPCDAcB2Ebepk5SovR89FHH7G/25Ev8RIXFxdU1Zp8yesu\nMisxIV0H+RK5O81cXV3R9z23u7sXQt/cstnUrC8qZi9Lk2p1gXMT05ho25Ywz2QKXAy0TmOmETUM\nuDTwuF6MBJ1YJ7thZnSeIisY+4GnN0955+Yp1y89IlktVCMX6IbI//XP/pTXXnlA7cTlcfPsV3zw\n5AOe3uwxVBwnx4f3O6pVyaopyXVAJ0+WyxAdLW8+oy1PnnzIo43m8XqFVomrq0u8SfS/eF+I6asC\nN87c7AVj+IW33mA+tjx7/pTCJPIs4/GrD9lsHqFNIQ+jaaKsKi42Ww6zxw2O9n6HthfiPfeOMs/w\n80zXHihsgYmJu2fPGNp7QtdS6ASDZJ9bbRjHibpZsaprbu/v2e8PJDR5lqGVRmu7jGiO2EzkULv7\nnSwAleL5h7eEpIRPaS1P7/bc9wOqLGmHPV1MxLLCLexTFSMame1lJqNeVZKjtEC6dZFjrMUvG19p\nbxNJCWUqxghh0S+OE0OUMdPoZnEoLX50raUrUqfiq7XYK5WoNeQ8G0k2A2bUAnmJUQuU3ESUTRAh\neY1OFpUiynqCnZkDvPfLX/D8NufRg0colchzS9M0aFjYnQPG2OWkKQV6niZ8SgtwpCaiZK67FFRr\nNSkadEIcgFXNcSeLXa1l1HY6wYcEWZGTG4kGmYeRw77DxVv2bc+Dh1esmoa+O5yDLEmJ9n6PPxxY\n5SXFw8cYY5jmmeSFM2CUZhxG2r47P5i6riOk9GJOrRevf3oxwz3uhbFR5oqh6+mXVF6RN2afWcc+\n35loe0+uZdNt9ItMnHnyZCU0lUV3LfPYcjweYXPBMQjVSecF2XIxiInj4UBVlHT9RJ2XmHYiHHqO\nukdllj550uTxrSJaTe0abm/vuX12R12XXF9tMFaRlVA1lqQj3XSkqiqqOoOYk9ucq82aaRjZliVh\n2zCFCecmoXWryDyOPN85Up2zOx54HCWVMLMJW2hc0sQsY9VsYe54enfDXZzJm5JNBrEsoVhxfHrA\nJkNpCiad2AfHTT/xx//8z3j3G98l1SvKfkSZgovHb/JP/+Rn/Oh//F+5uFzx5puv0Ww2/OyTPfvj\nTDKK3d0dNtO8ev2ALMuJlUKrAZOtsfUlu3ZiCo5cR/b3nrsdGALzcMdXrrZ84Y1XFnyfJqqcUdVs\n8wsMkSZG3vjiaxzvnvHmq6/w+OEDunbPPM08v/kYN3ZcPnqLq4cbXn75b1NuHhKSYggRYzMuL7bk\nRqFiwE8jU9sSxwHftxz6ETVnYBq6w1N8nBkN5GVGciVpTExxYEbhjKD6chJ1VWLrgr53DM7S7Try\nwoLN2B33jONAb65QNuM4Bw77e469I+oCN4AnIySDnydikFhjmycgoGyiuW5IFMSlIBstkcsWcVVZ\nDEFrMVLEyBQCIUJACP/d2DN7FnTjC9G9MYlsyX/SKi310hKVLI+MWpJGo8cGzkUgacHFhRBgDi8U\nABpiFEmPwaCCRUXF82d7fvTjnq9/NZIpj4qiUbaFIPXubu4xZskvQ9HPIzaUVMFgHJTGMpYBpSWc\nMASZ9WbGkpcW5ySxzEcYJ0dVaIosJ4URvMOEjHgccEoykYpqhcoc6zyjXFfYYoXJa/rbiTgGdAxc\nbGvqdUZsNlRNhTKigfYhEVDElDPPhmFQjH0iBLCZoakuGIae467DT1JMV6sV9WIucDiy5oJVNiEm\n40SKIpypypIq/xtcRJ89e0qmDau8RgHHVmaJ1uYYlVFVNd57nj+7ISrwwPHQUWUlTbNhaA94NzPO\nwgl1zlFoSyhmvJN00MOhJSjIrMGWwkXUKXLY7XDTTFUVXD+84sHlBbMT8OzxeKReSz56CJ48L8jz\nQhiTzknaoDGs1yuRQSHUqKnruTveM02RMFn2+z1qdLz1+BW6uScr7MJSlNNInlvKVUV/GGhWKzbN\nBhB//ZwCYz+RW8t6vaYYJ8q84Mn7T9i3e7ZXD+nLhDaW64cP+E/+8/+M/+6//29572f/km9+8zd4\n4603+cEPf8LxeCQrAk2z5pWXHvLKKy9LzHCELANMjtJG5rVKEHwhBJ4/e8rDizdJSvOXf/lTvv4b\nX+Xll15lHD3T6PAoNtcFOYpVnfHoesO3v/FN6tUaVWzYJMvo4fV6w/rymqpu0LYAk6FMJhIerdHG\nwhLXIHNBGbClKLT55P0CQhkZuyNTt6O7f4brd/S3z4nDjjC3TO3A1PeyFHCBOQ0EW3DoBnaHln6c\nCIcgji1bCAeg17iQGMaJaVqy2MscFTRuOhkwZG5W5pK5o5SirmvKsubYyvb3tKFWSp3nmVpr/LKt\nBkhRMc4jXdcxjhKG5xd78emkB3wKogFFlhP18nkEonNyfYqTaJmPKnV+TxklGU9KqQU794JqdBbu\nL1yJ9376Sx5dN9TlSFPJKfbQ9tR1Q5Xn3N0+ox96ma3mGahIXli0gsmNOIQ3QYh0YysOwKaR6xAi\n8zyJFGtxGjb1Sh5efU9W5EzRiezNeZS1rOuact1wnRfovOKw7yjqij603N8d2R/vuLq+5OGjS1SR\nQQzYMiMPiWH0TM7R9nf0C3QopUS5aqRj0In7u3t2xyPGWK4fXPPqS5dY+2LRlS90/K4bzvK0pAIs\n1/mve32uRfTp06dUNuegM4iKpKBqVuS5JdOGEKEbB2JiybmWNuDucKRZbcnKbGkF5yVd0KCswafI\nGBwuBvphQFnD66+8gc0yhmEghkDKxD+/alZkWlHVBWUw3N3dcZhGqkY4pUnJk8vFwLHtOe6PElWb\nGartRpw6S7Z6axRzcri+5dh20mpMk9hMl7YCQGlNP/ZQAETWTcNbr79GVZbc3d1ye9jx/O4Omwwq\nRKLRjN2Aiommli1wURQYK5EGu/3It771m/yX/8V/xftP3uOllx9Q1zU//MFf8PTZXrKYLq+52KxY\nrVYoEkVVEhedaj8JEFchsAt04nZ3Tz8/5uryEo3n2dMbtpeXdP2e+33PjOKrX/0Kb7/zDd5688ts\nmksiGdqWaFuIUcBkFFW9tNJLq6nE782ZYKRED3y+K9Iy9zv9UgpqSmKLDd4JhMTP+KFl6g9Mx3v6\n24/YffwL+qdPuH36EW6YOTrH/XFgDorOa5Qy5FnFruvwx4ExKow2GJtT1QVT27M/tLikCEqSSYtC\nxgpJKapVs3jFlWQYleV5IXSS/aSUfi2uOaVEiorJidC8bdvzyXOOpyURv/b18dMfRwlZM4huOiiF\n1RowhCCgHaP0rxXSU/Z8Wpz2IvKPy7UVBB1R8/TpLXf3BzZvXC7cVwQ4nhJNUVKv1gzjjA8yAgsL\n2CcBPswolZGrTIwv3glE20uRnme3mEwseZ3TNGvqukTnhsGNBCXuoHmOTKPDFhl53WDLFWWzQpsM\nrCUrBHz+qye/4Bfv/Rx/UFy//phgC4yf5HvUlqQlrPJ+v6PreupVzWbbkNcFJpcxoSoN3omt+Dj1\n3O4kkNKafJFKaVIS55UsDC2FFkPMZ70+1yJ6udmiUbhhlkF6EgJPWV6AMbRtR1UVoA1l3VA0azCW\nOEdMmVOvLPv9ATtPGDOjlGQwpZSY5pl5Fgp+tV7x8uPHeO+EPRkdq3qDsQVVYXFzT4qOoizRRgmF\nOyEBWlmBMjJjvX1+y/FwoC4LmXkpmf/leY4bxUJ6eXkJRYYec0yW4cfpPPQuioIpSWZ2P42EMFM1\nNZdlzqpasb+74diNhAiD8xRa0XwqdGsaRh7UNdM0kJcZ6+2GyXkmJ1vHt999hxBnPnj/pxyPB/b3\nOzKzgHCj4NzyPEfHIOmjS8jY2Iqr5LRI00oxzjPHrue1Vx9hUmB3/4xuSmwfvMbXvvIGj155gzde\nf8xqfYUxkqWktERTozSlNhhr0dp8qkAuSXEvSuRfeX3anXP++MQzKAS8W0TRV5ICwQugIs4jc9/i\n+gO7Z59w++Ev+fBnP2H3lz/GdSOOyDwHbAy4YMjzS9LU4hb2pwvSemZFuSg65OE5x0DdbFBKWls5\nnSzEq+XtczpNaq2J6sWJzzlHiJwxim3bMs+ecCq6ZrF1LrKk86n1Ux75T0uj/lWX7dMkeb38vyrJ\nyV4MJALzSeLNkR+BSmgluVl96yiqNYqOvKrQRWCeJ57d3bLKczl1x8gUPdMwyga/WKA7Kl9kQwGi\nJsye++4egKLIFtA5EhFeZhJ7XhWU61rie6oCH730zdoyOY9rB7H42oykFVVTUeVbjIXRSXDe49fe\nQFnD/oMn7I8HhoXdamxG3/WAFO/Vek1e5sQUxJxxsaVo5O+uqgqQOpFyubRjEMVBUUrQYVUYirwm\n6b/+foXPm+L04AH4QKs7rM6Y5pl+niEp2bYmIZtbk1PWDdvLS8pqhZ8dmdKoNGFzQ9PUi7sgkpeZ\nAF9ziykyts0l2/WKqiiYoudy3TC5CauUyGIyTds69HKbNfWKoigI0YnTJ2r6/ig/iKW1q+t6gb0O\nxGjRSjFNYlnTi6h4u95g84wuHZnnmaaqub6+5tnNHcrITeazJP/23OLnQbb3s2ecJ4LROJW4ePiQ\nNAmJf9PUWK14/vQZb38tsL18IMU4JcHR5eLq2O93/OgHP+LjDz+gzKX9yozBaIFbV0XGME7kTc3Q\n9aQQiEFmy9JmJ1xKPPnoE77w1lu8/taXeePrv0NWb3jw6BW2Vw9oNlsyKwmn8s7UUkiVgmXDfDq1\n6PNP/F99M37qIPZXv+JUWJaPEwnSqVBFMoAoLpnSO6J3NC9/kesvfYNXvvU93r274Zd/+Rf8+ff/\nX57+6n1UCFxsLyVDKwX6YaTtB7DCxpwWNN/l9YaoLGoUhYW2hpWtyQuBUsyTB8KvtfKBJGL5lAg+\n4YOkmQ7DQN+PTE5AN/pTbf/pFeWbWr5lOY1LVLha7imNUovg/nyiNHKqXH7NUkATy2mUdLb/KoCo\nF5mUMBOCVxyPHSEkirqi3mxJSdF1Hc8/+pBVUbJebwHYHQ+0bYdSO9haios1ZVkzjiN9PzKPjmmc\nGYaBED15nrNey4PCe4/30iVaa1it1/R9jxsHUogLim7RaPcD3bEFqyjqehmZJTKteHR9RVTyPVhj\nWJU1+/2R4CJTNxJjDzFx9eCKpqkhBgyJoBQqRYxRrPNKCmSzQi0QoxNkOqZEvSpJtViEs8wS00yY\n/wYH1VWlbG7bw5F5HinLGhavsVKW6DzjMJMVOfv9DpVZqqoiWUXyCaMF7JDllrrKCF6yjZRONOs1\nCagKAQpMrRTCpi5QY+Swv0fnF+KGiYEQHQnBYFW2FltYdAy9w82RqtxweXlJZi1laZkGwdhltmAq\nJqZhxiqNyXOSD4u1bWGaLmmBMUa26xVxoeYbq5jmgczUpAXb1/c9N7c7jn1HqXPQim4Y6fue9fU1\nVVXxL//8h3zxK+/y9pffYBwC3TgwB3/Ogjnuj9zf34ujKAV0iiQEmFsWAlzOsozZOflz85JhGMiW\nljCg+Oo3/h1+67f/Fr/1299hvd1ibEbTbCjKGptl57b83EZ+ypL46RPnZz/Dz1/9GZ9UL75mKRDy\nSqS06PdSQqeEyRZ+a7miWG1prh5x9cqbPH7rXb7+nd/l9unHvPfjH/Ln3/9/+OTnP+NwkDle1BmZ\nzSHLyH1gCpF+mFAmcH19jQuJcVqSEZwnJclgF8PGAtcgEUOU4rloFcdx5Nh3jAtU40V67CKOP2/h\nF7uxOgWsRbxW5Ociu1zbJUo8olC8yLIiKU6Z7jKSUegk2EJFXAqwIuLPI5S0XMvb3Q5tDEWxxEzr\njDwmrh48oshzsqQkTkdnhAD9MKNUh/eWhw9FjaCNIaSIW+KSvQsMg2zlLy42ZJlFJb2ciEEj0Jih\n7TEosqJAJ4VCE6Nsx6MCGyPJavaHPYfDQRJ8ibS7PdurS+pyxdX2gmJRgLT9wNV2xeMH19g8Z5pF\noRPCTFyA7kUlKoSyWDGrTsZtwZMZS5bLwklrTX884v1M17bMk/vM+/dzLaKQMEaiB+5v76i8I68r\nYgpopanLipgX7A57pn5mdzywXq9pqhVEz8W2RhHp2w6znHeSMmCFIrPZNtRlxdx3OD9T5hl1VRKT\n5+a2xY+aGEZslpgHQ5UX8oR2iWka8GnG+5mhn2Gtudw+YL2q0QS6WS6+3miYYBo6pqRZaxHzHsee\nEBPFkjh6ym6ytuDu7pa+OxLSiM4LSJIlrhGCj9zwGmUyhkncFHFp+fq24/2f/5x3v/Y13v3q72AL\nw2ql6dqJjz76iD/+oz/i+9//Prc3z/FzICnLOByxreXh9RWbzYZ56FFKM/TLjFYpYgpcPnzMd777\nXb78G1/j1dde5/rBNZvtlrquhdNo7VI8kaIpH/xrW/R/ay/16aKslvoqRUl+X3SUxiZMHsliSVGv\nqNdbtg8ecf3yq7zyxXf46r/3t/nlez/hx9//Pr/4ix9TTAOr9YbJzRzanuQDc5TB7OQcakk0HCbB\nqlmTn/mZfslVT1HJIjJJUGLf93TjwDjM59DEk2Xz/ED4/y0sTtg5+XRaxgRywtUkzAIpkdHLcvVl\nDsApokMt10UtsiPSYmdUEDEvhPwpkqyAtwWCIvP7qGReu7m8QDuHGz3dL4XDhQAAIABJREFUNDF7\nCFFjk8XNcNsfCBq2260gEPOcGgnxIwb6tqXvO9w4odcbNBIQlxRM/UB/POL6kRRgPo7oKJ2htZbK\nGpngThPj/sg49fSHjrwsyMuKaew43CdWyp7lhac9QdWsqIqSSBTojIIYNeVC2F+VK4qsQgNZVlJV\ngWGQYmqscE6tldP7NAz0w3A2Dfx1r8+1iIY4Ms+BLNfE5BiGIxcPLqnrFcfdjmkO5JmImnOVM0w9\nBE/X3rMua3Y3txilmLp2cYNoopYiemIKPrx+SJhGpmEkX8DJ3suQfw6yWS7LciGxnwj1En4W8YTg\n8U60i1VeCh4rOYyKHMeRi4sLKTLGCCMRKZxtF6jLkrquz3bPN19/i/1+T3s4kOc5KUtsm7XMr2Jk\ns9kwRo3NMrarDZcXV7THlsqIzW69WXPTtvhp5oOf/YK227FaX5NlhkePHvHtb3+bcTjQVIaf/+xn\nPHnyASFqTFHxxptf4PLB9XkZsdvvcTHQVDWvvPoqf+fv/i6/8Y1v8viVl7m8uqJeyVjjlNsuro3T\nqRP+7RfN9Ff+zKUx/df8TadievpYCopBk7SoF4zNsLm8Aatmzebymoevvs6XvvZtPn7yPj/58Q/5\n+V/+BcPNLXWzZqUt3TDio1iGs0IvDjfFKTzP5DnBDUsWkCYtqobJiaW4G4ezyB8t5K64oBBPC6jz\n95nSr31Hafl+YoyEaBZ0I2cS1Amt51NEJUVcNKlJ+vizYF8LEXwZB7zY4p/UIS4mZue4vb0hzy8o\nYskUJrIix/nEqqyYpyPdOHFsO3aHlnUwFJdblIK2789ifZPL+0grkTm19YrnTz9mGCa6rpUCbwSO\n3HUdd3f36CgutTDOZElxsdmidYVCIndclKyvh9cP2TRr0eTmosOdxo6iblCZIgUBFGWVzPxnL/T6\nrCwksrmoz7jDGCPzOCEJpJHMZniTM/kB7ySPS4qyE0t6psns32Dv/DQNGAzzPHJ9fUk3jGRG4f0k\nsACbGNoOkxvWzYqmzjkej8TgaZ2nLi3THLBKCs/+cITMMM9QJGlZvZ+BxLE7ENNM5HQ0T3jnKMs1\nVVUT/cj97R1FUdF1nZwS9AuykwS3WTGkKMN20zDOYcl2ysjzAoUIfMPsyNDkypChcSjyLMMHJ0/L\nqmAcC3Qm87HgPHmR0ay2PNv1xFlOLtM4EWfHg5cu0Rouri6ZgckH9rfP+fBX7/O1r12jTcK5maur\nC7773e/yyqNL/uzxQ+q6ph9mymrN9ePH2CLn9vZGEhRj5NH1A37vH/wHvPPOuzx+6SU22y1VVZ+L\npzZa3oyno82/ceFc2vClVpyKyKk8ymfTUgzV+Qv/zf62F0X1XKy0lnbfGOyC2CvrFduLax6//Cpv\nvvsVPnzyPn/2p/+CP/v+n3BoDyLB6UdZKLkoC5vl36qs6DH9IoFSGOYwExEGw7494p2cSE/CbhlZ\nvihip9dpaXj6/bSIwmNIBJvEIvmp+ekp30skpGrxsEsMtWyo5M+VxZW02va8vX8xVjpd/5AcQ98T\nXE3vZrJyTQqRkGAOXrigSpB+SSmOfYfWO+pqjUqRcexEdxwCUSXyrMAtmV5lWdGNvQCF+o7t5eUy\n0xUUXlIZJkXMKtLe3dHNHRfXG5yaUBhMUEK9R1NWjcCDCGSZpd0duWuDRKBkmjBFfPJEL3bNtu3Z\nmgspqoNEiMQIfd8v8sJcknZToKkbtustITqmaVhOoxkmL6kbQf591uvzTfvc7bi+uMRmGhc9dV1y\nbHcYndHUDXlVsioKDu1hsYXlWKOZZs80z2gvFCCztJhFUXCzu2cKnle3WzbbhhAC2+0FKniOhx1a\nS7DadrsFzVmeFLOCfurY74/CLXQjWZmhtSK3EhEyjB2rquTq+ppxKDn2QRYU04TS9uyImKeJXBvw\njnEQvVyoao57SYochwHvZzQSvOacw2bFOZl0vz9y6CYuLxJhGjGvvcprr732/zH3Zr+Wped53+8b\n1rz2cMaauqq72TNJUSTFaIgi23CsJILtKHBuYhi5CeD8HfofAiQXuhAcSUAMw4mERI7iUJIpUaJE\nUtZARqRI9cTqoU6dce+95m/KxbfOqWpK6pgD0FlAA43qs7vOnt71fu/7PL8nHqk3V6ggePzwPR6+\n/W2ef/4FElmT5Yp2ikfEayWA1pqiUNy6c8TLH/84wzRxcvKIw6MjfvRTn+XTn/4Md+7eZbVekxc5\naRJnXEpKhHwim3laPvMffoUPzjCFuKmP11rFp4vqzUO4Ps7ODxF/vUP9Xq6nn0MQYtamRspSmmUU\nZcVitebg8Ih7D57l4z/6Gf79V/6Qr//Zn5Faj0fg7BMvezRcxsKotGIaLc5FTbIxhn4aMdOTLf48\n/OSD67N4PV08ny6w1xHAzjm8mnOInlpgATc+8PjY+PoGH4v19T/e+wiFmV181778m/QH4nihLGqE\ni88pTRKCkCACTbcjFQqZSJZ7S7zwTJOlrnMSleJ9S6IliQhs2h2bYYyhb0lc8uo0JQ+BvCip65qq\nriOcpy+QuievV6zqGmFHpAyYvsNIQ7EoGINDeoklMAUXb4JakaVpBLLo6N/vTU8yy6jkFEP1pMgZ\nTVTrJGl8j8dxYOgnpuuwyEzevI5puqCqipmfIAkigqCLGVTi/F9/756+PtIi+v7777MoK/I04/z0\nDJ3EI5f3nquN4db+UfS2WsPkDH4+XikhSJL4AU4UNzEA/Zz0OVnDoipiSJ0WBCmoV0sCLh7VO0Om\nU5IkCuslERwMkr5vmKaJrutJimx2NxQRWjEYiuw42sk8WBdJOlJO9MMWZu1g37dkQhGsIM00k5Q8\nfvw+t4/u0LbRfXV+cYHSPkotQsBYODvf8s67ZxRZiVDZ/Pd43n7rbcrXXubhw4ecXVwxGTd73N8g\nuBGdVGgZOw0hBFmRU9YVn/zkJzk4POLw9j12bce7f/mXfPazn+PHfuxz3H/mAeu9fcqyIE3nBYF8\nclz8/gonEObCQOyUYh2JGeAIULqIx+CxwWNJiwOCt3PnlM4LEYmQaVxDzKLR66MqfP8l9QNHaSmR\nQaFUHFdkeUZVLzg4OuaZZ5/jEz/6Wb7wW7/FN7/5F8g5niJqNuNzFCJi6q4BF6OZ5nz6DjMDMeC6\n6/ybv4RKXesPrxdMs8NTiAhnkvIDP3/djV6PVoKMi0svZsuoCvMSadb7zs/5OrspBPVEiuU9CI33\nljTNyXSOUoIizWLhYoxRxUqTF3HJu6gy6lvH5EmFlAnjBFoKhqGl7yJTIs8ySAPGTdSLJcUiIuWs\nCEw+3uB1XtAbS640q/19xnZHkmdMpsMES5mVBE3sKr2jH2MnmCRJXCIlsVj23YTtO1SAZVWzWC5Q\nQkZZXQgM/RRPetaiZYpWI33nWdULmPcezsUYkmEoZjLbMENdBD6AkCom2X7I9ZEW0WbXcPLoEffv\nPUOqNMZaRPAkabzTDcMAPmDnmItpMgzDQDAxlqKqqghIMI5+GtlstlSrJaK1T4KxCDQ7S6IESM0w\nWcw4sl4vqRcZj997hLeWqigjdScIuqanG3qmbU9eFrTtyGq9oKgWtP2AvNrN4tx5VigkV7st/Tiw\nqGqUtYg0YVEWpEnK5B2nF1vM3t7Nh3gyhnaz5WBfkCiNsyOXl7G4PvvCy3zqsz/O//Iv/yW7ywu+\n03Uc7a954/U32DUdeb2IRfTNv2RotyTLGm9jJ14vF2SJwFlDVVUkacGjx2ecXW74qf/4Z3j++ec5\nOjymKOOcSP+wiidEtxEBgYxxD67HTX0sot7hTU9//jZ2aEHPkRR2wI8DenEMQFrtx+5KZiTlHsXy\nCHkNxRWS4GMB/EEmsk93p9dFRimFnotpUVas1vvcu/8sX//zP+P3v/AF3n3v3VgwnYUQfz4KyqMY\nvus6Ns3uZg7qZnjxdeH7sDnoBztRcdMpXhfR6+7RhVgIxdxRA6CeRNeJINEqLpEkAqmIkS1z1Eec\npT5ZLuEkk/MYE9NOiyKLue06RL6nlqRaUuiCi4tzrBlI9BKpbORuirhgm8aeVCuqosR7y+XVJSEE\npFYs1ut5ZhyJ8UnIEErGHLIZwtw0DW3b3fyOQiuSNI2hhgTCjLAbx5Fu7MirInbNaRpTPG3sLrMk\njQoA75Ehurea7TaSmlwcDZpuwM884H40N4oYGzzVooqR2EJG9m+qUGlCnf//ODJZoejagamfqOsl\ng4nsvrZtwXfkKkWEqDPrppEgPEoKpEpwYcJaz97hIReXl2SJ4qVn7pJnBd/45jd5/Pgx9+8/Q9dG\nIbkHlJBkRTlnY1uKKkdpxe6qobnqWa7j8d97T/CKpu3pOs/kJu7Y2DV23mK9oCyWLFZ72Gmiabac\nnV1wtb1if2+P4701eZIi8EzTMOv7BGdnZ9w6vkO5WNL0HbuhZRwtJIK6yPE2kKqERycn/ORywcde\neoE/+coVeVUyjRPLxYKz80tEkpLXKQ/ffJ3T999lUR3faDRDEHghqZcLnPV040i92uOnnn2R5Wp1\nk4yoVWSrXs87f6DiOWs3BWK28e1wtoPgmbYndI//iu7km/ggMGYkjD396dcQSYZK9wjCRRivz1B5\niTUD2a3XwPbk6xdYHD/H+v7HUWkRxfw3nd0Pvty66U6vj/pSoeYUy6quWO/tcf/Bc/z+F3+Xr/zh\nH2H6Fh8c1sX4YuvdrJXsGMdxBo7wXUXU3eg5P/CqBfnB32EupuGa7xqezOSVUmg5g07iyz13m2IW\nTEQBkRbz3FTEMLynm9nrm+W1u0pqgRYaKaO8SimFFdHq7IMjSwSZlLhxIgUMjqFvEGWMvMmUYLfb\nUlU1hw+Oubi44PT8HARMxqJdxM+pOd3AzFLC2P1qlICh7Ri7AYKkyCvyqibLK5ZC4cIVWibgIwzE\nTI6u7+Kc1gekUBTVgkQQ1QfGsrhOj3jvfaz1SJVgnGOabAzMm1kGbqa92WARSkTgeFXFGbOJDYhQ\nT+Vffcj1kRbRPK1QIuXy/Ir9/X0O1hXNMGJMi3WOtIiMSOdBTSMqiceSaRxjUmGWxWNMlpCJlHK5\nYG9vn1dF4E/+/Z+QJposzzk4OIh3c2fIyWG5pts12HBFnqU0m55+1+Amg84jDd8FSdc5+mlCaTi7\naiiX27n7DfhgWCwkSVaSWsv64IC0Lthb1exXNdJa2rZlN3VkdQ14BjOQZTmLvT0mZ6gO9+KdsR9Z\nlkvSpGQ9OR7vWl5/8w1+9r/4uegFHzoWZUmZ59FsoBRCJ1x055y8/5AXX/w0RZrhvUNrjXM6pqYa\nx97ykGqxosgL0izGQUipfiid5811Yywy4Dtcf8r20be4/NYfoPyGqW2YRktz8Zhhd0aaSJJigcpT\nTH+Om3YEkeOMgNBj7MT4F5/H9Y9YvvBz5Ot9mtO/y/LuqyyOX0LnJcgUcT04/SFcH3D+iAgUifG5\nOXW94ODokI+98CL/5jf+d77znbcjmUildF13M8uOobHRbnntn//uDvT673q6+3y644z/XSGlIPgP\nvkfXP+d9NERcp9dGtqiPviQJSoAM879LefMSaRUJRmae8To/US0zFqsFYJnCCFLR9R3WDZRKILQg\nBYKZcOOETSZ86kjyHBss9SrelFUSb9z9ZCIW0kWO7zCO86hhXqKZgPSOKktJkzSqZnTKwcExOoG6\nWpKWKSrL8cxjBxeXuc4FVKfJsoogBTovZmKUQwWPNRPvvffuTEDrEEJRlwVdMzKageVyyTJbUJUF\nCoHZXWEGc5P7FQQYN6MztSIt8jnq/MPBzB9pEU1UwrJaIMVMkJbxaLW3d0DX9ug0xzto+hahJGVe\nYt0EIrJHlU7wAvKiBK1QiQYp2Ds8ZLFcsNvtODw64t69Z9jtdjw+eUS7a1nlJZ1v2W43FPmaIikY\nRMydVlk2H9VT0qxk2+1ohpGgIXl8wao2LFcCPUom03Pr+IjV3gH5coHUgixVhLbl4r33MOPIyfkp\n5V6PBeoyZZpGttstjsBi7wCTdnTmkqHtsF5GHqpWfPEPv8SLr77Kx156ib/68z+lyHKqVcHR7Ttc\nDj2brkdmhrOTx5E0JLMbPaJSCUe376NnF1OSprHDUj+84nkt7A5PCe7d2HD1+u9z8ie/SXv6BjKJ\nqol+12CNIwRIilXM6lExKlnnCpVV0c5rJ5wpsZtzVLLHOK45/dbXyOvAtN3QnHyL1b1PsLz3Iyxv\nvwQymWeu4YdzM2A+6kt5s1y7XkJlWUZdLzi+dYvf/D9/gz/4/S+y3TVPzUHN3CU/OX5r/cGv13f/\nntejnTSNi8sov7M3cRVP/5xzDi8VXgisD+hkhj0T/1opBBIx53QRt9uzGeW6aD+tQ0UErBtYrW9R\nVinObpgcKJ1j7Mg4dhG8kgnqvEJ7mGa1gieJ45ZMEIKk6TtGaxAqoagLvIBNs2Oz26KUoCpzgouu\nMmttnGGWNTbo6DJMUvIsBTw+RCiMSjT5IhoaEqnijcIJVJajdBop+3kayVXDSLu9YHSG3hgGM5GV\nRQz7k7Dcj6kUeZawXu8TvCXLMm5VKU0bWcGjmfBtG7/7aYbQSfx8pkm0eH/I9ZEWUYHi4vyCRV1T\nlmX0GA8jeZ4zjhNmtCQyiVzRIme0hr4fcOMQ43izlCzPSaoCPQ9/m6YhOMdLL73EOw8fMgwDQitQ\nkmEc45EriUP/aRwoEkte5OT9hFKC1XrJMBryKkPpNaM9oQiGftrEON085/xig5IjYx1nT0IGvAwU\nyxLrNMrEHKbdZoP3ns12h/WeZtOytz7i7OFD3nrnIenRPrdWezBN+GZiu2s5bVtOxoE3T0741//r\nv+a//W/+KX/8u1+gOTnllZdeYrG3zziOXFxdIcPIycmjKPyOTwmPoF7tU5X1TPBPZh/2D694PnkD\n58WRN7j+MZu3/oDdu99gbE5ACWSSEARkqwVlWhB87NJksIxDh8w02WKFSjK8czhr8ZMhLVOmdsCL\nDcMuwQySi7ffpW939KffxllDcBOrZz6BEMkPrYA+eVpPOr+nZ6ZJmpIXOWVVsX9wyL/4F/9ztDk6\nhyPEzpgnRfRv04Q+USNI0iRntdwjL9IbgPBut8N7O0uyNFpHzJ2eJXYyxOWSCB6hZrqTiuMqOdOe\nrnWh1yFrjieOKTHLrfI04fBwTZJIjI/KDiECWZHhfE/fdGQuICdHkRbsr/YZ52LcdyODs0yTYRxH\nqqqiXqxvEnGLqmTXNjc3Cjk7p6x1EV6uIu81Rpm4GPLpA2M3oLykXNXxaK0FVb3ATQ4zeZAKjyLN\nS3wi6dqG4B0iSWHs8CGQZCmr9T55VUbnmRAs9lcRoJJoFJLJWaSUrNcrRlNgjENqzTCNbDZX9NPI\nnbt3qesarccP/bx8tLnzaYo1Ce0oSSfPep1SCsv52QXdDrJsQRA9OnF4RhK9wA8TXdtHDzsKDiQi\nEyg3Mm1bmqYjFAXleg9RL/mdL3yJ7VXHer1m6hx1eciVcZyGhG1TcNV01GnKYlEhU42xsN313Lu7\nZl0KSm1xEpo+SjzuHByBc2xOL2iFp8gEfT+CD2QXKYmQlFmK8IGhFyiTkqIxzuMI9M2A1jnSay7/\n6n3UsufunTs0qafV4LTkMF0gguSbX/8Lzk4v+fGf+vv8/ud/i4vecuuVW9yrK/q24XE7sWlahqmn\nLieE9BwcHCBVDNuSQt4sIL73QvNk7nhzzHzq/xO8wZrhZtbXb9+nOX+D7vGfIuio9tfoNEUoTZAa\noZLowhIBNwyIokRIhUwLVJ4jhUYjMX2DthNCX7EUnjRRDJ1lGh391YRt3kTlX8L2l+TrOyRZjc7q\nmy3+D9MEEItgPF7fbLlnrWmWFyzW+/ziL/4iDx8+BKFm4IdCIPA+3CxKnsw3wxPsnXB4VZKUaxaH\n97h9+y4hBB6+8xadeQdlB/yc467J5sIY+fhgCN4j9JwQS0AFj8Qi9ZwiG6LUxwdFKgNaDDgf43SC\nFkwTVELzzP4BCykYvcMNhkRVLNfPMtUPOEveRYmJi9NHiMlSZRV1UTEJwXl3SUWBlpIJhXWBTdOy\nWq3QWWC1v0Rpz3KZ4+gZRkNalIRCMYw+Zkt5T3Ce/LqpGSYMnrJY4INGZ8tZSZGRZCCkR85zaB/j\nmObspsA0tchUsDiomPqBLJckCg7XS3a7hlRKstU6ngKdiTZQrcjzApUm8bXUGp0qrB3ZnJ+gwsRQ\nLajr+kM/Jx+td74o8AlIqdlebdhuRg73l4xtz243sdv25EVKVqjIsewnnAuYyVDVFVLGhMLEp0yD\nYeqjEymVgr7ZMg4diYS91ZK33ngDKTXPf2xNt4vEn67pOTs94ROvvMzerUPatuVqu4mzzLZlvVhz\n9/4d8qpEaE0/RQRbs91y+94tRj/hjGNvtQZil1EVJdMwMDQNVgREllItF7RNC9bSNS1ZkXPn1hFa\nJgil2O52iERRpnHGtlrv8dxLL/HtN97mj770Jf7xf/ZzfP1wH5QkEYq7t27j+h5/+i5Zotltr1ge\n3Ge1rpEfKJ4/SOd5/Tg/F0qiztCN2GmDNSN2aHFmpNs+pnn0DczukmT9PItDiY7aM+zYggAvFUIW\nqEQThEL2A0JrZFoSlJ4lTAqZ5ngp0dWCzBMdJ7WjOd0wjJbRJFw9fAs37iiPXmB55zXqg+IDYI8n\nIv4fxiVm6ZFEJAnFdWeq47x9uVzyy7/8y3z5y19+8oinNJ/XURXXek6l1Nylxgiauq558OABt2/f\nZbvdsdtcsNsUuNHjnbmJq3lyLI+81ae7ZEkkNQn8jRwXIVBaIIWMIX/EgCfnowJAKUXwE1mRcnp+\ngqZD6xRrDetlzXYYWVYl0kK6XjNuG6SMdszOxBmj8JLVak0pM6pFDVKTpFk0plwbNm4QNBJrHCpJ\nIyODyM0VUmGnyBNViY5po9d6WBElV0pInLXzn0cNbppqhIQ00UymizpaYtJqVDIIhIonUJloghQz\nMnPi6uKCJNX42dggvWTTbAFBWdXU9YIsjaO30Rr0zKT4266PtIimOkdlCZJAogNdY7i8jNDUVDuq\nsuJqt2W53se5wOZqQ72oWdQF+/tr1oWmD5Zxu2NykKAQc8ZKnmlyLXnllRc4efcdnDHITNL3Ld5N\nuK5lGgYO9g+5decuOk/wfcc4TXg8OtUUyxLnAjrLODw8ZNdsGMcBrQWJ1gxdhEwkSZyjNm3Ltu2i\nS0JJBimQSpHWJUELEqEJweOGgQzY31+RzcNrOxmKLGNV1az3ltw+PmZRLnjzjTfZdTt+8u/+NH/6\n1a/gzIgdIEvTaGftdiArhC5jAZXqZlP//V+ztnHuQO20Y+gukFqiMEzDFZvTN2hPX0cAKq1QicTn\nizgWVBKRavw0xMwbb7DTgMhSZFAENKOLLjDhXNQ6So1W0bponUemJclCoZIE7yzOGERn2V6MdFcj\nurjg0dd+A6lykqwmWxziQ6T1hO86Qn+31Oi7n+u1m+hGuP43dLPXj1Nak83FS2tNmsZ43eVyyec/\n/3muXUEQcM7Mi77okfc+oLWaj81RQ3z37m2ODg9j0mmZcXBwwNBvaLaCoYvyHCFDlCwFEFzHiMS5\nLXBTSAWa4A1Bhjhisgalw0wgmxkJDrwLWOM5OCxICskURvqxQQbJXrqk61r6vmO7uQTTsFfkmOAZ\nxgkXAs3Y4Qjs5r1FUUb5n0pmiEmIwO3CwzQNKKnIqhKVZvTDEDOqdEJRJAxdj8oUSmh0kqBDgvOG\nvg+R7h8imtGMMQ9ezmyJaZpQMqBVwFmJzq+9/+CEpDMTi2Qd55pJQqI1CkFVFlyde3abKxarmmns\nYuCfc7NLb44YkpAVOVrLaKv9kOsjLaJ2cnRTT55qvDekOqXvO6qqJktz1ntHVNs8+pdlQp7k5GnK\nwUwzGs2GoR+wXmJ6y0U/osqc4+NbqDzh/YfvcP/eM3zzT78GUqESwWgGNhcXhGlkWS9QiWbTNewG\nzzD2JFnKK8/e4/DwFmmRc352Tje2XF4JdpsrPIGszKgWC8LkGf3I6ckZaZYxGsPZ5QVlWeKEw5iR\nqijo7IRUktXemlQo7GRodzuCUuRlyWQMVqqYfpgk5FlKkWiK9YrN/opvv/4t/s5/+vc4PXmXodlF\nucnQoYLjJ/7OP2Z9dA+d5CDUTQf6vV8fBNKFMGKHS3anbzB2DcgUxIi05/ipYex6slQjgsGOZ0iV\noMWEnS1/U5Lgg0aQoYRCKo8KgWAN09DRtw0pK4plhZkMwat49A8OnVUAOC/wiUelgfqORl1cYQbL\nNFp2j3d485es7nyLJM3IFofzTDI8EcPffPj/5o78ungK8WTWG//sgzbNm1flupA+taC7DjUsioLl\ncsmv/dqvfYDY9N2C+Sh8j4uqB8/c54WPvcCirgDBsqoIB/sEP/CeN+AnmBNEUWEW0UvULOmJrFAi\nAUleO8CiJVQSY5hDEBAcUgU88ubeOFrHcrlgfbAkEQ1GjfRNz+X2Ak6K2MEFzzBN+CJj8mCCxbtI\nXSrrjGkrGEZDVsVlnJCSJE3nLKWIskzTnGtsX5rkTKNlnHoEGpJoW1VakxU5ybyIa/uodhh9jIBO\n8pxpfm+lZCbmC4Tp59faIUTUbAckSVpgjKU3hmVW4n089udJghCBxbIgTyVJluFmK/ZisQQpY26U\ntQxDj0wSHPqvLfq++/poi6j16HmmNnR9PC4a0EKSZoKuvaSuSt7f7hjHkfXemtVyFR0QdmJ7taFr\neqbBEoJk2/Us5AGgSXVOkcd4kXvP3OHs9IwsS6NGLUvRQSDTjNEZHp+eoDPNYllzfLDHy6+8itaa\nXduQVjntdsfl+RkKQTe0FIuaem99swBL+oG26eKRVWjOtxtccBwe7ROUYDcN3Nk/oKwq/DAhgiNL\nNCQpWZmRywLbDWRKU1YVJIpFkWEmz96qxiWBtm947ZMf551vvc7Qt0yD5R/8l/8dL37iJ8mrdeR6\niu+3gDJbLoEw4aYTguuwU4ebtrjdOwz9JT6ATjIUE8oHCA4zdRByPrnzAAAgAElEQVQcdjKcvPUO\npr2kXtaookTmcSaXlCvKokAJj3UGrzRpvSbJK5KiJMgo9lZSYq2JCLfgcULigsKHeOzTeUq+TBke\nNfRXoLTj/PU/jl3P4XOk1SEqSTHTBMjofAqBcexAEH3zScI0GULwJEnKNZf0evl27V2/1lN+YKPN\nB6VQ1//cunXrA13pr/zKr9zojZ/WZSqVRFCOUBweHvPKKy+xWtXE6IYIA1dasVqt6Jo1wY1MXYuY\nMYlKKhIVtaGx+5wLe2AunILAtbpgLtjBE+bseOscQaSzRRT2ViV1WaKFxGcJWT7QNIbzqwuW6zVC\na4TUCJ2z3D8AkYLWkEjSKkEd1ZydnZGVRYwSB4IUJHmGsTFpU88R45MxqGG8uRFdXpyS5gl5WWCc\npVQxj2roexIlGbzDDROTGsiTFOfizflal5ulBSL4KNsSaibRR/G/UArTjzx8513u3onsUTc5nJTs\nNhvcZKjrEplktF3kqUYtucS7iPSbrCOVGq/i2/Nh10d7nFeaokxIdGC5KOiblmmKVq280NEFsh3w\nznB5eYW1lqoqkC7ehS0KnWQMjWE0A2cX57xzdoFBc+/ZB7S9Y1lqju/cpp96sjrjYttytHdM5lJO\nLxrqsqD3I9ZbyrqgWJaMZsAFzeQmdBKPCX3bsbdeYzYOr+MWMC9r+nFC65S+v0JpTZrk8cgzNHgk\nq/UeaaLIqgorAuWiQIoI603znP39A7Is4/L8lGA8udaRfO4Mk5lYrZeQZZw+fsSrH3uR4eqKk3cf\n8+m/919x56VPsH90F53mP2ABnZcyvsPbLcFcEtzA2G6Yhg7rLVLEbCrGISL8okiRqd0QrOf8rOHi\n0SV5JWjnaNtyb4lMK3IlEcUSJQBnyEiReSDLS0YXhY3hGniR5eA9duqx3sV+ygPW4YhuFpV4ph2Y\nqaA/f0y79zqPvv1HqL1XGJ2Kgn8/sTt/DDojyStW+0e0vcE7h5Ka1bKiH0e6tsGaCBM+Pj6ai2g8\nMj777APsPIu7lit9t74zmcPODg8Pb7rSJNH86q/+Km3b3PyMtbErttZSV0ueufeA1aJGBIfUCcHP\nW3PAjANKQp6nYCcwjkRGQlUU0nukCFF8/1Q3LRDRojoHhAbv4kRSgXEBF6IO0phoyqizyL7VRRoZ\nvaRUKmBcRDEmeU4WamReUqQKKTRCSZJMkxYJzidYt8SGSBRwPmDGgbRIY4SKiG6gNItcCRMMCkme\nJFz0PW3bsC8ERVVG0bsXGDfhJ0uuNT70bC/OUTIOesdxJA0RKD0ODcssj9R5a7HjFO2qk4nqgKJk\nt9txcvKI28e3Y5H3nmmaMNNEoiXLas0wxhtumOOJnAsIkVBWsUnKihIhPryKfqRF9M6d22x3ZxGM\nbOOc6HD/COcHjm4t6YaW07Mtzkq8g5PHp6Sp5vj2IVJCvTomdD3BBJrTM3bDiA2aR4+ueOPtE6o6\n59lnHrB3sGDXXkGicEKjVMbtO/sE9T7d1CMRpMuM1TpqPXfdljTNcM6TKh1f8OWSoihIs5SirKPF\nLleY4OjHbj7SVUzGUJYFxViwt1yzXu+zWJRoAXbokWlOUgWyaeJy7DkMkOrozx3osd7ipshjDFkC\nAcw0MGyjlvbw3n2OX/xJbj94hcX+EUlWPqHLf59XRK95nBkwzdtIWggSKVNQJSQr0nyNDg437mLc\nRtfEGGlvUDJ+serjQxI5IbGoJHY8zowM203sYNMcoVPyRYq2ccHhvMd5AzM8Q4QA3mLMhDUjLkRn\ninFgLDhA5QlJMtKeNSRaMly+x2S/zLl9k9f/n/eww/vAjnLvOXyyIFnfIVvdplofUuQpwQtef3Mk\nzRQExzsPH/Lbn/+3gGdvb59XXnmVNE05ONhHa8VnPvMZqrpitVzdFM3r67rAFkWBEIKXX36Zf/JP\n/muUkvzSL/0SzrkIsXBRsL23PuC5557n/v1nWVR1hAcPhl0flxfeP8mflyHaNkUSZ54yAD7GIaun\nWAmz/gIhFEpG0T0+ELyJ3bi4hldLvIdpNGRZQRIEwTi2kyHNE1AFKhMs65rJjAhipExWVkinsJPD\nO0/fDphpxEtJnimG0WKmLt4MAsigSVPNZDw2jDBZyrxAqYRgHXmhOTw64PHJKbvthiSLC1WlBMJ5\n+mZHJjU4j5sMph9Iy4Is0eRZihWCx49PqI9uoYSKFu/gmayNjF8ZKVGHB4dsLi/pdg0qeAiROZqn\nUZO63bVIlZHnOWleoVRCaqPqoagqrAszA/jDy6T6hV/4hV/4vr99P+D15lf/L5SOR8KxH3DOo6Qk\nyxTj1FIvIoqqyGvOzzZopalWixg/kOVkWUWaRO1cbyeSsmK9PmK9POT0fIvOUupVweHegrLQNF1L\nUS4ZB8fl+Q5vO5x36ExydHTAYlUzjgPGmjibEwIRFLuLDVmaIpB0fY9OE7yLFjRj5w2qUNEVlCRU\nRRmJUzphuaw5PjomCOiahiRJ8CFgnefk6pLDg0OKLGWyBjsvJWKYliFfLnl8dsLV+QW3DmLB/Nin\n/g7r4+epVwdkeTkP2r+/RdINYymAdy3T9m2m3TuYvsWSQlA4LwhBk+Q1WgWCHemvTqM8xYykMiCS\nWAikH8mTgBIOlWUEb7F9j50szW6i6SeqZT2nD2iMIUbrxu88/jr90o54b7HO4RyxGPuYez6NMZE1\nTJZhN4AIEW4iDY/e+jZ/8Tt/xF9+9ctcNI/YDp62G0mLNavD26R5gTHR2aK0oF5UaBkTR/+n//F/\n4M/+7E9p256Li0v+1b/6db7xjW9ydXXB7/3e7/HwnXeZxqhhTmdW7bUP/XqbfN2JlmXB0dERRVHw\n53/+tXn85EiTnBdffIlPfepTrNdrEJ5xGNlsNgxdxzRMBD8RgmVzdY4ZR4Jz8wxUAhZBhH4oLVEu\n3DBOBbPgXsTZoffR+36NzjPeE9BY5zEelsslP/bqM5RFwdXminEyrA+OyPKSaTIkSRK/BwQCMeDN\nWodWCm8Nwnm27RVaKvqhZ7fbIJVAqWjt9cSmKMvS+HspRZ6lTCZS5tNUs7c6wDsXvytZgrVz+udk\nmboOO07kaYZ1lnEckHMs9NQPbC/PmYyN2tJppK7qGwqZsxbhHEPXkmmN8A4zTkghqaslSZohpCYv\na5brPaTSMahR6oj1I3akxnrMFNMKnv3Ef/K3fo8+WhTe7oJEeVZ7y3jk6ANxtBeFv8YYsqLEWrj/\n/H26bohuislycbWhqg9ihMEy8NLBmtOrHVeXPXla0+4avvXmt3nm2QNk9hy5rknOz7HG0u4a2s7S\nb86QqWSZr9AEqrLEBcPZ2Rm7beDW/hFT27HdbCjyEqRg6AfarqPdNlTrChGgzApSqTGDwRjLMPum\nUY5pmJgmi3dQ1EtGO9FsNuR5Hot8XWOsp+0HrtodeZJSzjlQV7tLhmGgzAuqomLvzmvo4pBqsY9U\ns31znuV9P1ecp825RYx4c0kwDUJo3NAQ5tmyVBOFsngmRjeBF7jRIUMSC2FIMXbE20gHF1LEI/Ik\nkD7HDgNGOFJvMf0+shDoVGFUwA0OZyekAC9iNfXGx+I649nc5LCjpW8GghWgUmTloYljFgQkq4Iw\nnvLO+A6/deH4+/dW3D3+GM998qe5+7GPE7zDOosgkFcZdVWyXFQ32/PP/fhP8MXf/XeUZU4Ijhde\neIBSkt/5nS+wv7/Hw4fv8n//29/mZ37mp/jc536MT3/60xwcHNxIkK6LaJ7n7O3t8+KLL/IP/+E/\nou8Hfv3Xfx3v4f4z93nppZdYLBaAhGDo24Z3333IrulZr9es1ouY0+RjbrsPFi11ZEZ4hSCK1cWc\nVPr0Uf5ahyrnWeE1znC0BiGiVjnqWQ3PP/eA+/cfYIPFGs/oRspiSRARUZlnS5b1gq7dsbvaQJDY\nYaIuS8zUURUpzhia3SYi+czE7uIcViu8kCDiljsvixvBgnERXBKUQiFIRYZzS7wK5GnG4Gyc186i\n/G9/89t47/nMT/xHGGuw40hvHVpHhm+zbUmSDDyYySEVLOfYlqFtSaWkbZoY/ZGk8cSUxpvgMAwY\nIRhN7PzbvmOYgSReCLK8pCgqwn9Ac/LR6kTLJH5ofR/vMJml3XUzxUfcyA6UcqxWK/KyYBgGHp08\nwvk4nF498wwiLVjs7yFUxu7yOzRXF5i+YX9dUVUFm6sttfJgPJeXj1kuDpGMmDHepTUBnCNMUxQx\nz2I7LWQUCSsdaTXG4T0M/YhwgXpVxJgG4aNtTzrA4xwYO5HInLZtuby8pKoKdJowGctg4tC9LHMc\njrZt6bpuzqTZI6tKhEkZri4p84JbB0fc+thnWB4+i04rlI5Z8bH7/D4LKECIc6DgRoJtSRKLqhYI\nIRmHEeF6sAMEw3hxxdSc03V9nKEmOdY6pkkxNo6+CyRofNCAYpwCTWvQwiHwWHNFmgl2V6fYaUFR\nxa29YGIcOrwZMWYgq2qc9QRzncFusIPBWUsQknGwqEQSsgy9yhkvdoTOwbtnmH7H0Z0D/sGzP8JP\n/Mx/zt37L5IVWdQeihgOWNYVZZFFAIaSSCkYp5FXX3mV3/w3/wfb7Ta6XcoUZxzPPffsTAGKLM4/\n+IMv8c1vfpOvf/3rfPazn+Mzn/k0q9XyphgrFWOW9/b2efnll/n5n/95rHV87c//gtdee43j41uE\nEFFudmw5vzjl/OwMnaQEYtKms5FrqYSM+kn/5D2+cUF5D8QOTxA/gyEQCUazrhUhZiShwgWBtYbJ\nBBSB1bKkXJT4EAhngjzPEAHGvkMGz9jukFmKcJbgJwQKawcmGxd9TW9JdEzW9TYuFmchADqR2Dn0\n0IwxajzRmiSJRb7IcoydsGMXdd15Qut2dN2OVGqqNCdZxDHEnWfusl7t0/YNxhhSrZmGFm8n+t4i\nL7ccHB0wDQNtu2V//4CyyOnchPCORREVAXacCF6w2eyoFwvKcok1DYMZGNouOrgKTd+PeONJaokZ\nB/KyYhy6D/0ufaTH+W/84f/GrVuHjH0Eq2ql0ErTdTuci1t0pTO2244A6CTGri731iyWK559cBuJ\npyyrKA0qa+xokMHx4ME9VAJlnTP1DZvTc8wwcvn4glt3b7Haq5mGgTRLKPOMJI2RuG3fI4RgtVxR\n6pJgozC663s2u4ayrsgTjZaSclHQNQ0iCJI0xQdP2/YEGVgd7JOXGWVdxY7CO6ZxoNntGPqRqqwY\nh55hHNm1O6bRUBQFKksQaR61js6TKMXHP/ezHD/4JKuDO2RFhVL6+56D3lg/RZypBTz4lmAvYNqg\ngOAcwRmCGfBjg2tO6c/fZ+ganHE4IKgUM8UMIBEcIniqMkMnKcZB2440lw12HDFXG9y4I00zvPNY\n5wl+RGsFQvP45IKTd96k2VyikpyAwoeYWRTsRNsNTKPBGc/2/CpCcoUkeIfpJ5zT9IPB6jWLBz/D\ni5/+GQ7v3KeuF2gdheo6TSjyjEVdkaQaZm1g3w+8/dbb/PFXvsrQ9+zv7ZOmKX3X3xzV44wto6pK\n0jRhGAZOTh5zcXHOMIykacJisfjAvPT6aF9VNffu3SXLYgckpcJ7Bwjs1PCdt9/m5PEp6/Uey8Vy\nViiMmKmPrpoQgw6ljxEgWoBWkVqQyUjhCsLP7+WcsSQFiY5QaCEkDon3ChvAmOhse/75+zy4v4fO\nkrgdL0uCN2wvL0lEoMxSms0FD7/zJqcnJ5RFRpalMQq5zOKOICvwPtDsGi4uL8ELFoslOkmwxiFV\nilIxRnuxWFFXy1nxoBBCMXUDiGi1rsqSZV3jTTy1LZf73Lp7lywvOLs45/3332ccew4ODki0wpmJ\nerHPZAzLxQpCwDsbx0DTxG4bl6ISSaIVCMGubRhHQ1kuIlwEi3eW4By73QatJMtFxdD3KCUp85yi\nzOm7hhc/87N/63fqo6U45QWPT05RAswYnUDOWKqqYtdsCV5TlUua3oHxpFlBezFwdHiLNE3JU0/f\nNLRtQ56XuLHn3p1brJcVpxfn7HUFZabJ0wKJwjYdx8dHyGBIs4zj27fYXF4hExVjHdqGfFlzdHRM\nrnPcaFFpRr1M8FKwaXYYM7KqF5R5hnWx/S+qktVyL+rL7MRkLUe3jkBJrJ0YzcA4WMzQ462jyLIZ\nAu3YNlusDxQ6Z1GU7LqRq+ExwToWWcmrP/LT3PvYpylWx7GA6uTGQfS9XB8UkT8V1xscwbXY7jGY\nCekdwQzY7go3DuAdU7dhbC6wLiCTHClyQpggOLzrscOW4DRn5x6ZJhhnsP1EWaWIIDg/vaBvdliv\nWd2Km2o3RklWVu2zXC0I/jZf/tK/45lJcnjrNlmiMSYu2bwXSKUxwtENE24Y42MmTztJpnEiqXNW\nt19jde9VylvPR3jNDE3Os4zFMn5JA2C9xVqPtZaT9084e3yOmQwvv/wqaZYwDCPTNH2AC3otmNc6\nIctiJtfrr7/B2dk5p6eP+dEf/RSvvfYa6/U6eta1Js9zjo+PyPOMRb3ki1/8Emdn53PXGvkBbbuL\nMTkydsU6kUxG3PAyrXcYF8cden77bsT1IS6ivPBP3EsiHuvdLIkKImpDpzmJNBLbFUniGX2Ej2dl\nRpllDH3P2G2RWUa+qmjshHKOTDEnxhpQ8URFlpIRozvOzy7YXOyQuqMsa/YPD0nTHKESlEpJSSAo\nkjSjDETVAhISRZ4pyrzg8vISM84xHgJsiOOvpKzJhiXL/UOc6Wfuq+LevWdIs+UNZUmoijTVOG9p\nmh1pmrK53KFlZA5cM1ohJrEGKbDKogRMJi7K2t0lyzJnvawix6Dd0Ha7GHX9IddHWkS7riU4z9B2\nZGk620Aj6SVLaupqzTBM1GXB6eUlb739PpttH7u2qkbTsahqLk7OeOONt5BakRUF9+49w2q1QL8f\nqLOC5XKPUmva8zOEM7Ttjqt+y6K6RV4WNE2DMRPFsmZvtU+ZFSgSkiyFoBmGAZ0m5FVJoiRpnnJ0\n+5h+bDk8POTg8FaMCbGGtTvg7PKC0Y6ooHh8+oiyzFkvlnTGYJ1FS8E0DbGj8IGu2aEqovspy2IG\nknMEVXH04EcoloekWRlhIvO86Xu5/vrSKXYyAMENBBftm34cUH4g2OgwMsOAnwbsNCKSFKni0iJM\nPTiP9CIeATvH6aMdZ73k1p0lmhE/jWRFjk9rVHXE7qRletwzjg8p65Tl4SH96FgcSJbLFWkiOb77\nAo6Urnc4S/ydnCWYqC+dhh6ZF7jR0m56hmZg7AJaZSwOnyM/foHi+EW8iNDrqozOtrrMZ71mXAZu\ndw1d29O1Le+98y5vvflG7LLyJEa9iBmNFkJka87SmDyPsRfXXaZSis1mw5e+9Id89atf4Z//8/+e\nu3dv8+DBs4CYR1HqhkT/E9byxd/7EhcXF4QQ4oY7OERw0c/9FNUpz3OCMQQzYYVASjFv5N2T99T6\n2IVKS7jG5AnFzHYCZu1jIKogXAA8R8eH3L93h8GOs1MuR0kQ3mGnkc4M9HVBmRUc7O3hQohyKx1h\nxsYLpq4nLzMQ8Tu3XK+YpinefBykaRIz4r0guIAxMUonz55YPpt+Q5kWGGM4PXlE13V87PmX8CLQ\njiOLecnVjhNFlnB8fEgiPJcXp4x9wyIPoCTvPnyIzlJW6z0m6+MGPs+QCvqmBRlIUoUykqLMSVLB\nOPZU65owZywtioKx77FmRMkkRvg4x67t8f8fJ76PtIjePr7N+dkVRsasaucm3n3vIQd7h9SLNc4q\nkIJts4kWMBkdC1fbDbu2o6wURbkgK0pkgPdPTijWC+wjT57kLJYrmk1H101UecYqzxFG4EzHZrdF\nyyVIjZcClWXUdY3yguZyQ7VYU9aLuHl2DuMtRZlTpAl5lbDeX7GfHpNlGVIlnJ6eItOE5cE+Vvg5\n/8Yx9R2F1mRKkq0WnJ70dDNm7Ph4zXpZzw6JgUu/oVos47ggq/jsT/8jVofPkGRzByq/twJ67aH+\na9fsL3fe4tyAGS6wZqTfXlGVKQGPtYaxH7D9luBNtHIqiR3GuA33grEf8V7hrEQlipSUJE1ZFQoz\nepyB3VXD+6dXnO8MyySlrGHsB84fPUblFc5rhAhoLXnh+edpGoNF0Y8T0kuCkzjjIako9g5J1wlm\ne85wdY6/bJiMJlsuyI+fQ1f7yCQnz1LWywVZnpEkGh88ZjI0bcPlxSWPTh5z9viUrmnZXG0Y+p48\nj/PrYRiiYHteFF1v4K21TNN0I3eRM6ezKAqcs5yeXvFrv/brPPfcs/yzf/ZPkVKxWCxiomQSj/sP\nHtznM59t+Z3f/gLTZLHeoMQT6K9UzMupFMGC7cXFTQd1wzoNMRIkSPDOE/R1HIvDBRE5okLH04qI\n8OIYOJrAHNK4v1xQlZoQJg4ODsjTjObqEoEnSRXBOrq+Z2+9Ztc1s33XkyWxo9xtW6z31FnFaCbS\nsuD+s8/SNLub3zV2xXJmcUqqIgLPe2PJixhf7KXAE9i1cd7pbaDrBryUJEXUp6apo5IK7MgwGrwK\neATdOCDniOqTR+9SLJYUdRUlVmkaGcQ6Ja8CMtFRfy5hGHtGM3FwcIi1Pi6IM81quWaUmrFvGVzP\n/8vcm/3ImaVnfr9zvn2LPfckWSSLtap3VVtqLTPCqC3AhnXhuRFg/202DNvAeAD71pAMjZZuCSpr\nm9o3FrfcM/b49vX44kRmUW2ppkseo/QBLDIrkmQwIs753vO+z/N7qrqlaTt6vT55+S+Y4vT48WOS\nuMAUFqNeyNXsgsV0jsQg9Md4TsjZ9QmdqLB8E8MUjMYDrq9XQEMtbPy8InBsLEPySughfJfpes3s\nYkrk+KhWMN8sKUIf1dQcjscUqsKs9ZtbNbqqdRzdx1kul1pXp0wwHaRpgCXxfP+WUu84FqZnYroe\nTaPIswQsQ9tV21oPLIRu4Ke9PpKOqiwIglDLQJTUOLvFgvF4zNHeLus0RyGhU1idwZvf/ym7R48I\nekNMy0Ya5jeSMf2TG+j2UlsZTFfrRdIUDUWaI4TC80yNHFPQKEFdVAgDDMOmE5JOCIRhYQcmWdbS\niA4/8hhHAX4UoNqCeCNYLirStMIUgv2jMaapsGwXYdQIKVBtQ5klVLmH2YsYj0LaJmY6XxNvct1/\nTDM6JTFdU3Mt3R6uMKHqWFVnmIbCCEKkF2H0DnAdhzBw8Xw9POpancuVlyWz6ZTPPv2ckxcn1KWO\nw26bhrKpqKryNgnyphd6s4neDI2UUttKVWDbNjcVvWXpyvHFixO++OILBoM+b731Ft/97ndfmto7\nDAZ9Hj58wGw656/+6l3KsgS6rZWxuI30lVLc6hMNw6AzdB+1VbofqiEk+n2UClrV0imBxoNsB47i\n5mcdxaGU0L/fNPF8myyPCUwtw7MNk2qrU7Udn4qMTZoghKSqW/K8pKwb3BqEURNnJcpwmC6megjc\nKWxLQ0GKogDREYYhTdtRbBJMW+K6NkWWkxcp0oi2HFSNJ7Esi9FozHK+pKoqhnsH1MKgaFocz2Uc\n9amymNX0Ekto1U5R1qgmJYx6DId9gv6APM/oj8YoNObS8oKtk8zavocxRVljCg1Vb9KK9XLNptUJ\nvSawmq8QQtAgsByf3fEus9X6a9fat3ucTwvSNCeeXfOiKbGsViPrioanT56TFzWL9YJNPmP3cBfD\n0JEdjutQlQ3KsJktFlj9PgPfJc1THNdlfXLGZ599wVv3Xmc4GuL4AXbgUtQNl9NrTFtrxPREzqNq\nK9336DpoOuq6RBoWynZwAo+81PnihmHQjzwOjo8Qhp7c53lOnCb4XqCjdKsCwzCoqwLPdYkCDylA\ntZ32yyvFZDLhejrl4uqMUX+ARC/YrKoZ93rcefgj9u+9hR8NsWzvlkT/yw6S/lMb6M1pXnQNXbmh\nztcsLxYITCQmdVVRlwVtW1M0HVlWAiZeoCe9UgodKiehXs/JyorItwicmmp2Rt40NJ3EsgU9IegH\nIWmWk2xW1KWBckyqLCPo6WypqqogKwijPrabQ1vz+LPH25RFgyJJMUzB5PCYnckIjxaVpQjTwfRH\nBPe+hze5T68/YDQeMhpEdG1LXevj5XK54rPPv+DpkyecPj+lLEuiXoghJS06DqMsdRa5Uur2qH6z\ngVqWDpS7CaWr620vfCuwB/B9X3M285y//Mu/Yr3W8JBHjx7heToEzXVdxqMRb7/9Js9fvGB6+fmt\nxrSqqlurqD51ST3sqStkq2iKfMsC+IpUZZomHfUWrbetALeaZQ1UEbf987bVwO4oCjk4PKDXC1HU\n5GlGbxIQBJEercPt6yAMizDs3d4ITMelqMAyfVw/wnIqTFOSxglVre2lRVEwnV6jhAHCYBXHBGEP\nK0loa+1BT5IY1WpQjGFbNHl56+zKsow918H3Q7K61eB1FMLQbinDEOSFDjNURU2RZ9w5OqTCoEWQ\n5TlBL0I2Jk1daY1prNGZnudhWpZ+H8ucWlmYhoVAspjOGUYB/f5QJxUkKU2n35eb9/+fur5dnmgh\nmF3MWdcNedUgu5ZXzB6RbREGLtLqcAYerj+ksw1sAYGqKa43mK1kwJBeFCLo2GQ5ddvRJSVFWmJ7\nLnFXEFotR5MxhmjIkhzXdSjrjMOdHVrLIN9ktInmVXYIbN/DDl2EAZaskQXUcUbVtfQnI/YmIwyh\nyJZz7OEOgWOSzFI2yYauK1iultiGSWBr1qK0HWbrJT0voM1yiqwgNhKKuua6LHlAC1mypS91eOMd\njt78VXqTfWzXRxr/DE/813zrTR4SW5i0oYqtRKbV8Qu0dFVNU5RcX1xzcXJJ2YLtORzfC2jriqZu\nkLJjEFm0TQtthzIMUDXQYFsOQz+ktDZUaU1VNcyyAsP0saIdlGoplmtMp0ZUHUXVUrcxtmVj2wZF\nVdF2HWnR0jQlNDWB7VHGK+JqjpIp6eyC1hrR3/s+o/07vPLGrzAYjjBN7b8vi4LFYsV8PuPs/JzT\nF6dcnl9gWSZB4NMp7cHexDFVVd6K5zUE+asfL8ubHMfRIejR4ewAACAASURBVIPb3t/LG+3NMKnf\n77NcLvn5z/8Cw7AYDAYcHx/ffo/ne+zv7/GrP/weT977c1w6RN1QJWuaOqdVJobhYhgOlhL0EGya\nEtm0mE2N1UlsYSKVTSUKDMtGKJ37jpBYhn7OnQBpt3TUlGWNkh6yczgc7bE36hO6FZskxRAmVZ2S\nlRl5GqNUsyWV2RiWSRj28HoBQuiqcDGPIe7oux6y52EKSVO1lGmMb7v4u3skSUKZJgRhjyrPaJoG\nz9EgkuVqvtX+1vR8H9/skTQ1V7MlhmEQDQe0TQXpGqoK0flskoSmqbEdGyElaQWLvGNomjRC0RV6\nk7QdF9m1FEmCNEwQkk44KNOi7hqQBk1XI4VBU9eIZoVtKHAsWmnShhHj4Zjq4hIfiW0arGfXrDab\nr11u3+ommpc5YRjimjbz5Yq6LEjTFKNzCPsBvV6PfFNzND7GDSyqImdVb7hz3KfOW5KiIK80Jqyr\nanq9HlVSQtYycEIm/R626hCqRkqdhmlaDnUnaVoTL3DAU5RZy8HRIav1CmHqF1of6QzKqiLLcw4O\nDvE8T1vepKJrK+yuxTQkrutQZwnz6ZSmacirGuVXqG1eC50iyxJ2+kNQiul0ymKzRgqDPCsJDAvb\nsUnigjuv/RpBfxfT1oOkb+pGEi/99/91/ULWj1IdXVtgUtIbh2TLJfl6TpOtyLKEMiu4OF0xXSQ0\njk/R+QwGNk1RURcNm1mtX2+l4xTKrkQ5ErOTYLQI38E0JFZnkH85w7A9DCugpsVyQ+qypYtTEBbS\n0vK2oNfDcW0cz+PpyQX98YDDu3v0rBa/XeOokq6OcXfvEz74LV799f+G0d4xURQipKCqSvItHX56\nveDi8oKPPvyIZJNgmhpUkWYpWZ7qQMTt9fKGeJPxnuf5bdUppSSO41st6M3/NwyTMPRvX3Pbtsjz\nhufPX/DHf/zH7O5OCIKA0Wh0W21FvYgHD+7zzk9+kydP/hdMQ2g98WyOkJKh5SAsA9f16ZCoKqcU\nCpUnOgVBKAQ1LyP+LMPEMHT1qZT4avMXAtOwNElM6ufa70f0eiZKSMIwpKoqhBDUdYVS+t/n+4F2\nOtU1tm1qWJA0GI/H5NmUq+sLQjx2JhNMISmBLM2wLJuyqvDCHhh6aMi2r9y2LaZhkyVr1us1qmuQ\nlsl8PqOqag6O927VDWWp4889z8X3PeZzHcFSb91sgecSmNouWlJuY6+NrV8/xXE82k6HS9q2SVkU\nlKWmPjWNtirTSeI8pT8eYW8r1LwsCIIAx5BkScL5+SmzxeJr19y3uol+9vgz7t57wOHBAXQdcazY\n2RvjGAZZkTNbrjg7O2fncId7w1cY9sa4xpL1NEbKBnNsYEqTKsmoi4JCmZRVzU40AFvfbdZlhlIl\nk8kI03KwvBCMDs8bsJqdECcFftjHcOytFjAky2OePn/O9fWMulPcf+VVBoMBdVVxdXVJUaQc3jmk\nq2qUYUKncA2LPFlhWiZlkRPXNUmyoTcaolTLJk4xFDRVjW3b7O3sMEs3+gNvmSRxxp2H7zDee4AX\nDLBs56Vj/H+eS906lHRFWmcznU7ZFViqxmw3lNkG1Va0VQmiwQ0dvKblsycxdf2MnXEAdU3U88g9\nC8fr4XgemAbC9DDsFlVqP3zbKTAdbDfi+LX7TM8u6doCpMSO+jRVzmJ2TppsGIz2WIoOZAtdiVA1\nBh1DX3EUpHhS0bUujXEAvVfZe+Vtjh6+zu7+AUGvR9t1lGVOWZSkScpHH33C3//t33N5cbVldXog\n9I07z7KttVd71G3L2iZ9ytshX1EU+ibTKep6G77GDXhEbGVPHb1ehBAK1/U0Aq4sMU2TyWTC6ekZ\nP/vZzxgOB/z4xz++Pf7blsVoPOJ7P/wxf/GzP+Pyek6e68C7aDjQyZTCxnF9hGth9FscQ1GImlpV\niK4GdTNkbJCGibyhNgktUhdbEn7d6bjxrqvwPZvhOMR2JLZpUhYVmZGxXiY63qPXR21bFjeaV92n\n1cd0PVhzUW2r4eSLgsBycKSN8CLSJqbpFE2nWKzWeHWD64e0SrHcLKgLrXRIEx0it7O7r1m6bcfe\n4SG7u7skWUqZF/i+j2FIVNPiBy6F57BarcirDN8P2NudUC/nKCVwXY+r6TXSsPD9CGVL0jyjaRVh\n2MOytBW0riVRFJGnCfFmhTQF0jSxbY+szLFtbfCwHRPLDJBS4MdrBr3oa9fVt7qJOq5L2zbUVUW/\n19NoK9uiRROSmrbF8wPSOGOz2hAeRhwd3qFNT7icn9OohqP9AyopEXVDW+XEcUZSFOwcH3F9NSMr\nMga7jyg7yNKcBw/fJEsLzi4v6aoKz/PwfB9pGpRNjV1VtHXH/u4uTi/k9OyCzWZNnRVYQmfSl3XB\nYrXGwqa1tTfYEpLQdsmrEt9xyfKcKq+p2oa6afREs2oZ9vtMr7VWsFM1ZZZjRRGW6/DG936b/nAP\nx/W1oP4bOpL+oRb0H3kcDRsRW6Zk13akqzMCS7Mq2w6KskOohrapaeuC8dgnzmuGPUm2WTJrShxT\nE+sXlk1vbCM3a+KNYtw32dsP6GRHuimZXq7pTUYMfJvRwZjrZ/+Rxck50u3TCYN0dU1ZZRT+LmZQ\n0xUtVizxfYdx3+e/+ME9XMfAcwNMe0xjjgiH++zcfcjunVeY7O1hWZY+XpcFSZLy+RePefL4CU+e\nPCHPcgZ9DY5punZbgWbUVfUP6EymZdF13e1k/kYfehMcpytOC6W67eNiO4gqqKqCzWbF/fsPAbGt\ndBocx8bzXE5OTnj//fc5Pr7DvbvaSoph4Hk+h3fu8l/9/r/lgw8/Rq7lNjvdhU7Lk9pWaz0dx8cS\n/a0crUTUFaproZNIQ+cpqRvSkDQRhoHq0KyAqkKpGmkIBgOfw+MJUnQUWUqaJmw2Mcv5ivv3H9Dv\nDylzXZ3bjodp6Mz6OF5RVom2t1Jp374pUFVDsljhhwF11WjMHwLL8ZgvFyziNW++8SsYhsFyudqq\nFPqApKpKpGmjWsXO3iF3t86wvCyI04T1esV4PNY6zSqnrSsEDf0g0N2otsFzAwxpbfudAckmpReN\nSOqUuq4xLYe2bSmKBssyKQqJUq2+mdGx3nQYtkVV6el7EER4nkeRpzSllvb5vgv8C+aJWr4L0iBP\nUoqsxA98gihEqY7A8ynynJ3RmLhIKNKcZ8+eMgwHBJ7LoN9n1cZIaWBJA8ezyVSGE5kQRlyuZqR0\nHDx8gPICnp2fs78zoVYdLS22CaPJEY2C5SZhtdqQJTldVTMYDAnMgKA/QCGJ1xpptlmvKcuSoirY\nbDbYnR4W9MMeQpqYSsujMCRVWTJbLPCigKbSXuib4UJd17R1g+NpHqk0XR69+RP6kyMcN8AwzW8u\nZ/plv1fncOjFaLgIpe15ous0O9LqoYFDBQqTvNBuIc+xcD0bVZd0TUpjelR1zdXVY+ZnS+y24a13\n7uBGb9K2Bp9+do5qDWRgIDYlyWJBuLtHRY/VKscNBNGdA0J3zHK6xuhPCPb3UKZHmywYH4dIK8Ay\nbPK8phQuXn/M0Wtvs390l939HdTtxleRFSXnZ5ecn11weXmJajuCwEcIyIqMLM91KmdTobaAyBsn\nkmEYt4OdJEmoqhLX9bBt61YKZhhgmg5tYxMnMSBwPZvNJgYUw+EY29ZEoBuIr+/r6vTdd/+aO3fu\nMhyOGI0GCKWwbItef8ij19/iN3/7d/jf//3/QZElNFVBY1k0ho0UNpgSw7YxpYcXBHR1SkunYc1I\noEPIFraBfTc3XiU0r9eQzq00sD/0uXN3D9tIqaocy7JJkhV121BVevCUlzVpXugNynG2OfFg2zaW\noS29lrSoioq2BdU0VEVNtm19WI4mRWVJTl5mbFYL+r0htq3lUa7vMd7Z1eoHyyJ0XDzPw/Fc7dn3\nPF2RbjbUTUmrYD69Is1ihr0+O4cHOr4nXmO3Whrmuh6e7VIUJdfXV8RpoiNopB78VlXBzmRCmibQ\nNYS+R6s6LMvBdVxMaSO7jjorEEGgB9hlgSEVQeRj/yd2yW91Ew16Q4q8pSkyVqsVlmuRpDGTgzF7\nvR55ltF2HXs7u+RVSuA5pMmGrFQ8f/aMVVdiCMnx7oSq0FT6neGQZZrx5fkFjTRYpTGbeIUltB6t\nqAs61TAY9DEtKDINGMnSguPju9B2NG1Dvz/S6aOrNavFmsrzCD0fP/RI0g3C1Hq9JEmo8oKDvQPq\ntsOSBqvNBmWAadoUWYXnexR5QZbnOJ6H67r0/IiyzKmLkuHefe698SO8cIBpOS/54n+5659z5L9Z\nbNK0aersVp6dxjlZmuPYIA2TNKtZrjLyrECVMVKUjA8jepM9Li82zK/OWJwX/Oinv8P4zTdZtIJh\naPDonfu44b7+OwxFdNwxbEyK2uSeKQlCh7xsqBvFd6M+ThCSJWvqIiPYsQnuKPI0Zjm75sXVCWcX\nzzi5eJf/7r8fEw2HGHKPRrUUpWaBzudzPvnkEz784APKsiQMA9qupShy3dvcDqtUp/7BEOlmOt40\nzW3lmecFUkqW65g0KRj0AxzbYDabcnp6hmkYjHfGlEVFHKdYluTk5ISjo+NbGEnTNFv9p8Hl5RV/\n/dd/w/HxMYPBD/S0Wxq4ns/O/gG/9a9/l7/727/n5OSULN0QhiGdalA0YDgow8QwA+y20JVi3QIS\naQjarWvuNtcdAE13alt1C2CWEqK+QxDatNkG07AZDBzqWmFIByElnRKUdUWaZ5imQ7XF0pmWohf4\nCKXI84osTakLbT6oqoqy0Wmdy+UKL/C1GUEaCNNGtgpbCmoEmzwh7PUJ+j2apkPS4vs+5tZKWxQF\nnufgDAYYW4xiW1c4rs1qUZLImGSjJUhpvCGrJMOhXqd+FLHZpouWpd7MXdclL7UCqNerbt1Otuto\neVmn5yl1ltM0DWlXY1mGTl5F57f1fJd+sPO1a+lb3UQfPnqTZJOQLGLWScLl1ZQgt2lFg22YhJ6m\nyl9endMfRkyvLnFsG1s4vP3913k6m3F6ckpoWQRBTwvv/ZC2mfHOd77Hl2cnxLMZRwc7pJsVyrXI\nY+3LX8+WWK5eSON+n1F/QF2XRP3+rV4vzzJU1ZCuNiSbGPfeMYbhcHR0TFGkqKalynOu5jPNbyxr\nurrBdX1sx6RGkGc5hhBYlqMJ40IyGk/IVzFFlmMLn8m9X6E/3se8qUK/wTT+G2+fN8MIYdI1BZgB\nolqQLFNWy5wkziiLFEMVdG1FEq+piiu6smK8/4jB7h16uxMM22N4x+Zf/dtH7N95SF6UFHlOGIX0\nBhNW6yVNXYOQzBZLirLAMGyOjo45PT/j+nKDUh3jyYSz6ZLi9JK6bimKkq2Sh7wo+OzTTzk/fcEH\n773HbDEjCEOEUPR6EUEYEMcxz5485/PPP+Pq6hrLtjBMPRDUVUi5PZJvUzZ5KQJ5K2W6kRZpAj0s\nlwuurq4wTIewN+bo8IAXz59R5AXf//53uXfvHkVZ8viLJ+zs7HF9fUkcb3jy5DG7u7vs7u7fDn0s\nS7cBPvnkM95663Pu3bvHzs6EDrBMi15vwOtvvMnv/vT3+J//p/+BNF7TjocI00ApByW2wG1TYHkR\nphPTlg1CNLeSJHXz8/bzIMS2bYNGCAohULR4nk1VZzRlSS8I8E2H4QB8TwNPWhS25WrHTllS1Q2b\n9ZJ+5BAGjgaLNFrf3JQtlm/TCIVj2Zi2TV5U2KaFZUg820GYJkW8JjG1PMp3HJqu1mxdFHIr58qS\neFsNF9iWQSdgvpjSVjUShevZTCZj6rpmtVpqwHNdY7Qmi8UcYX4VjLeJY30a6DrqVp8IbvCF5nZg\nGAQetu2QLLUMLl6usD0X27FYL1akjklWJtR5RpHb9Hzva5fUt7qJvvb22zjS5oP3PmC1WtNva37w\no7dJkjXXlxekvk8Y+uyOdzg43GU6veT58+fs7u6TlBmjyZCd4YBq26j2vIC6bMiWKX4/4gevvUar\nKqo8YV4lZIsp6/mQqDfSGlHf1yARWwNMrucziiIn7Pdp2wZTSHbHO6yWS5I8Z5PEOHWBYxmsFmst\nq3AdnCDk6YtTxkFElqTcefU+6zzVujTTpheELDdrqqZGdQLfCxF5S1dX3H/7HXrjYwzHx7T+GcOk\nb2oBvbHMC0FV5axm14xdhTQ65pfnPHu6YDA0MKVF3RlEo2O+98oP8QaHRMMjTCdg9+iI3mCEYek8\nnc0mpqalNX0+e3pOVT1ltVpyenrGs+fPMW2b8XBImuX85V/8HJTix7/2a3Sq45P3P6Usa15741XW\n6yVFWeK5HnlRcHV5hVIdo9GI/nCAQvHhBx/yG7/+Ez75+FNGoxHn55d8/NHHXFxckKUp7bZvWdf1\nbXWJ2GYTbRfRVwmaxu3w5EYDapo2lmUTBAG/91/+lAf3X0EKySZNeOvNtxgO+5imyfPnJ6xWa7Is\nJy8yHn/xmJ/97M+RUnJ1dc1oNMS2dZZ8FEWcnZ3zySef8vrrrzEej241na7nsbd/wK/9xm/yFz//\nE66vLqCrMESH2gKaOwRKWGC6CNMDo8QUHU1daLW9qvVUvgPTFghDaz1RIIQuFJqsRVqSutHZRwKT\nompwfB/L8W/trI7vYWUeTVPjWA5BGCItRdXUmJaWPdm2Rsv1RqPt5uWSJhkHB65mh6Lo6oIyS6Gu\nyTYrhGWjLBthOThBT782cUZdFayWc4qqJM9zptdXOI7D+fkZlhQMen2qCsL+AMPQg7/NZo1hOXRt\nTdu1yEZj/+IkIStyDg4OqJqOoioZDkc4vkfkB0C3TYTtaPMKIRS0+t/t2Q6u75FXBUEUYTkWKoxI\n1wviOP7aNfXt9kQtA2kaHL9yl+vrSzzfJl6v+M7bb3J6esLl9Jp+v89g0CdZr3FMi97NJLatcHyP\n/b0dNrM5WV7SWYZOMmxrDKDM9MTNE5JHx/compq8rOjqhtDVdyPRtuR5gmkO6Pf7zNcr0jQlcD1c\nxyGtah68co8nL55hGALP017fsiwxXY/NjYB+f5/d/pCP3vuA5y9OwTZxQp++HyKVnvr5W+vbnTt3\niZ0ZSu7zxjv/hnCwsz3G///UB7251A2GWaDaGmF4VJViWSRYNNiOx2D3AL/nMzp+BeH0ObZHGF4f\nN+jhBn0cz6NtKjarFRfn17cWyrPzU66ur4njhLZtWczmfPbZJzRdyyv37vP8yyc8e/YcaQj29vZ5\n8sVjrmdTXMdjsjPm+bNntE1DEAW0bc3pyTPNPPC1rdL1XF7p3yfq9Tg7uyTLSxzb5vp6yrPnz2jb\nBrmtKsuyvJX+/GOb5ssQ5Zs+4o1HPk1jnG266527d/nBD3/A8fEhm01KmmWEQcCg1wMlOD5WWLaN\nAH7jJz/hD/7gD3jvvfd47733WW9iFssFuzu7mKaJ49g8ffqUDz74gDfffIMg0BIi09K5Wvfu3+e/\n/v3/lv/tf/0ft+mmFcKoEJ2OHG62cOxGWUjTo6t1qqdhSVBbn/82YsUUEinBQFCVDZ1SVFWFEhI/\n6pE3lQb2KA0kMQ2brMgxLImsTbIiQyoD4Rv0egNMS+H6km4r/bMcG9f2cX2HMOzRtgrHHVEVFZaQ\nxJs1vV5EJjriZIOQUBU52DZ+b0DkuSBN1uuadLNhs1zSoiiKnDSLCcOQg4NDTKFD6Tw3oN/vb4d6\nOZOdPbquYzOba6MGWj1g27buBauOIAgxLBNhWliWo6EjShGFPllWkOQZVVZtPwvavVfWJY7jYpo2\nwjSQqiNdb5A3yQD/xPWtbqLnFy/oWtjbO+DN777Js88+pStTPn7/P7J/dMhrD1/lej7TvuUiRRod\nIEmzikYpSgx6jk+cJVieRaYy4jzBCC3M0OHq8oLxoM9OOMSVAs/tyJcLrs/PONo/osoyDZVAkZcZ\nRVmRpQlGWSKalslghGUZrNcptmkQug6OZbPZbPACn7zVCoPTk1Os3V1WWcL+nSNOLs5ZXm8IexGT\n8RipwDEdfN9HAFEUEdouk/tvMLjzKm7Q07ZO+ctrQv85HPubo7zqOjoFWSlocCkan1ZIRq8cMX5z\nBzsa4YV9lOFhmB6GZdMpRVFWTK+vWc4XTOczZtMZV1eXnJ2eMZ/P6JRCoBds29R8Z2t7rKuKOFa8\n9vpr26gMXfXt7e1rVUBb62n2cEDbNqRpyt27D3AciyRJaTsdoaKzniQXFxdbNFpB3TS0nUIaQk9U\nm+bWzfOy9vMGaXfz65ezkvRz0s6loqjYmezwwx/9iOPjYxzHZTpf8OL5GR9++CXjccBrDx/QqY6q\nbnj9zdfY392lqmqyNOfo6JB33vkx/+7f/Xv+w5/8KYP+YJsEGjGfLzg/v+DFixe89dZbAJjSwHEd\nRuMJ3/3e9/nkw++zXs6RAg0YafVnXikQ0sZwPFTdaLCH6kAJZCd0yGOnObzC0JF1bVPTtkKjCwWU\nVYPjhuRyTacknmdTVvrm4XkeCP0aeJ6PQA/bpGfjWTrJIS+K216vArIsI89LbNvVxHjHoio11V6Z\n4EU+ZaVjP3zHZZ3kxLMZnu0w3jkg2sJ/DKkHVK5t4jkDTNNk1O+hlOLkZInn6QSHrmowLYdGdWR5\nQZpnLJeaL2CaJsPhEM90t9ZWh96gr+NQ2obxaMLJyXNCP8AyHRzHZTGdQacLo84QGj3oOkjLxHdD\nRNeytmYY7b/gjKWyiCmrhl4ZEUYuigrT0HfP5fQarzdkMtnjanrBejbFsk08z8cLI0zXo5Vw7949\n3l9cUXcd3rDHdDWjrEvqeUtNx3y5wm0NirZmkydEOyM826Mta3rjIZbr0LoNHYplvCZerdnfP8Ay\nTDol2GQxV9NL+r0eZy9OObp7TFEUhLt7WKZJXpaM9/cZjifYQLDrEwz7nF1ecHF+weJ6RlkUDEZD\n7t9/cFsZ5bRYgyP83kj7yb9pxMcv9b03b77YfqWHKlVVkiSxPqY4O/jjexiWi+kOsL2IqmnpOu1r\nruqGxeUVy8WS9XpNmiRs1hsWyyWr5Zw8LynyAs/zqZtqe8cHPwwpS+3sKYqcosi1YNs0yPOMNM1u\nJ+NqWyl5nkNRVNsNsCDebOiUwvNdykJj0OYzLcye7EwwDR09fMPpRGpvuGl85TYCbjfUl6vQl3/c\nQEIMaXB9fcn+3i6u63J6es5wOCDebPirdz/gT//kb/jVdx4xGQ9wbIfzq2t2dicc7O1hmho40uv1\nsC2H3d0d9nZ3b51Nvu+yWKy4uLjkww8/5tGjR9ucc2MbI9Pj/sNX+Z3f/T1+9kf/J/PVBoneREWn\nNNLOEFi2Q2eXdJ1C0G43UxDSQMoOjK3cSWg9qzQUUunUVDcYUjYC2wnoUKxXG602KQodyuZaW9dV\nj2ST3DquTNnSdoVm4rYNQRThexENCqUE6/WS2WzGzs4OrusibYMuVzRdjbBNyq5h4EY6NbOumZ2d\nYdQdbqDzy/qRptErIQiCgLptmM/nt71MraHNNOwFhSpLQFJ3LV4YbKt1bm+Ytuvpm6lsttrvQLcP\n6posy+hHEevlAj/SbF7VCWzHQRgWTQdXl9cMRwNcw6JpuMUg/lPXt8sTNSWO6XBxfkJTV0x2RjRp\nQm1KHMdltlzi+AE/fufX+bu//b9JNiuKvCEr1hzfGUIA0+sL7biQBrPnL9jMY+7uHlFXHaiKbLnh\ni9OPKTYbbN8lSlOUErrfWVW4kU9ngeP5OI7DzmSCa7q4tkccx9vJbo2UkslwyPTqGicIma+WRKMx\nSZKQZRlTZviOjRcEDMZjzSssK7JMTwzXyxVNXWz/vJzXvvdb9Hfv4AbRS4zQ/3xV6FcHd/1V2yma\nuqYoC7I0piwrTNvD23uk1QNVwyor6JIVTaNp+9OrK6bTKWmaUVc1cRxTFCVlUero47alaXQkSl5o\n+RAI0ixjuVxtj+Its9mcpinZ2dkjjjecnp4ipWB//4DFYkFVlXrx1A15nml4RZPQ1A2WbbFZxwih\nN7r1eq1Zj1mKEoq9nT0tFA8jfD/YgkG4Pa7fVKC3FKRfyIEHneDpuq7WJk7GIARVXZOkGYvFEtu2\nsIyON946YndvognuQuF7LnXVUNcNXdNuqUktz58/4+L87HZyfrMILUvTvp4+fcrl5SXHx8cA29gK\njXJ79dEbnD/9EufZMy5nMaopEPggNEBEmRaYFspStKqGRiFMhVTbgDqpEIaCrqVRzRZcYpKkOVVj\nYJge4UBgi4bGEKRxQpkXCDoEDoYpCHwXQ0jaqqHMMgpqLJvbfn0HWg8dRLdtk2brJLIsgTQFWBIp\nTFwRaDOK51MWFXQdXVly+uWX4Cl6vT5pljIajRmMhmzSBJQiCkKyLGPQG6CE/Ep/6wUEfkQY9RmE\n3jYRImM1X7DZbPSN2bZx3ZA0jREK8jTjuiyJoh51WVJYBsN+Hy/UUqflYokd+NiOR1nWfPnlGUJI\nDnf3CMI+dVF87Vr7dilOH3/EYDyh6QT94ZDd0ZCTL7/E8VyEErimS7za8PTLp+zsHmDbLnmSslkk\n5KuUvcM90tWGrqr58vETpqslR+MDWqfm/OSUq9Wcpkg5HIwYDyKC8YjGc4miPmZncnF6QiNazNDB\ndC0MIfCdEOUoyrxgs4m5vpqxf3DIIAxogoar6zmtMBlGfXw/RLUt6+WSy/WGw4M9TNehrUrauuTV\nh/f59KNPkIGvjz5pws7OLnGWMzx8iOP3kMa2ivom5/NfogoVW1BF23UaxtE0lFVJUZZ0SGzbxTBt\n1nHC1WxFURQ0Tcvs+pqry0vm0xmd6sjzkqbSoXHcWPcsC9dxQEKeF/Qth9F4hO1o+G2W5biuh1Id\ntm1R1y2ua7NarUiShN///d8HYLGY8+LFCQcHB8RxTF3XpGlK23YaUqEUL168YLNZE0Xanqi1n4K6\n1iaG6+trbNsminrs7+8TBCGe520z5bvb6l7+I62Slx9zXRfTtBgOhvhBwGq1IYpCyqqi34vo9ULC\n9YY8yzXirSiwbe2EapoWy7Ru35ovHj/mvQ/eYzqd7u+CjgAAIABJREFU4Qc+lmVRlhXhVk2wWCx4\n/Pgxh4eH+nlJibEFZOzu7/PG27+CqnLmixVtmaG6CFNIncoqBMIwUUZHJ9HsUGGCUEih9FFa5xUg\npR4wtV3LapPyN3/zPj/9N79NFHpIlVBvahAd/UGkJ/ptuU1MkPiuTdZ2VGXJzm4fP7C4vMqRpQaj\nWJZD04Jh6GN0GIbUdUnbeQgJSjW654oiSWJMYRJFPaq8xJQmuUhZZTHnie6hh2Gk34+2o6wrTEMP\n9waDAV0HV9Nr7ep7RdPx8zzHMh0OD0YIqfiy/Zz1Wgv6yyzDdzx8x8W0NDFttZjqNpofIgW0XQtd\ng+t4BEHIYDC4BQo5lo2BZLPWOnSMf8E9UdkJLKU/kFWW0fZ72J5LmWbQQp7n+IZN23ak6zWdUoxG\nI7JFytWTF8zFiqP+mLbsMDqD0Axp04bcTDk+OOL4/l3SZIWnFL5t0ZgmzniEZXo4OHihQ1qk9MZ9\n0jzlww8/wjZtLHuK5wY6LKxuGdzg7NqGB48e8tnjZxzd8ynSFIlg3B8iRpKsSKmaEtl1dE1L3WWE\ngYthGBwe7FLnGZvVHH/3FZzeGMP2NGCEb0ho+iWuG8lO27aUVU3b1NSNRqUlScZ6tSZOYqqqIok3\nLOYzphdXlLXmZpZVhSG1NEvYAtEKoihiZ2dCEPqkaYplWwR+yO7eLmWRI6Q+GrvuV+0JwzBuXT9C\n6P7TYrHYEuO1UHo+n5OmGV3X3XrSl8sF6/WGzz//HNd1ePLkCdPpjLoudfKjkDi2vQUm11xcXJDn\nOWEYcP/+A5TSAnHD2AYKbytRTUACtsf4m8cMw2AwGLBcLnEdF7qOtmlp65q6afCjgCTLsCyTLM2J\neiGbTay93lK3PjbrNT/7+c/4wz/6Qz7++GOGwyF5nuF57m1VLIRgNpvx0Ucf8c47PyYItBVUSIlp\nWYRRj3sPHnB98hnDyGYeZ6gqBUcL3YUw6IQFQqEMqTfTzkCidEqBMFEoTKTmjSpFVTUUZcvP/+pv\n+ZM/+0v+9a+/jqXWbBYxbV3TCwJukkdRHVVVoDqJIQ1aCcvlkk75upfdVHihiyEdPCvEsU29Sc2v\nydKYMPChqVFtq+N3LJfxeIco6GF0IDrFeDRivbRZXyX0w4hVrAEfSilWqyWN6nCdACEEk8kE07QJ\n/UBzR4sSaZl0TUsn9HNzHIe7d++RJGOabX7ZdHoFCA4ODumFPvPrjtVyQVOWGOJGeqZ1ooHjkMUJ\nLTqSZ2/vgDuHR6wWS5ACNwy+dq19uz3ROOfL6WPKWhGNe7R1g+c5zNdrTGWQpxlXlzP27h3jhi6W\nZTIejpmKU05OTkgKn9F3e/TCMW+/NWG6XOBLB7ODumsJ+n3iJmc+ndMG3pYi3rBZT2njkmg4YTTe\n4dnTL3j1tUf85Cc/wXZ80iTn+dMX5EmOgYSmZbi/g1eWFE3LeBWzms7ZOd6nrSHyA4Y7I/70z/+M\nKArYHQw42N8jXixJNht29/eIwgBTSEzLZnT4CD8aYTuuvvP/f+yFvjwk4ab67DrqptFDubqhLApm\n8yWr9ZosScmzjPl8xmqx0CAOoWnjpmkz6ffwfU0g1xulzyv37iENua1uW8bjMY5j38ZsgHrJa90h\nhEQpXTF0nboFYpRlxWAwwDAMyrKi61omkx3GY3VLS9JDJz2Bfeutt0iSmHv3XkEIwSeffMzl5SWP\nHz/GQIvadTSvQ5alWzCwoNfrsb9/sGVJWv/gNVLoQDe1nU7fHPN7vR6WZW/By4q6qhFCUtcNURiy\nWq8JfQ8FBH5AUZRcXJzTNC1ZmvPixTPeffddTk5OdG9QSuq63OLUtNzJti3m8yWz2YLnz5/x9ttv\nA1+pCFzXZbyzy+tvvc315QnrL06oqgRR2yjDRgmBNC26BoQSiM5ANgrRbVOWlEIKAyEVUuiY5jbb\nIKVFldf88X/4c37ltQmTvha6r1Yr1qsFvu9q8v/WsYUyME2tvVxMr6lql061zGYzXC8kDIaU1ASe\ni2Nqza1rabjzZrO+nZZPxhMMaVKVJXXbkpU5xfkZs+kU6dpkZbG9eS1IskS/boKt7bbh7OwMIfTr\nYhkmcRxjWRZFWbCMExaLKfFqzZ27R3iOw9XVJYap0wEsy2K1nHN0dMzx4TEXF6fE6yWWZTDo9fFN\nXbBJ1+Ps9JzRZJfA1SeLftSjKkpm6yWmY3/tkvxWN9E7R68wnc6ZLRak65S/v34P17cQCjzDoS06\nsizTgvpBiGkJrp6/4CAcYyG5vt4w6O8xDjzOpi/IipT7r98hX6XkbUtrSvp7BwSOSzqbY0iYLa7w\nbIdOVdrp4PvcPbrL9PoKf9CjUZLBeEJRVLSDElPB+ckpLy5OuPPwPuPJAd/5To/Hnz4mz3NEo8MD\nlFIMd4bEWUrkOOwPJ9S29nWbW2G3alqiwQ7HD97Ccm4oTeKbSj3/yetmU3jZ971crZjNlqw3G9Ik\nY3Z9zWx6zWI+w3G0rEqaBoN+n+FogOP4eK7WB47HI/r9vgZz1DUITcK6GQTdbJ6GlDrSdltxdp2i\n2X59U/2VZUtdN9zkFSlV3T7fX8wyuiEl3VS1nucxGAwpipzRaMxms+bRo0dMp3PeffcvME2bqtL5\nPKrrWMxnbDYxbdvpGOJ+/3a49Iuv1cvV6A3AQ3Udbaeo6woEuJ7LYrnm1Qf3aZsGyzSJoggpJRfn\nVzx58pznz1/wR//XH/LRBx9qb7lhUJYlcZzgugGu61KWuve7Wq2YzWZ88smnPHr0Gpb11dDLsmw8\nP2S0e8Dezoinz86I6xyqHGFJpLAQGAgJ0hSoRm6TQDpoJUrcxIdonqdpKrK8pCxLPC/i9Oyc2WLO\nzqCP5zsUue4zG6bCsbQ0yrVtiqKmzHOk5zMeT3A9yTpdkmUZJycnHB5IcmzK0mV3NNyyB3K6usJz\nbYb9IZvNmjRNMQ0LlCJNE87Pzui2n4N+4GGaerColGKxJfkfHh5qrB0aCnRxdUma5npA5CYsF2sd\nU1JVbDYbVNPw5MkTmqrWQnrH4vpayyMNw0CinV0SGAx6ZEnKcjWnNX38Xl+bXraJBev1CkMYLJdL\nTNNms1njROHXrrtvdRMtNktMq+POq4fY21z3q+k1juUycHxE3bJMUl6sZuQ0sCyQccH4bsjewyOM\nOOHi7AXWq48QzoDN+jGbJKOsY8aTCGHryif3DNS4T7LJtBhbCML9HfqjAfNqTn8vgDhncfGMQThh\nuVpTFR15XaGosHoeTQ1FbvHxh0+wZI3vKUZOwKrZYDg2ppA8OLjLl59/jj3cpS5qAj/ilbt3mc+n\nzDczHjx8yOTh63jRAClvJE3fYKD0j+222wF827WoTuPtyqpiPl+wWmnk2Gw65+TFKddXV7Rtjeu5\n+GHAcNBnPBlraYgX4HkuQRAwHAyxbAv4arOU22PxDf39ZuP7xc3oZgBwY618+bGbSfzLG5ceTHxV\nxd4MKm5+3000hw5uc9nd3WUwGDAej1kulzx4cJ/nz5/y/vvv61aAoeVAeZ5zfX19K7rXVaZ1e6S+\n+XN/8XUVQoCCJNlg2waq64h8H9d12dmZQNcRRSFtWzNfLPjZn/2cv/m7v99WXzn9fh8EW0VCQZZl\nVFVBVdV6Eqw0Q+H6esqTJ0+Yz+ccHOzf/t2GaWA7DqPBgEf7A5IHu7z74TOwPKhNLM+iNRpaLyMo\nd0isnM6BNk3wDIFRN5qEZUpaHNJSEUtFLjr6hkDUCteKwO4hpaXlV7bNerlgFq+IxgP8YUQxuyRL\n10Q9h6bpqNuAqH+EtOcslhmDXsW+pyPD4/mSpM5ImophGCHrgp5pEEQR55cX4JiEgxGmLTEdSdW0\n7Iwn9CZ75GXBJolJ8wTTsTENwfnVJXVRMhmOONo/JhAmbadQaYZtStp8w2TnHnENeW5wfPc+WRKz\nXF0x2RvhBRGrle6jF/mSF+ef4jk+ea5oWnjw+iPOLl+QX10xKjvqRmFaHq6yma+neKakmv0/zL3X\nkiRpeqb3uJbhoSNSi6rurhbTMwCmBwMs1ha7NCxp3F3ygBdAoxlvBBdCnvKMJzSe7JoNsAa5wMxg\npmVVdYnMqkqdocO15MEfERmZlV3oIY3W62ZhGeHp4vc/wl//xPu93zWqriGlCWn0X7ElGiYRCRWv\njy7xGk2EukuG2XNJ5Ip2p0lvf5f3VdB0E62SmF6PuTw/J/VBrZtkcoZEzmw6wDENDMPgcjAnSH02\ntzewah4oGd0Nj6vLa87PzmhZLuFkzuXFgIMHh3j1LoOLCyRJIwpjZFnlYP8hQRpzcnbEdDbG9Rrs\nH+wyGk4YXp0gyxmzYEq73cZt1JnMpvR6XS7PzzBNk9lsjGVYJHnG3PdRdZ2ykmj0HuDUmsjq72aF\nvg2gFVXF6ilelAVBIOrz5/M5w8GQly9ecvTiJefn5ziOg2mZNJptNrY26HW71OserusI2tiCnSDL\nElmaLShJ+QrIlhbi6uwL93gJlrIsYnAl5QoslyC7HO8N5epm3DfKU9Vbx73JqEuUZbWyVnVdwzBa\nAvCbTVqtFru7+zx+/A2vX71iNBqi6QZpGjEcCrdwKTYi4rXSrTGsn3e55HnO1eCa07Mzmq0migxp\nHJMkCb/5zeckacSbkxO+ffqCMAypqnLVVTJJYpKFdFwYRuJzkqDrOnGcYFkWs9mU4XDEixcv6Pd7\nawwCEfKxvTadBx+zObjCOzplksQohkscJ0gayJpol2wYBkWRIekaZRIJz0KRFkT6HE2RUGRE+w5F\nxrF0NFW065BlDc1xSKcz5lFEDkymM1JAVnRh4cc5rltDllQoZVpOg06tg2eJTptpkNHa6BHNEly3\nxmw6xZZhkA6oOTWKSojbxHGE49bY2NhgfCW433EYEoUhlq6iqt5ChGSMbZhkyFxdDjA1k6IQgtCq\nqqJoJptbO7w8OqbebQpvcDEP+/v75GWOqoqeVvV6ne2NNmWWcnF+xebGHtejCVdXl+zs7KPW55SZ\nxPx6Qp6EjE6PefDgIdF0xJvTV6iGztXgGrtd8q7lhxUgqblEwYy8gtksoNvp4UcJrY1NwnDO10ff\nctDr06o3mA6HpFWFbdWob/V4+OmP0Joan//qN7w6fs71+RWf/Ohjuht9ciUnTSMUzcIPEh5//YRm\nt8/e1r7QaixLZmdD1E6HIpepSpVWc5NJUuKaLqenQxobGTu7u8zjCa22R1ZUDAaX5GmOJBc0GqJy\nZjIb0+q0OXj4EFVV2dvZ4vj4Jbqm8enHnxAkMagK9U4Tq97BafSRVWORkf9+CaW34HNhva0AABhP\nZiLmOZny7MkTnnzzhPl8tqjPrrG9s8XW9ib9/gaNRh3bFqBpGPoCtFi101gC5/K1bjm+NbY1QCq5\n+bHdgOft92KfdX1o6a1t16uNxNUt+Z7SrbFpmuAxGoZBvV7HNAx2d3b4i7/8C2azGZJkUxQpk8mE\nPC/p9Torvujdsa9fp7KgRU1GE16+PKZe9yirkqdPn3BxfkFZlsz9KcPhEEmSRW8twwAgSSLSlAX/\nUyXPM3w/wLYFayBNU3TdoCwrrq6u+eqrr/jss5+K0MrqoaGi6DZ2cwPXldnquYxfBqRE2KYlmtIl\nBepCyKSqCizTISsLsiSjKMWvQpFAUhXUqsLWVSxDpek5SFUBeUGY50gV6LaDXatTlTmD6YBsMsV1\nBCm9QqZW81BkjTBOqNt1UYeuaoT+hOFshOYYtJsNgtAnC+YkSUZZlTiORL3ZQLMs8qpYJfA002A2\nnIIkklJlpmN7Di2vQRwEBEEoHvq6xdGrN1RVhesJDu58PBb6u3EC0zmqqgvNWFVG9gssW2cymYr4\nsqYjV4JNEPkBg8GAjz76lLQqOD8/4w8+/pAoSLj0Z8znAa9fn3P4wSGNTpNAEV6X4zmk+bspTsqf\n//mf//k7t/j/cfnb//t/Q9I1wiTlejjk8PAhjXaLaTCj3e8ShQHT0RBdEjG56WyKn0QcHR+TFTlS\nmdJwa0hFxd7uPoZpEiQRiq7R7faQZYU0jCmygiIr0CSJfrNNOp+jSWA4LVyvIVTHJZiOJ3z7zWM0\n0yRMUtAUFE1BUSXa7Raua5GmCVkaUeQJQRDj1evUG02G19eosuihXVY5YRDQ7HZIshTNsuj1e+w/\n+iNaG+9jOc1Fnfz/N1deVN5AluecnJzyy1/+il/+w694dXSEP5tT82ocPtznxz/5MY8+eJ/d3V16\nvR61Wm1R86wsRIdFRj7LFln0NXL+snfP+jjWQWfdkrv7Wl+/2PuW9bxc7h7v7X3fpibdBVtd13Ec\nV/Q6UhQcx+bkzRuQKpFRD6PVfksu6X1jXIYplqruaZpwfn7BN998zatXr5jN5iSLpnamaeJ5nngg\nIiQFs0xYvst48dIKdhxnlbRaxmaTJMXzPHZ2duh2OzfXtZirokhQmEEa8+LogqwyyCqEEpEhaDiy\nqor5qQqgEq22y1IArCRTlTmj8ZAsSahZOjv9Bp9+fIhlwmQwYXh1TRkn5FmKKsssYkIYlomm69j2\nDYMkL0oMx8Kp1TAcCxWJwWRIJRc02k3iOBQgv2BMyIqEW6uj6SpFWRKFvpC37GwiyxL+aIphmmRJ\ngj+bM5/NxMNd1fFqNSRZIctygiDGD0KyqiRKUxRVw2u1mM9moidYkiFRcX1xiaxIQoZyOCJLYxRZ\nokhTLs4vCeYxO/uH2G6N+XyKpFa0Om3iNGU4m1JvNUmLhCLPoCwwTAPf95n5M/703/+v33lv/qCW\naK6KrNvujgXIXA2v2d3b4/rkipmhkydCauwkP6fX7uB6NRRDp1b3qNU8ytmcydRnOJ5wJQ3ZPTzE\ncCzSIqFMC5RSyNW9t7OPJqskUUQ4HmAZKvMi5fr8jJKCrZ3+Qs1bod1pcnV1TU2RyMoNfH9MWaT0\nOkIAwdBLqjJF1XVqnketVkNRFLrdLqcnb5hMJnz4wYcc7h8SRCE7+/tcD6+p1VvU2rui7Yf6uwku\n3+d+SpJQ6JnPZrx6/Zq/+9v/wuPHTxmPxvQ6bT798SfsHezR7/dptRpYln2r4dZKnGPhSkuLeuul\n2lG1iFNWZfVWrHJ9DOsW3HKMd9+vxz7fXnd7WWbx167+rf3ujgeEwIhoFifxh5/9jKfPnhKGEUdH\nR0RRBIC/6NWjadrqtR4+WJ/fJEnQNJU8LxgOh1xcnDMej3HdGqpi4boeiiKvRJyX+6qqTJbJKIq6\niOuKDqFhGGJZ9sKlFy0optMZw+GQp0+f8vDhg1WVVVmWSLKM6TRQzBYfPNzh0csh//RsQpHKaIZG\nkeeYChSVTlVV+GGErcoUkiyUm6oSQ5WI4whDAVMFS61oWBpFGuBPc/IwxZ8MSWWJdquJZaiYegM/\nCSjyBNN20B1DFFLEmWBTSCDrBpUEZqHS63Vo9dtkcYQqA1S4nkccx0yDkIxSAJYkKGdViSghTjNK\nqaIshYXq2g7tdpusyAnTmKqAbqtHUcoEcYIuK6RZztbWFl6zSVVVXJye0ex0uT69QldUTMtmPJhg\nuTZ5kqHKKkkYociwtbnN5eWIJ08e8+iTT2jUmxiGQZKl1JtNHqrimoLAR1c1ri5OkKqK7kYfZfbu\nRnU/qCX6i//rf0dBoem6aLpKlMWijjZLyf2A+XSGquukRQmygqEbxGFImWUMLi85+uoFtuMx9UMq\nVSUrChr1JpYuXKv5fIZp6ASzGVWaIBcFlydvaLXreA2XKMlI8pg4jZClnPPTY3qdFkE4p1JV+tub\n6LZBFM6Iojnz2aIKp8xxHZdud0t0+5zNSOKY+XxGmRf4/pwoCmk0m6i6Jlw7w2HrwU9ptDdRdRNZ\n+X5qTTcxw+Vn8b4oCi4vr/j1r/+J//gf/xO/+dVv0FWNn/zkU37840/48KMP2d3dpd1pY1sWiqqs\nrKxlrBOWpY83IQJ426pcnveulXjXclzfd/n+7eNxa9v19+vJpLvHBd5hqS6OVYG84KLquoHneYzH\nI9HxMUlQFJkwjFf8URG7vT2W5RiW51qGOpaVTjdxYEF9um2Nr4+zFEpKi+9KVdUFiBqrXkviexCW\n8YcfPsJxnJu5WD50ipxg+IqihBfHbygklTQvhatdZuimQVHKXF9dARWmaaCpGlWeoVcleRahagpl\nntKumWy2XTodlyT1sRwT3VAxbZP+RhfDVCnylLyISbKYdrfNPJgxGVyRJvGi7lxG11WKqiCcx9Sb\nHqahcHZyjG5oFHmGohpEYUxe5SiysIZtU8eruRR5wXg0ZTrzkVQJVVOxHJs4jvFqNa4HA6EotShQ\nOD0/R5IVur0eve4GF+cX6KqGjMxsPsV1alRFJaiEvR55kZGlGbs72yCJKr08zdAVnTQRrUh0Q6PR\naFOkAXEQQwmaqmObDkWaE8988iRDRnSy6Ha6fPIn/9N33qM/qCVaFhKj6zGFH5FWCbIKzbqLFEd0\nvA57O/u8urikKkqKNCONRemhooImSzz4+GNkQ6NpGjQ6PaajETISiiyjaCpJmdJo9FF1jWw2I/VD\n3IbL2dkJpuvQ8mwGwZxep0m308QfXTCdDmm2Gnz9/CV2s0GtUUfXTCaja64uLvnssz/ENh3yTCJX\nCgzD5uzsAssySOIUx7axDZP5dEZYb2A5NlVRYXlbGLaHookKJel7WqHLpaqWN6nImA8GA371q1/z\n+W+/IPBDPvnRxxweHrC3t8fm1gau6wqrrixJs2J1Q992zRG1LXeA5Ob/b8cM32WRLt+vxxxvgG8d\nqKW3gPBuQunu+e9bJInb+0ggKQpUFY16A13TCYOA5y+f880335DnYh6urq4W41QwDP3Wtdwd0xIw\nhUp9gO+Lfuyapt6K7a4DuqKoyLKyeJWi730UrUImS/qTrmtMpxPG4xFHR8d0Op3V/AkNUBndbuPH\nJdubLXb6NZ6d+eiORZokWEZFEATIisHm9ha2LhOFAXlSous6ZRqgSrDZbUKRsNmq0+u46HIl2mu4\nFkZpoKoysqGQ+hGzQLAMkCXyIiOOAqqywFQUdArSJCMI56RFTpHreN4mcTRDUxVUCSRNI80TJF2l\nKnI0Q6fdamDpMnGUIiE6cx4cHJJVGePRiGa3KxpEUlKr1ZjNfTHXYcTVxTmabuK6Lu1mi62NHl/8\n5re0O21UXePo2Qt2tnd58+oY0xBqVmEQArDV3+TV8XPSOKTf26TTa6MbNpqq4TgOwTQgCmMajRp+\nEOI5HoGkMw0zms02juUwmoyWsq3fufygIDqf+NQNnTxJSMuYeq8OZcrV2RmmavFw94CXr86YXoyo\nWw52wyJSI/qbbfz5FK3T4Pr6ina3R6fdoMwj4jTE8Zr4ccDc97kYXnG4t0umVARlSl6U1Jod5vM5\nnY6JZpuMhtcUeYylmyiFaJ3s1RoMh2NkWSWcTXn/4R6mojMdTaDSkDBoNR103USWVfIcer0N6rU6\n4WxGlmQopYRcwNG3z/jTj/4Nhunc6IV+bwxdbniTyb68vOQ//+Vf8fkXX5KnGe+//5BHHz7ivfcf\nLkjekpALjNMV+EpS9RYoVVW1nhhfrfuu161RrR3rLoiuH0esW08k3d7nbjhgCbx3x7P++buW6uZp\ngGHoUFU8fPiQvMgZT6eMBteLggKFIJhTliWNRlM0RLvHegZRNlmWInZtmtaiYVtBmgrlqfXJk2WJ\nopAW6lHyqm5/2WY5DANsW2jXxnEiKDhxwnA45KuvvuLHP/501ZZZzKOgKVVWnzff/h17200uBgFx\nHqOaHkWZiN5PZYVu6SRFAqqGgYQcizhhKYPrutQck41ug81unU6jTqnBydEx88Cn22sT+wGGrIqy\nyzAGTUFCpubW0SWVKsmYT+dIisxkPqWUwK310TSV6+sJVAV5FlPz2iRzAWKWYwMViiqh6yqR7y9K\nZetsbR9wPhsxnE9B15AWer6e4/Li+Qt6WxvU6g0ePHzAZDpnPp3yOk3Fd3qwz8X5BZJtUpQZZ2cn\neJ6HP/epNzx29/ZptdpiDJaDbZhsb27jhxGvTk/QqpI0jinSnDSOyeIE27II/YBmo8HJm9f4oYbt\nNtEMB8vyvvM3B8u05w+0aBIYuo6maxwcHtBttsjihPHc5/jijOF8Rt32yKYhg1fnvPz2JeOZz/lw\nhFWv4xcJk2iOqkpoukocB0zDMZUC5xcnyBK4hoWmaHT7WyQlWK0WJRplrjEejCmznCzJuLq4pioV\nwiDDsT2arQ7bmzv0OzvoqsXf/OXfkyQFcZQT+Bmj6xmDyyEnb864PL/m4uKaV8en1Gp1TNPBNRzy\nKEWXNLY39nHqXXTTFrzQ35Fdvw42L1+85Jf/+Gt+8Yu/oMgz/uzP/g3/9r/9Mz755GN0XSdNM4Iw\nEsUCVbWIca7xOYs7Lnh12zV/1xjW369btMt933LFV+dZhgxEO9/1fe5z/9et2eX6u5avWO4/VllV\nVIhOjo1Gk+2dHT768CNct0aRi7kIAmFVxnFInmdUVUmxNjdCGq9cueZVVS3YDBayDGma3RnL7blS\nlJsEksjS5wRhQJplVMskUClUrUajMWdnZ5ycnK6OJ0sSsqJSSSq6u0EY5mz2u2x1aiiLbqjLB9F6\nqKEoS7KyQJE1qKRVfLndarC12SHPIs4vTqiKkiopsCSdZBYxH0zQKgVDttAUE12xUGSDvJBQVIsK\nlVJWkHUDWTUpJBWv4TGZTFaanHmakSWxKN1cFFrkeS6KW7Kc+XxOnqQokkzoz/CaLXTHIUhSdMvC\ncByux2PSIhcK9bbN5uYGDx4e0t/oosgglQWyVPHppx+jqDLz+YwiS9ne6i/Kj0Wyrr9oYijKiCVO\nT0+QZZmtrU10XeXp0ycoioSiaQwnA6IkYjIZMp1PMEyT4WTMy1fHBHFMlv9XrOK0s7OBSkWaxjx7\n9pxOr4VtuYRpii1JlLKEaZr88R/+nN/+8td89dVj/uX/+N8wnk8pqjFavSQKQgxd5fz0mFavSZZn\njGdDZFnC0Qw2u32hKJ8JwrVtemBWUGlUqc+QBtQgAAAgAElEQVRwMAJNwfM8VFmn5jbp9XbxM4nB\nYMzTL5/h2ha6bkIls7m5zbePXxLNUmRVYjgZMx5PMG2Lre1tjo9foVYSrusRzENUeUa3t4PtNkQd\n+sqV/92pTXme4/s+w+GQ//Af/nt2dnZot9toukaSxhTLOCcLN7e4ZWQCC2ttsXLJ57wLYt9nWSfX\nv9NiZXk66ZbFendZAvPdcMDdV1VVN6wBbocNFgdagfdSP7TT7lAUBdPJRDSry3JESCES4hiLRJ+I\nY67P+g2gCotSiCsnibqwSDNUVaWqoCxvsxBEou5G9KQoCuIoJk0i8lx0c02SBNu2mc99xuMpz559\ny/7+nhiPLFoeK5qGZHiUah1TM9nb7nExfkVYxlTIVCgolUIqlUhKiawqUFYkRYQhyyApVMg4tTqt\ndh21VHBdh6vxhHA258FD0Q789atjTl+fYJomrltnFvqLB56MaRhIhcQkGFJIIp6rmTbNZp2ryzPy\nJMa1hMjO6ZtTRtM5Vq2BZZioCyDTJAld1YjinPl8hh9EbDVb1NwWslShVhXT2QnT+YxGqykSdlWO\nbho4NZc8T9CbdWE5ZhlhOOMnP/ox4XTK8dER+3s7QkjGMpnNZsRxzGzhbVSSzHA8IYhC7HqNZqNF\nScX51aVQxJ/PMV2TipwkCTl4eMiXXz1GWYR6ptPJO++FHzSx9OTv/08MQ9TBjiZTGs0Wim7iByFb\n29sApElMu1nHj0P2Pjhk78FDVMMgLypMzURXFBzHJc0S8jJnc2sTwzBouB66LFPlKSevX/Ht4ycU\nZUlRlpimw+XgmtlQ9InXDZ3YD8mSHLfmMQ184jTjm68eI1UVH7z/EEWtkDWZ3kaPjz/8CCpQNI3f\nfv45v//Tn9LqdjF0jU67SxYnTEbjhUxaQm3zIRsPfoRTb93I3v2O1mie53z5xZf89d/8LWVZstHv\ns72zjaari4TRgsu52P5tq+3t2CVr295nFf5zFKb1+Oj6OW9bhG+D89vHkJCkm1jp2y71u8nONwdG\nNKJbPCiWD5MlN1RVVfzAZzQerkATqkWP9ZtKJklaJpWW413GX+UFeyAjTTOKolxk+JdjFccrF/qW\nRZGvqruWPe0Nw8C23RUzQNe1VZmrJEl8/PHHq4IAIciSM5/7PPnqa0xVYmd3m+FkxngeCPWmSkKV\ndSSppCQXYZOiRM5zqjwhzRNU06TRrNHyTNJwjOt5NFpdZsGUNE9ptpoYhki2hXHMbD6jUiS8moei\nqsiAUkEY+IIGBfQ6PZKy4Pr6Al0VCv1JnOAHIUEY0e9vYpoWwWzKdDImSxLyrODqakCaFRiGRXtz\nB1M3KFMBrK+Oj8UcqzKSIiMrCq1WkzzPiKKAfl/kN6bjEUVZIMkiyVUVBS+fv0BTdRrtDqquYTui\nfLnICyzLZj6bkucZM18I77hODUUpMW2TMAmYTsaUZU5VVmxub1NWFa5TI4siwtmEn/+7//k7f3Y/\nqDs/mQ2xXAuv2aDRapKUEqWssb25R8drIZcFKCWn4YDOBzs8+PTDBQnXxp9G2EaNolKYRyGSrmNZ\nLmmcoksqSRzz+uyEf/j8NyTk2A2LskqJI5/h+JJ628OwTYLQJ08jgsBn7k+ZByFPnz4njAPef/+A\nn3z6EbIkSLxR6nP0+hnPXn7Dh48ekCYRjmORJBGua3P8+oQvvviS8XTCweFDWu0OZxdX6LUmllu7\nycj/v6iVj+OYOInp9br8iz/5Yz765CMUVSFNs0XCpLxFR7rPMrwLZuuZ6PXk0t2a8vVwwrp7u77d\n+jnuuvv3nf+21XmbC3rX8rxPA/Ru8ml1PklCqm7Qr6JCVmRs26HX67O9vUOzXifPC+I4JklSoZea\npStrchlHFp9vg74sq+i6sWiWlrwVHlmCb1FUyPKNxyHAt1yIrtzMW5aJCptlie7R0fGNS79sqKeb\n2I0tJkEFqkG700CR87XvL0eqCqEnSikSZpqI1ftxSpDmNLt9NEOnkkpG0zElKrsPdonTgLPL1+RV\njuVYqLpEXCQomkyUCtpSFAWYlk6v10XXVaDEtUzOL88RXUc1qlLGqTWwLBdTt/CcGpHvMxiMGA4m\nvD45ZzYPMQyLXm8D07S4Prui7tZRJAVZ1lBVnSzPmc/DVWglCHyePv2WyWS2ErguJfCaDZrNBrZl\n8Aef/R4bGxtcXl4yuB6xs7PLdDYlCGNkVUfXLer1OlvbGxweHuI4DmEUkOc5uq6xs7VJUWRkUYCq\nVMThHE2FqszY29pis91++4ZcW35Qd16RYTQeUHObdPsb+HFCXhSCCF5JyMj4eUIu54RVgSU3iKYj\nHN1EUyReHL8ky1MkrcKr2TimiVopyKVMs9Xm+PKUYRKgY9Ns1pDykjKH8WTAhx99QtdxuR5cMJsP\nUOSSvb09Slmju7mJaWucn53gGQaoMu1eGyVSqTc8JlcjktTnvQ/e5yef/QGnZ2e8OT8DSvYODghn\nIV8/fUqn3WSWptiNLqq+6Nr4O1QpldVNTfn5+TlnZ2c0Gg10XSWOw4XFc6PWvg5gyxYYd0HobiJo\nua7ibWtx9b+3LEmA29n0+5JDt89T3Uow3XXZ77N674u13ke1urVPdcMGKKtKqDUhSlMdx2Fne4/p\nbEr6/DnT6VSUH8bRSmVfaBlwa2wAZQmKUi0y8xq6rhFFAVEUYpg33SDL8oZrWxTyCoSXVLI4jsmy\nlDzXV/3uXdcljmNGozHffPPNKr69BFHDMDBsj6PjZyiWhuN6NF2Tq1mBVGlCMCXPkVUFWVbJ0kJU\nLxUlsmpyNZwTJgWt3iaJnor+T7M5nl3Qqte5PDsjtmYYtkWS5jSbdWTdoCxLoiTBD33SPBNVWaZO\nt+WRSjlJltKsNZAlCd0yyKKEq8sBlSSTJjGj4ZCyhHarQ1VkqLLGzsYmpmlz/OoVo4splBWGIUqg\nVUPHrrlkSUQ4D0T4RLPI04w0Tjg/OcP1PNHSpyxRZNA0Fce0aLbrmE6dIIg4OT0jziPyJGaj30dW\nNPqb2ziuTkmBauhMZyHz4bWg/BUJ3WYDTRHVe8Pra6xag2+efU3t4SPUf+Z+/UHd+S9+8X9gGBaG\nbWM7NXq9Dea+qGqwDI3ZbAJyRVgklJJEkWXkcYKmKqDKvHj5HN1UiGNRQWTpBp5boygLHK9Ordng\nejxAVmUc26ZclLkNLgfkWY5l2ygqtFt1VEXB92NG05BClkiShGAyYXtjk9l0xiz0qbXqqKaBrZtU\nScnZ5TnD0TWO67K/t4/r1SjKijSL6XT7yJpCqep88Af/inZ/Z9XN8/u68kvASNOUk5MT0jRlY2ND\n0FfKt+lF3+X2vssaXbca77Nc71u3AsM7l3E3VHCba7nYYRHLvHvM+zii7woh3A03rAC3KCmrYgFk\nUFYl5TIqK4kYaZqmVGXB9WCwesiIl6AlCem+2+wDsf8NrWpVI58mGLpBRbkAzHKR0RcJPZGgKlbn\nh2pRWeWsQg2qqq7CMaZpcHBwSKNRv3Hp05SLy0v+6fMvkRSVZquOXCVcjiKoVBQkSopFTFSlzCqU\nokCqCqZhyOV0ysZmh/2tFkoZ0e1vgGoRT69QKhieXyFXErbtUlTgtVo0O13SLEdVVKb+nOl8TqPb\npVQlbM8jTBLySkGRhf0bhREXZxecnV5gmhaO7VCV1aJfk4Si6riOy9bWLldX11xeXpCWCrPZnMPD\nQ4Iw4Oz8HKfm0O9vEoQ+b169pt/pkcYJk+GYoiiJw4iqKAn8AK/hcX4qqtJM0+HiYkinv8HnX36J\naZuomoKq6Mxmc3x/RpqG+MEcPwyZznySUHCH00woc50cv0Y3LFTD5GowQFZ0jp+9pEpTfvY//C/3\n3lvwQ3f7zCVs08G0bGzbIU8LWnWHvf1t0jDCa9bJkhh1NuH49JSr5A3b/S0kVSJKAt7b3wKpRKpK\nijyj02owDWfMZyHX0ymmafLZx3/A51/8msvZOSoSDa/J9sYWo8shqqLTbtn4wZQiz5iMYjLFpNNs\nM5kMKAsZKpmygMFgQqwJKa2WUSMuMmS54mpwCbKE5ZhCMNoMmc2mqKaBZtRoGQ6yZixuku/vx69b\nef5C/XtJf1mS5e8mXd61VFUl2sVyP9jd3fa+sdy8B5Zxx3virOuhAEmS1kBkkQxaKyX9rnjpcnkX\nh3N9fDfXL8C6rNZBeTkeIeXX6/UIQ5+jV8f4c39VRSRqwlUkSbjeS+txuRRFhaKwIssLDdOQNEtW\nMc4bV/2GGXEz9hJZ1tasdLGtqKfXmU6nTKcznj9/zs7ONrKioMgKmqbTaLaYRjnnozm2pdBptvBq\nKf5E0H5kSSTAKAo0RcWQdPJSR1Z1srxkOJqSFTm2ZSIpQpE/HEvEYYKkqIzHPl6zh6wbhElGTVHZ\n3Njh1dExcZRhuR5hFAtrHZX5RFjhs1h0Xb08OSMJQtqdLp1WG0PXV9/96ek5MhIPHjxkNvN59eqY\nMAxRbFsohKkKjXYL3TKZ+nM2N7ewTIc0zvDnc1RJxlQMTMXg6vQC07awbIsg8BeluSn93i5/9Ve/\nJCsUvHqT87Nz9vZ3mfkB5AXT4SXdbo3d/R02m21Ozy4JZRPdVGk5GqauEM8jIRCeQZAXdJodrvIz\nKuXdUc8fNCaqoxLOfR4/fszp6Qnj0TX+bEqSZ9R6bbZ2ttns9DFRkJOcfq9Hb7NHp9dhGk0oQp+u\nV2OjUaffbhAGMyrgcjzEMh2effOUV4+f8XBjj7pVQ6pk0iil1+qyu7VPicTf/90/MJlMqHsNOv0u\nntciiQsURWN3b5/QjyhLmbKUmYznpFnF3A+5OL9iMLyiqkouL895/foVZ2dv6PV6bG1t8/jpY8I0\nwaw1qbc6i7YL339ZAoXoJxQyn8+p1URPm6WE2/pNe9f1XVYnrVt3xVo8c3WOslrRnNbPex9wrX/+\nrpjnffvf2eqd7jjcjsN+l5V833mBxfWsj/XGvUcCVVVwHRfLduh0+rAQdk7ThDRNVjXvN2O9e13i\nP5qmY9ui7XGSRGvfg0gsrc/9MpQhVK2WvFnxUF2XDqyqcsUZDcNQgKMiiP2Oa6NbNoNpyOnZJboi\ns72zs9J3VRQFqSpW5y3LUoQzJBlJ0bgajri8HmLXXKIoIooSUkmh0jTq7Q5RnpNVFZWsMfUDLq9G\ni4eGRhokyJVMEuWossH1ySWD0wuCKMSwLWyrRhynpLEQ9a6qCn8eEsxDgkA0GNQME0lSePz0CS+e\nHxEGIZcXlyRpysz3idMEp+bS39hC13Usy8J1XcoCDM3Eq9WwTQtV1pBRKLOKq/OLRTmthWVZbGxs\noWniIdXd2CRJkoWm65w4jjEsG9/3FyLZGpKkIKkqjlsnzwo2trdxXA/HqzH3Q3792y/ob29Tqe+2\nNX9QEH11OaSIITqfEZyPMCqZwJ+TzadMzk45PT1lEPhorofm1ZknGZsH77G58xCpsOg6Hq4h6u6H\n51OCUczZ8RtUKce2FeqWw+B8xvlgjtHos7X3iH5nkzz3CfNTRpchFB5KXieeRmz0amwcuuBVYBqc\nng2oUJhNR7gyHGgOe6WNU5qEpcSzV1c8PjplFKZkuYw/DTg5eU2uhfyrP/sjgnmAbW+jqYIfKsnf\nL6m0YkEuwGRpga7fzHcBcv21DqpwH3Xpu13k1RZ395Fur/+ufe+C4XqCqCwFaN8HtOtx3e+clztM\ng/U5Wp5bVPqsH+O26IkkSZiGgWPbdDptTMNYKVclSbKmYlWuEk3LBNP69SmKvAJSAb7Fwo3PF9Vh\nNw+y9URRmiYrFaebeSlXvMrxeMxkMuHo5fHK0ldUDdty2G63icZTxn7B02HJB4eHuJaMrCYkZUxS\nKkilhpQWSEVGlocYuoypmMwHKYPrCj/QiII5anaFVEp47Rq7j/Z57/c/JlVM8srCttuYNYfT2YC5\nXBAvOvB2Gx1MTefF0RETP8CyG6iFipYUPGj3sFEYnl4zPh8TjmKqTGUyDRmFMUbNopJKiqpEdV1e\nT2bkUoZhQeAPCKcz9jZ32ds7wKrX6B0esPn+BwyjBG+jR2lUpEqG02+QGBlyR2KYp7w+u8Q1HMo4\n5r3DXUbTKfMoRjMl3nt/g7qj8vrlJaXSwesdgGMxGI4IpyGdvk2cTBmPB4R5zpurAa2tLVzLxlVl\n8tmUcD4jTJPv/E3CDwyilZTz8vgZtitUv6tKQkEliXMU2WA2m/LmzTHX15fUGzW2t7e5vLjgt//0\nT+xub/Lpjz5jNBozno1J0whVFZU5k/GUJC7I0pKn3z7n5M0bsizCslXSLGE+D1Bki/52h4cH22gS\nzIOAgT/n9OwSOS959uVjJFnmajRgOhkR+3OuBwMkU6O90Yeywo3BykGl4tmzb1d6koOrAV9/9SUH\ne9t88vHHsLhh7khqfq8lyzJ8X7RNWNa93xVDvmuB3ifQcfO54jankRXo3I0zrv4uXPe7UnfVHavy\nbdC8D+S5NQk34YH1z7e1RNfd9VtW8MqiWxx7McX3zfPNOIXVVvfqtJot6o26iKOWJVmWLl75atu7\ncyHmV1iTqqriODXgxhpd7nc3RLKkWIksff5WlVSSJMiyTBCITqmPHz8WsduqQlVVTMvCrXtUVUEQ\nxVxfjri6uKbd6yIpMuViPHkqSPglMiiqqNuXIU1TTk/PmAcxaZKh6zqe5eJZHppqcrj/ENex0FVB\nzO+1O4TzEKmU6PY3KRWZOM/59sUzTs5OqOQKSzNIo5jHj78hjmM2d7c5fO8BXruJYujYdQ91ofEr\nSQrj8QjLcvDqDfZ2dznY26VerxGGAYapIWuiKMGxXD7+8CO67S6z6QTXdeltbLCzs8vu7i5ZmlFz\n63i1Bt1ulzD00TQVVRfx7jCKSaIUS7fY3z+g0XSZT8c4To16rSt6Qk1GjKcBumaTJJmwpPOcIIiQ\nNQ1FUVbdWJeqX9+1/KAgWlYZeZ6gaSKwH/gJqmIxGs6ZTnzmU58sSYniOVJZ8Pr1MX/7N3/NP/7j\nf6HRaPLLX/2K169PuTi/wGt5HDw4pN3t4HiiE6dp2siyzN7+Dl7dEZSUssQ0bAzdxKtbvPdgh5qt\nEaYJ33x7xMXVCEc1+ZOf/wzXs2l2Wvzxv/gjut0WklpxMb0mzhPC2QxXMpDTAqUqsQyNL37zOW9e\nvkaTdNxajb//5V+jGwrNZgNV1VgmVr7vUlU3DbWWLtt9lT7rALrcb/n3rnW6fuxykble7bsCnjsW\nabUA4/L+GObq+7yTHLoBbEHaXv7cbgBSXiVrvuuYYvv199KdOYDVpN5y5RfzU1W3p1ySUFQV16nh\nOoL2JMnSKs4s+J85y5jm+iLc9KWVCqoqlOFN0yTLxH434YPqlhUKwp2v1xtr7IkllWqNakbFcDji\n6OiIweAauJH6a7WbyLpwQ6M44/XrN+RlJehzqkKZL/imioqkaVRIlAurOc9z3pwNODkfMfFDAc4l\nyJVOEGQgyWhKgaHmFEmEa3uEfoShCWX72TzArdW5vhqyt7+HaRv4ozGaJBPO/JVSll1zafZ7zPOE\nTCrZ3j/k/fc/wNCEyLNobW3jOC7NRoNOp0sch4xnE4bDAUEQEIcRs8kUqchpNmrM/RGWY4kiHMdj\nZ3ePfrcHpYRlWwyGV5ydvSFJIhRF1OjPJgHXV0OC2ZRet4Gha3z7+DlVoVKW0GrX8YMUt96h5jWx\nHI+9vYMFp1ehVquxf7DPpz/5VHQreMfygyaWVFujCkqyIqVdb3F+fo7X6iFVJVcXV+iGgm6oSKrB\nmzevMZyaCPyXFYOrC8bTEXklyjYnk5BXb85BV9jc7DMYXNBsefz8j3/G3sEBlZpzeXFO061Rt3WG\nowvGVydUpo6ilCApNDqbbO4+4PWTp3z8wfvUdnc4eXPMqAhotDyiKuGbx0/wmj28Rg3ZqKGEDjv7\nu3hujdHFGD+MOXrxmsZOg/d+/IiEnLwsMNSlatP3z8wDK6L2+rIEvXe5v8v/L6Xlvot0v3KBqwqk\n5fluZ/zvuu13QXcdrG9bkjf1/mUp6tDvhgyWLIP7jrEY7a05u5WQWjs/FchIVEurtRKlk6UseiYt\nwXVpEZqmaJ3dbnWwbQvfD9F1nTzPFnqgGooiI4j3N2MQIF6x1CKQZQXPqy9AtESWKyRJuXVNy8qw\npci0aZoLgL7Rk60qwcIwTZPJdMJ0NuP58xf0+n0kSTQMtFwbVddAUkjSksnYp9J0OpsbBG9SkjyF\nqgQZ4ryiWLRSVhVhHft+ysujSw62FWazKck4Ia0UgrIkLUbohsLF2Rm6lXFYaTh6jSxMefLV1/ze\n7/+UMIxp1Or0N9okaUASiJ7usiQxnk5RDJOoLJHMEKfdojJMJEWm6bUYpimaDkiiJl+WVHRFQ5UV\nyqoQCveWi6XbxEHIyfExaRTTbtW5vr7EDwP8WYxumDw4FPebqU3BtGi16xRZwmA44Q//+Gf8wy8/\np9PqMZv4eIZFMBmzu7vFyfEJG5t9ev1t4nCEYjTQTRc512l5DnkuJC5N3cCyTKqi4MmTx3Ra7+aJ\n/rCWKKIp3HA0YjwZ8vrVa559+4woTIjCiNCfUeYJsgybmxv8yz/5U957+B62bWE7Br3tHt2NHppp\nkhUS14Mx19dDilKoz6NUbGz2+eqLLzg5OWc+FvXSg8EVk/E1GjlFHtDdamHVXcpM5fWRiMUOBxdM\nri5J5z5h6JNWCRvbGxzs7+C6Dq1+m97DPXq7XdIwIPEDuu0ueZxRzFLOn5/w9W8+x3FdFFVZtOn9\nnhNzBxzvZrnvs0LXrc3119L1vy9e+t0hgds8zeVya0z3ANt9oF5VN8mdm3XlW8dev87lue6LgS4X\nWZYFqX7JnJLvHmfZv0pojSoLzqXo8y6AtObWFnXWWyxd8DzPyLJ0YVW+HX64mX9BadI0Fc/zsCwb\nVZUpipswwPIhtnwIWpZFreYtOn/eHHv5XSzbRed5zmA45IsvvyJJhIiMrml4Xh1VN8mLalEWqXA9\nGFJvd/js538o5qgsCJNYtBWWFZBkVFXEm6Os4OR8hGW1KStJqPDnFcNJgB/F2LZJRUGWFciSzqcf\n/hitqqjyjMP9A968esPoYsj08hpTVsmiiJPXb5jN57Q7bdyaTZZlODWXeruNXa9hmiZHz5+LKipF\nJ4gidNuh0+vhuTWQSmqNBv2NHpubWyKskmS063WksiBLBfsBKmRdJU0yfD9EqgRdLY5jTEunu9HH\ntG22tjbZP9wlyzLiIOfN0Wu2Nvv0WnVarSZff/kNsqSiqCqNVg/dMHFcb/U9id9kCVJJkoYkccDp\n2RvetfygINrf2Me0XA4fHDIajzBMBVkpKbMY17HY3Ozjui4He/v87LM/Ynh1zfMnz4Xu4OU5eSmj\naQYbmxvohoptW6JlhNug191CV3S2t7d5+N4hilySpAGvXh5zenKOik4a+yRpyGg6QNV0PvzoU5Ko\nQFNVXEvH1hU2eh0uzs+YTCZ8/cXnKzCr1evk4ZTU97EUlTAJeX52jGoa/PjRJzzq7mOEMLoeiRuB\n28DzfZclnUaSblzOdQC8Dzzvi0fe/d93bQs37iW8DV6rdRJvxUTftSz5lXdjoOthiLvnui/WupyT\nqqqo5Ark5bwK+pYkL4FTrJUX5Zw3PYxursG2LWzbptfvYSy6cbKQGlzGRW/A/iZUcvOgKVaWrQBS\nB1iKlxSr8y7ZFJZlL1pRL2+7ty38PM+RkBiPxlxfD3jx4iWACEG4tVXJqKqq5GVFnOW8ePGCn332\nc/70T//1gnsqiQSOpgsK0CKMVVUSMz9hFiYMRnOGkyFxkSFpBlEUoigKtuWSFjKO28Rza7x4+oQf\nffAep29OCCYzSHOu35zx6skzLs8vKIqMVruBrotzGYZGBRQUTKeidbKpagRzH8dxaPV72F4Nc+HW\nu65Lq+6hKApZkpIlCfPphND3kSlxHJuPP36EW3dXQi5lAWdnp0KizzKI4xhF1tnc3iAvYg4Od5jP\n5kKrotJxbBtDkzk82KUqCopKxnQbqLq2KrHVdZ0sT8mymCCcYZo6tZqDV7fpdZrv/G3/oCA6nSbU\n6l1QVDa3+mzvbvDo0UMMS6XdqePYBj/60Sdsbu5w8uqUydhnPgvo9XuUeUEQZpxfDJnP51iOznBy\nhe1azGZz4iBFkXWeP31OmWe4tsF7Dw/QdJXrixHHL04YjSdkSYStGYKjF8R0uh3eP9hjPrqiIqes\nClzNIp34NGtNnFqd88tzTFXHlSR6toOUpRRlTnuzi2woTIcjXv7mW8q5hFQubt7fAUDXQelu1vo+\na/MuKK4D53oWf/3z+rm+y9q8DyDvi62+G0SX5Py3q47+OWv07Tm5my26WbWy+tasP0kWianlOsGO\nEEAqKzK6LvpPtZotvHqdohAiyXm+FK4uFtfMW+cW8d5l4k7CcVxct0atdiObtkwEVlWFbdvU6w0c\nx1k8iPNVqGZZN79MMGma6K8+Ho958uSJAOEKDN1E06xFwzYZRRO97c/Ozvj666/5t3/23/HJpz+i\nIiNNhRydohgYuomiy8RxzNwPubqasLH9ENM2GE2GRMGMk1evifwIVbNRrQb1zgZZltFteYyG1/z9\n3/wVsizTbHpkcYKBim2aYu4VRYxHER5Xkec8ffqE6XSEVFSkYYxcVlxfX+F4NZobPUzP5WpwzXA4\nZDabkacJxy9ecHl+zng4okgzyjIHSkbja1xb5De2trewbZtOt4+hKrTbTQzLYObPKKkwHB3TUuj2\nm+i6SbPRoSzg+vqSmmdy+P4+4+kY3XCxbYPJZExFQVFkKJKMIoPnOKiKhKbKNL0aVZG/4/f9A4Po\n6dmA4WhKUVb0N0Rd7nw+Zmu7R7vdotlsMJlMyLKcKEkJw5goTlGQhBWgKjz68BHdTp/JeIahW5y+\nOePq4pIwmGNaOmHkM7y+JPZDFEmm1WrjeeKHEJcwHc2QKwiDmG+efsvJq9ccbG+gSwXHr18y8efU\nbIdynmCqBn4YCfm701OSLBZtEEZD5P3U+70AACAASURBVDyn2/CwDJWL4YBAknn4ez+l0eogSfLv\nlJS/S3FaksDfBZyrv9XtdcANd3Ct9cddMLwPhO97wf3AeddavNn2Fm3z1v/uAubNetYsx++Ih949\npyQhyTcJK1mWURdydKLds3iQyYu4tLx06Ws1bMtic2MTUFZq88KtL1bgLa5jSZy/cdmXL00TcdZW\nq02z2cGynIW6fp1+f5Nut49l2Yu5zlmWj1qWia5rtx4syxDMYHDN06dPGI2GAGiKgrX4LciyTFbk\nmJaFpkj89X/+K8Iw5Gc/+xl1z0GRxcSXyFSSiqZpKIpElqZ8++0RlWSjKBrhdM74/IyObRGP5qiK\nC4qN4bi8OHqOLJVcnJ2ysbmBYekomiJcdq/OwcEeNa9Gr99btJ4pGQwGDIcDJEmiUatDmZNEIVEU\nYToO16OhEAhxHZJcsCGC+ZzpcMg3X36NP50hSZBXOZP5lKJcCLFL0Gm2ePToQ6bzGZqmUfNc4jik\nkivyqsSpiaRdGE0F2GcZUZyTFSWtVoOyitnZ3eLNmzcUlUxRZqRZjCpL5FkKZY6hahRZSRonZHFC\nu9XCMt7dHuQHBdH33n9PdFWcTLAsi729PTqdDlEUcX19xas3bzg+fkWcZDiOR5YV1BaK7bqmUVQi\nXmoYFrJkMBz5TMYzTF0lzwKSeI5bsyjzimAWcvT8NZpmcLC/w6NHD9ENl8FwwnAwQdd1fvGffsHl\n5Sn/D3Nv9iRJdp35/XxfIzz2JffKWrq6egca3SBBzAwlkCI1Mo3Jhg+aF/6DepDJ9CRpYAJAzhAD\n9FrdXUtXZeWeGRn77ru7HjwiKzIrqwBQRmtes6rwfbnp/vm553znO5NRn7xjY+ct4jhmrb5GTrPo\nnl7QOjqjd9EhCSPkQhl0jVKlSGt/j2//6b/w3VdfkWtUCCsWcckmEpYUofSPB9IVsFj607LUwOVL\nvZpaeM2SvMbDvAKMS19nfDWC/Drr9E1Aer0tX/4oigjD8LLe++qxr0fZrwPvTX7P1e3h6pB+dX9x\nOS0uFIBkCUF6OZSXJHExxF8A6WK5runk7TyVcgXLMhdD+uQywLQMhi0/Bkst0GX0/iW5Plnkuevk\ncjnq9UzspFQqZ6I5uo4kiYzHM3q9IaIosba2lhVTDOJF1D+71yiKUBSZ4XDIaDRkb+95ds40A1JZ\nXtSHkrKgWeB6nJ+d8eWXX7N1a4vbd3dQpBQhSRAFBVkzESQJUUgQ04Ruf8TnXz7Bc1NURNZLRYqy\ngiFIhB5UG+v0JiOOTvcZjQYZoPf6PH32jN64j5YzQBKZTacU805WGynJnqNczsrkB0sF8rkc5WIJ\n27bZ3FhHUSSG/S7z6QRdU3AKxSyZZDplOhixVq+jqTJxEmZ5+eVMGrNUKCIKAqamEvoBzWaDOI0x\ndQPT0vH9GYiZKySjiU2wHIPJdIysqXiuv8hESzAMhfpak9ncIwp84tAnCjz8uUfoR8xGM0gE5hMP\ndxZQKzWx7X/Fosy1Rpnbd3fJ53OMRiPmcw9BUDg5arF/cMrBi2NcP6TX69JqndO+aPHhRx9SKpW5\ndWuXnd1d0jSl3+/j+yGnp+fknTymmWkbapqCmCbIgshsPOXk+IThcEiaCpmIhGSiGg5OtY5pWOxu\n1qiXCvSGHcI4IGfo2KrOaDRhNJmT+CmTVp+cYXNwdMSzZ0dMZh6CAKah4I1HlIsFys0GuUaFGS6a\nYWQ1b/6ZfbT0iYqihChIV1626+D2On8p3CBcfMNQ+ibAvGm75fGW65ZAvATPZe2hJaBm0/G1OvQ3\nEPov21UL9HJ4foUadRWEL5eJ1/YVxIUNKlxOX7oAFnqjds4mn89Rq1VX7ie64oN+2X+r170E0iUx\nP1uqqsplOWrLsjBN8zI/PopC3n33Hf7jf/xf+OSTTxYpqDPiOBNrXgaYxEVhtm63z9dfP8T3/czf\nmETYlomARCpkw39NVtBEmX/49W9I05R33nmAZaiQxpkOrpRZohnLLsYPEh4+fsHJ6ZD2eZdkNkWK\nAvyZy9Onz6g2qvT6F4zG/Swjy4t5sX/MaDJk7s4wCza96Zhg5lOtVHByeWRZplyrYuccXNdlNptl\nMnUCCLJEkqbZED2K8aYzLFVHkCUUVUMUZEQk1mo1NFWh2axTrVeRZAVZ1dA0k2atQRR49HsdnEIO\n28kzHk9I4xg/cOn12hklLBXZ2NhE0xV0S0bRRGrra4QLN00Qeui6zpMnj/FmHpIg0uv06Fx0sPQc\nw96I9nkbMZU5PW5xsH+UpX+/6R1949p/4fbd48959vxbmmt1trd2cfJlnj3bx3bKaJpNnCrEiYAk\naxTLJRIhyfRHPZcXe/sEfoRh5jAMjQfv3cO0VQqFPPPpjNOjMw4OjhFkhfWNBjlHZ2Mzk7wajyak\niUwapUiawfrWLoVcngc7u0yHPYaDIa6fpbqFns9gNGLt1g6VYgUlBoIASNiw17BFk267w8atNQRb\nRS3YDEc9HFVkdHTCZNAnTZMlkeWP7ptVIMj8aFlwIYkzX9zyhX1TcOl14ApcgsWbIvlvsjrDMLys\nG5Ttm1ltGdUnvvRJiKJEHMcEYYDrZWl4q9fwh9wC14fzq4C5+nt93+t+6FdAdwHUkixh5Wws06Ja\nrbwUKEmFhTX9h/pkOTJILj8my21E8SXVCTLQ3tzc4P3336VWq9Ht9hgOR5f8ZRAvJeCSJEYSRQaD\nAWdnLY6Pj0mTGM/LUoBV1SAms7501SBn25yenvLFF5+zs7ODUyhk/lgBFNlAN62MkC6LpIicnPYY\nehLDsU8Sx/hzl9FkjFPMsb5ep90+YtC94M6dt2jUmhiqRrVY4s7dXdbWN7DzDoV8AV3SGfSH+F5W\n797I28w9l3w+n1XTjEIUTWY0n2QC2KJErVSmd37BYNjFsiziKKJUKFCt1rh3+zaqKjMcDvD9EGEh\nlJ6mAtVqlcGgw3jYx3dnRIvqArIsIUsCnYtzWqfnREHGr7734C5e7NHtd/GDCNfz+f77p7Q755ye\nHpMkIAsa04lHr9PnxbM9JmOfYW9GtzNm0J8xc2MULffGd/UH5YnG0QzdKtDttnn++BmSbJPEIpbp\nIMkqoiyRIjOazej0hiSkxEnI3rPviQMfzaohSxnISLKAYWrM3DlCGKLIGu2LLnbOpFw0kRURp1ig\n35vgTnzkBFzXRZENBoNMAXs86UMUImEy6k2IwjHjaUC9XCGXLxD6Mbo+wjItbNPEVmwGbhfdNJin\nCZXtLSq123z1+4fc2dnEzjvIQiafhvDHc0SvtyWvURSmrwRnluTz677FJbAsp1eXrUbDV/2cq/Or\nx72+Lo5jXNe9jDovAyOQEkaZgrumZVkfWS32zCKNF4EU0zAuS2fcdPw/1K6D7Oq9rXJiBUEAUWAl\n0eplH6QJQgqirKCqCXknT6VSJZfLMRgM0PUs2BCG0aIo3Sr3M7vXq9cck6YZHzZTg1pNN4VUBJGU\nYrGE4xQYDIb0ej36/T6yrC0i7uIlaAdBgKZpjMdTxuMxT5484db2Fk4hx2weIIk6ERFjb/LSlaBL\n/PrXv+LD997izp17nJ71cKMQVdOQxABfFIklkUQU8cOE44HLg60Gqq5BMkXQNDbWNyjkVEbdM+7u\n7pAEMUkEO+sb+MEEMRERBIXZLCQNerQ7HXIlh0KpjJFzEKKYWzu7SKpO5EdosoyecyhoCr7vZ/zU\n6ZyR1ycMM3m8eq2JP80ytpI0QFElhsMBcy+mVKzTaG7Qa58yHA5o1Cr0uh00XcF3Z0hygp03UWQ4\nO5kw7PeZ+3NqjQJB5PJs7wnVchNlKrNu1qlXaqimxXg85vz0LKsWMc6qG/R6Q+r1OoZhEAQBxyen\ndPt91EUA7bXv5x/11P4LNaeQo1opYykGVafOZ59/y3QWEHHM6dkZlm2QL+Yp1puMFhSJIMok7GJJ\npFDOc3F8SLmUR9VzzL0Q27YJpmMEMSEWodfvYmgVREHGtAvknQbf/LfPqOQsNE0hmE0ghihN6E16\nbFVq+JMpVavK+aTH2vYW7dNzJAFs06barNLc2sjym3vHRNGI0fgUaaJRWdtlOBgzHvQR1srE7oIq\nLl5VGPrntEKhwEXrgpdk7+wlXZK+0/QqkC4B8HpkfxW0lm01YLMKqsvf64AdJ/GCBhReUnwycejw\nMlodhgK+H5GkCZIoIUoSKaDI0o0iy8vruAlIV63N11mvV8B/qdokCpC81FZd7i+KAkK6KI0CiwCT\ng2laNJtN+v3+So2ggDhWLkE0Yxpkf8dXXRMv5zNR5iygpSCge0GmOrTu881339G76PD8xR6iKJLP\n21kp7jgmCCLSNF7xhUt0Oz0eP35CtVLG8wMMw8CdB+RMncCwiH1vYV2ntM5OOTo6YefWHb58+AQv\nHBAlEWkCgqwSBwGirJKGIQMvxUNFcyqYgo0Xh+RyJvgjusd7NGwzy4ISIW/oTIZzHn7xEFHLEaQ6\nTV0iiHxylSKipJIi4gUuiqRhGxad8xZh5HP79m2C0MOUJCqVChdnbaazKaVq8dLqN3MOURKhKgqW\nYhBFERKZ2HMcCSiaQSqm1OoVZvMx3U6LguPQH7QYD8A0bZrNBlECZ0fHtC6OiGKfREgYjcdsbmyh\nqTayDPPZGE1W2Hu+T6PZYD7zKFfKePM5cRxjWTaVmoWgfEmr0+PO/fs3Pq/L9oMO56ejrI7LbOaS\ny+X56Mcf8OHH77Ox2WB9ax1EkYffPuH8osts5qGZOlGU1UoKgohvHn9JrmCCKHF6co4gqoRBTLFU\nACHEKZhsba+TKxTZ3r6DgMzh8TGKJtPrtymXncyKFWVSoFhwWN9Y58H9dxl0J4iJjJk3KTbKhGlM\nvlqgvt5gPptysn+A4ggUmiUqW+tMxyHeNObbrx6xubOFrEtEaZgN9pJkkZ/+pwPoEjQsy0JRlRUh\nkuX6l/V9/qCP84ag0+p28Gqu/fXjhWFIFGYW6JIzm+keZGV6TdPCNA00XcW0DCzLxDB0craNk89j\nmval5XrTkP0PWaPX93nlOMLK8RbBoOvbXkbzFwGpLAfeJJ/PUamUMQxjEWCCKAovfaPX++v6EH/V\nxfLyA5YFc0xZxjR0uuenfPHFl3z59Recn58jihK3bu0SRRG+77H0s2ZBuhBZFuh0u0iShOv5IIos\n00N93yefL6BoRvaRSgKSKObRd99j5cuUajVK1QKSEAMismqSijKSlvFMvURk7/ic7shlNI9o9YYY\npkbr6Dlet0XsusiKTBB5iIQ0mxUEQebgpMdRa8z+yTmSZjKZufQGAyaei+f6JFFK9+yC0A3Y3tql\n1qiTAl6cEeUNy8I0c1iaShrHaLpJnGS6r71BB1WTqFWraKqBKOjMXJdWp02cJAwGXTRFxptOGPZb\nRH6EN43pt0cIUYImizRrVYgTZlOXd9//AEXTmM8yX+h8OiUJowXRX8LJF9FMnbW1JrppEpMgqTJz\nb06lXmLiThnMxm98Jn9QS7RRX6dUqKJLCtPRGM+boqgKXhRTrjrcurPLcavNi+eHlBs1Ts/O8WYu\nd7a3yOXy/P7JN2xWG+iqwdn5KbZtUl9vMDg/ptcdEMYCpZLKZDIiSSJUK08cx+iGybw7RZmPaDRr\nqLbJZD5DliS8uUvLHSOgkMYeYgqJlGJV8wynI6RUJG+bbN7axsJnPJthOw55J8axKpSKCYIAXuyi\niTah5xPHMSp/AoRmb/7l7DK4VCgUcOct4GU66CroCAKL1MOr1ubldDYKvdJuslhfB8irYJQFTrRL\nWbGX4hrxleNdjWwvSepXfber51ht169rddlyenW/DBRF4gW/c+lASS73X1QdJRtaLwn6siCQLjKC\nCoUC5XKJk5PTy3sJgnAhQpEJNi+H8svzZ1qxCbKsZr5rSUBV9YwqlcQEYcjADUhkETmFNIqwbZuf\n/exnfPjhR8znc2azGQcHvayqg5ydJ+tbFdM0WFtbwwtC2t0hqiSSz1mE8wDDzCMqBiQJuiITCQmH\nByf89Ocqb739NooqMR2OCbwQVTNBnhF4LqIEUZySJiKnp32CokJ3MGTY7dA9/B4lDBGTGN/3mAVT\npBDCyMUNElrdCZGmUmlIpJKMmcvjJ5li/tNHT8hpFvhZ1k+h4BCmIa43p9fpoEsaqqxxcnbGbJyl\n3m5t7+K6Hufnx1xcnJDPqzTrdfKWjKrZKJpFEMcEkY+Zy6NJNkIckaQ+o77HdBySd/Lgz3AqGrdv\n36U2a/Db3/0TZs6hUo8YdYacnZ6Qc3Sm4wnEAptbm/hhQC6Xo7HWZDIdkJCSChGjaR/ZUIjECEF+\ns4zlDwqi9doGimyQxNEiN17H92ZEqcB87uIUqmysbyLICoEfMZt79NoXtI6PeXDnNpKoc3LWolyY\nMhp32bp7h+Gwx3zm0tzYwvcyK8nJ6cy8Ed1xH1VXUVWdvGoQeX1SUSBVVYIgoGzb3NrZ4fjZPogS\njUKdYt7hYtpHLzkUZJ2v/uG3bGxtIxsK9PsgxRz0h3iBwo5ZIAouGKdTxDSm6chErkcUhERajCjJ\nfxzp/pq/b/myVqtVTk7OAV7xg2bLrpbqWILsqt/wpnm4GcCuA1yavhRBWUbMswwcrpzzVbrUklGQ\ngdjScl5e/6qP9ibQXB7nOtC/7nqXQaWEOIvWs8ifz9YugkpXPxaSJJPP5bGsHLVajVbrIvPZyRl3\nNLMKX/bfpbGbZkNuy3KQJIHpdLboHwlFkZh2O3S6bYII7EIJO4ggTWmurbGzs8PGxgYPHz68dAdc\n+rxJEIWM5tRsNlhbayKpGrKkoOsKcRxm9b2CENXQUAVIgzGWoNLt9un3hty+c4duJytbE4YhmmWj\naDqzyRiZFBGBIIgI/ARDd0iTNvPplGDQxzE1ht0ugzBGNWQkBQ5eHDKcQCxrzEOBXMFB0lUeP3mG\nltOpNGq4rk849jEEmVqtxvePHzMK56xtrVMtFjjZP2Y8moAoI8ceZ2ctJFmj1mgiqSrVWjn7wAoJ\nlmliWAU0TWN9Y4P2eUi328FWdCzDxMzb9DtzosAnZxdod08wfI8kibKPuiSTJgLN5hr9Vo92u4Uf\nmCQpVGsbpILGoNumud4kCHwEScSdDvHDPLaTozjP8f2+j6y+GUR/0OG8GUcM+x363gwxZ2GYOUIX\nQi8hiV1Eecrdtzepr23w7TcHbJQ3cEybzmjEi/4Ex3zA7x8d0E9mNDdKbBbqzLsJ+xdjxHIFvZ7D\nI6A/HTKfzrlT3mRNyjFqd5iqETNFIY4lnn39DHyV3XsfMJ54uL5P/fYG6nqRQLIQBjovfvOcnGgh\n5FXOown5zW38wg7fHQ05H/uMRYl2FPHN/iFffvEdRAqjUYAXJKSJkA2lk38e0SlNMzk0wzAoFPKv\n+DCvWnwvf9+U+nm5PrlKh7rp9/o/RVEWtCvxxu2uX9sSPJfLV+9rFfiWvzcd4/q2N9KbVuYhvaQ7\nCYKAKC0ymBa/2XLxMuiXcY9VCo5DuVxZ6IQGC3dJvCiz/Oq1R1GwIMvDfO4iyzLb27vcuXObYtEh\nSeHBg3f4D//z/8hf/bufoes6juNwe3eXW7d2GY2GdLtdTk/P0DQdXdeR5az8iyhl/Nbnz54yGg0o\n5Ew++dE7vPvWnazMsCLiFCxkWcTzE2SzgidauAIcHT2lqEvc3blDbfsesW4ThiGObkCqkWg1RLOK\nLMYI8Smm7SKZEo+eHTIYu/SGLj0v4fBsiD8TGLU8iuYalXyNj3fq/E/vFKlWDcrVEv48ohDrcDZm\nO7/BJFBp+Smj0GPUabNdqLDubODNFXpDl9EsQDNtNNVGERK8aRt32sMyNO5s3KeglJAFmfPBGYkZ\nEMUTBM8lnkVYZgHFNvGYcXRuUGjucDE/Qc4F5Ks2uqkwn/Q429/DQGLW76GIIZoZEcUxjcYu9WqD\ngi1TLEiMRh1M3aLd6pNGApqqcnq8R/fshHqxTEkr0D5uv/H9/EEt0XbrFCWfY31jjdibE7gBMSkh\nCaVmHdPJc3S+T5oW+ODBWxDOuLe7S3lSwSrW+Id/eE6QuHz71fds1au8f69I0p8wmk/43/+P/5OP\n33uftUKBxJ8xn03oqF18L6Jaq4Iqoqs5Wu0RaRKThh7t0xe0z88xLJvWsI+iC8xnA+J0zsX4gq+f\n72GWm0y8GeetQ97afIftyQbTwOfO2z/iuN1Hy9usbZXxFQWICfwZURReBjH+qHZtOA9c1uKpVisM\nhyPSNKMovQy4XCezL310r0aSL63YFFIhfaXm0eo2f5Sv9Q1ugJfW58v11y3o68dczq+uu96u+1GX\n85eW8GrgbJFff2nNJsmiWxZ+6jSbVVWVYqFILpenVq0yHo8uA0xhGKGq8YJVkAX3RPFlbnwcJ9i2\nzYMHb/PBBx9g2zmGwyF//dd/RZIkl3zR9999l0ePnzCdTfn9739Pr9fj2bPn6LqGaZoLcZJoYf3G\nFByHJI6QJYlarUqj0SBwPQzDYDyZYudVLEMj8qaIooIXhAhpTK/TJmfZFAoFNtYaPHr0JONIClAs\nOvQnPraqYok6pVKOcFGmww99lHyOs9NDSo0NTF1HkUW80QjL1JG0PE4pqzZ6dnGMbDu0pj3u3dsh\nnow5ePaC+vYtIhEULaaea7BWqnBxekJ3OiWYTikZFmFnQNAs8vbb79Jun+F5HkkCmqEj2zrd8ZiJ\nO8Fz5+y3TjHJkgqiNEFIFTTNABTc+Zi1eg3Xm2M7NmEYc3h6QpJkHOA0SRh0umiSQRDOUVWdceAy\nmruMpz3CKOHF/gGhH5HPGdhWnq2tDc7Ozjk5OUNTVMaDN9ed/0FB9KJ9ih2ViJOETrtNFMZM/YRZ\nHDLyxyDD7q1btM5G1O/cQkl9ZrMe9eY6j54fISggRwZb67uIUcgXD78lVgXuvXOf9HuN777dZ+SU\nqOc1RDHg0D2i1tjIlMJVje55j/HYZeYPMFSB9995j8O8xtDzKDUqzEcdpMBla7uKXipQ3NiiO+oz\nabeI5lOqhSqFconu02O80YRxv8Ode7d5sf+MIBzz1nYjkwzz5phJYXHXf1qAaRX8RFGkXC5zdHSC\n73tE0asSd0vQXOLOEkyXw8UrEXwShPQ1NZoWAPvyuCurrvlbrwPjVUBMLwF0VQx6ec7rWVfXLdPr\n1/wmQL1+7Ot9ePkrLjyiabrA0mydLErYdo6iU6BSrXB8crzIZVcWAabwmphypikqywoHB/s8ePA2\nn3zyEzY3NxEEgWLRwfd9CoUCxWIR13UpFIooisrTZ8/49a9+zWg0IEngnXf+jHq9zt7e3uV5sr+5\nxNbWFrIssWRiCLKEqqqoikoShSiahq4bxHGKIsnIesJ8NgIhK5oYBT6SEGepjYqEZajEgoguS9i6\nxZ27GyRCgOl7KJJItV7Knn1J4L337tM5PwNbJe9UePz8kPE0ZD4bky/mkHSZaehSbJTQCjZuEFHa\n3cWo5OkcPuVeo87grI0YRghhiK2qNAt5tmoN9sZtTi/O2VpbxzRzHBzsc+/ePeIkQLUsPv3zP+fp\n4ydoYZaOKcXZ8zIZjLFzGjlbIQxT3nnvPm7gc3rWolZvUivUGQxGuPOAOEzI6TZxMEASDQ4Ozqhv\n1BnMujQaa5RL6/y/v/wNhVyBvec97r9zC1GCQqHEeatHGMaosvbKM7fafmApPEAUqTdqTCYj4iTC\nMDWcXA4xFXn0xUPS0Kdgmzx/+g3DUYdup43ruhiKRqNWxFJNnj05oVjZYv/kgqOjYyRBZK2+yWAU\nougO5Wqdna0dRFmiMx1xdNHhi28e0xqM2Lh/i+J6iVzVwg1d3nrnAbKpMvdnhIHPfOyjajbVZoPt\ntzYp1yw+ev9d7m3eYb/9gotBj1yxxNnZGf5kzKh1DkFEo9YgiEJyeQ1Fkcgqg6R/Ct/+SlsO6VVV\npVQqIggvh9Kr22SgtNLHl9k0q9biAnBSuD5EXQ32pGl6Odxf/bc87k3W4hVXQboE80yERBBe9bXe\nlH10FTRv9pVe7xu4Osxfyt6tEvKvZD2tLLvcVsrEj4vFEuVSmcKCsJ4R6JNLqbpFz5Km0eU1vvfe\nu3z00Udsbm6Spimj0eiywGCSJHieh+f5GIbBxuYGd27v4nse1WqV//Sf/ld+8Yv/nmq1giSJjEYj\nkiRBVRU8zyOOYm7tbGKbOpIkUSwW2dnZRlVVBBLSMEBVsvxuXVexdQVFSInDgJxpZLn0RPjejCCY\nk8Q+jqGgawq6IqJr2TOaxhHD3oBipcR7H7zP5s4mcRKQCBFB6DGZ9pnNh/S65wiETIZDKvkcb+9u\no4pQLDkUKjlcb8Lt3W0evHMfp5gjV7BRdZWCY7LWrPH2/fsMBn1SMcVxHGazOfPplEKhjOt7HF60\nGc7nCIJAtVigkM8R+h6z4Zhw7iEjEwcCk2mPXvc80xONs2y5ved7mRTgIhtNQqDb7VIqVpjNfcZT\nHyNXpFRdh1RkNBmhKBqGaaBoOidH55ycnlMolqlVG1SqFQqFwk2P3ctn+I1r/4XbaO5j5PIkooBV\nyHLVVVkidn2UKKWeKxHPAh599y2oCWbJYupP6V6csbFWQQ2HVGyd0E/4v/7vXzOauIReTE7JI6IQ\nJALngyGFShnDNqitNTByBaaJgN3YxKjmqWw2+cu//QX/9m/+muNuh2no8+EHH0AY0LvoEyYqExcO\nT4+5aB9yfPwU15tQq65hWhZuHNIZDdFsAyKfi8MXjE/P2Xv0HE3Vmc8n2LaJqr5ZxGC1pSv/w1V/\noSRJNJuNy/lXQG/FSnp1HtI0A6N4he50nb6z5IKmSXpF7u51QZ3r1wmrqZpX178OLF+lLL3eWn/T\nvjeliN40v/pvlfYkyzJOwSGXz1GuVjKhjxWdz5eF7DL5NFVVFmIlIc1mg263S6fTYT6fZ1xHSbqi\nA+v73mXF0QcP3qZWrVGpVNB0nZPTU4IgQJIkpEUJZ8MwKJcLKIqEaajUahWCyMd1XabTCf5sShyF\nJGGweHgiCH286ZAo8Mg7ORq1GvJI3QAAIABJREFUEiIRJEFmjaYxJB6KKpIr5DIFqyjE1k0+/fFP\nOD06oVgskXMcpoEHsoRkKOiWSXO9jiKLmKpGOHPRE4G3N7YwRYV+v4OZs7BMFcfQCT2XvZND5lLE\nxbjHRbdLtd7g4OyYjj9GSiMkQaTglBHJCPa9wYjhZEquWGI0GqBrCtPphItOl95gQLVapX3W4sXz\nI/YPn+P6cxCzD08ulyMKQqaDEcHcQ1c1Wu0WF90u5WaDcrPGRbePO/epFGu8eLHHsD8gCOeIEtza\n2UIQMisUsqBp4AeMxoPXPovwAw/nc/k6uXwNP4gyYVdHQpIVJBH65wMc08abuUzmE0RB4fuDp/z5\nX3zK4dM9ao7Bv/3ZB8ymMY8f7XNw0aZaKiEKIVtrO3zx5f9DuVphHs4JxZhSwaHnurw4OuHp/im3\nb91Dk+fUuyOERODsdA83nHF49D0Fq8j4YoRtFHDDhCdH+2CJTN05qSASSDAVIrrnAyaTmH7PpVop\ncP/+LkoSMrcDAhKmbsDe3ve892lmzcjS/7/uTtMsom5ZFoVCnn5/SBBkpZtXrbEsOvwSiJbBnWz9\nMoq/hOnl8P8qqV4UxSuUqJv8mKvLrw/DV+dFUbikBq1e4/V7WwVnQUgvrdDlh+IqbepmV8Pqda3e\njyBkJPyb/L+rTZQldMOgXKpSq9Q40PczBSJdI0mW3E0ZEFCUDEQNI5OnS1PwXA9FUbAsC8uyUFX1\nUphFFAWiKEGWs4ymn3zyEw4PD4jjmKdPnnJ6ckq73c4UoDSVJE6Io5if/ORjZBFUScCyLM4vWli2\nQS5n0zk9RhVTQkEiTiWSMMQxVaTEI/Dn1Dd2aNSrbK83GXXbCIJAFLgkCAg5n927t9m9vcP5+QvE\nMGQ+HFEt14mTlHK9wZOTU0JZQhZ0JE0nTSTyhoMpqwiWhBgkVPNlyk6B8bCHH4aMvRmT0TCrW5RE\nuH5MqsnMRzO+evgNk+kI27awXRATgflkTq1aQxBSDo8PWdu9Q952SCURdzxmPB6zfmuHfMlBNnSC\nKCFNRdJUwCkViOOIRmMNdx5BKCCEGSPEzhlMZmNU02CeeNy6f5uDkxaPvvsW8XFK4nfRNIO1ehnS\nkLX1OlE0RdMUut02zfV1uv0+tvWvWICkdTpiMgp48XyfwPNBgsFkQEBCfWsDXxTxEBF1nebWOrql\nUSzkqBcduqf7FMomvj/g1laFnUaBXucMz/d5sX/AfDJlrVwkDOY8ff6cJ3sHPD84IYoFFEUjTGLu\n3nmPvSeHPHn4PYOLDlISQRLSa3dwpyH1epMPP/kQ1VEYzWecXoxpbN2nsnmbljugkm+SBlAwVILp\nkJJj8daDHe69vcntu1v0uyPOTs6JwmAhMJH84U5Ztte850vOaKWSSezBzVH0JLluQS6nlxbnTf/e\nFCB6lW50CWCLTVd9o1etxZcA+qZ2FYCFG9ct+0CSpJdK9QsLfUnivz5Mfx3Qrh5v1VLN6hmVKJVK\n1Ou1RX8uh/TRZd9mQiEygiCQy9lZaV7fw7RMms3m5dB+Op0yn8+vsBkyt0GRg4MjfvObX/OrX/2a\n/f0XSJJ8+QH0vID79+/x1t07+PMJndYZmqZiaDqObWWpysPBwue5pHZFKEIMacgXn/0uEwYpFlhf\nW1uUhg6Jw4gkcAlDlyj1CeMAQ1PY2tyiVqnj5EukgsL+8Qm37tzDNAsUK02CSKDglNE1CyHNsolG\nszmKbXMx6PNi/4h2q8OdO3dxnCKGlSPnlPBmLmkMmmERSQqFUoV6o4GpyFiGiarqmJaFYZm0Ou3s\nbyBKDDsdxv0egixSaFRp7u4wDVzMfI7G5jbePESIRXw/xDRNyoUKedvBm3hEboCQgqZpWI7B3tET\nEimkVMvT63aYjUfoqkQhb+LkDdLE52D/GWkak887TCZj5vMpoiLRn/wrtkQ/+vhn+O6YZmWdcD5m\nOhrT6vRwmpuYpRJJCJGkEEQhAnBn5xbDdgdDVQglgVkS4kVTknnIvdsNmnGVx88P+KfP/huu65P3\nDfK6jmbmGLsxYSRgqBrrlTKNaoGvv3pOv9/h3be2sFXI6zqpKOIKKbl6kZOLExRLoOjY2I0G8yBi\nOgtxZ13Oztq8t/Nj4kRhZ7NBMBsSzKdsNivMQx9JzVPtzhhOE8aDAapVyKwg0j+JK/py9qoFVa1W\nOTw8XpSyiBfW0euH2i+PAS+j9a893ZWA0XXrbdUXK3DV8ry+/8t1L4Hx+rY38T+v+02XVvhNAa3r\nALuaiLBq8V72/w2BtFXwVxSFfD5PqVSiWq1xenqG6/rYtnJpVSqKQhAEjEYjLMuiXC5f+k9n0xnd\nbpfRaMRgMMBb+D6X9xRF0WU9J1VV+OyzzymXS5f101VVRRAEDEPn4x//iHt3d9l7/AXPn14g5xoZ\nyKaZVWxaGrIiEBOTxAm6KqPKCY5T5NG3D/mrf/8fUFUV27axTJvxONPiFNIIRcrKm8w9DzvvoBkF\nBEHGchzCyGV4cIQtaHzyyZ8xHYwYdvv0O0POjlpogsQsDGlPxqTDDs1qlXy5RBrHbDSaTKdT8vk8\ns16beX+CqlpoioRl6eR1DVuWEIoha2tN9g6PEZV1TNOgXC6ztb5B5M3pnJ+ShgG6lWOeRkzmE3qT\nER4xYhBgaw7uLCBJshqFhq4jSwoX5x2ajTUcM0/eMghin0KpjGXIbG2v8f3TJ3z6k59QNgLGoymd\ndpdc3mEyHOD6PoqmE0YRiShxeHqEUyy9+jKttB/UEv34z/4MSVbw5i6Ncp1KqYqRy9OZTzmfjNCL\nJexymWqlghjGiEFMEiYkgsgXTx7z5TePOTxvoVgKg0EL25K5c3ebv/j5T7m9vUE4n5I3HX73u+8w\n7DLeLMQWBdTU4852A82wOOucc9w6oHNxhjdxiSORs3Efe71AokY8/OIh3/z+EXuP98g5FtVaiXF/\nwNGjQ377xUPOOl1QQDckinkLRZBIPB8x9OmetQhnHmIc47kuYRS8EeSutDcEUZbWUlZFVL7Rcry+\n7Or8S4v0dduuWrJJelXpadWHGifxZa76dWv4eoDpegDo6vD9VfWmm4DuJl/o6nVfv6ebjnE92LTq\nG11uo2ka5XL1UpRkqVC/DDABi75PUFUZxylSLBYZDgc8efqEg4MDPv/8c375y1/y+eefX+qrLt0T\nqqouqE8mSRKjLSLsgkCmQD+Z8sGH7/Pee+8gCgl5Q+b8LMuiCjyPzsUZd+7u8vOf/5xSuYhh6Fi2\ngaEr6KqILguUCzna52eocsbpVTQdy3LQ9IzKY0oScRhxftEiTCNkQ0MxTBJZRlRUnGIRbz7n4uSc\nSqlCLpfDC1zsYhGzWODBRx+SSiIJKYqhky843Lv3FvPJGIIAKREwVZ1bW9sUczkm/SFECUWniJDG\nVBoV8gWHQqnIWesMSZKYT6acn53hzV1EBHI5i9t3b6MZOlGa0B0OQJBQTR0RGVvP4c99JuNhVhMp\nDKhtrLOxvUO328ebueiiiBj49DrnlIp5dnZ2yJVLJLHA2ek5H/3oxxSLRQb9EXEscHbSot3tL5Sf\nPILozXXnf1BL9NHzbynWioihiqUWOO+2yBUcvn70lJInIZZVkvkZ3dMz1h/cxRvNmXghp+0Lhik4\nsYwXpYiGzrDdZrh/QL5aZ9BpM+x12NncQTAt+l5IGInYqk7FMknjLEeZZMz2RpVmtUpv/3t6ioKj\nm5y2L8g1KhilGkqSY//0MZbl8dXXn2NbCnfrt9ipN3l63uLOTgNFUxkMJwiqRq/dwQsDJCMkVeHw\n8AX9bgvVKZPE8QIc/zDN6aYtrvssm80mFxeZnyuO40tlpCXQvj4AtMToq77QpdGWLVumkC6I68Lr\nrdHl/M3netX6XPWJ3mSFri67KSp/07lusmBfBV2Aq4Gt1Q/Iap8pikKpVKRYLFCr1ej3+4saQtqC\nxxmi6zpJAuPxDFVVKJVKnJ6e8Pnnn19+PGazGY7j8OGHH2IYxmXee8aLTHj69Bn1RhNFUYGEOM6y\niDbWm3zyycc0GjUU0UcVA2zDJGfn6fe7iGlC6Lv0+21Gwx6GXWA6myKLIUHk0R7Okaw8/kKWbmNz\nB1GUGU+72KqKrEkYZMX+/Cjm4qKNqDuYpsxwOiXwJpimThQEnB8fUXYckiSmtlajXm/gzX02t7eQ\nNTkrczweU61WkQSRUbvNyd5z7rz1FnEYEhPT7/dJgohmpYYkCUzSEDdVaE+GqKZOGgcMR33K5SJh\n4HLea3N4eEi56ODUN1ALeerVOp8N/ysSMrXmFp25T6VuU6/WOT8/IY1CUhF+/OmntE5bnLYuUESF\n9UqN8+4FF9NDPvjkFlGa8E+/+280ZJlef87TZ/uoisZ0HqKnKjN3zng+Y31nG6dQZH19/cZne9l+\nUBAdji64OD/i/u1d9HyJDcvieO5RKtaYjqbU7zcZnxxeRvpk1WDmRiSySbG5xe7WLU5llVQyKNU2\nGPVHuEMPQQhxLJvBaIScCqzv7NAbDimXbDQlRZIF5mHA/bs1OodQMRxmqo2fxvSGFwhJzKA/pV5r\nsvXebXxBJFdyeNp6hm5bOOUis9aIn3zwHl9+9XvW6hY5HVzf4+yix8j1MKsRvpiilXXOjl9QWruF\nsBIp/wNuusV2ryemC4KA4+RwHGchTeddgusS4K4HVtIr53/JJ10F0sUZWEaVkuRqLvzq75/WXk21\nXE0R/UM0ppuA9XXbXwfumz4oq1bn9eVZoF7KavlUqtTrdQ4ODpjP5+i6fqkb6vsegiDhunMODg6p\nVitcXLQ5Pj7GdV3SNBMM393d5dmzZ9Tr9UwMXDXxPA9N1ZAlGVHMPnqTyRxZVrh1a5tf/OK/489+\n+gmWpRNOJnTOj3n33ffY6w7J5/PEM53edEC700ZVJYaDAaKUlbyoNIrkzSqprKOKKYah0VjbwLBy\npEmmBCaImTtCkESERbBy2OuRxjK1egVNSZjORkymQ3TD4ODwGdVGDUmOqdWqtFodivkczfc/5PDF\nC2IBuv0O096A7vE5qqCQ0wxQodVrc3x6gG1WEUjp9tvkyiapqTNypyRRiqkqNBpNWhcXjAc9ZFI2\ntjbxPI92+wJpOKHVPqN70WF39x6qqmFXixh5m9lkiKkqiAgU7BxffPF7er0J7szjg/feIo48/ImL\nF/rIqYSpm5y2O0jFArLi8uz7Q9bX1wljicFFn0ZznUolx/raDqmQEodvrrH0g4LoVqPCb//xl4hp\nwNPvBe69/Q7NtS1myOztnxJ5c05Pj/jRu7fI50xOXpxxdNJHNE30So7N9Qbt8xZfffYUx7TQZJmD\nkxdsbW/x6U8/5T//8lfEXkB/NuOte1v4oo8rqjjVKrKcZzY7wUgEalaRQblMlI+przXY3n3ALBGp\n3trGDzzWbq3jT1xq+Rrd6Rgzl2fn7jaRUGSru8a4N+LF+T6GpvLeR3/G8PkBmBa2JaAoHuGsTxJ4\nkMRwrd74m9qbgCoLMKlUqxVGo9HCGr1q3V0HvVeHv1fP8xKkXo3orw7Rl5bkZRT/j2hL63cVvK6D\n3HWwvnqtr5L0gcua7kvLb1VXdHX761H968d72Q8vl6uqSrVao1qtUavVODw8vLT4l7WYDENG1zXO\nz1v84z/+F54/f8bh4WGm/7q4r8FgwOeff84777xDqVRClmXG4zFfP/waURTpd/tEsUe12uCnP/2U\nH//4R/zFz/6cYrFIEnn4kct83MV28qjjhF6nz3g4oN/tkqYCkqggSzFJEqDKKY16FTn2OG/3GA27\nmbtClpBVBdu2URWRIIqxVRXfD+kNxqSeh21pKEImyDJyZ/iBi27I1MtV3MDn0aNMYd9QNQJ/xsXR\nEVHo8fjxt7z9/nvc2t7in/b2IQrx45C9588xKhad8wvSOCKOQ/zQo9qoYVgC1Z0N/LlH5AXICEyH\nQ/rdHrVGnXypTGrbmfLSzCVKUqbDCZKgUq1UMDSVWegz9VwqlSqtbp/ZuENj/RZJFFGsFMk5KaKm\nM+4NIVUpOiVODs/44J33Ob+4oNebgCBjGDmiWECSZOazgI3NHYrlPLadp9vuEvOveDj//NF3WJrK\neDJlMnEZjF3KG+tIKfjjKaNuZt4P3BGjWZfWRQcRnZxhIokC3d4Zkijy7v0PSPyIXq+NadmY+Rxj\nb0ar0yIRZD79Nz9jNOmw+f4dTvf3MGWb06MWhqQQpB6RFKPX8rT9Ca3elJwAvdmQUIsoVCrMXA89\nUXlr/T53LREVg0LZphtGvPXufcwkYrtZ5vmz7+n0h7z9wcekUsjR4XeoMZw9f8jW259Q3bq1CHqk\n/2xL9Lr11WjUOD4+wff9BYdRvHHfVfB4nVX36vYZkC6zKC+D8deG9TdNX73WFa7UtXXXr2UJzKuW\n9E33fp0psBRGySzrV/cFrhz3dX2a5dMvfacKxWKBSqVCo9Hk7OwM13Wx7VxWaiIILsv+BkHAs2fP\n6Ha7C1dACU3TSNMU13Xp9/t88cUXbG1tsbm5xdnZOf1+nyD0UTWVt2/f4y//8t/xs5/9jK3NTSqV\nCqIIc39CGnvMZpmwycbmNt998wWi79JptbN0YEUm8Fx0WcBQFMbDIQVTxJ8PcacjRFVClFUkRUGS\nFzzhhSr+dDZFlyLylsV0OKJR3SBNEnzfp3NxTjHvYNkG/jDMAl+aRhLFTMczGnaVx3vPkEwFUVdp\ntc5p1GqkjsN05nPrwQPOOieUHIdGpUanP0OQRNabDc6Pn3LR0ikXioznQ4L5HEPVceczUj/Anc+I\n4pizTpfxcIRjO5AIVCt1mvX17FmXJbr9AXlLJUXivNVDM4tUKiX8GE5PL/juUZ/paIChGghSQhIl\nlPIOBB6yZDEcTdncbKIoEvVqDUnUiOPs/o729zNFrZA3th8URJFkdu/c5cmzPQzNIp6HXLw4Ym33\nFvd2tnGnM/J5HT8cEc6nrG+tkdPK7Ny9g5STSaWIt+/9iO++OmA6HrF/+oKdu9s8OzgkEgXuvfM2\ng96QejHPVw9/y/s/uc/A95FlAVuzEKWUkTihnUx4dnLCNErY++6Iv/nLf0PrvEUsR6yXGgwDmYvz\nIaOxS3/WxSk4WKrNZ0dP2a5WaRgWYuyxtbOL7jQgSpAR+fD2u3RPjvDnAbE/Jk2iLKCT8seP6V/T\nli+9pmmUSiV83ycIgivrltM3AerNlulyv+tgKrxyqddB7JV1V3Bz9XpebrPc77qG6ZuG6G/2l2ZV\nYOP4Jff1+rlW6Uw39c3L+wJRFBbWfo1Go04ul2cw6F/eUxSFzOcuqqoRxyGynPlRIaVQKF76QJfD\n/4cPv6Hb7fLtt9/Rbrf57rvv6HY7fPDBh/zFX/yMv/u7v6PRaKCqSgZknovrzphP2kzmUxBEvMBH\nkiROz44zZX5RZjb10WUZIh9FVpEEmE9GGIqEOxkSe25WAsWyIImJ0hhJVtEkkZydw7YD5NTHsEym\n0ymaZSIIArZhIiHQOjlHlBQa1SYXFy0Gwwkbm7cIXJ/1rU0CAhTLIB6NUQydRnOdVFQZBC6qaeHk\nC1n6rGbQ7/c53N9HF1J6Z12SmYc7n+A4BYQUGtUaUpqgChKVtQ3Ovv0GLZfDzOd5/PQZs9Gcved7\nbNar/PynP8dzB0wmbebhBDQTN4wQZYFvvnrIvbcecHBwwlmrR7O+xujknOHEQ9VV6sUceAqyYLHW\nKDLoD5BNlV1nk163S7FaZDZLWFtvcHT04pXncbX9oCDa930UTWbn9l3UWORi/5QXz/fQRJn773/I\nF19/TdFp8s6HH3C0/z05KY87CjlvH7BT2eGzzz7n9p2f8Mvf/oZHj57wP/ziU+rNIifnJxg5kwcf\nfcCo02U+nlDUcxiqRYTEf/3dZ/z7n/8NSpIwLtl89v1zLk4vKJoOb+3eIRAVVK1I3VzjV//bf8bK\nVehO5+TzJrIMQRCBECJ7EbaiE8YB0/EQcaax7TR4/uQJL54/5ZOP3iVJMj/abHxO4LsoRg7pT8j9\nXAZ5VoHtqvUo0WjUaLc7KIpCkiQrVtnNVttNgLqcvrr9zUP95brVa7k+ffV31Zq8Sjx4XcDp5uu5\nOr96Ly/7SUSSXubrL4586ZJ4U8T/puDZ0qoslSqsra0xHA6I4whZVsjEk0Om0zGKol6WJV4W6UvT\nBEVRiOPMsptMZvR6/cXfKWY0GvLxxx/z93//9/zt3/4ttVo904JNEtI0wfPmBP6cs/2nmKZFvljA\nnf9/zL3pkyT5fd73ybOqsu776mu6557d2cWeABYgFyAoEJIoAAoFrbDosK2Q9Jb/Av8I653DLxzB\nMG2/gHmIpCwSIA5isTs7u3OfPX13131m5X35RXX3dM/0LEBHKFa/iI7OrMo7K598vtfzVYnFYmSy\nKTZ2D8jFk/i+i++4KJJPLpNle2Md3CkpLU5nf4dOp0M8nkWSBSQZhEhCEEUSkoR4mP+KGDGzZghy\ngoa2jDATqZZq6P0BemdMPJ3GkSVMw6PeqFMo1GlvPMV1XTb3t4ln8mSrNQrLCUZ7bR7dv4eYSpIu\nZjl39SquaeE82qbfnzBISHjOkEbjMsZgQrlaRFBk4jGNhChhDnqoiLiuj+m6lLMlLM9DtyyuXLvG\nhYUlAlOnu32A5Y3Jl/OUltJce+cDWrvbeM6MQiaNFMJivYExsxClGBfOr3Hrs89p9g5IpWKoikyU\nyyGGNqW8RiTE8HyJA3tGLrNIrpSm3d9hqv83LMr89598yrvvvsU33nmfp5/c5uLyOTqbG/hTnXI2\nTyqWwDJn9LtdPMfh/sZdZClOXx8yFoaYM51Or0NjdYmW3iNTSXFwsI1EwLNnG7gijDs9UpFMSk4w\nOOgSU+f9UrZ2tvD7d5hpBSI1zVuvrXCxWsOJAv7iFz/nf/zD/xlpaHDg7qGPTZ52dohPVN68cIFi\npUp7NKCgJNl8+ISV1SbnLl5CkuKMhhN8xyabSrPXahNFFucvrfL4wWesvflt4qk8shL/zfNFgVf5\nT49AIZPJkMmk5z28DeM4Sv+qcRYzfRFMj7+PeEGV/xAchQghOh2ceQlAw+eBrKN1j4D5rIqls9o2\nvzh9FoM+GvMkdel4+SN/6VnuhKNtncx2OMvFcaSZWqlUaDQabG1tYhgGuVyOecM+/1CEZN42+egc\nLMvB95+3tj5qFxIR4Xku7XaLarXKhx9+yGuvvUY+n0c6FNMmio6V7T3XYDbrg/hcE6Dd6xJ57qHG\nrkkqmUTwIrI5DUOfYBgGKSlieWmRcRAxHA3INUvH56NIMpIaR1NiyKJENpuk295gZluoSR85piJJ\nCkLoMhvPCN2AQWvAyJii5TNIskogSLhRgDGzeOPKa0xtG18UcS0bazYhlUpxMJrgKSIuNrl4hkql\ngudCJpPBtF1m/QmC6rO1OQFVJqmlsUdDUqKAbjgM9g4wTJvx5iaT/oDhVKc/GLFQLGMM+uiGgBAX\n2NjbwRFCVi9Y1IsFgqHFQqNBLpMDQaXVHrBz0KaxvMo//xf/gnxeZnf7EUZ3QjKZQJ+NqDcWCCMZ\nfeZTq1ZQVQVVlZFl+aXf6ovjSwVRR09z48kub/3Ob7F2fRF5q8tXLq3w1LJxM0mceJEbv3qEc2Ob\n737/ayjNiCvlEr29LM/utSnkSkTmiKVSgLtQRrWS7PYjDsYj0vkUO+vrhJ6KLspcu3ye/laP19cu\nsCmtc+C2MIU4jWSJgqAhWhZ3nt5jvbNPfXkFWfV4tnuLt796lZ/d+JzVRoXRbECzmUELTbKWRSOX\nYFcSkcp1Or6F3d5Bc+OUMzUGQ5tYKUetlmHQnTDqb3Gwu0O62ECJJeb90YVfn+oEnGn6nwQSVVUp\nlQrHAaaj/tuvGmeB0KuAKSJCiObq8KIocFSOeXRY8/+nSzJPm8vh8TkeZQK8CJhf5B89CaDPL8cX\nsefT82d99kUBu5Nm/9H8/PqWKJcrlEpldna2j7c5F75QDgFOQdPmL2nDMA+rlJ5rl0qSjKrOU4LU\nWIxvfevb/Msf/ktev/764bU+vBYCRIGPbUyZTFq0RzpykCYdK/Jga4uBMWNmWFSSMHZDwqRGQjAp\niiO82ZCVlTJxRSEQQzzfx/F9JEEi4bpkA49AUhlHGqvn8zQqBTJaihYD0qUkptFBdrtIVp9ITDGa\nzCgVC2DqZOpNdCvkYGePct4lijnE0hJe4JCR04y6U7zQx9AHpPNZ1iqLPH68Tn/fI6aoBKLEaDRj\n5dISV65cYXPrEZlshjB08AJ/zuJJkMhWEIhjPV1HdGZgTxBtl5XCGgmxwGAyIVUWMVRQfZ9wNmWp\nVCZstbn9YJ1YLEE2nUc3A+4//hw/gmI+x6y9z9POAW++cQXVE+mMx0RRlkjQEGJxWp0DmguLhDHw\nvAmKr7CYK7Hvbr3y9wJfdo8lT8exbP7vP/k/0bQ88VIJKZcmrsUIbZsYIUlZZLi3y82ffUQqlmJq\neYwti1y1hCzHGfX65LU09WqZz259xsbmJoVsAd8OUJQYQeTT7uwzHAypNZvsdzrEtQSu74JjIAkR\nE9tmaLn4kYQUhaSkiI9/8XPa3SGP91qsXb3M2rkVztXKJGWRTn+AmMowMqY0lxr89Cc/pd2al6t5\nUcB0NkWJyYwHI0I/opQvUMhn+PzGz5iMB3juYdL9b2rVC/DrFq5UKsRiKpIkHgoIn7GZM8zVs5Y5\nSvMBECKOezOFUUgQzGvv562bj9jXvDHbyTzTl3vMnzqZE/s5Lax8ShDkxDEdbfcsUD1rvJhQf7JM\ndD4vngC4s4VJTpaUZrNZSqUizWZz3p/Itk+4TeYnLssi8XjscL3TCfwgIIoRs5mOZZm88cZX+MN/\n828ol8svM/AwJAx8As/C0nuE7rwqzfVtLNuAQMCYOJgROKGD4U6QlXkfrsXaAvV8iYVKndB2ycbT\naKqG5zik0nFqtTzxZBzX85AkgXQmiePZ+KFHNpPEMR067R6I6lxlKZcik06gygoxNYkXhDx99piD\n1jOyuTJr5y+ixOOgzEu/lBbfAAAgAElEQVS2B/qE0dRgqluoikaz0aRRq2BMh4SOTa1WxLYtQKBU\nKqMoColE6lB1KUa1WqNYyBNTFRYaDVJamsAXiCKBUiXHG29eQ1JEypUGKVEhqcRQVZVLr7/GOx98\ng9fe+gq6aXL3zl0e3b2L5IVcXDvPb/32N4kEMF2Th0+f0G738EORydSm25+imz75QhnTcGkdtCnk\nCnR6fXqDAWH0xUTnSwXR6WzA+1evcrWxyv/6v/0J68MBycUFtOxc4MAYD8mmYnzw1pvUM3l8K8BH\nZup5BAKcO3+RdCLN4KBFOhGjUstTqpf56rsf0CgvMhqOQYm4fOU8+UKW9fVNNnb3kRIJgsDjG++8\nxXDYxwl9dD/g6eY2MSlBYDqktSSSpjF1HYaTCdNhjw/efxtjqnPQ7vLeN3+Ld3/rA/Y7bSzLwpjO\nQBSJpxPUVuokUgka9TrDzoA7n9+mUi2QjAcY+hDbMgiDgN9UpnmOGV98I2OxGPl8nng8cWxCngSd\nV5nHJ5njSwB66iAgCqITEfDnf6eP9UWQOwJN8UTk+9Vs+Ejo+OT3LwLrWQB7cv4IFI+ErI8A9HQt\nvcC8tfHzbZ8ln3f0f668VGVhYYFUKoNt2yfYqH/oPhBwHAfbdogi7/l1FEQSiRggYpoma2ur/NPv\nfY/llRXqjfqh2MvRdY+IwgDPtdAnXR7c/AfyqSK5XAHTMWl195lNDfwZhEIMSRKwrQH5QoxMKsl0\nPKXfHbDx7AnT0Zjt7R3kSEDCR1UiMrkEshiSEEUMo08kROy09tHSSVqtPUQhIq1lEJAYTwZksgm0\nuEoymSRfLCIqIpZjMDNGzEyHZ9vbJDNpJtYUJZUgkc1gugG64fLw7lPy2TJpNU42EUcWAjJagm6r\nzcP790+02obZ1GAympBKaCiSwGjQxtAnyILMQn2ZdDpLPKUQih4HnTb7BwPM3oith49QZRHLMekN\nh/RGU4IILl2+wJUrF+f55UFEPptDSajMPIva4gKLy+do9aeMpi5eJKMm8gyGJns7HUzdYTAYIcsy\nE31G/LAFzqvGlwqi3/3G+1yuNGnf26K92+bW03UWLl4iEU/T3m2xP+jSNnoESkC33WLUn7C72+HS\n5dfnPyrXQwgF7NEMQh8pLlKuV/jk088oFqoIoko8rRFIHpV6iYGuozs+M9siltSIx5JoqoJujAjw\nSGZzZNJFolClVKqQyWcp1/Mk0yqXLl/g6ZNNJlMHHxhMeowciwuvXeLS+VUEQlrtDkvn19DyaWzb\npL13wLnFBYqHSjOuMST05j1hQt/7zZkor64IOhqSJFEul47bdpzUvnzRp3g0XgzMPF/2EBwF4ZQU\nXhBFzKX04HQE/3jqxOcnJe3O3ucRmJ4E75cB/bl5fRZLPdrmSaCc/4nHzfPOah9yFnie/O4IfI/m\nFUWhWCySTmcoFudSaUddQIMgOCzrDDBNC9M0CYKTAbMIyzLp9ToUiyV+8IMf8MMf/oBKZS5ucnzV\nDt0dge9hTMc8vfcp5mDK5pNNUqkM6ZyG7RhYMxvflrENi5ymkVQi5NBlakwRZIWDboft3X3sICIQ\nRIajPuN+GyG0KWY0XltbJCv66EabVrfFjRu3+Zu//jHT6ZTz51bo9dqECMhKDFmUabVazGYzXN+i\nP2oTiwsktBhP1p9w6/ZdxjODUI5hhxEbO7v4RMS1xPzcw4iYoiJHInFJoX1wgCiERPgMhwO63Q67\nuzsUiyXicQ1ZVAg8H0kMSKfiLC8uUyxWaNTqWJZOp7uFbZm0WyNqlSqOZbLYrBE5Hg9v3ePB3Qc0\nFhfwpZBOv008odLeb3H7889YWGogyiLPNjZYXF7lrfffpzfVkeIpbnx2i62tfRwnQBLmXs4wEhjr\nBob1xXmiXyqIXr9wnu76Bs54wvvvvcf9J0/p9Qak1Qx/8aO/YeJ49D2T/VmHheUquj7h88/vcO/O\nI3Y29niw/pjReIquGzx88JDNvU0ebz7G8nw++/wuum7S7/fJFdOEYoSoKpi2je359Pt9fvnxTRzH\npt/ep14t4gYhHjLxRJqpbpBKaVx/4xorS3Vm0zGVaoNktoioqPynv/wzbtx5AIqMooJr6liWRW8y\nQUvnyBXzZJMaAj7vvPcVIlHg7t0HdHc3EEJvbq4FPv8oZadfg7q5XI50OkUikeBk4vnzFiIv51x+\nEVM9esAjgWPWfASyp4/pxeM6Gd1/0T95tP8jwBRP+G+F48DTiyB6ao8nXginRJVP/UknwPpsVnsE\noGeZ8ycB92g9TdMOSz3nNe+i+Nycj6IQx3EPVemPWKyIKMqoahzX9SmXS/ze732XDz/88PCFN1eA\nEo9eZIeaBrZloI+63PnVj3n28Bnd9oQABdN1cF0bEQFFTBAFIdVCnowcQ4rm5xKIIZEAghJj4noY\nnoPlGIShjWOZ9DsdYqFDJR6wvFzGdW129np8+uk2+XyZRrOB7TnohonlhBimz3Awl6MTFYFiOUu9\nWUOVVCBAkAUs1+PK5esMBjMMw0VRFbLZNNV6kSgKkESV2cxGn85fMIoMw36LKBLIZnN4ro3nWsii\nzKA34sG9BxQLeVxnRrfXwrNDdrb2yGWSjCc9wjDks8/voaaTXLh8Ec+06WxsM9huk4+n0FIZLn/l\nOtlmiXgmyXgyRBUEZFHg0uVLWJ5Ltz9i8dwSK2srbO3v0RuM8LyAZq1OrVwmrSURZYHeaIj237IA\nSRB6xNIJ0GTs0KNarzNoD6hlanR3B2w/2wNRQtPi9AYdUkmN1eUVrl27zmhsEuARqRLNlVWWzq1S\nrZSwXYvBbEAgiNQqdYqZPLIkcdDep9msUchmScUSSILMcnOBaqkMYUQQiuQLRTzPRVXm/Z8ePX6M\nGktwcHCAQICsiHR6PbwgAkFmuzPgz//yr4hCl0sXz1OuVLl1+wEbO3s8efyMar2M71pMJgOmuo4s\nafzVj/4vZpMBYeDO5dXCs0Do/9+YS+QVSSaTx5Hpo0j9WX7Fs9KRTk6/qF4viXNzfB4FPxpH0/Oa\n8JPm+nGA/xRTjU4s99x8f1EE5OiYvwhMz2Ktp83wlz87y/962lc6dwGc9B8fvZAkSSIejxFFIZJ0\n2OQO4dAvHBxqph5d6/m077sMhwPG4yHvvfc+3/nO77C2tnYsHHMqShdFhL6P55hY0y6ipTMZzmh3\nJuy2h0ymJsNuhygIiCdTJHNptre3EAOBuJLAMCxCP6K1f4CqxEnEM3iuT7NRYvswHWkwGNFub+NY\nu1jGFFkUWW6eY3GhSrNxjoPWAEFUsB0Xw3Tp9idMxxb93ohut3NY0DGPsIuiCAHEpDiu7VEvNVio\nL3B+dZXhcMBwPCAgwrQtKs0mhm3juT6CJBKLK2xv7mHoM6rVMro+wTBm7O+1IZq/2JoLNVzHoNVq\noU/m7H7Y65LLpvn2h98mlUqRTqfpHLTo7rdQERkPJyytrFBq1Kg0ahTLeXzXYTTo0+11SCQ1svkC\ng9GYz299TKVWJAgd6vUK08mY8aBPLqMRUyUazTrJdIro1+gAf6kgOjJ0fvL5r2g5Uyw5AEnm7u0H\nVGtLLDZWqCTzyLqN6oZUUwWapQqlXJF7t+9hmBZPHt3n6bNn7LbbqEqCc4srvP/e29QXGigxCXum\nMzro0d3p8uzJBqNul1JKQ7A9zi8uE9gu+nBCPlVgMJiQTmXQNAl92sGxpqiqymCk02l3cSyTVDKO\nac5wgxDL9vECWFs7T+j5+K6HpqUol6sMBgOuXr1GKplBNywcz8XxPQRJotPqcPPjnzMdD/E975DF\n/CN8o69cdu7bLJfLxONxYrHYqeqcXxeUOfn9izmmJxnbaVP8pHl+MmD0nFnOP5sD55x1n8zdfG7G\nv6ii9OL8iyz6Vab9yWMGXmKYZyk4vQiuJ/3ER/5QRVHQdZ2trW103ThslMYh450LBB/dg3mu6jw9\nxrJsTNPmO9/5Dv/+3/873n//fRIJ7TnLPcXSQ3zfxbFndLYeERNkwjCi1FyivLDK1s4+w/4AXR8R\nSD6JVJxMOoljmOAJjLrTeQAmXyKwfURBPjSRRXzPo9PuksxmqDSLnL9Uw3UiGpUKybhIOqWRSOS5\neesx/b5JhEoYCQQChKKEKMWYTay5fqdl0+vu8/ThJtbMoX/Q4s6nN/jaO29hTcZsrW+w8XSD2czC\n8V2EhEIsnSBfKZIrFSCSSSXzFPJFdnZ2iKIIw5wiyyLpdBaQMWYmYeQxM0bokyHGzGAyGJNOZXAs\nG3yPyLToHLSQRIXucMROr40vhjzdfMZ4PGZne4tyLkchpSEEPqlkmr2DFvlSmbt37hJGLpIckS/k\ncByb169dJXQdyoUCcVUhpsWoLFS59+jRK565+fhSQbTV75GrVRDTMXZ7PQ66fVpTHbWc49Ibl6jm\nsqzmq1xtnCdyBQzdYjbSsYYTzMEYVZgzrYtXXuP8ynmyqkZvr82zp4/IZDUuLC0TzWwCwyWyfMqF\nPGoUkU8kyMoatg+ZZIZ0LMZgfw/XMXn45BGCKpAtpfFck3uf3SAZi9EfjLj3+Cl93WA61hn3BlQK\nRcRIJKYkGXZnqGIMIYrIpDTy+SzTqUm/N2Nmu7Q7HWYzHSUmsf7gFtPxAM+1X4pi/7oRwSuBNIoi\n4vE4hUKeZFI7rpR5MSJ/Fgt95f5e6Vedg+VpBvgcYE+ywJOs9GicZKIAc6s5OgVqXwSSR+NkG+gX\nl3nx+F70iZ61zaPvj/pZSZLEcDhka2uTRw8fMhj0D1mpjChKx43qFEU+bi4Hc/Wro1Lcy5cv8s/+\n2T+nWCyiaRovWR6HqWBRGOD7Ft3WNtuPbs5zmgWJt7/+dRYvXGL92S76aIaWTCDGwLEdLGNKrZzj\ns08/Y6Y7lEoL5IolBFVmYhmcv/waCS3PZGwQ11JYjk2v2yKjxei3Znz2ya/Qhy0kweev/urH3Lq9\nxZ17G1iOSyQKxJIxpKRCsVYj8hUiR6JaLNFcqDDsTpkMJ9izGe3tLX71879juV7F1g0if+4/f/j4\nMY7v0OofoCQU1ITG+voOqpymUiojCjLtdpt6vc7M1DlotZCVOI4bMBqPqDUqhJGHqiiIkYgUCFRy\nBW7+8iMONjepl2q0egMmns+5qxdZuXqBqTVlcXGJxdoCpWyWxWqZ0XCAZVmMJzqdVo+j3vSJZJJi\nscTMMLmwdoFUMs3f/+3fcevzm/M4hmtju9YXPiNfKogKUoyElgQf8sk8tdoChWaTtjOivFqCYEYh\nliAuxOn2Zzx8soMoyBBEVLJ5Pnj3HRQEbnz0Mb/46S8IDJfV+iLlTAHbNPA9g9Vmk4QvM+6MkCNx\n/hB4HpN2HyeIY1keq/Uq1UyC/Z1nFGslrrz5Bq7nkUvFSSkCX3vnHWQlzqOtFslsmWQySSEZwzIM\nbnx8k/t3nmFOA/a3WohhgCIEeK7L9m6H2w+f8ejJDpVqhXQmRnOhwd3bn7CzvY5j6YSB/4UM8ewL\n9+oPJUmicBill2X52Pw6teQLJvPJ8ZvmVJ78+DnQvhjwOe1GeHXQ6DkIC8cVTaf9nSdN7qPtvdgp\n9OQ5fREQv+p6H4GnLMtMJhO2trZ4/PgxOzvbfPLJJ/zlX/4FP//5zxCE+XWOxZTDPksqkiQf7ysW\ni+H7wVzpKJ/h+9//Pt///vdZXV19yWUBh77QMCQMPBxzSmvvMfV6g3yhyOqF8yxfWMPxfW7dvofn\nhyiKRCIlk1djVJJx0jFIxxU2dw7Y3uugpJOMPYPWZIyay6GlSxgzl9ALScTiBHaINXWQojif/upj\nGuUUy80qT9Z3MDyBRDLD9tY28bhKrlDm4rXXyRbyVEoV4nKM0A/Z3dtEjkSUSCKTSFLIZhl1+qiK\nxNq5Fa5cuYAkCSRTCUxrRjKZxLZcZFnFsQMMy2M6HaPF46SSOSRxLnidzeeIgJuf3cK0572kut02\n1XIR1/KQQpGEopJNJPBDD0WN4wSQSmfIlnL0Rx2q9QapVAZBkDHNGX7gQODz4M4D1p9s4do2axfO\nsbPbZjo12dnvYJke/cEIQ3fIZHLMZiaPHz/i3XffI5dNn/kMHP9uvvDb/8pjYXmN6dhAcgJqmQKC\nG5LMpvno5i9x/Smr5+q4ps6vPv6Up1t7HIx0ulMdNZnia7/1LTzDoVmt8+Ybb1Cr19ja3OHSymW+\n+63vgBChZRPkS1k81yV0Igb9CabnoiZU0skEju0zGulMxxMa1QpLzQaxwyoFNSaTz2eY6VNu3b3N\n4so5PD+iWq2TT2dYW1nBs0xq5SqVcpPt7RadVh/fNJHDkHarzcx0Obd2mb2DLhsbW8iKSCafodpo\nsPHsEZ5lEAQuQXDU/Ow3Ha9Od4qiiEw2M1cyTyZfaZafxfhe5Ts8yeieV0M9B8DnrPPVfsyTVVQn\n2elJv+lRkEmSRARROLXsSZ/li6b+SXP/aPokaANnuiiOpo+26boum5ub3Llzh0ePHvHkySP+7M/+\nH/7jf/xf+NM//T9odzsUi0USCQ1ZFk+lSB2dg6KoRJGAZZlcvLjKv/7X/z2///u/f6J66qU7No/I\nhz6ea2EbQ8zRDvWlFXxJIpaOU6gW2G8fMNENEvF50NA0pij4LNTypBJQr+eR5Ihur0cimabSbDIx\nLXb3e3h+dJjLG6Alk4hSnNksot/tcf3qeQTf5MLqKo4zB5JvfusbvPvuG+zt7ZEvlOmO+gSRS7e9\nQ7/VopDN4To+Swt1KqUivh+gxpKU63UGoyFuaGM7UwxjhCpLDNoD5Egh9CFwIhqNBrqu43sW/V4f\nVU3gepDO5sjlU1y4fBHL8Rj0p8RicUrlAm+//QZLzTorSytkEkkW6zVMAixCLl1+nVQqw6DdRiZi\nsVnns89vs7G7y9bBHsV6iUIxRylTQPQFSsUykiQQhBGGaVMuVhhPdTrdETPbxvUhCkVu37zD/Tt3\neP+dd77wafxSK5Z+8rNPGR3sUEjGscYT8tkMqiTS3t6ifn6FTEzhzs4mUTzN4vISvgwb7Q6qJOPI\ncSbb9ymVq0xm62iaxn6nyy9+/ksWzl/AMm0ebD6lls4hyTKZTJ4H6xvkajlsAq6dX2by+Q6elmC7\n0yfoDYilExSyce58+gmlYp5IUejPTLojg2+eu0yzVGLcbeO6Nnt7bQRRZnXlIvrEZDweEwUho84Q\nIVQxpgaIEgvLiwhyQK/X4ubNW7z5loJhOQx7+2xvPUZKpMjk5ybhc5/aF485QMCrwFRRFHK5HLqu\nH/f2OekjfJEVvuynPJwTxBf2ddLkfW66Pz8uXgKqkwB3HEx5xfkIwlwxShIFCEMiUXypsgmeC5ac\nvFYvssuTYAqcCrC9KOPXah3Q6XQxjBm2bfPs2QYPHtxja2sLTUuiaRq1WgNNSyBJczX7ebO/+bU6\nakutKBKOY7Ozs0+tVuarX32PDz74gMXFRRKJ+Jn3NoqY18ofViiZoxYiIaIaY+o45CplFpea3Hi0\nfSjk7IPvIUQRbjBiOrUppBTqzRKyqjCzTJ49eoIYixMXNfLp3FxrNApxHItkssT67j624/CV1y8w\nG+0g4dFrt5hMJuTzOcAnCj0IfTqdDoVyEUcfoiUVOi0LLa5hmDYpLYOmKhQKZYYzkzv3HhCLhVx/\n7TyWq5OIy3i2hWtakMyhoKLFNWrnakShRakQxw8DkrEMg3GXfLHAzDAOO0AIfP7ZXT787W+SzWWR\nJJEoChAjuH/3Hr7j8XSnT6074e3X38GyLPbbu3zjd7+FY8wYjabEUknGwy75tIYsyxSSBTJ9HXtq\nQFqkUC6xs7tLtblMXNOQVBkpFmdwcICqSQiCwie/vMk773/9zOfsaHypIBpXUqiKRr6QozcdcjAe\ncfHSZXa2dyiJIl+5dJlffnQDNS6jRjDsDTBsG7Va5WA2I7I8osGEbCHPTrdNqpilP5kitnqk8xUu\nXFvi1q8+4rXmJQa6RzypMTB0FC3Fz298TC29yNAOKTRqHHTaLJarBK6BORrhptMIKmSrVTw7ZLfV\nIZ1MIccU7j9+TLpQxjcdJhOdQqGAgIvo27z95ttMdRc5lsGLHFzPIJdLoo81Qk9if6/D5u4eju+R\niMlUFldJpuf9zWVZ+Y1AFI6Y2+my0ZNBkXw+y3A4xDAMPM87rq6Bl4M4HKs0nQTVI6Z4ZKy8mEAf\nnZjmxLZOm/CnmdqrRZ2PwE4UOZTeO1tQ+uj4vyhQdtLfeQSez9sdz0FP13U2NjaYTqeYpslkMubB\ng4fs7s7BKpVK0Wg05oEZWUUQwsN1j3RKj14mIEnyoa8TZjOHer3KH/zBH/C9732X999//1T/q9Pn\nHUE0r04KfRfPGOEMdnj7jTfpT3RWrlyiUF3EtCz0UR9rNkYQJFQ5RAhCchmJZFLCdW20RAwtKVJr\nLDKdGSQyZWZPd3jt8mWMyYBue4dKLkcpX+bj8aeM9AmNdgZjdMDico2t9j7ppMZo2OeTj35FNafS\nb7dBlHn7vTeZuhMK9QbmzMUPA5AkTNMmCn0s10SOy+j2DDcEH4FspsB4bBG5PplEEs+yUQRYW12l\n1qhi6WNcr0cqpXHv3n3KtTKu41PIFXj84B4EIXE5hSrFWV1e4cGD29i6Q+iHaLE4F69eYv2TEfrU\nYnN3h0w6zWr+IoZj8/nPfkYuV8IxZjiOixJPIKtxAj/Csx38wMVxQUspZItFIlHlnXffYH9rl4vL\nK2xtbFJO57l8cY3d1h4f/8MnL/3GTo4vFUTXak3C6RAUiYtXL+JsrFNsVDFmFiPbYxbC4to5Msk0\n9XqT+0+ecefZU3Y2d/jeD76CmlP59OYtHEFmca3JxuYzJEljOrMJQol7D9aRNY1kIUuybzDqj2lc\nXGYy3icdkxnNxlx6/QqO52K5NoY+Y6bPkNUEca2I6RjEkwnefOsNbt+6z52HjynlcyQSCd555236\nrT6d/pDuqIciuDQaJUIv5OH9J1gEXHvnEtubD1hdWCahJigWKvT7Q+KqDL7H/votWjvrpNIFRFFG\nEiWiVwRTzh5nLxdFEbFYfN4ozDCYTCanzOmTD/OLZvdzMOWlz+brcuy3PIt1vrj9o++P/p/8ThTE\nU/mnRwxREKJTjPnkcb8qIPai2X+0rGmax6pKQRBw79492u020+mUMAxptQ7Y3d2h3W6TTqfRtBTF\nYvkw15bD7InghVjec1fG0ZjNDHR9Qj6f5/d+77v8k3/yu1y/fp1YLHbmPZqfxByUw8DDnI2Y9ffA\nnlFcaTKczXuv54o1Wq0urd09UrKAEgX4hoGiCCSlgNlggO+GpBNzhbF4QmS3MyWMpVlYXqBYzc9l\n6GQPTZGYDQckFJnS6jkWlxYZxEy+/vWv4n/6lINRyHQ4YOfpHr/13/1TrJmJPRsz7replSs8urdO\nLl/ioN3BtCzi8QqB77C7v0vz3AqB4CNIKkQyluNRqSxiGTqi77B6bpl8qUZ7OOUffvEIxzBQNZcL\n569Qq1UQZAVZVPn0k0+pVGpICGTTWUr5MpIccWv6OYPuiJicoHalznA64vqlN3jyZJ1irYIV2jQX\nmzx+8hB9PCXQHc4tN7F6bURJQdE0lCBxXIyRSmukCnG0dJlf/PITrl17g0m/x/5BC1XTmJom6XSW\nouewe9B/9T3kSwbRzv4mqXQcURV5vP4MRVFp1Jf49OPbdByP+uKYhbVzPLh5G1GQcWyX5eYy99af\n8g9/9/+SiRwiUUOQ4iixBKVygUsXXyOu1fjzv/lbQtmjmE1y0G4zM3RC12GpXGfTmpDJqMzGJsRA\nlWWSCYXx0MAPVSIxRSiliAkh2bTG3/7kv+CGCcR4CgcR3zEZT/pEMnRGA3zfppCU8F2Nzc1ndPtD\nyos1JCkipamkEwnMiU5K01DiMm7gMen18YcWWw9vUq2voiXShKr6UtrLF42zGN3RkGWJbDZzzLRO\ndsB8KbDDXPRizmxPBoReFmx+MZjzMgi/PH9SIelU4OqQ0J48rjmQPl93nn96+pyPlj0CzOdN5CIc\nx8E0TWzbxnEcoihke3uX27dv0ev1DtmxxGDQp9vtABGpVIqFhSWSySSKIuP78yqk+cvipIvgeUeC\n5/X3Iq7rIAgCFy5c4M033+CHP/whr79+nWw2+wX36SgiH0LkYwzbPP3sx4iRT7acwZgOuHdvi7cy\ni0z6XVzbwZvp5LQEleUFDNPAGz5iODCQFQ0jbzOZjSk3avQGHYKYwqXX38X1dPrdPvVyCa2QwR4P\neOPyOdCSnD9/gWJepDeaYpkWshhxrtkkcH1G3RFvXnuTz+99xrMnj9FklcdPnvH6G++ysbWH6861\nAHRjQiKlkNKSNCvz9D5DN/B9SKXT5HJ5Np7cZe9gj2e72+zs9zBmJgu1GrliFggRxICF+hK9Xp/9\n7RbXLr7O1YuwubHJdDImkVCwbZvF5XMQSRx020ymA2rly2SzefbaLfYHLfRwRkCESIipTylkrtHT\nkjzd2ObyhWt0WxO0uEqv18MhxXBg8e7X6vPsnG6LVCrBfv+AiWmQSydotVqYrsH3vvedL3wOpT/+\n4z/+4y9c4r/iuPfJn9ObDemPJsioyC4k5ARPNraoLSzy7ttvM+q06LQ7mK7Pfn/MhUuXSKdj5DMx\nGsUSw6nNWPdIaQmajQLD4ZCf/PRjZFFDESSyyRiWaXDp/EV2n22TlGM0a2WmMx01HjGaTBhPpmyu\nbzEdG9RrKwzGBqZtEk/IDMZDPr39AFFJIEkiw26HmCoTISLFJJ5ubJFMJnnz+mW8mU46maVYbrBy\n6QIjvU0uGaOUKbK9tc9wPEJLx6lXyhjjGSIBuzublBfPUyzXiCeSSLLMc7P6NxsnmeJJ1ifLEpZl\nYVkWruuiKDJBEJ4COkHgMIhzpNL0PO/zxQATHIIYp435s4JTcLpUc77y8WEej7OqqY73c8KfeZLF\nHpVkBsFcXd6yLMbjEQcH++zt7XNwsM/+/j6/+MXP+eu//mt+/OO/ZXd3lzAE1/UYjUZEUUgqlaJU\nKlEsltC0BIIg4qvapC4AACAASURBVPvzl008rh6foaqqx4zyuZiJSBD4zGY67XYbRVH46le/zn/4\nD/+O69evk8mkX3JvnD7BOQt1LANL79N99hmiO6bT7/Do8R0ePXzEwuo1So3LrG+2sHSdZOjz+oU1\npoMeSkwi4Y/R0mkai8tcvXKdmzduki/kmegj1ISMGlMoV2rs77TQ+12aOY3OwTO0nEYil0UIbdLp\nDH/7X37KeOLiOlDJ56lm06QTCSbjKbIkE/ke8USc7b19IilGtz9g7fwlhoM+yUSca1evEYQC/f6Y\nXCpHvVJmZ2eH85cuUqlVaHUO6Pa6vPbmG0QCZDIayaSCrCZRZIHtnWdo8QSb6zuoQpz2QYvFhSaL\nC4sEvstUn5DNZllcXkVQVGaWDkrAs60RU9NAUkS6vRaj4YDLa+e5ev4ivVaLUr2M6drcuHmbr1x/\nm/ZuG0kUyZaytAYdFN+hXK5CJMw7CQgCT56uU6nUSKY0uv0WxUqWy1cvceEr333l8/elMlEjmFBq\nltjp9FgqL7JabjJoT4msgJluMpvNUJQYuXyO1sjAiEKe7G3TqKa5dP4c5USBiX2Ljd0eNz69ydv+\nOSRFxvMcUskEMUlAk2VM0abZqLG2sMCjz+9wVbgCskAYzdhqDdGSZdRUASG0iMIQU9cZTTuIygKD\n6QiUGLv7u3zjzbeYtHcIBY3exKA9aJFMp9hvtejU86i2yeuX3+Lvf3mHTx7d5dxakVgxie+42JaN\n49qMJgHJeIKFaoP2YIfeZMwnH/1nllcvkNBSh7mHKsI/ipG+7B89qlaKxWLIsozneccpPKIoHvYg\nOmJ/wSm2eOQHPQvYjnd4VD9/ho/zRfb6fLtHea4vJ8yfjqrPgT4Wix/XpR/luzqOg+PYWJbNdDql\n3W4zGAwZjYZEUch0OmV3d4+9vV08zz30bS4cVhrNXxbpdOo41/MIlC3LQhAgnU4hCHPzPAgC0ukU\nnhcwHo+Pyz0FQcS2XQaDAUHg8uGHv80f/uH/wHvvvUejUUdRlJeCXKevYzjPDQ0DLGOK0d+lu34D\ny7aZzibo+gDHcrm4doHWcMLefpdKoUzGMXl6/w6O65JvVvEIyeazXH3tdeqVJtVSA1t3KefyWJ6J\nOe2x9eQRjx/skI+piEKAllFwpRAhLnH//i0y6QyDocn7X/829+8/ZW9rncRCHc/z6Hb6DMc9Fpcr\nVEplTMug020x1i0GPQM/sCjVF5lMptTqK2STBdLJON12h3qtjKbFkeIqhXKFxkKTnd0DHj9+wqWL\nK1xYW+Dh4zYIDmvnV4ipKpPhhOnIYDqbUCwUSGc0bt2+yW9/6xu4fsCDh08olmusXbqA5QzZ7+0z\nnY4I2i2uXLpI5HuElk/f7uCFPmN9jBn5BJLIxtY8talczFNYqCCmZGZ727iGgyKIjHp9ZrZDMplE\nFEWmuk4+n8F1bPZb21/4/H2pIOpn8gRui+yyxyw1JXnlm/zDj/4OfTJjcWUJww4JRYF/9YNv86d/\n8r9jKBHt3pS91pQo0HDPSWhZiYwposxSrG8OmUxtpFiOYDbD801MQeW9t64yc03CpIIlhIw6I3xL\np1+LKNbr2AOdc6UajdXLPHi6TaOYZ7M1QA583rnyGv/lxx8RlzIU4jmuLq6iSHP1+HUnzX57H89y\nKaeXqC/lUMpVHhh7KAWFfK3IQqlEa3ubi5cX6LYmOI7P1voWUkbF9ySipMpW5x537v+SVLaIrMSI\nJ0QU4TcPMsFzXyU89z2Kokg6nUJRZPr9HrI8z2tMJOKoqgrM2epRnTc8LxOdrz9PbzqZHhRF0bHA\n8Ivm7vP1xFOgPN/m3DQXwghBOq0fehR48TzvOAgGYBgG4/GE2UzHtm0Mw0TXJ/R6ffr9HgcHLbrd\nLr4fkMnMwW86nTEYDCmXq5TLRWRZZjabHaYjCdi2w3Q6JRZLoGkCs9mMbrdNIpEik0kznU7pdufX\nKpfLMpmMkCSJZDKJIAiHKvFzIH399df52te+yocf/jYrKytUqxUURTkVCDvbjJ+LjISug2+OGLY+\nw5JHTH2P0DRpJkt0QpNmtcr9n9xAG28z7jl8+uAR4WFri5zoYIx9kmkIcHi8dZN8M8bGwQ5Ll1/D\nNkyKhSbXz1/iye37BKksP75/i2o+i+pLtG8+Yv/ggFhVoC7G6D28x/l6A9XTiccCskkXO2tx9Z13\nefykzd0HPRxToZjyub6QY7GmshFrIIlx9OGUc6sR5UaI74/YfvqAc2vX0V2fYGZz+eI1bn/6EYQh\nq2vnyeRKHLRs6tllQlknkUzg+hGFpRK5chrZLTHc36Wav875tTWiGDhiwJO9DhcSVSLZYWmxxOp1\nlc6mzLlajUxMZHPrEYGapGP4DLsT6rUhncePqEgqO/cf0VhoYkVTRhZIqsBA94mlS2B3CYOAra1t\nRDXG2LIQhRApPs96sCb6Fz57XyqIjrpdLGdGjDwJpcRs6tHu9nBsA1lwqJWStGYBm7vbVBeX6Qd9\nVpevMhwNmFld7t7YZmI6BLJMZekclmUQKlOGYx1z6CAKAgfGBOmdBNPZlN6kQywlsry2xNMHj3D7\nE6JYlkq5im7aCCkFJSFz9eplnGiEZYyIwjrf+vAbfPTLz2m3DogJAoVcmf2DAwzDpJDPEi8UkCSB\nrc1NEpUs165cYb/bZjKc8vP7jzm3vIggSgiChO+5JFNpOvoAIoVzS8tIcsTTR5+wvHgFTcsgy8o8\ndzH6x5n1L9rLUTTXmKxWq3S7PX75y4/46U9/xu/+7neIxWIkEgliMRVN08hkMiQSCTzPx/O84xzT\neUQ7QhBEgiA8ZrgnI/3zpH4PSZZQZOUE051Hrp/7LOcBHtt2Dk3mOK7rMB5PcBybeDyObTtMJlP2\n9/cIgoDxeILve7TbHcbjMZY179fe7XaZTEYnVJUEBoMhk8mUUqlILBan1+ti2xapVA5Zluj3ewwG\nfRYWlonFVB4+vEcYwvLyMtVqFcMwiaKIixcvkEplyOdzeJ5LqVQiFoth2zamafL06VNu3LjB4uIH\nfPObH/CNb3xAKpU62+/74h2K5on1vuvgmlPM4R6DZ7exLQdBkMiUi4w6Qy5cuE5cSbF/0MaTJXZ2\ne0hSgtlkhq8p86yBlEIYunQHHUQCiCJae/tUF1dJamlMyyahpZBFiVQshq0msKdTDnojhsMpF167\nQFpQyKQ0bC/i+lfeYGd3g2RcwzJN9ndbNJYvc+nCZWw3pNlosHewga6rVGsNFDdgNO4z7I+oL9Wp\n1RYx7BFLK8ssr67MRX9kgQdPHlBtLmKaBpZtM+h26eweoCbzXL28gq07TKdjUoqEG6l4kUR1ZQUx\noaA6Cp3tAzxXwJ5MqRQzxFMCtx8/4tmTKUk1huu4WEFELKHOtUbrBTqjA3b3OtQa52htdxgMdfJF\ni9pKmc39HcoLdcBmOu6iJRREKU4QeIQ+2LZHs1lGS8VxbJ/H95994VP3pYKo3huiJlRmfZdCMsaP\nfvRnxBMxsukkSUUgsEeEgc3jjX3Ora4xDVVCyUVTA0qFHJPtkL5n0h9PGTsmq2vLIIWYjo0iqCwv\nrbGzvYnrwsef3UGfjdHScdZ3NihXilS0Kol8hqcHW2ixONv9Nn1jjPPoLkQeo+GIfr9NSArft5Fk\nkX6ri0w4V/MZT8hm8qzUm3RbbfRRn6vS23Q6fbafbZJeWKCYSJLOFWl3BuTyBQaDbdKFHGFGQQoV\n9jf3yFXSFPITbn76UyqVRVQ1Nk93UgTg5QqXV40oAoHolBtAlmWazSaCIHBwcMBPfuLzox/9iFqt\nRiqVQpIkqpUKjusSjyfI5bLUajVmsylhGB2atwKqGpv3KT9kpvl87pjlRdE8OJNIJrAMkzAEz3OP\nE9gty0LXZ4RhgKoqBMG8A+bGxgbxeOxYzOPjjz8+9DfOWzJMJmM6nRZRxGEJa4gkxRCEEF2foCjz\nFsDzqpYu6XSSZrOJqqrYtsvS0vJh4ziB8XjKG29c57XXrqHrBrPZjHfffZvvfOd3jtt6zGYzms0G\nuVweTdOQ5bkvNplMkkzO80XX19d58uQJf/RHf8S1a9eo1+uoqvqF5vvJGzRnoS6OOWN7/R7rH/0n\n1DBgMjZonltBlVQ6rTHZQpM/+7P/zNQ0EeNxfDWJqIjEJZ9muUizlqHTE4nkEEGCmKJQzGSQQ9AH\nU3YebfFv/+3/xOb2LtPRmCvnzzPr7nPvzj3y5RKxpESunAPdYjyY4vkie60dZsaMr1xbo729hT3z\nGXR1usMOCytLLCwt0hu0sGyHe3efUszNO3B6EYx0C0WTyWRziEgEjsXSuSVu373LzDSoVCvsPH6E\nPpmy0GgQ12Ks91qISsBqrUiCECX08f2Q8VRHiCcYOyZqMkF3b0wQKdRKRR7ev83S+Sbt/RFxOc6o\nP2TSbvG1d14noaWIaXEyhTz/H3nv+WRXfp/5fU5ON8e+93ZGI2MShhxSQy5FSitLVnL5nf8Y/wmu\nfWO7ym+8drl2rZUsrVSiSDGLaTjkADMYYDAAGo3Ot2/O4eTgFw2MwNFwhmG3hpa/VX27bvidPt2/\n08/5xucRJJFMtsh4PCeXL7Ocu7iBe35DD0MypkmCi4BPfWUdL4hIqQ8wM1n6gxFx6LJavcDp6RmK\n/PETS58qiGYUldnExRQMxNBHER1SZho1ST8d79IwLZ32aIRZLOK4c6bTLrWVBvuPmmSMNKIs0Fgt\noJgawXLMtD/Gni3IFVMcnx2SSAnf++FPmM5n5PJZ5vMFfjJGLSuYScxwOULSRCJVoDka8Pi4RTmf\noV4rcHmjgR8nvHv/IaVciXw+jUEJTZfwggjHnpFJW2Qsg+ViiaJrdPtdViorNPePcOceSj1DfzpH\nNExGrRmNxhoOAV4C/dMuqiiTEiymvQWDzg+pV7e4+dpX0DTjPCyW/rmH81ex53OMSZJQLBb53Oc+\nx7vvvstbb91CkiQmkwm6rnP//QcslwtKpRJ+4DMcDCmXi2Qyuaehr4qqak/zqhKplEUYhgyHI7a2\nNpEkCc/zGA6H5PNZBOGcXX+xWLBcLpjNpsznCyqVCtPphE6nw3LpUCyWEATodFqcpxbkp+QckMmk\nkWWFMIyYz+e8/voXqFarTCZzms1jvvjF19nc3CSbzdHpdDAMnWKxyMbGBnF83kVQLOY/0I43zfO/\n52w6o1AoUKvVcD0P13UQBJFMJvPc7DtYlvVBHvZZugHg5Zdf5ubNm+fUcKL4wXz9J9/ozpUB4ijE\ntZfY0z6Pbn2faDHEqpQZHR/hPn7C5QvXWFu9yFGzz9aVF2k6Nks/YunHKFqKxLXZbFSR4jGiHFNZ\nKaGpCtPRkJSqUkxneXDvAfNIYNSfcLB7n8s7F5GjiGV/TDlfJBYSGmsrGJrCycEBxUKeIFbYPzjE\ni0Py5RKDfo/axgXOOgNsP0LqtBAlEASZl156gWmvT7aQ4bQzYB4E6FaK+cxFjCOkEIbNMyxRRwoD\nNtbXieKYVCbDw4e7rG2uYhZSVK0sRkplMpnAYo6hGFy58RLT2XtUq1Xefuc2YeSxtb1BuzfAxgUn\nZPfuI26+fIPWeIoS+ThzeOtnd1lZKVJOBIIooFqrM53MeeHmTZbTGZmsST5vMZkNqddreDMb1Uzj\nRTCcLNjZuUQuV6BSreA554oXhBFyIuLO7Y/d2U8VRBPfpl4q4wYxmxslJsNjquUKo57G3Xv3eeXm\nVcqVGlYmRxBLWJk0y4XHbOSgy2VyFYNxMGZzo4yZ0hi2h0wEMAyNKPFx/IjFZI7nRKRSFgPPPvdy\n0yaRqFJbLzA6PWa8nNMoFBj25hQqRXw/YuyFGLFIdzggUVTUVIrJdEStnGU2myKoItmMxfZanWG7\ngy6dV20dx8NfOBTSRVRZ4dKla+wd7+NHAVEMZirFwcEjNm5sM20NiYOQs5MzXvn8q8Riwo++8zdU\nq6tkMjkEUUTTBBJB/mVrTOcBfZL8i6KUqmqsrjb4gz/4A0qlMrdv3yaOE1KpNIqiUsgXCCKfKI4o\nFgsIgkS71fkAuyeTGZ7nkU6nGY2GzOcLQGA2m51PayXC015M7ykhtMBiMUUUJVRVRRQlDp/qeBcK\nBdbXNzg6OqRQKPCZz3yGanUFTdPRdZ1MJoWmaaRSabLZDPV6A8dxPvCAG43GBw3z57rvaVKpFFEU\nYlkpgKeEIPJTzk7xnOLwKeDBefO9aZkIQuFDRbWfn7B6Ph/8jJw5jmNyudzPffaTdiVJEpIoIvQ9\nAndB88k92nd+gFnO0ZwOqNQbeOMJB/f2KNUv8vrv/S6Puj0CIaHb6RMGAr5ro4khQrBgOmxh+wus\nlMFyNkdOBNKGSSaT4urKJu/vn/DG93/IxY06V7Y3+erf/meK+QxmRsP2F2QNjXI2T1sWMC2F/eMO\n6xevM5hNyNcaXNEMms0Bj27fYzgc8vsbX8L3fcbDOWsra2xXaog5idu7e4yWNkGUUMsWERMXRZDp\nHLfIahlWKxXuPnxAY2vjvDCnGwwGQwRTpl6qES57CGpCIIi4scCTg31KpSzlTIZwGeInIJsmvhoi\npVX8WUTRyBBOHEwlZqWcRa03OHhyzNFJj/HC4dqNK6zUVzk++RmJAH5kk61Y5DIpRpMe3szDtqf4\nscrR6ZjcFD772hfo9/tUV8rkM1l832bQG2LqBmH48cLznyqISpGPSMJsMePkYJdp74T1agXbtRF1\nFTf2OX10yNnZgFZ7ypd/9wvsPdzHW865svMa5aLA0UnIYj4nlbGor25w1p3hTBaEEw9NtVit1PHm\nwXk+LbHRFImpKDNbhhRXUkzdgM5ohqSO8PwY1wuYLpZMgjnFzSrt8Zil45Oxl3ijJe7cQFJEfEFC\niEJkSWR9Z4uMpvPTW7fPK8l+hBgmrKxU2H30hL3mEdX6KhcvXmL33vvouk671eLC1gbLuX0uq+uF\naJZOs3fEvbe+S75QYUUQEXMiiiDwPMnwJ9kzIH3mwT4bq0yn0/ze730Fy7JIpVIc7O/T7w7QVI0o\nitEUDV0ziKOYKAzJZLJEUYTj2MiyTCaTxnFcRqMJSZJQLheJ4wTTtJ6qI+rEcUQUhTiOy1e+8mWy\n2QxhGHB62uaFF66xtbUJCE+r4QKNRp1CoYiu6/BUr10URbLZ8xztsyZ5VVXJ5XK4rksQBAiCQCp1\nDpjPgO75+fQPN/bLsvHB3+dZRf75HOZHDQp8eMLqw7nO5/PCH7sfT0c7ozBgMRuzGLY4fPAGKV0n\nEQTazSYbtSq2HXLw/jG52g6ZYo7W3bdZTicsRlM0SWcZOtjOgEbls5yN90FMiPwAKRHI5fM0z45p\nD9uslxsogsR6dYXXX3mFb/3jVylWilx/4Tp379xCU3S8ucP+42OKhRLVlSJ2kpDKZSnX65y0e6yu\n1Nn9/lucNJtc3Fnj0uULLOYud2+/x3Qy5Ob1S/zTu29hWRbq8lwyfErEfDZg6QYECQzHo3OxPHeJ\nby8JlguyVgpn7iInOvWcycHplOpWCVvS6JyNwXO4+ZkXMXSV2A0hgXdv32Pn1YtM7EOsjImpptl9\nfEBxPcWVqze48/Z9JrMp6UyBfD7L7dtv8yd//sdcv3Gdb3/7W7z++iskYkB/0sP3fXRJYbWxRvvB\nPhkrjyypTCdjktgnnzGIXAPPFfGWDvlGgVc+c/1j9/dTBdE4EtnbP+bClauYakIlVyJ0QwaTCVga\nU8/GjwJUSWXphMQx1FZKdFpTSkWLdBKyubLOk/Ypp70ZcSIhijLZfIZBd8aNnatsV7d5cH+XbrND\nvpHCyhokqLjLkO/98G18BaxClsXcI2tmGHfPyOSyRKLPfD4/5+X0Jfr9Puu5LJaZ4ei0iWKlKeQy\nLCZjbh2ecPPFF0mlLXzXQ0pEXn35JmXL4hvf/BpmOUs6leXR7i7bO9tkiinG9oTQ9qit1mmetXi8\nt8cXv/h5NFXl3p0fsbVzA003UZ4xBCHARzAA/SI7B9Lzh+fn5i3L4nOfe41XXn6Z73z7O0znc/q9\nPrbtkCQR3e6AKIrQNR3PdxmNRqiqQrFYQFEURqMJ+XyBUqlALpcllUqdF0Qy1tO0QZlqtYIsq/i+\nQ5LA9vYWiqIAsFgsyGQyaJr2tLDko+v6B1Xt59uePsrL03X9KeD+sz0/oQR8gof4L7lJn1/zPCB+\n1EDBh6e9PnkjzgtqURTiOksW4x7h7Izj4wcULQtVlahnM7iDEZZqUmzU8ZKIt95+C9H3yMgCGiGC\nHJGkJCaTBe58zGatxiJ0SKUytJpDKkUNRVfJFbI8fPAeO1vX+NLvvM7PfvJdVE3CTJuIqsba9g6r\nK2U67SYzV0BkgpbSKNVKRIKMrqcYdCfs3t3jtc9+HlVRKJQs3vrpG1zYuU4EjCZDvvaNv6XnBOia\nyYVGjZQqYztzVNOgM56Qqa1Q39im2z5mfX2VIPA4OzpCiBUq6RzV+joqEWKc4IcCs4VLvl5hMpvx\n/v4hwaaAIEG9VOPth/co1CZIYYxtTxm4MfnVBu68R7t5huvaXLt6Gdv18H2HS5c2qBRyqIJEbaVC\nr9/FNEUEwLJSnBycsLZaRYx8FELWa2uMOk3WqnlCb4amgGcHqJpKEIXY/sfLg3yqIDqZCji+jGZl\nWV3JohPT7swpluosEo9Y0RAUhUajQn804+joES9/5hr/8LffYjQ748ndHqmVPLYHQ3uJKClk0zky\nVgFf9+menDA67SGgkCtbWFmLKAmZT5bIiYoQQhzBaDBF0xS0qkEsiMiSRjGTo/2kSbFcwQ/GJOF5\nq85KbYWl69HqjqgUikymUwI/5Mn+Pqqq4kwXzCdTlFCg75wQBAFZM8VsOuXw6IhWs8nnPv8ymaKF\nL6v4IoycOVrGYLqYo6VMFrbLD77/VbKFKrKqIckKumEiC8p5dP0rAOmzrvhn00AAhmGgazp//Kd/\njOt6tFotQj9gMp2gaRqO7XF21qTVbnPaPMGyLC5cuEClUkaWFer1GoIgPi2+nPNuKop8ftynFXZZ\nlj4gMw6C4IORzrW1tQ8A78Nh9Afn/dxU0i/83T7i/Y8bNX366kcOJnzU+p9//stxr37EWZ4rpIYh\nznKBPRvTPnifvbvfwMikkM00OUnG7nTIyxZqPo9eqbP9wgt89/s/ZtAdks+lsWSPWIJYCrEsi9Fo\nhCTZCGHMyeEpipnj8dEhmZTClauXOPr2Lb78b77I0eE+rVaT1Y0VRE1lupjjeyF3792nVMzRbPUJ\ngzaZosJ86SMpFhe3LvPo7nvsPdyjUijzyovXODncxVBE6vUGGxsbIAnM3TmRoCFHMRuNBttrq4wm\nA6xCnuNOj9F0iZnJcsHcwffmvHv3LplMBseOWdg+1sTGyiqk8jnev7/Pi9evcePGdQ7Pmrz51i3a\n7R4r6xUEFGJB4exowJWr6wyHXXKFCr2+g2z7ECdkshZBaJMQ4Xkz0laDbuuIUnmVcrmAYYos3Sml\nXInmQRPPc+j1z7iwViTyZ0TulPffvc/aagUh9shnDabTETuXLvHk+Iy7j5587C5/qiA6GkZMEw8n\nCPHCgHanz09v7TEXTMS0wXTqgR+yulnHSGksnTmarvD5L3yWUdfmdLRAS0JkQydeLHBmDt4oJJPS\n0VSLpb+gUkozmdoEoogXCgwGQwqpDDvr6whegcNBDyGlE5Ewmc4xrQyWmsIdLUiHJkXSxErEaNEj\ncB0uXtzm6PAAMQk5PTlFNy0kUWEwHLK1vsHOzg6T8V1kUeKs30eVFUxVY7hcECYR3mLJ3Tt3uPnq\ndWaIxKJAoV7Cnk7JlHL0ZxNQVeb2lB/94Gt8HgHNMJ/q1AsgyYi/RqEJPkQQIoIpmZimSS6XPWci\niiISYD6b8/nXX6N11ubRo4dohsaVy1epVMofAJyiKOdpiCj6wHt7dvxnnuIz0HnmhT4Pjh8HkL/M\ne58EgL/se7+MJc/fjX6FReeFpIgo8JgMexw8eJuffuMvMVIC+VIO23XYqlSx4kuMhjOW4oJrr32O\ncn0FURDwfZ9uu0lkT1AtC01QiA0LPZWl1z5DeDpdlS7kEG2QxIhk4bG+uspwOGQ2HiJoCnPXJq2q\n2NPz/LWVMhE0Fd9zKJbyGJZJJBnce7jPa6+sPS2aSRweHLK99TqyJBIlMbd+9jNUVaVWqyExRfRi\nZF/k7OCIjeq56N7h4RGvvHST48Nj7rz9Fq+9coPHu7vnelCrqzw5aiMIApVancP2AxTDIJMt0m+P\nGeaGTFoDNtbX+emd2zw+OuTGtVfI1up0zk7YcVZIqSqB62BZBpO2h720yeYsggCSRCSJbBRJoNtq\nsbG2gZi4lCurhF0XP4zwwwjracfJSiPH/bt77FzcodZY4f0H7/Dii9cQJJFao8h8McJMmYSfsPWf\nKog6UYTtOQzHQ/rdQ/qnbSJJJJ3KEYkxKd3ACzTeuXP/qdxFyN7uMetrazx47w1GgUc2Uki8kJVi\nmUm0IIlEREEmFmOWcUR3MmEx97DdAGSVMARF0Z72RNp4S5vlYoaeTbGY2zRqa9iLJfFiwWeuXqV5\nfEImZSKk0whEHB/tMZmM2Fxd47h1iKoZFAsFxoMRkiRxerBPv99DrAiESUS9VmM2HtMZDM/ja1Gg\nUi7SOztjiES2mGXpO9SqJZ4c7bO7+4TG2iZO7PPk8BFjJ0AxLS7I50zqmioAEj+vc/TJ9vOUduf2\nzDt9NsrIU7DTdZ2EhM3NDVbXGyhP2aWeH+l8Zs8353/YPuxdfvi1Z89/U5D77bOEhIQ4jgg8B2c5\nY9ZvcnD3x2SzFoYmcrJ3SCwKpGORaXdAs9UlXaqyNp4hy13iwCcSoVZbQbRV+u0umUydbhBy2unx\nmasvcPj4IZEQMV/O0DWVs+MnkKiUy1X6wxGfuXmTH886LO0lnhuQz+Rp1KoIuoITu+QyOu58yIP7\nDwlFHd9L8EIHUQEn9AjjmEcPd3npxRfZ29/jwe4xuplnMpwSzkPm8wklI4cpity5/Q6xoZAplXjn\n9m181+Pavu29eQAAIABJREFU1Ytouo5pWQiqTn+2oD9bEjgjttbWcWYzFqLDlRde4Mff/RHeMsQw\nVWqX6pQKOaJYoD9eEMUiiSjQ7Q+5uLXOSavNhRe3cM+OyebTxFKE57skscz25hazYY9USmfcb9Fo\nFDk6esTq2gaTsYNppJi7Ie3OkHlkky4WEDTtvAtGNelPZqxUSvRHQ1w/QUnnaVRrH7vbnzKITrl4\nZZter0ev20GMoLCyxvrmBYbjFs0nuxQLKbr9CbOJRzGfZ9Q9pFSogBSTKaeZLReokUrKMKnVUxwc\nHCCnLNL5HG6SUKtt8ui9xxiKjuc6yLJMq9fHcyMMISJMZILAxwxiavkshiKAEpGr50llFNbWysi6\njqRXyOXOiRA01cDQ05hWmkI+z/r2JpJwPm8dBDGWZaDpOhuba0TOElHSyGXTnHR6XLiwBUAchrx8\n8yanJ0ck7rmCo+04OEubYbONlc0hWia3vv13lFYapKwsqqIiCgKKoCIIz9PU/XL2zKP6qLD35z73\n9LuiKkix9AuB7qOKLR/OR36U5/hJofpvj31Y2fSXXZM89UB97MWE1uFj2o9uMxu00HWVJEywJJXq\n+hai4BMaMqlGnUZjBwGFx/cfIBARCzEL3+Wzl69gJjH9qYMqC4znDqFqkS5mcRIV3/eIJQF34VKs\nlnnj1i5/+Kcv0uy0cWyPcjHPpDekvF3A8xx0Q0TVVSxN4EmzS1WvkC3nyVfyCGKIlTUQJFi4DifH\nTapFE1VWiKOAYi7Pe3cesFpKcbFa4+LqNvu7R6RWylj1Cm/efotut08chqyslTkdSuQqFXoHJ+we\nnLG0PWQ/ZNxu0cgX6HsOb/zsTWwk7h2dcOPqBUazKWEQkzfzOE6Mop8Tpc8mS5JYJJvPMpz3KVaK\nJEJM66xFoVDi5OiM6vUXUVX9fFiEgEqlyNQeIwgC6+sbePYRsqjguwscLyaKYhZeyGQ+RbHSLL2I\nydyjUq7TbLbJmin64se3OH2qzPaSFlMp5Wg1u3iewHgRsHR8ChmLSfuE5aRH4vukjSwCJp4jMxk5\neH6MZuj49hJZlFg6Pp3uiN5oRCZnMZ1OWF+tkzZSnB6dEkUR125cQZBiBCECYhbLGV3XwRHAMtNU\ncoVz/aWUQWO1jGxJFDcqzGOb9/ceEEYuvuvw9X94E98PGS9srHSa7mDIndt3kASR45MTVtcarK7W\n0HSVdDqN7TrESUImnaZSqZDPFXACn8l0xmI45ouvvc5auQFBQuLHWKKCGiTYwwnT0RQ/DPlPf/Hv\nufXmDzg5OmA+n+J73gdSvb+OfRjknv/imccp/Lwi5vP28wQm/5LJ/sPPP2z/XwDQ89TDr7suJgp9\nlrMx426T3uN32L9/C2dp0z49w186fOaFVzlt9un1Bqi6QigK2ImMns6fT4A5E4TER1U0mp0+9cYa\nhayJqSaMJ0NkPYsd+RiWQRj4OPMFmUyOwXjKyF5w3D7nrCWC7cYWK9Xq01x2QhgGLMZTBtMeIQJG\nqoDjxvT7fdpnR4SOTcY00BMRSzF456d3WKs1uHjpIttXLoIoUV/fYbNSY9Dq0O8Paayuo2o69dVV\n6o06jbUGqWyKg5NjOqMhQSQgCjLbG5tsrDaIQ5c0Ikok0OuN6Qz7uES89+QJt959gOMkSJFAvVBg\n1h8jxiIpI0WpVKDSqNAbdgBIWRkymQxRGKHpMpPJEO/p/0cQxXheQKc1ZDqxkaXzYubx6RGT+YzI\nEykVV0gSgeVyiSBLnJ31ODsdEIUys8mC5WIB4W+x7nyjvk4QiGTMPLWVVWIBtrY3mA5GyInAarWG\nKsrookxa1TA0lfWtbRwvpFxoIAcxsRuQNi3COMb3QlJmloKVx5/7ZAyN6bRHoWwyd2fEAmiaRs7S\nMMUAT45x4oDRZE7o+1iyxnI0IY7gtNPjr7/+daR0ite//LuEYUg2Y5HPQZSEVOoVQgQa9VUyVoq9\nx4+Zz+fsPn6EbujohsrcnmOHHgExK7UG66sbdDp9wghmrsuiP2bc6ePbAcuZS72ywp/94R9xZXML\nS9FwljaSIDMfjfjH//wf2X94h1G/w3IxIwrDjxRo+2XtfN1HhOD8fLb1lwXGfy32i4ief4mVJE9z\noIHn4dpzJr0z3vzHv6F/9D5EEdPBgNlwjJgINJtn7Fy/ynAwpHfWQdc0ti5fZhQExDKsVoukYh9v\nMqc3nDOwXS5d3SajJUhRyHxuIygqru+zs73Fcjal2+mTymR56dVXEGSBOPApF3JEvk8+m+WsdcJ0\nNsGZL5j2R6hpk2Ktjmbk6PenpAwTezbHnk0JbRdnPufC+hpZw+Jo/4hrN26QymWprK/RGYw4OWkx\nmC/wFYHefIzjuew+eIQ7W5D4Idvrm5TzBSzDxLVt7NkcZ75A0xUG9pjpckq/N2Y6coi9gGo+jaGr\n7D1uMlucEz9ncxaypqIqFn4Q0G03qZby9HtDCoUShpGiXKgShB5x6LB0J2imgh/H3Lp9l93dE2Ql\nw8lhH987n3R78eUbZLNpOkdN3PGc7Y1VUqbGqDegVKqgiBqGYmLpFuNeD+Lf4j5RVUnx/r1dhuMJ\ntXWJV1+6gTubMp3MSSKwdIso9HFHYyxBZ2OjTm1rhZ/85E1euvEylWya024XTUyTr5UxZJ1H999n\ntd4gb2YgcFEFyKQkRsMOy5mLVSqwUcsz6jZpTj1MU6W22eDll1+mmknx7e99n/7xGel8mYePjiDZ\nR0Amo6qMe0P+6Pd/lzfffcBkNkExdCRJIp/NsZxMyeVTGCmLyXiEKKgcHh+haTKT5QLn5JSjkzMc\nz6W2UkSWNfb3Ds4ZcewlmXyGQtpEzUnks2lyizntdhdd0shX0hB7/Pjrf0Uhk0bgXNVTUXVkRXlu\nYuZXzZPCh8P7j7J/7cD5zH7dG9KztUkcEwY+9nxCr3lIZ/cOB/feIFfME/o+igCZfA57saTd7fLS\nRp0vfemL7O8+wpF0qvUqoijysPWQ2LXR4gDbdjgZT1jOLSp5k5eu77D48S2aBwdksgoJAp1Bj5m9\nJF3IoegKb//oR9y8+SrZtRWYaZCc99ku3Tlr9RrHR03ESCSRJRIEdh8fMXdc0pksUiwghALlQpGM\nZqCKCeV8jvt33yO/scnm1XVCIaY3HmJUC6xcWCXodfHFGCX0SRsGhmaQskyGnT77Dx9TrlRYr66w\n//4hih/hOEvcOESwNFQ7QYxE5DhEdl1cPyT0oHnSJ/I8MtksiQS6YZLLqPQ6bTYvrXPzyhUEXyCb\nypNOZ5BkgXqtzMrKCtPJgjAW+dwXNgijGPesy/HpCddvzPE9l5WLW4xHYwqGRSmXYtzp0Gk2mYzH\nNFZWkSWJtfoqnjNBVCVkM/Wxe/+p8on+n//b/0S/NyWKRIQkImWoLAZ9At/HMEWyeZPttQadJ216\nZwNG8xmJfs7hWcrW+NJLG/S6XUzTotcf0u10qDfqDAd91lZX8ZYLWsd9qlmdjZU17IXNYu6g6RZR\nnLDa2CCbzjOdzum0zwjDEMMyabZaVFcqCLgkcYwhqVzaXCetKXRbbY6aPcx0hak3Z9wfsloqEYce\nqq4xW85prK7z5Mk+q40GhUqB/mjM6VkLzw1RVZ1sLkO1ViFYuNhxjIfI8ekpKVXl9PAJy8WUWJLp\njmYUKtXzXs/YA2+BO2yh6GlS2QKIIvJT6V6BX2889IMV/z8Byn9pv17Y/nPr43MvNPDPJYw7J/sc\nvPMGb3z1LyiUC6TyWZzFkpViCSGI8eOERFMw1BgZkVKtgZdIyLrGbNJHi3yWw/65HI2eYjCeUSjm\nILK5tL5K2jIJAp+sZRIKMq1+HxSRXC6LZqToD4bcuHaZS1vryMSossx8PqPfbRPYHrKoEngx3dEA\nUdDxgwQvCHE9H13ViTwwdYvr1y8TODPGwx6ybrBz/SUqjVVODp/Qa53nNwVLZ+QukA2ZXNqi3x0y\nGk/ZvHAR21lydHyAJAjUi1XSgooUgRfYmLkUacNkZseMxlPSqo4uigzHU0TNpN5Yp5gv0Oq0EVQJ\nURF48foVhq1TUmmL7Z0LjPtdVlfX6fUG5wTOyzmT2ZylE/Bk75D5wmEwmFAsVHn06CE3rl9hd/c+\nmXQWy8xxaa3GfLlEM01aT9m5Ll68QvfsjMBdYFkShUIGRdO4/Pp//wuvgE81nB/2W2iagqlbJJGI\nv/TIpdJYmkwY+5gZlVw2Qymdp5QuE4cCvf6IIISDg1M2axY3dlbJ6DoEMWvr69TWVpi6DgfNAzJW\nhmpGZjVVpKzoFDWDRqVGrbFJYXWHaWvG3vsHtFsDuv0xP3jjDs3WKaurdVQpoVTMcWVnm2wmxXQ0\nwZB1DCWFKlrIosl4OiEIAgzNQFEUMoUcoizRabfJpNNsbm9RrFQwUxaSrGLoFsViGS+MaHY6zOdz\neqMRUiqNrFmMRhOuX79Gu99DlGWSKMLUTPwgoFAoUClmKWctvvof/hfuvf0GnXaTyHcJfZ8oiojj\njw7RP8kSfnF4/6/bfkMATc4BNI4j4jAg8GymgzZ7t37A/e/8HZoskSsVQRQZTycookQ6ZXHjpZdw\nwoDB6RF7e7uc9QYEQkKv22LSaXFy8Pjp6GxCMZ/jK7/7ZTY3NlhM5pydnrJaq5IxFPJmhuVsydy1\naWxvoBg6xXyO11/7DBe3NplOBniezWmrSbvZQkogCSM2Vzfx7JBSrkrazBC4EY7r0+v3SWfziKqG\noMrEUkIohly6donrN67z3nv3mIzGmIZG86SJoaUoFMukc1lmiymyptAbdDk4O8WJY4xsBtXQ8TyP\nQi5FNZcjnM4xBJnIDxh1J2RSJo1amSuXL1Ovr7FSb2BYOtlslkpuheVkyXQ0xA+WzJfnRCme4xOH\nNtWVAp1Oi/l0welpm/39E4IAet0JppVldXOdk9YZSCIb6+vIsoQsy/heSLWyTn/QYzqZEgsgSiq2\n4zObzbnxwgvk82kUJWG5GLGcTD72MvhUw3mSCEsXCMQEIpCihNl8hpoS2dy5wExQsY0KE0Fn/UKN\nTdnGVzzadkB5zcSJO1Q26/zk8QPsMGQrJeLOJhiqSSTokIlIbar0xTnLIE2xvkokhrTbhxycnLFU\nYxATlFhGDBUuXK6ztVXDXvSZzXrUyjnyuTRv39njMBJIXrnE5laV30mJuO6Uh48FWv0u+dcVWoHL\n7t4+qWIeRUnwE5cf/OhHrK+t8cLly0zbXdKZEnMHpksbw1BxQh+JBGO5IJP4iHKGxx0bMbVG7Ilk\nJZlwNmc6jnniz1gYIV/67GfRQo9b//jXVFNZxqaJlSuiGSaqqiPI8lOu5F/ds3y+H/LX9Wp/++2c\nLvA3Cd3h6U3naSN9GAa49oxRr8n+3Tf5/j/8P+RyORqrDVRR4uThLnocEGMztmdUxFXyKZPd229x\n8cJLxGqInAqorWbptDscHx5yYWuHMPT56RvfpFFdQRJlyo0qjqbRdjz0fIXeZMKgO2Jrc4dKfpup\nMsQOljhuD3uRwXFj9h6fMJ/aqKLExmaD9nSMTERH8ahmU0zaI1RVxpsnrG5uMR412S4bDNojpqMR\nuZVN9FyGN773HQZewEr7jJW1LVRNYuelS2gpjaqeY9YNGTQnTJYqRmkNx/eIDjtUMSlX60QkpNc0\nSkEaP87y4GTC5ddW2axvUc+nieOIXGWTV/QMdhhy1D7E9xa8enObo8dNcKEzG/LY6aEOi2gHMdeu\n1ThqthnOpsSCDrGIv4hZKRU4OWtzfNxi5gTsHR3hxxGyYrC2eREpneLO/rtsZcscnbyLbC/J+TKX\nNl6mXlljOD5l0GtysnfAF17/ImnT+Nhr4VP1RINYIorFpwziFgkigihzZfsKrYNTlp0hi24bQ4XB\neECiKwiqyvpGjuuXNznoTSjV1hAJSByHrGYiCSqabjIcjwiCiKyVJp9KE/se+3uPuXPnHm4YIRo6\nOhaGYrCx1uDq9WsMpnN+9PZtmsMOVsECReXuo0eEScyNl28QRgnf/f4tJL3IMlBRTIWLl1dYXath\n2zaVQgV7skRNVIKFj2t73L33gOl4wauvfJarV69AHDHp9vDncyZBREJASgXN0GmO57z9aJdCKcPC\nHpNOWwwnYzY3GpSrRRo7Fzmd2TR2LhLbC/6Pf/c/cvuNbzHonbGcz/A9lygKzyV4f2OQePYA/yo8\n1CR5OoL5m+U+zw/1VKXzWQ50MeH44CE//MZf8/2v/SWiLNHvD9l/sk8SCximwfrGJo7tEicCYQzp\nbAZZS3F8eoQfLanVqwzGQ8LonNH/7LRNqVqhUqsgyBLFapXjkw7N0y63b72NaemMBgNymQyVSoXv\n//B7eEGAHyY0Tzp4znnFPo7OWfkFRSYSYTqb0O92WMyWjKcTjLRFLIDv+9y4fgPPDfCCiEQAM50i\nnc0ynU9YLpckYcTh4QErKys01lY5Ojrl4GCf+WRKJm3h2guKuRS6KjPo9Wl3+mhWigSJvYNDEkFi\nsVyCEJOEAd3RkEAQmDkhu0dNvvqtb/Kt736To6NDPMdn1BujaxprjRVuXLmEO1ugiwp77z0ga5jM\n7AFIEYNxh3w5R6FUJBYlpnOXfGmFCAVJ1ul1RuRTOQqpDMNmh0n7DG80QhQlrt54Ad2wWN/aYnf/\ngNNWm+OzDqEosnLhAp4ks/yEy+VTBVEBjUKuAMQEiY+e1YkkiaUb4C08cpLCVrnEYjpk6tq0Zwsi\nRaVUymLJIf/wT/dY+AGaklDL6GiJQKfdx49BkBSKhQIrhRIpzUARIHQddFWl3R8QqhomAtcuXCCX\nyfLu/fdoDgd0pi67p1MeHjaxwxAvEQkliYPjM4JQYDBecv9Jm8Oei2AqvHDzRXYPHmOaKURBw1vE\niL6Iv3Ap5EqYRponT04YDEY4tsOFrQY7W6uYMoipNKqhsb22Qq1SRdB0msMJg/mEV25eZ2d7lbQq\n4yxnPNrf486TI/73v/o73rj1NmIcECcu3/36X/K3f/MXnBwdsJxN8V2XMAx+o8r9M/vnMP8399w+\nHUs+uBH8l0lW/LO4XBSGBO65lHFoT3j7h1/jnTe/jeP6RNG5ymjaskiimMXEJgkTNCONlckwnkzx\n45h8qYKeNhHVhACPZrOJ74eounHebtPqUF5ZQZIVbCdA19IEoUCpUsW25zRqDVRV5uR0H0iw3YB2\ne0wcSRw+OcZ3A2RFRtU1+pMB7V6HTDFHoZBDU3QkUePChUvk8jnS6TSaphEG561BimFQrTd478H9\nc2IXUcDQTR7ef0i/32f74jZ+EHHn7btICaiShD2dkDJUqoU8IgmJAKKq48cCsmphZfIougFxQtrQ\n6fTaCIrOYO7RmzkkosRkNuDNN35I+6TDdOLx+PEhui5TrxUQgogbOy/w6os3yVgqqUwKz19SWikw\nmg0wsxaKqdKfjFg6LulMmnq1ThJFrDVWkSIBf7ogp1i8eu0GXhTS6XZ58Ogx7V6Puecwd2zKqw2a\n/RH5eo3DbpfYMD/2qvhUQbRgZkiCgI31ClZeoWf36HpDSOv8t3/2Z6ytrxH6HvPlgsHc4f5+k/7U\nJWemuPuTH9GZwGS25KUr27z28g3spYtuZKmsrGLbNvPZksXcZTAYoEgJpWIBQ9VwXA/H9vncq9eQ\n45jj42O82CcQYtKFAqJkoClV+sMFmmEwGCxonQ0RRZG1rQZ3H+/RmSV0eyNiSWMwnBOjMBjN+fKX\n/ohBf0ohW0B9yio0Hk/ZPzqhO+hw2jtibbNEIWdiaDpBEHB4eEy3dYaYJBiGxR/86Z+hmxqLcZuM\nLjAdDphNHfqDKc7SR1VMZCPN2WDB+3uH/M//67/jP/5f/56Dxw8ZD7r4rk0U+Oe5uvjX6yV93n6R\nTPFvp/3zOSbJ8zeC3/Coz/KfUYTve8ymY4a9Fu+/+1P+6Wv/N2+/+U8oqkkqlSFJEjRZwXNcRv3z\niKjV7jOb29TXtzg+a3Pa6uAEIblKgRduvsDx6TGuFyIpKplMCt1QUVSTJNGo1DcYjafMbQfXiwkD\nEAUFSVZZqVXpd9ukUyl8O+Sdtx8QRQpWKkcQxqw21lEVHUmWUSyNQqVAtlDg0qUriJKKoZ/zH1y9\nfJnlfEYQJ4iqyvalq7QHXVIZCy8MMFSN/mCA7/scHOwznc9prK4yHkw42T9CJqHXafPF1z/HlQtb\nuPaChe1QX1/n0eND7r2/i2Gl2dy+QKFYQBEECpkc8+mCe3cfc9Yakc0XuPnKi1y9uIOpWJhqFs8P\n8WIfJ7BBEIjChBsvvchp7wQvgDhR6HbOR65n0zHL6YhSLs2wd8ZGvcrOZo3rO9uc7D+h3+/w2uc+\nx+r6FoGf8HBvl3fev0N72ObgdJ/ySplXP/9ZYiEgV8xiWikm0+knpsY+1ZyoQEQYBUzmAZEVohYU\ndNXktd/7AgVV55t//VcogkYqV6DljBmOPfpDmxfqqzSX7yNGsP/+Hn/+3/w+X//7f2DuxihGloPj\nU5zFBAmBSFY465xSrWhsb69x694DSpkCjqgSh0u6vRZe4BM/7RBKGzl0o0bv9BBWFKqNAmkrQEdG\nFgUm0yFL26G4lsfu7nHr9kNymsjSdpguQ/7xu98jWi7IpWVypRSVco4olvCjkNawxfUXL/PSCy/y\n1o/fInrUf9pZ0McwM2hhTD1fIPYi7t97QDVrceWFCyjvNUnEPqEfIAoq5fIK7580EYwVBtM+gSjw\njW/+PfF8zh/9+X/HtZuvUqrWEJ5qJAnCr64g+ovsw436HzVO+qnYs/P6CN2n3/zQ56JyURQRBj7z\n2ZTWySH2uMUb3/5P7O/t4QYhuVBiOB1QyeeIJJ/tC9u0Tk4QRZnhaIY8dzCLQ1qtLkYmxUqjTLGQ\n5t333sVMp3GjBNdzSGV1VE1hMFoyHCzRtSVeGHHj5Re5e+8euizx6OEBkiRx6eo26ZRJIgjoosqF\nrSukMwaSZTEZdLGdHqm0SbQIUGURWZX46Vs/I/AleoM2tWIVRZRY29pkupixtraOGEfsn56yf3LC\nH/7pnzDqtkin01wv1WkNhiRiwoVL27xw/XdwliNUycd3PRbLGfl8lv3TEwxN53e+fBMZjd5wgJk2\nOTltUSwUODneYzyZoBgSMgqeH7O1fZFao8j161ucHXybs1af9Y0dbDfASls0z04RRZFUOs2dO3cZ\nnB0zmDdQdYtyvoLnBhRSGabjPqYiocQ+Gh6xt6BUMJETD83Q8KWEW+++w6WrlynUcyA3EBGQdZ1y\nLc+1azs83n+bzfU6KU0mZ5m4048vLH2qLU7f/Pv/gO05LCMX0VKo7zR49TOvkE3n6DXb9M46rDXW\nCH3QMnmmto2kStRKOdKGwnwW4S5m/P6//Qr3dx9z//Exp+0BfuAiE/F7/+azuI7DcLYknc2ecxQG\nIb3+mNrKOq47ZzidMXcckKBcqiDFIuFsSeguSJsGqZRFPpdm3Dvh5kuXOTtt0Rk4iEqKRiGFJqtE\nSUIiJoxmM0bTOZquIUgR6bRKu9NhMvcJkMlV8xQqaZzA57QzpNdbYOKR1qFQqOBFEi+/8BLzzimn\nx7vkyiUaWxcp5gpM2z3wQuJYZBGGjN0FETmm3hI3dMmaFmdPDnn86D6pfAoEkWwm+8FoqCAKH6hs\n/teynz/2R+gj/xewD0ZGnyOe/q/lIX/QeJ8kRGGI69jMZxM6zUNu/+hb3L/1dQzDIIoSAjegfdYl\nCXxMTSOXSVFdKbO+uYkfRty59x6SoqFZFp7vY6ZSqLqMbik4nku+WGY0mZLPZagUcsymC/xQwnFF\nxuMxfuQxGo/QTZPxYHj+8yZjhsMelmUiIpHPVvnxT24RAsjne24vbOq1OoosIYgwnk0ZTRc02z3C\nKCJYuviux+UrVwmiiKuXLuE7Ls1Wm6svvYhuanRaZ4iJgKhoeH5IGHqsr1WRQ9BE6HdaWCmTue1Q\nWmlQLFfRNAWBc8/d0tOkUiZW1kCUJfYeH2MaeU57p2xeuMzSj5g6S8I44Itf+DyP3nuf+dTGDxPW\nVut88d+8xne/9x36wxGvvPQqo26P1UqZ6nqDx7t7JIlIt9PHVFViP2C1XqO+UiP0w3PpGRJSpk46\nY/DOu7dwfRszY+AHHlevX8Y0deIwQVctFFmic3YMYUCtXGPYHaIi8tIf/Q+/8Dr5VMP50WLAeDln\nvAzoDhaQqBiqQdZKce/d93iw+wRR1qg1KoiRgyoGCELCg4MD1EqRnXIJgZi33nuPa6/cxF66KKJA\nLptio1FEF0VaJy1mS5dYU4mI2WpUkcKQbqdFu2+jpEwyFYNSpYS/DGjk8/zJH/wOSRgwGs04OjqF\nZI5u+EwHXVJqhtiBee+UndUCnrvk+PgUzVDJ5nV0Q8HM5TjpdEESWTpLTts9OoMFo3nA3uEZZ+0h\nkp5he3sbUYrI5AwKtSp+nHDj6mVUfDbWN7m316Q7s5EFn7IZ8f+S92a9kqTnnd8v9siI3PezL3VO\nnarqqq7urq7uJrtJqiWK1GJbAgZjAQY8gL+BP4BvfWdjfGNYgwHGsEeSZRnUTo1ASiTFJtnd7K32\n9ezn5L5HRsa++OIURWpmSBjwAD2jiZvcIjORyCf/+bzv81/kyMeLBWZBzGg+YzIfIcsqpWwJ17LJ\nZ01ap6f87v/6P3Pnkx/QPj1k0G0xn02JX5gbp+n//73Sn3f8LOj8dIDz0/t+OtxJ/8H5//btf+ex\nf9/z/q3z/wN/kH+w9xlHAY5tMR12eXr3x3z0nT+lf/AxSZLQ63Rp1OuUciWu711he2OTvGkSRQGV\nSpnZfML65jqlcgk/jlhaWmI4mhAHIYPhDFGQMbMaSRpSq5bxbB/HDjDMLI8eP0RWBVJBImMWmdru\nRccaBoiKiJYvM134dNsDxBRMQ+fK1T1WttYZzWw6/SH5cpFet4eqqhwfnmCaeVRFxwsDDM3ANHMo\nksyg3+XjH33Ao0eP6QyGyJqOpMj0et2LALck4Wj/EEWUKORNRqMB+08foikCoe+jKAqFUpHZfMbT\np08xRSL4AAAgAElEQVSYjsb4nouzmBPF3gXB3gsoV+vYXojjB4SiRmc8oLKU57R/hprN0+qOKVar\nlApZVFlgudnk5OgMVdZoVGs8ffCQcW+AnErUGzVEUSBNY3JZg3a/hxOEhIkAkorr+izVl3l49z6j\nQR9FFskoEsWcTuzO0VUdYiARLuS3qs6TR0/Yf7JPPleg0+ni2B6irP/CcvlcO9F/+c//B8ZjmzBS\n8UIBAYnAWtA7axMHICkyWxvLPPjsIxazEaoqc/XKFRJS8rks+TBkHIc8abf5+q9+ne7+CVGY4MQB\nshBzbW2V/lmb9mRKoVFne6WJN+gjZUwOhgPmjkMkRTTXlynky7izOf/t7/xTnjy6T7ffY2vvKqqh\nUGuYlAsyKgKGWiBr6tTKOeoVCc/1IAXXmaOIKWtrm5RLDcbDEaQh+WKFg5MZomaSkDAcdBn1BoRO\nij0bcWVnBYQYL4J6c5VaMcds1CObLfCjjx+zVK+T1VK65yec9cd4kk6mWCBOPFQSxqMpWS2PkiRU\n8xmyhk6hWGc2HHHv00+QRQlBkjCzF2FboigiCsKFyTP8Z0yy//ccL8D5whYwIYpCXMdhPpviWCM+\n+9F3+M6f/O9MOwfIxBeMiuNTZqMZS81lNFlmNBiwsblMq3VKpVbCsmYYhsnB4TGiILJz+TKB57O+\nuU4qSOQLGfr9FrIqI8sqrh2ytrzOZ5/cwXYcpvMFq2urVKp1vMBHUgSEJGI8HBLJWdI0QUwT1jY2\nUAydo/NT+pMJup4hDnxyhokkCWTzOTL5PGrGwAt8rOkMQzd447Vb+L5NmsScnp3hLy5iWGzXYzyd\n0GzWGQ+6zKcWnpcQpQm6IWNkVWadHs58DmmKqKlkyyUcL6Lb6bO81MSajfEcl4VlU2/UsBZzQlJc\nO+Tx4wMyhQLbW6u43oyF47J39SqnR8fkjQzd1hnlUomtS5eQFJnJdIyRz9JcWaFZrbNUrTGPZvT7\nfURJxA9c/MhnZXWJzZ0tZEVmPB6Ry2dxbZtCPkfeNFnMbYRYRExEhiOLrGmyvrKBiMrupWsM+30U\nRWRrZ5fPPruPUSizefkKO2989eeWzecKoicffZPJcMFilqDIJvPZHN9xEFMRw8zy6aefYqgSxYyE\nPRqgqRlOjlvYMwcRheWcRI+Y590uX7r5OtpswbPn+1hpTLVa4Qt7u1jdHqfDCWo+y85yndMnzwg1\nmVPXpVHOUqqW2T8+5fq1PX79V97l6b27fPe7PyJRdErLy0zmIxB8Xnlpj7PTM9649SrVUp5Xrl9h\n5+oaxWyJheVwenQOQoKp55gOFyQhdIdDGksrDMdTbMdDEEEWIl7e2SUrCTjWkFRKSUSZyXjGrZdf\n5snjhwwnc6JIYNjtsN2s0zk9QslkGLohThjRqFcQhZSyrmNNbWRBI6eKCK7FO7dvUy5U+eY3/5rI\nd+ifHzGZWeRyeUrF/Av3J4H0J6mg6T9mTuj/9+MnXW2SxERhSBD4BJ7LoNvm2cM7tPcf8N2/+AMy\nYoo3t5FFGU2RkFIRKRUZ9geUKxVkRURSBdI0QlVErBdE7dFwzOraGn7okTF11tY3SISEwHOwrCmS\nBGY2R1bPMWj3mc0shtMxYRIzGc8J/JjGagNBilldWSIJY066U0aDMfVaDSOfQdQleqMhxXIJUZBI\ngwDPcegPe7R6A9Y2t9E0k9D3cK0psqxDHBEsFtTqNUgvYlOm0xlIIqVKhTgKiAIXMYXl5TXCMEFR\nBNY2ltBSkTROyGSzTKZTNnd3GU2mNJtNZEnAdRa4CxdNy+AFIeP5hLe+8EVa7T4nh6fY9oI3b91A\nwmc0GlMq1bnzyV1MTSH0F0iiwPLaOsVyidNei2y1TCpL9M47NGp1bHeG7/kYhsbelV0UWcTMZSiV\n8tjzGUkSstJcYjjoo2g6kqTx9MkxoqQjyyZh4KGrKocH+0RBSi5bQpJFtrbWcUOHg5MzVCPL0sYG\nl1579+fWzucKoj/4s3/B08cHJImCopqkaYxnz1BkmU67S7lYYb1ZpZRROTs+wXVAUPNMpgs0NcPW\nSoGJINGdzdgs5rm+ssadew+xRZlavcZurcRiPEQv5ik3GxiixMn+U/r2nOWXrhKMRoRxzGzmQexR\nzMj8m7/4LqaZIVZ0jlvn2M6MUs4gI6vYMwtVVPjwgw/44EefsIhciCRKZpk3v/gWtcYyvhvhLQLG\nE4vBbE4mZ2BkVOzpjFIxR7Va4vb1XcJRiytXrzK3LZI4RRFktlbW2H9+gCipSKJK6vhcXlmiUS+w\nCCIiWWc0mpHTNdaXqlQLNRaLEClJyWoiW40y777zNs+ePMZzbRADJAke33+IqUo062XCyL/wAE2F\nF0uhn+5d/ueikf/p8dNth+RFBpLv+xcJpdMx3fYJP/zeX/NX3/g95Ngj9gIOnu8jxiIZ2WA66OLO\nXQzdxPV8Fp6DZmrERBQLWXqtc5brdbKGQbPRoFSpcHbeRlIVdvf28D2bjK6TRjBfONx+4w3ufnqH\n08Nj1jfWcX2Pme0xt1wQYGm1Qqt9ROCFiImGZpbod/skQLVRJlcwmNkXSQvWaAYJ5AomgpDSG094\n9PSA1dUNZoMRohCytLRGmoQIScLy0jKVapnxeMRwOCIVRHTDYDYZk80odFtdWq0elm2ztFxjebWJ\nNZqhajpm1iBMY1RdplQqY+ZyDDpdfM9FkVXypRrTucPYmtFYquPaNgf7h1x9+SZvvHaD0bCFKAic\nnPdwPZ/V5QZSGlMsZlF1nTgFNIn+aEQUpUwGI+rFAqIGqixi6Cr1apn22Rn5bJbJaEj3vMOo3cNd\nLLDtBcVShaFlM7Ed6qtrXH/tFpWyQbGU4/GTRxSKZSqVKu//6D2uvrSDmTOYOwvO2x2yuSyvfPm3\nfm4Vfa4g+r/8j/89oDCfh0RJgqqJ7GxtklEUpsMZagpKnNAsFXn48AAlW0XOlkkVhel0RD4rME9E\nAi/Eap3wpduv8tmjp5xPFkiizK995U1G3WMWvs/u1RsXpsmtMxJNpVBbIhjMmU0twjDli7dfY9Lt\nIEQLvvj2W+QLefqDIdmMxo0ru3j2HBmVNJVx3QBBTJiFUDHLPLj3iHkQY0UJW9ubqKLI04ND7DAk\nTEPWmwWyMjiBz+raOvW8zqVGHrOxjJDGlHIm9XKDYXdKu92j3qgxm1ksrAUZRaRRzvFsfx/LSZG1\nApoKBT2kMwpw7QW5jELeEHnnC69z/7N7rK2tsn/4mNW1Kpd2t2hUl3n/h9+ndXSXleUSoqgAIkka\nvRhqC38/p/kpkP7jBdSf3VtNkpgoii7s5ByH+WxC+/yEZ4/v8u2//EP+4o/+TxzHpl5tkFE0jp8d\nMbdcrLlLThWI/BBF06k0ahx3zqk0qghyij0bE7seWV1jbWmVO599hpEzMQp53CCg+yL3p1Ko8ejh\nUy5fuUJzucmjB/dJggsiv6LpRPFFFlmjXmF9s8nDJ/chkckoeXqTGXGSMpvNSJOQze1lFs6MTqtH\nRs8SBiHFcpFiuUh/MMGZhxTMHIW8wdnZIRvr2yzVa2iqgizLF+qrOCKOI4IoZjgYU8hladYq9Lpd\nZtMFq2vrdLsdBDlmMraRVY0oTYEYSUqRZJnpeEr7vM1wMGQ6tUHUOGy3CeKAV19+GeKIYbfH21//\nNUh9Dp49QjMNbD8EQSYMfHKGzmI+Yzwacnp2gpnNMxiMsCYztpsrlLMmhYqJmdExNJnwhYPU6toW\n5yc96sUagRcyncwIoxhF1xlZM0rNCpZj8dn9TzE1hVqzytSeUKlU6Xb6nB4f8dqtG9x/eAc/jCiU\nyhRLJW68/V/93Hr6XEH0X//u/4Sm5SkUiqyurPD67Vch8ZnNptSqNa5e2kNOE+rlMoenbQZuTKzr\nmCWDUiUDUUgSi+iCxMlBh7WtMopZ4Ph0gK7IfOVLr2LbAzqDIflClQgBy3UJ4oTWUYvt5U1Ggz45\nQyGYOwQLh3KxwNbGCkYmw5PHT1iuNRj3h2yuruItfHQ9jyArSJrKWX+GIgiomsrY9/jw4T0ePXnE\neNJHM0wCSWK5WeOlzWXm4yHFapPJfEFOFbH6ZxwN57z33ieMxh2K+RqkGocnxxRLBcbWlJk955VX\nbmCaKkmact6d0lzbIE4drHmHWMnx/NEpGjb/9J/8Jh9/8gkHp60Lt/1KgaW1Orqq8uGHHxFEESEh\nhaKCPTgk8UNmCwuQXvApL4YpF4mZF9/PP0Zjkr/3+4wvUknDIMRxFixsi177jMcPPuOTD/6Ov/h/\nfh9vPsYaTZDlDL4bsVSrMRoMyZpZBEEhIyesbqyzf3RMpVln7ruEScDK6hKR6/HytStokki5UGBm\nWYiaxv7hEZu7u7RaXWQpxfVCNN1gbXODw+MDkjhh0hsjigqiJDCf2wz6A16/9Sq2YzO3F0ho6EqG\n0XyGNZ5QyBWIQp9CIYMiizx7ekCl0qTV6SKI0O/08D2fcqFKPpejVisRRi6qomPoGvV6nVq1hiTJ\njMYjut0uplkgCqKLP+l8ho21VYrlCr4f0x/2CMOQ1dVNDo/PMfImw2EP01TpD3oEUYKAhDW1GIws\nBEUnEiSypkGpYHKyv8/q8jJrV/eYDLrEgYeayfDw2XMKpSKxH3JtdxdJSDg5PUbTdRZzj8XCQYwS\nFuMp9WIBP44QSRkMBwRBSK25zMIJ6HaG7Fy+im3ZZDIam9ubnJyeEqUxpXIBSUywrSmaohLFAWfn\nbWRJo3XSJgoDmktVBuMBK+ubOF7E8vIal29/7efW1OfKE81oZWIvJGdmqVQqPHv6hO6ow3w+RxI1\nKuUqqqKi5grIGZPpdMggCqkGJgUzIV+skiVD6oSYBfjhg7v88i/9l+Tfv09OkyiUc8wjn9F0gnPv\nESPfx0sCDNUgXYzJmLC51mRuLXBn1kV+zKUdYj9FBzZqVZIgxpq5FHJNeq0elVqW8WJAplygEknk\nKyU8d4Ho+dSbVUxdQwMcL2a52EBTYDYaI6QpvU6XRMtiuSH21GcojDAqBpEocvP129z78R3CNCHW\nFAaORSpERAqcTiwu3XiNthWz0ihy5+CMyCiQzapc2inw5rXrvPfej3h8eMze3lXkTI5aaYW//c6/\n4bXXruPMJ0SpysGxw0lrQCGr8OyzP+bZgc21N7/O+t4Nqs0ldCNHqVRBVtSLAZQo/TTb6T/RzvRn\np/dpklwEx8UxQRDgey4L22Y0HnL8/AlP7n3En/7R7xMnAnIq8NZrN7k7tMjmBOayQbvVJiGh2qzh\nRRFyvGB5c5vT3gAEgWajQX/cJwgiFFUhDiMymQzZbJZcKcvjg33MYoVGo8npSQtRVBgOh5SrJX74\nwXvUl5vkCzXsxT7D0RnNpSqKGLPSKFOr1vizb/4VV67v4SwcdE3llRuX+cCyaNZrGJrA7sZlEGKe\nPDhk0O8hyhLHp2cXIhMtg6lreM6CVCxRbdR58PEDRkt1vvjWmzx4+IhCMUepVMA0Tc7bbdZXt3Hs\nKZpq0B8MUNWLkDxZVikWKrR7IwbzOZf0LPbCI00FgjDGmgxpVpcp5ors77foTZ/wG7/92zRqJexB\nizSOyRVMHtz5lKVcllqxhhN6GLLMarNOs1DDnk+wnQVKRiOfz7NwIjRRYr5YEEYR1mKBNfKoVvLE\nsUi700HSdGJEKqtLhEJMrpIlWNhMRn3W15osXJ/heQtZEDFTAc8NGY2mGIZJGMRUK3Xq1Rrf/94P\nCIkwik08P2Q0mf/CGvtcO9HvfeP/4PzkGNdy6Pf6tLt9EEFQRObOAsua49gWjmVx0jrH9mO8JCWf\ny1Av5wnckEKuTL8/JF8pcNxq88U3v8jgrM36Uombr17B8R0ePjzAD0VSSWUymxPFCUIqo2RC9rY3\nmQwGkApUanUsN6BYLBIHDkvLTQQlQ3swZffyHrNpl+XVIvVmhTv377O7fY1Ov0W5UuT0/ITAcZEB\ny/YYDMfM5w5l08BbzNm7fIVWf0iSxsSBz86lLdqDEaKRI1Mo0azVOHj2hJnn4EsiaZpgSCK6qvOk\n1SZTLjGf9FiMu4i6Tmvm49sDrm1uoERw0uqzeeUlRM3g5OiE6cQiRUBIJRrlKs1qg5nlMJ/bvHbz\nEovJCb2DgO//zTeZW210QyHwfERBRFUUgjB8ocFP+JlZ/n8yQ6if0p8u9jvTFwOjKAxwnAvg7LbO\nuHfvMz58/z3+7m/+kjsffp9KpYqIROB67K6u4dtzivkSq6trLC/VkKSYTx/cwSNBUiVeff119EyG\n8XjMcDwiDGPSICD2fVRRZD6fsrq+Sn8yIpZFVtbWmU0X9Np9EiHGNDOcnJ4xmI4oliq0210ysoYs\nSIiSQBJHXL26R0YzuH//OaOJAwmMBgOq5SxLzQZCKtDtdLm0tYUii0yHI1qdHuPxmFSQEESBMAhI\nU9B1mWzWuOANxwlvvvUW+4cHPH3ynCiI2NjeIAhC7t1/TBJCsVhAksHMGTx7tk8cQz5fotXtYM1t\nyrU62UIex54jyzJmNoe9CJFFhZxuMJvMuHnrNjtXrvDtb/01a0tNdnZ2kFSVheXQLNeIHJ/WWZtE\ngFduvEawcJmNh+TKJiCQJCIvXbtO6+yU+XxKrVphbnsMh3OWl5ZQVYn+oM/a9iaJJOF5HuPhEN+x\n2N5aJYkjNO0FTSmCYq6IgoSiaiRpRK1WIZ8tEjgBr9+6haykPNl/xmA05c13fglJUbn+1td/bq19\nriD60fd+n5eu7KIKEq3zHjkjz8J2qFTKVKpVPMcl8ly++kvvcHx4gh0kROkFEKqajiKllIsVTs47\niIpGrz8jI4MmRDSKJvm8waOnT7EWEdYi4fy8j5kv4McC8yhCVaBZLTJsn6GqeWI5z9PjQ/IlCQQH\nI5fjhx/fwxVB0cBQU9LAp95ocNZp0++NmC/mNJp1Us8nth3SUGIy80gFGSEMyOkqsiShZHSKlSLj\nUZuN5TqB57F/1GPhB+zu7BC4Lr1en0BIMPIGy9UavcNz/FDAlyTOB6dooos3nVCvb9Dqu9TzKllR\nRBEkLE/gpGfxfP8QVYgg8ak31zg779MoVtEFGUVWGI4H7G41qOVVmqVXGI/adDv7DNunfPD9v2M+\nnbGxscZp6wQ3CBAFAVmWSF9EHv89h/5FNMl/LEv+9B9wSdMXy/X4wmk+9HEdG3cxZzIecnS4z9NH\n9/nzP/lj/uW/+N94+OgBa80armMRBgHZjIkYh6xUipiaSj6fYzAY4bpztne3ePjsKTPPJ1vOM51Z\ntM7PUSQZVZYRBYHV5SUa5Qq+615Mhg0VLW/S6nQQJZUnD59jalnq6yUGgz4f/PgT8uUapVoNx7Zw\n5xb5bAEQURSNL3/pHT54/wP6wwmOkyAIEpEfsFo16HV6bO1eZjAYMRqNOHq+z+b6OrPhlEQQKVdr\n2G6AGwTIqoBpaHiuw7A7oFwuoWkq1sy+yAgzNHq9Nk/3D8hminhuyEpzhULJJAh9jk9O2d25xmxm\nEYQxC9um2mjiJwlmRmdrfZ0IgXZvxHg44ZUr15mNJtz+4hf5+N5nXL28S+J7rK6sMhyPeX5wRKNc\nRZHki9ViGNBoLCGnImfHR9SaFY5Ojgn9FFPNMO52+PLbt8kZWcqFGt1Bl9Bf0GiUII3Y2L7E4f4R\njx8+x1A1VEEkDSKypomiZTg+bSGrKvlCnvWtDVRdRtFFRoM+S0tLJGHEbDRAlgEhZeH5KKrOaDTh\nS7/x3/zc2vt8ZZ9aiCTHvPOVt8hmylhWxEd3P8EZTfniV75E22gTzmckgc9yrUbf7mK5oGWKtHpz\nshtZ5pFPLEtEsUi9XOSzjz7h+s46i3nA2dFzNEVnvnCp1lbQ9SLD2YRQTBFzJrlClfP2GZubyxwe\nOxSLS8yePcRJxixXK1j2DMnQUURwUwscn9ASieJjwijgyuUb7J+dEYQxjUKZhpylN3GZezKLIERT\nRGbDMdXdbTrDEYWiTiknc36+j5HJkzUr2MGUYkbnyZNnCPIFYdlURaoZnXPZQJJMIIDU5Y03b3P2\n4AQ/FjBSlc1aldbBE8RynTiROD7t8Jtff5fXrjb5k2/8IX7kE0YpGTXL8bPHbF/Zwg8sfDtgHnko\nSYJnW6gK6KKOv5jzf/2r36VRjJmkKUp+hUs7L7G6tIoia+TyRVQ1gywrpIAoyRdK9X8QRif8DLD+\nh1Yt/WQg9O/e/xNj5OTFZRSGBGFAGPosrDG2NWIyHNBp9fnTb/wp5ydH9CZzBEXH9wLe//FHvHpt\nmyjwmY4mqFJKVleI7IQwDlluVDhtn4G4g6SoGJks3emUZ/v7lDIZbly6zDvvvM2jhw9xLZdqPo9a\ngMPDJwzGI67efJlYeEK70yONEpIw4ez8hLPTNlGcMp4skCQFUYLT9hHXtq/hOhHb21skYQJJwN7l\nHTSzThjG9NpnhPYcz55zcnyEF0c8fX5A2TTYXAnJZQwERcOs1Ji5LlGYoGcymGaG9uk5WxsbGIZB\nq90mjlIQZT7++BOWl2uIgsBkNiONFDKGwdraOu3+Mc1GA8dx+MKX3uHB/XvM7QkTyyIrwtblHZAV\nbG9CkKQoksqTR494441bDHod7nz6Gdu//Vtcv/I6o9EAJwhp9XuIusbB46c01leoSOtoms7MGrJ7\n+RJB7CEJEqqgMO2NeOuVV1jMppwcnFIsLiOIAYpqks9lyBhrPPjsMxYzl2K2hJyo7G5f4fj5U6Ig\nJlXmCJKEHXgI8yntUZeCplComPT6LQbdATeuvkLJNJGVlHZPYnd7ndODAzTD/IVV+bl2on/0e9/g\n+u4lxod3cPotVEOlPRthBwuWKjku1Sssxh38yCKWQZHyTHsWauJTMEPKzSpZKUVcDDEin4wiEicJ\npXoNs5gjFlQCP0WMBXx7xvZ6g2cHz5E0nWy+yHJB5Lzfo1xfZTIckzg2SeCCXkSr7XB6PqEoKcjz\nGbdv3+TjZ8+I8wZJFCPNHRI9TxKmZHWTVBBRcxdk50UYYAcxHgKRKpIkPpuNKix8CEVqy8uM7Cm9\nVCKbLfLSxiVGx4cUlAQl9SjnTJB8/MRirVqCWYjiyKw012mPhjSXmlSyBT66d4IlwNmsz/pajbwY\nEc6mzIdzslIOzY3ISj7ZcszNd65SyOtEszntZ2cs7IQ0jYCE9fUVvNjBdgfksjqqlCAJc549f49v\n/dUf441dFpMZ2YwMaQgkpHFKGl8skVMuojFEQSBN4otJP7wwUUpeYN8L5Ps5CiPh70H3p6f8g+7y\nhZtImly8109OvNC0X0yUfd8jCjzcucW416XfbnF8eMijJw/57t98g0ef/Dmfvf8t5rbHItCJFjMS\n32a5krvwZm1PyZtlFq5PY2mVeqOOkctx2j6iO2rh+gsKxRqtsUWuUqeWGDi+T6ZgImkxBT1l3DkF\nISVXqjJbOFjWHEFI2NrcIHID7n1yj5VGk4QIIVDotUZkjAKFvMG1y5ukocOg1Savm5TzJd7+0pf5\n7vd/wNOzFhuXtpEUkbfeus1v/PrXwA+wJnPu3X9IJl9CLxYI44hSsUhG1+mOh1i2Tej4FDJZokhA\n1Qw8y+XtV9/g7GyMoSrIosDHD58zCDSmfoYwkJnNpmxe2STWBSLBp2hehD7aszmrzTqzQZ8zJyKI\nQnKGQa1cYj4Ysl4rUTAVYhGsGBJT5+6Tu2SLBk+eH/OFr/wKnX6Ph/d+TLNU5MqlHdonp4QLF12B\n8bjD+uY67e6QSc9itbnG/Uf3qa42OZ9Z3Ht+hJ43UA2QMjqCJiDqErlSjY9+/IhokZJTDZzFjM2t\nJv3ROdVmjYXtoaoFkkhEz+pIisAijFnb2MaauuyfdIkFmdVLm+TyObqdKb6rstzcQIkSvvRP/ruf\ni2OfK4j+2e/9cxrVAvOpzSKIaA9GOLHAKzdvM7ccAt9lNrdwY8iYFSZTC10VMAs6hVqZJIrxXQ9V\nUpg7DsVKFdfzSKKQjfVVzo+PKZUqVKoVTtvtC/JwmhBEEWkUUy8WabXOCCOXSrlC6EVoZo7+ZIyg\niMRRwFKtzKB3xt61q7z/8T1Wl1YIHZu9rXV++OljVF2DNKJRr3J4fMhkauH7EblcAVmVEAWIfJes\nrhH6PqPpmFypBILC6WmHt167TRyGKKSIJESkyDmT0XRGQTXZWN3g+cEhsZjQ7Z5iTbpcf+k6vf6A\n08MzFEnCndvoosB6rcFkNMKy5lRLJQQ8lAyYpTy1lSUePXpMnIRYnoebgDWdYs/nICYsb61wfHZG\n7Me8+fptkBNG9oTeoE/79JxPf/A9VMFi0j8iq0qEroMqvdB1Bz5R6COLAr53EakSx/GLVf8FXedC\npvnievJTSedPsonSnwHZJL1QDCUvXucnUtUwDAhfEOE93yUOfTzXwbZmTKcjzk6OscY9Ju0zHn78\nPj/8zrf517//r3h8cA/bHhE4PqacJXIDOmeH1PNr6HpM1oBf++V32X90jOO4VKoZZpMWg06HxcTG\nyGRJkhhiAUnQcZyQ0XiMoWWQzAyiplDO58mrGqoksVi4NOo1iANKeYNe+xxVV/HckPFwyrWXrvP0\n2XPMrIa98CmXy6iazN6VbazJhN55n7xZ4vqNVzFzWf7im39FGCZsbG5wdHjEt7/1barlKleubdJY\nXkXNGvgvnKXEOCKwFmxvXEJIFJ48OWQ+j0E2yFeqHJ+fIKgC25cvMexPKJWyZPNZHj8/YDJzMFSd\nnKbg2TPeeuM2s+mITEbHmk0Z9keEUQyCQLFepHU6IGsYKJJAvVQha2gE/gLHc1iEMbt7L+GFPhvr\ny6w0l3ny4Cm6rBHMJ/TbZxTMAlnTRCRmNBxgZA06vT6VapXz0zMC37tY9SQptuvS6feQxIs6yZkm\n5+1zXNclaxbQZI1nT5+TpDFZ0yCja6iqSqlUod8fMp9b3Hr9JmetUwbDMWkssrRUoVmtYOoGkiRT\nqVWZToZE0UXe1Ml5B0lVqTeK3Pr6z9fOf77LeX9MFMdMIpGeF2OlCU7g8+DRU4q5PLEP6DmmXvbl\n2QMAACAASURBVMRauUH0/JiMluCJYHkpRiSRLRWYTEeo2QKD2Zxbr99iPhlRLZU5Pz5GN1RkTcfM\n6Xixz/WXr/L06QGiIKMKIsVsjiRJWFpucuK0saYWpq7gO3NkUSCTkdEzGnc+/RQ1BjGOMXM5Ds9O\nmcwX6Dmbncvr2KHDwg/ww4vJ7OZak7nr0O90uXTpMr5nIwBuGPPs+QmXdq6wWbUpZk3+7nvvsbtU\nI6vJJGkMegbJC5ETgTiMQAHbtyiUSqw115GIGIxa1Mo5Fm7AUnmFZrnM0lKVSqnM2XmH6WLE2lKZ\nrd01Hu8/p9sZImc0LN8h1yhhGGXypJyfn2M5LleLOXZ3Nnh87xnVQo32yMVQNBzPxolSmuUV2p0O\nvjMgHp2io5MvrzFKZDLVJhkzx/WXXsZxQ7wowTCzIAgUCkXCKEKUFURJIgh+kpwoIogCoiRBmiIA\nsiQiihfmInFykVmUxAmZTIaF414Y+gL2wiIMfLKqyGQ8pXXeZjIdUypoHD/6iGA65vSww0F/zFm/\ni+YZrDdruPMFo/mc9eUa2w2ZNJXIqyb5oowmxLx562WqSzWETMSjx5/RLDUYdy103bjw6hyPKOd9\nchmThefSHY9IdYWMmaHXn1OWdC4tNwncc6Q0plIwERIZRdoiDSKILyJ+LctGUmSq9QKjscXG+iau\nZyHGCcPeiHp1FceO2d6+xLOD56QxbG1dYtwfM5uNKJeL/Omf/yV/857A9tYOlWqTr918jUGvy8c/\nfJ9qtsRituCl3V0ePnyKJYqIgk6SytgLl4wh86x1wqMnj7j80m/Qap1ybe8yycMj5rMJPgY3Lu9Q\n0lRczeTo+TEpMXPHo1YuY3k2hpZF8CLOR8fsXd3hgw8+5NJKg+3NJpP+kEhQsOdTTg6OuHljj267\nhSlJ+FOLNHUxdI00SAicBaQRuWyGyWBCtdJgYdtk8zpng/7F71Q3eXLwlJ29TeI4RIgTREVlbXkZ\nXdf58jtfZrGwqVRyyLKCkIAqZ7DmLlevXubx4ydEsU82Z7BUq2AfnJP6ElZ/gJUz8RYuW2trnHU6\npAQ41hjHC3n73XdBUJD4jzjtM3Z92r0+P/j0PrKaISNnUEwYDockccD2zVc4PD1h//iM3d09NF3B\ntW1CIaXSbOK1xwiCghuAT4QzHVEo5tDEiDCJyWazjIY9zEKB0XRMZzThyt5VVFJ215c4brXJGiaz\nhc15a0C2kAclJVFizkd9Vle38YKIvStXWCzGXNlpsFwpIEkS906Oqdbq9Ad9Uknk6PScWJLIlyuE\nfkCzUuDsswMkUeD09JxCwUTXFOqrq+w/O2I6srl5dZdapcgX3ngdOQ05OHyAaMgUkJjPHBr1Or1B\nj+VmlalrE8cJc9tF07OU80Vu3nwJy3Lp9nqMrTH24piv/eq7LDwLd5Fi+zajyYTA88koMjuv3uK9\n976HM3fYu/wyzIYcByE39l5GlGXUjMjbb3+BrY1N3v/wB+RWTGrFHNbkomOcWw6vvPQqwWyAbsjM\n+vucjvp0P5qRyxTJ2L/Kjz9+gGgWufHaLaIo4fLuHokoY7ke+UqVue2SJAKkAn7oo6oaGdOAJCKj\nysiCiLNYgJCiqgppEuFOU7rtHoPRGEGA/WcPiTwHIfKwrQXv//BDfu03v8qTjx4w6JyyurRCIKTM\nnIBybYXxdET3vE9TV1iuFlheKbKxVeRHH+4z7FvEYY27d+7TbNT4q2/9CVJGI1vI8/qtXcoVG2vq\nMvdCbrxyk+WlGocnp5y2HcxyGdsP6bT7aLUK66vbpJFLFEXMpmPiyGVzo0kjU+X5sxOCQKZcrjIY\nThjPpgyHMoHvYQ0nlKoGSRAQuQHOPMYw8tRrTf7gD/+A1ZU11lZWuf/oPqtLTTq9CePxFF8xmT89\nZ/SDB1zaWOXmS3v8yq/9F1y5tMuk36Z3/oyt9RytoccicRmc26hRTF4ySedwdW+X83aLWEi5ce0q\nzx7tk5FTZAlevnENTYBnDx+xEBLUnEF9aZnz00PWL20wsGfk8jl8McINfcI4xnEcTNVACFJW15sX\n2UeHhyihx8KakzcMVE0kiAUUM0MtV2U6GeHaFpIksf98nzfeeZuMduHany9kSeMUSZJQVRVJkqjV\nSuiKhixoRLrJ5tY6pVKRp8/uUm8U6fdmhH6KFXqsrjaJ04BypYTv+zx9/BRVUVmuNTg57bC+vIYq\nKBy1Drl281XqKyuMxh1KxRz/+g/+CCl7h1/65a9hzwa/EMc+VxAdDhzMukdvbCEKPuVCkWK5QKVZ\nJCMpjKcD7NmUJElRVIn1lXU++fAjPEXi6tISg9kCy7IQFYV6rULPtVAVkYm3YDaXyVcL9Lo9UlEi\niSIWTsRstoA0ZTYdslwrk/NNOvcG9NMpGys6ekZAVOGlyibjiYedSmTLWW5c2+PevbsIocPCl4hE\nCVWWKVXKTOc2k5nLZDQjpxusNhucnh9RzGfR9Dwn5x3GZ12KJYOX9nZZ30jIaApBvODs8Dn1+irZ\nYgY3ndIbd4g9h9hx0DSNajnPZDxhPJtgOS5KvYkXy4zHDrPkKbVqla/++q/w4/d/TKfbpjPq01yv\nEvg57InD2toWuYyBIUIwn1E2iwSLMWngsFItcmRkyGdzqKqGbur0zs95tv+UjJahf9qhZuYpKQqP\n7x2ihSm+G6HpJmedU3Y31xEmAb1xi8K2SeTPaT+7h5YzGZghdz/+iAfFEl/4yi/x/Tv3aWxc5vB8\nQLsz5trVl6kYGieDPnJWoVbPcnN3k8l5j35ryuPnR9jBnK985RXc2ZRH9x/wt9/+EXt718jKMovR\nENfU2bt0hV/91XdpnR8w7LaQSYn9GNeNGfSnrF9psJjPKGZk1leqXN5Yot06Jl8psLWVYTKb0O9Z\nFM0CZkGhWivw5KhLu7vAmv4VshSzs72DoKfkywY3XtulUM2yCEK63T5JGKKQoMsSmqxyeryPZVkU\nq1kMQyOVBcIwIiRh5tgUCw1kFbYv7VKupPiuwtNHj7lx4zL3P+0TeCG6nuWtt77I3FkgSRL1+hIn\n+0eMB0NqtSK1apVOZ4ap5rDtGJkM/daQb5+fo2g6O1d2uPnSNnuXG7z6xj/DjzM83R9ydnbGJz/6\nEQVBRXFSFoHFIJizfXmbQb9LwdCQJYml5RrVRpXDu3cIPRsnFVnZ2UUmRldUFFWisdRgcRqwGLlk\nkiyqqRKlCZ7nMRmPqTSX0SSZYtakWi0ROR6xJJEt5RhZHvePnhMVXW7ffo39J3MSSeSVV29gZjVm\nswme61Ov1BEEhQQRTVXotNo061Wy2SzefMF5u8srt25xdHrC4fER0+kYWTZZ2BGBF7LUqCGJAlEY\ns7A9bMslTWMcJ+Tq3hXyBYWTw3MUSefstE22XKTd66DrOjdv3kLKZPnkzqdc2lj7hTj2uYLo1u5V\n7j8+IQolZDFFUWQWizndvsVas44WR8hCQOrDdGhRMfO4boKe0Un8lG63Ra5chzjGGgzYXF4mo4oE\ngYtRWELPZOiNBlSqFfJmkd6gy3g0RVcFJo5NLlugVCiS0RXSNETTFbTUoD8658u3Xuc77/0YPZNj\nOO6xt1WnbGSJwgTPc8mWsrgexJHAo/v79PoTcrksknZhySVEPooo4YcXzjdBkjB3AqI4ZffSBp3T\nU5Y3rvPk4RHf+tsfsr2zQn0lj67IrDWrTNt9ut0WhUtbpHGEiACIlMoN1EyeVNQZjgdEgcvjjMZg\nPKLRXGJszRn2T/AXNnEgUa3UKeoaxZyOIInUGhUm1oRe/5SNyzuY2QyGkaOULxKlLsPzHs/3HyLL\nItPBjPJSCVGSyesKBBGmaqCqKp+cnqAKMd1ui+XVOl7g0RsOqNaqbF/a4uzkiOFwyNVr17hz/zMq\nWZPR2T4ff+/H3H18wHf+5lv88vUdJnGMmFMoFgVM5zrtJ+ccPZ3w/Q8fcv21a3zH7uA4QzLZMl/6\n2rtEbkBszdE1kWJRopBT+fa3v81x64ivvvsGoTPDW0RsNja4yxHT4Rm1usbt127QyBV58MEnlIom\noZswn9l86a03uXP3iPOzE5YaOXY292j3PLwgRVcMZCViMhvQaFTo9w74v3//LpcuXaFoqFx/+zYP\n9g8Ik4TQtgj8OZVagaW1CmEaIigCjh8hZxTQZGbOEC2T57zdp7m+ipnNkM0KBIFHt91jZbXKYu5Q\nLOZ584u3uXv3E7LZLIVchvvDHqV8ATGRmU3G1GoNtmo1esw57h+h5zWayxUOO32+/4Mf8Pjxx/yz\n3/kqR0cetiNTbe7xy+++y9feeRtdVhj0p/zd977J2XTAbDzhsw8/Jg1SmmtrbFzaIJPT8EKXQj6L\nH6ScnrWp5rKsr63h2At0VUeUwMgZF52e69AeD3mn/AZq3mSymFNdXmHv+h4rjTppBKOxxXA44MnR\nU7wgAAV002QwmbGxvY5ZMJA1gcRNiKKE/nDKKzev0+10KeYNypUappYjI+scnD1mY2eLcr3Kt//6\nEyT5QnklCwrNmsHR/gmd1jneIo81dQGJXN7k7PyMVmvAb/7Wf03gT+h1hixcFzue8dLtN5EzGo8e\n7dPq9njn3a8ytebcvXOP3/kFOPa5+onK2QwLxydwE7y5y3K9QrVSwnEC5nMbWRbRNYmSITLu9tFl\ngUIBdF0krxoUiuaFdG4+ZTzok9Mz5HSDWq2MKCbkCxf7ckur6+RyBcrFEgB+HJJqMv3+mMV8xubG\nEmFgcdo+RTdMJmObYXfI1uoS02kXUYqpVqrYMxfX8XFcizB1SIIFS9U6075FGsoEfkoqiAiKwqu3\nXqfeXKbVGSCKYJgmhpnn8bNnWPaYrc0qpXyTs7M++UKearmGlopkZIXRZMTSUpVizmRhL2h1O+TL\neRJijo+PODs7RclqZDMyo16XH373+6w1awhCjOd5nBy3yefrjK3/l7g3+7kuPfOzrjXvtdZea8/j\nO4/fPFSVXXa52+55SqQAAaIkJAQRgoSEEOdwzgFCAkXKCZEiAYkEdDdOmkCnnbbddrvssqvKVfVV\nfdP7vfOw52Htvdc8cfBanLVP6/kXHunS89z3b3B49foFvd71bdGYkJBJEQcPtrFrRcb+nM7eOlES\nkMY53nyFnGUIQsjm1jpeELNwfAzToFou0qiUOHn1BjGXME0bRStimmXGNxOWc5dytcbKdYn8iKpV\nQgQue9dc9G/IRIHEcykQs94ucXiwwTL28VdLNhsd3JsFw4sZJatGmiU8vrvNkzvbZMuQYCXyxctr\n/vKnP8dsVJm6U8rNEu/eafLFB3/BoDdkZ+8+Z70RjheSpjlF3UAXc/LYodUySMSIP/z2n4JcIXQF\nLL1CzbrD5uYO3/rWE1Q15eayR+In6KqGlKckoUe9bGNbGr4/xSjo6KpBtVjl6uyYra0G/8V//vf5\nu3/nb7C1UUOQAnIiuhsbvP3O15DkAjfDCfOlC7LCzFkSRhFJnnF0ckKt3kZRCxzs75PFtwlgruvT\n6NRwllM++OkHREnIixefI4npbeJSEDMezhj0+uxur/Pr773D3/53fo9/+B/9Tf7gN79Jt1FBU1Us\no4KQ6iyckLOTa/7p//zP+B//8T/mn/3z/4Xnp6/Zf3zAH/zB77DW7jC46eMuPSRJunVXlWyGkxGt\nbp1Wu44kiMiSSrPZ5PrmhqvLKz754GNazTqmplIuWVTrZWrNKi/P3jBxl2QFkYKl8/DxE2RJQ9U1\n+qM+nu/SabaQcoFixSJXZZrrXTJJYLqYEcYBnudRKldRFIUsy6g3qqx3uiynC1rVFgoi650Odx7t\nc3FzzdHpFYpSolZvoOkyUeiwt7PGZNDnzcszvGWEadikaYKgpJRqJV6fnPHq7JRlGJLJMuVGgz//\n/vcoWmXeefdryKJClmQ0anVKpv1LOfalQvTzVy9RFJlioUDFstnZ3GZva4ONdg1N05gufPRija+8\n/TYFKaXZsrl7d5fIczElkf29g9s2wG6H9W4XWZaZTueQZORxRJaGdDpNVqsluqHRaFYwTBVkAaVo\nULRNPvnkU8QsYXtrjcl0hKQqtDptTo5PsXSDxWyOkKdIkkQYhnirBaIooBsKm2tthDTDVIu88/gd\nirpFkiRU6zXGM4fBaEixqCLLIll+CzhVVRmObpCVhOPnp6x8n1wSSYOExXBBEoNu23hZTLXVwg8S\nZp5HrdlALyi0SwZJuMSLHALPZ2d9m631LQJ/xd37+5RKFQJPwHFCNrY2satFdnZ3GPVGOPMJ5WqB\ncsVkfb0DtkZru4NVKzMajYjdlGqpRMnS0EyJRrONswyZzhw2t9aoNSzm0wlJmLJyXHqDOaQq88GK\nTq3DbDzDqlaZOA61Wp3f/K3f4tXxEXM34ItXL5EV2N2o8zd+79e5t9dlOprSrja5en1OxahREC0m\nYwfdEPnqe3d4+epj0jwniFRk2WY+XzEaD/n42XPuPHpKHkTsra+z3qry+vnnkCVUyjaONyeTQmpN\ni821LjvrO/zpt78DmUIQJMhKEVkxaHYfEWcFLm+u2DnooBoZSBHFYoEsS/D8BTf9CybzEVrBQNdr\ntBq71OtN9g+2+ODD9/nBT75Lis+/+x/+NfYONwlCl+OT11xeXHN1MWAx97m+HOJ7AYWCjuv6BGGE\nKEucXl6T5hmmqVMuVXFXAY16nd///d/hRz/5IVNnxuujV5hFhU6rjG1oeCuPX/u1b/Ef/4O/y/aD\nxxw8uo9akPjggw/o9wdcnF0jxiIHW/tYZpk8FVEEKJcMEDOefP1dvDzjk5evubi5oGgZ7Gzt0Gy3\naLY6RGFCGmcs5w7j8ZBSyWK1WNCsVMlzgbOLPlkm0ml0kTURRRXJ05jDvV0O7x7cdi9trqPrOnIO\nFdNgMZsx7I14972vsbGzwfrWBgXNYDxzmC3n3H36ALGgkAkizXYXWVVodRrYpSLXvR6+H1IoGJyd\nnlGyLARBII1zBtMBf/HDH4AokQm3+cPD3oDxcESWpaiqgm0XUWQZ0yjR7q4jygqNdouPPv6QN5en\nzAMXx3cpNSvolsrx2RviOKbZqjMZ9VjNx7Rq1V/KsS9V4vQ//Xf/LfVahSSIKBQMrvs9KiUNQQjI\ngeu+g2lWefvtB4Ren/e+8Q6uFzIbO3RqDYbzKZ7v0Wo1ue7dEMcpWRJDGtGolxj0b4iTFNdPKGgG\ncRiRCylRFmJaFpYiEEUukiRz7+5DBtMp7U6Tu/cOUUSJcqlO2a6wWq2oVooM+/1b77UEZrlIxajR\nvx6SR7cyRkkSSJKAKLqtLg4D/zawVhRuE8QVFUUCXRW5d3+f6SAESWA86tOplbm3t89oNkYsKDie\ny3LhM527uFGCZVmknk+7XiEIfWRNYTxyUESZbquFrAoohkwcZ1yc3CCIIpomc+/uDu3q7ctJKYjY\nFZv+sE/ohVwPRuze2ccwTa4urnGcBZBRb5bww4h+b4pdrBBFPiXbYHg94L13v4ksinz+/BPiVMBb\nBhiyTsW2URUZEBmMJjx8+ICb3gVXvQHXkwWKovOtX3mP1XzEzcU5sReTLSGOUoajAV/56hO67Rqe\nu+DOg7t89uo5yywm10wO7j4ijVIqdpHUX1LSNR7ee8Tp6xMa7XWSLGZ3u8OdvQ2c6YA0DVnf2eDN\n2RlaocjR56eEy5iNVpdSUcdZzbAqZbwI/vdv/1+s72xiWCJbu03myxlGsUSvP6VerxHGLn4UUGus\nIQlF3rw5pbNWJ0xdTnqXjJ05z189RyDB1BScxYyri2vGvSHuwiOIAtL0duyTxQKKUmAyn5MrIptb\nXQI34uZ6SL8/YK3bxq5YGHaRv3z/feyShbta8vTxQyzT4M6dexwc3qNUKfPixQt+cnTK5tY2F2cn\n3PT6mJUaw4lHjsTmRpdHDw+xiwr1SpE79w64//gpXhjzh//Ht9le32W5vMYLIt56+6t0Wh1WKx9R\n1oj8CElIcaYDms027jLEDxOSJMEPlnSaLWI/4XJwzZO3HuF6K1aLGUKWcu/gDqqikngB7sQhWfms\npg7Llcv+/XsYJYtmp0O91qRWqXJweMB4OsIwdVZLl0LhVoe9vb1NmsUMB2NUSafeaLBczLlz75CT\n01OSTODuWw/5yQcfsVwuefLkEL0gEvkxZbtBq9XCmY9vQSMqVGoNau0GuZCxcFfoZpHOXotBv0cu\nZISxT56lLKYzpsMRWxvrnBy/IfBc6tUyT3/7b/2VHPtSIfrH/+s/RZdkBCFn5YcUKzZB7AAuK99n\n4YKz8lhfq5BlC6yyiWU3yEOBslzgyp0QhD7Vapn5fMF1b8jf+dt/iyzxKMg5y6WDWjCZTObsbe9x\ndvyGPEvxk4iEHFOWWF/rIOYZtWodP0qYLeYYus73v/tDAjeg2axT0FTSJGTlLPHDCMVQUTQJ380Z\n9AYEXkCeJBQKEq1ODaOgcrC/TdmyqNeqBF5I0TRIk5iCrrK1vUW51uD9v/wJtlWgauncP9xjuXC4\nuD5jupgSZwlTx0VUTEpWjflgjExG0TBJkowkSXn1/BpNFqnXLBYrBz+Msa0KzVqDOA6Zzce0GmVi\nd4q7nNDqNKk0miyWC2ajEdPRklLZxA2XGFYFs2CRJCGtdo3paMj7f/EBj+4/Ym97g8mgh5CAkMn4\noct0PqRcqqJpBkKeEwcuaRaiagXGkzmmVWC+nLNwA05vZpSrTQ4PdgkWM6JVwPb6Lm8/eMjLV69Y\nui6/8/u/wfHRp0hKjl6t8Cff/0u6e3dZuQFHL14zuLlia61GEq5459F93nz+OW/6Y5ZBiOeusAoa\nTx/cQRFyfH9JQkpvMEIRCqzX1rE0iyxOuLq5IJMS3nr3Hc6vr3l9ckSUJlQrFpKSkeYRWQaBnyAJ\nGvVqi3KtxmIZQJJS1DVKtQILd8zcjwnijFa7w7g/4vPPPsNfLdne3uZ3f+cPUBUFSVZ4/vo1cSxg\n6SXmsyWrwKXSrBJFLqEXk8U5qiRh2QaP33nKxU2PL14dgSCQZQl7O9tU7Aqu6/Ls82c4qwXXvR43\nbsj+1gZlQ0UQc3K1gKyYLFYrfvbhh1SqRT768KcIQkqhoHJ10+fPvvMXjAZTDnf2CLM5H/3sEx4+\nfMx3v/t9rFKNWqONIgm4iznL5RRVUbGtOuQiC39FtV6moGiIMcyjGZIosLneRcpSIs9jOp0iCAKh\n75MnCVdHZxi6RaleZx6scPwlo+GIYBUiZTmFgsJkOqJil4njFFmUceYzkjhksVjgexGyUsA0DBRV\nYrGaIqoaT976KpPFhGgVUjR0njy9S+AvSFIIg5zjNyf4v3hsxHFOo9VEVHJKFYveTR9F1lk/WGMy\nGKFpMnfu7tPrX6NJMgoS2xubXN9c4HsuxBnf/Pf/s7+SY1/qd14SoWzZbHbaOIspsp5SaVYp2g2K\nVg1JE2h2qnz+6jmNrU0yo0B7bwNvNScYTemuN9neXWNzt0ujXWNrb4PhdIykFTg9u2AwGFAplSnI\nCgVJpFMqo+cilmZhWjVmyxWarpBmHtdXb5C4zVDMcolOu02WBPirGQVN4PqyR5SKIMiULZNaycSZ\nr8jzlL3dNu+8dcBv/frXaVXKPLy3j0qGMx3Su7ygZBqUDZNqqYiuatwM5vzpd37GdOlgmQbtRolh\n/4owcllrt/jKkweUijqVegVRVfiNX/t1vvHVr7HW7lKu1ak1m7TqHSpGnTzKkEUIfI+qXSFwPTrd\nBu12HdO0cOYOqFBbqzNdLLi+GlApt0iShK7VRMpSahWbyXTAzFkiSRoba5vokkzHLlEvFHAnU7z5\nAgWR6WCAKoAzGRMsXDRVJgxD4jgkCXwMSWblzBmOh+glE6teQRQUTKPCwnHRNI00ilmOHG6cM7qb\ndQ4Pd0gCjyyN6Gx2+O77P+JqOMVzIjYbHeQoZHe9xdJf8PTdx8SJizO+obLWxKxVufP4LWZzl5ef\nv+bm9IKyUeT+/iEP9vfIoxWL5QhdVzBNkyCM8VYukpAQeS7NRgnT0CjIFd68nDIbepiFnN3NEnud\nLoIvkywgWMyZTq6oVwy217uULZPt7h4Nu42cGQx7S4pGhXK1AYrExc0p14NrnnzlHWqNDv3BDN9L\nWcwW7G5vUakUOT59SZJnSKLCeDrBqpg8ffqUDz/6FFHSKBgG6+vrBGHK+z/+kE+fPSNOXDa3O+zu\nbtAsGVy+/owsnDPoH1Ou6IhShKKItNptFL1Gc22f0dDl/R/8lOV8CXnKvYNtClJKpdxgd3ubq4sL\nTk8v+N777/OTn31EkoFdrbJ//yGpKKIXFAQyVFVi5ftMx1Pqpk1RL+A7DnkYYSgaeZ5z2bvhk+cv\nGC7m6JZBsWKj6hoL10WUJQLf5/zNCe5ozvPPPuP5Z88omUXmsymaLKNLMjW7zPC6x8XJGXv7eywW\nDq+Ojnjw5DG6aZGSEwspJy9e4joLsijm9YtX9AZD2t02XuSyubeHnwr0xw7tjQ6ZGBMlSzQVTt6c\n4s49VEmi0aizmjt0Wm0KskTJtpEQaDfbPHz4gEePHt5K7n7J+VIhenVzgevOqFg69ZpCmHi8eHPO\n6c2C6TxEyFJIAwDG84A/+s73CKSU1loV2xBwwykrb0KSeth2gVLJ4rrXY+GuQFOJshzP81hNp9T1\nIi2rjC6pDPsTup11kjTHWS5IIp8sjaiWijSrNcbDEYcHB2gFmSS9tRK2Wi3W1jbwvABnvkQRuHVE\nVG1MS8RZ9Pn5xz/m6ItPOPriC/zVDIEYy9ApF00sXWU5G5NnGbPpkrOzIdtbB2imyc1gQpzm1CpV\nhoMetlWgaMjoioAuizjzAZkQYdlFAt/HDyJq3RZr7RaNRoOjkzOMgoFp6kxGI87OTnFdF4GEcsXG\nLJWRNA1F05iOpshpjipoNMtVFsMZeRxRNk3mwyEvf/45Lz9+xmo047e/+Q2qRRNVlChbZWRJoqiq\nVHSToqRiCCq6UkArGgRxxHwy483L15RNE89bouoq9XYLRAFD18mSBFkESQZByfmjP/3XnBU8LQAA\nIABJREFUjNwxj9+5z5vXX1CtVrm5GRBHKUKeYWsKZVnl3toGpqbw8MkdEjFivpqztr7OcDzGD0PS\nTCBNc8IwZu6syFEYz5csA48Hjw/Z2KxilyUWqxFilrLR7uKP5zgTh+V8ikTOb/3mX+f3fvM/YDLy\niaMQSfCYTc7Z2+xSMjTqZYtW1SLwlwxvbhAR0ClQLVRwJwGz4ZJyqYVplXEDn+/95V/Qn/W56F/i\nphHT5ZLp3GF7a4vV0kERctrNGmZBRxAEbLvIu+++w6uj18ymS5z5ik5njc3dXV6+PCZIMuI0IcpC\nPvrwAxaLOd6kT+ItCT2Hfv+Sq7NXxPECQ4Nus8rO1jaWXiIMckzNwtBU7u1u0q5ZaHKEtwp48ewF\nJcNC1lRESWHle0RZyuVND8f3MEsl2mtrFBSZleuiqiqKKDG56iEmGe1Wi6MXryjZNrZt0+mssbGz\nhR+FoMrkikCt0yZIYjIpp9msUy6VWDoLKkaBPMwQEoH5aMZiNCCLfF5++hmXJxdIgsTV2RlbOx10\nQ2E+c6jW2kRpglHS6Z9f4S0XuAuHomlSNEymsxlRHDOZz7lz9yF7+wc02nUyfKLYRZJFyHKWzoo8\nSjHVAjvrm8R+SOB6hMuAeq3FT3/6M4JVwNXlFWGU/lKOfakQXV/vEoRLZs4Vbz+5i67q+EHG9fWE\n1TJEzmTSlU8WxvhRytHpDccXPR5+5RGanfL03gEFRUQUIUhCajWbpbvg1fEp3e1d9h88IIh8NEXk\nh9/7DqEfYBRM4iBiPnTY2GgiiiBIKoqo4joLTE1CyHzKFQNBENBUE0GQ2N3fxrRuoRmHCcQya+0a\nzUYJQRZZuHPSNEZTFeoViyj0SOMAWRHwvBXOfI6pFmjXa6RRzMHhHiW1yGzuYzebCKKKLCrEUcDZ\n+Sl20aRTstCJGfYv6A3P0HQB29RJ0pDu7hqNjSrLJCRXdS4nY6bLGV4ScDOasFguyZKYPE04O7lk\nNFggJCKGJHD088+pqCUC32U8mtK7GpCHMRVdZ7u9xrQ/RRUkiobB2dkJl1dXbB/skWUZuiaRRSEb\nzTWSIEHIQZIkSuU6nc4WkR/SrFV48+o51zdX6EaBjIiCBt5yShi4SKqEoIvUq93bbp69daI8YLFc\nErgJa402640KxAvc5RjTvHWN3NndQJOgXGtwM/O5Ph0jZTJZtKRYFKlVTSbOnKvxlEWS8pNnz3j/\nw48x7SKHB1uUSjKdTok8jnDnIZqcUS6WceYe3//BD/nhj35As9PFLjWxS2U2d8qYZR/TTvEDD0nS\nGI5GCLJIGMb0L664OD6HMKVTbxH5CTkS5Wod3TTobqxxM75hOh+xd7DNYjljZ2eTWsnG91a0mm3S\nOGFjY4PHjx9Qq1f4sz/9f3BXK9577xu0Wm1++IP3EWUNrVBk7/AOsqL8wsHlkcYxs/mSKJVRNRtZ\nkLH0AlXboF4xGFw+p1wU2N9us7+3QbJ0yF2HWlFjc22NTz7+gjTJOTs/plopUapWcAMfRVM5fHiP\n3nBOkisEfohuaJhGgbfffoptFTEKCg+fPML/hZPsJz/+Cav5ko1Ol+3uBhtra1imzs3NDf1+j/l8\nTq1Wpbve4Vu//i1++6/9Ps1mHUMvEPkx50cnJFFIu1alVasSeSHrrTXSJCKPQ0xNJvA8SpbNr/7q\nryCIGWKusNnpULZ1rGKBTmcNMpnt7QO2d/bRdIV6p4IkZ7TaDTS1QOhGHO7t8eDBLnmU8PqLFziT\nKd7KYa3TYT6f88Vnn3N6ck6xZJPnOavV6pdy7EuFaLfTQdVlvNhja3uLaBViijpCmmHICgebO7RK\nFTaaXa7PryGT+bff/SFmpUKhXUL2fCoFnaPXx6SCyJvzM0bTCZZdpdXeJAhT7JLF3t4Gnu8wnY9u\n++UbDeaTMa12BUmSMI0yeSbRrDcQc588cVjMBgRBQBgkrJYeYejhzAfUqzZplLKaxxgaeCsHQ9dZ\n39hGUhX29ncolS2SJMKwDOr1Ell++4VMo5hw5SEJCY2qjhD6mJrKi+evkFQVq1zm3Xff5dHTx+zs\n7lG2K6y16swXfcLEJc8TAtfl9OSYxXKKaQvM3RnHVxckCAiCwGw2I8tzgjCi025zeX5DrzcjjAVk\nWUFXZFTE26348IJcEBkOHPrXQxr1Ku5yjlYo8JWvf4PBdIzjLyk3aowmU1x/QSpExCRMVx6mabJy\npuxurVOrlbl3/yGmVaJSLdOsV/DnU5Io/EXKjkyahthWiUa7SaVV4xtv/yqpl3B2+voXo5gJfpAQ\nLENsRcNfzYnzFUHu8ru//xuIScSkN+JHP/qEUmuPZrGLmktIhLTbFlHmswg8YkFga/8O27uH6MUq\n15dDPn32jChe0eqUWVtrIsoS3Y6N567YXN9iuZpwdP6MpbfE9QVE2aRUK+KHAwq6wKNHj8kFGWc5\np98fUCpX2d3fJM0CXH9xuxjxViiahqbpuKuQxXyFt1hR0BXu39sjizxef/EZbz19gJCljK/H+K7L\n0dEr9vf2uTy/oNe/4d/7m3+Nx48e8L3v/QX9wZiL6yuCJMYLYlqdDabzFUmSsLezx8XNjJ/9/A2D\nkc9o6NBtdZhNJ+ga1MsKSTTj9dEzdF1DEjPyNERTFfwwYua4CJLEaDxma2cDo6Cyvb2J5674oz/8\nNrKg8urZK5599gxFV2l325yen7O22aXRqREFMSDy+PFjioZJ6oV4oznhdEU0XdKq1FFFgU8//oQk\nijh68ZzLi1O+eP4pp+cnXF1eYdtFdE0hJ+X45Wuuzs9ZbzXZanfQJYl7+/tkUYi/WNE/v6BWsmlU\nyrz/g+/TbXUJfZd33nlIFLj4C5/9nQcoko4qK5yfHGEURGy7QJqmtJqbTGYrkEBUY8aDa7rNBqos\nQZ7RatcpWgaNVhPbLlKtVXj09CEbG79cbP+lQlRTZdY3dwlTlf7NmHa1ghD42LKMKiTYOnQaFcKl\nT7hIqGglrs6veHV+QWX3DvHAQfBz2u11mp0udx8+pFlvoWkFhoMJ1XKNVy9f0F6roVgSiZoymI1x\nVw7BcsZ0MqVSrdBZ7xLHMbWyTVFXsS0D13Podhs0WlVkReTq4pwsywiDGDLI4hRDi3FXc/r9MVEi\nkKRQazXIspTsF31FdqWEs5xTqZRQRA1NVri7u8ZkcMzBdpPEm2KbBUq1MoVKESfwmE7m5JnEYukj\n6SrlsoWqCMxnDsVSCVPXCedzhtfndJol1toNWtUmCgXyJEcvKPiei7uK8AIR2bQ47d1wMx3TG45Z\n390CJUcpCLTXOuS5RhTn3Ax6rB1uIFoaqaaiV2zMis1wOKFcq/KVr79Dfb2GXNLxZIlMTUEIIXTY\n6rSxSjbr+5ts7K6xs9lFyQUW4ylZlnEzuGE0mjCfr8hyhbOrHn4U8N5XvoYt2jz/6Auc+YpKo4lt\nl0m8kLZtUTJlHj09xE98/viP/4Qf/OBn+BFc9gfc32ygpBFRnHIzmdPe2roNcJFlpDRHF2WEOEYp\nSAzmM8ZeyGC5otxuUKtbPL27y+5aDV2NUMSA+4f7NGt1puMpFbtCQdYQc5Xe5ZjYi2k36uxvbeAt\nHDRZQ7UU0HLKdYvORoOdwy2iKOL06JTl3GXYG6IgstaqM+pd8uTBHrIQk0UBu1sbkEpIgkixoFGt\nVrm8uOIf/aN/iF3U+O53/jXlUolud52vfO2rnF2e0R+OubqaEMawXHl4sznf+OrXkUUds1Dk7OSU\n64srdne3KVpFTk9PyQWR2SpCNGvY9Rbr25tIhkKiSkiqSZTl6EWdPM9xZlM22i2Wsxkl3cSbLXl4\n9wH+0uXq8oJi1WK6nLMKPVIl4+rlKeF0hS5q/PXf/gP2NnZQMonUC/AWS/q9awzDoFar0G01Kaoq\n836Pzz/6mB/++XfJMyiVbFIhodVq0Gg0SIKYPE2RhRhvOcUZT4lWEc5kyuZaCyGN+OiDn/Dzn/4c\nRRXQCjKiKFLUy7x5ecaf/NG/5PTVEYvpiLJZZKO9hrtYIiEwmUxoNtp01jtcXl2QJiEPH91FUUWK\nloqqimxtr/HWV57w5O3HRImH76/+/9CTv+p8qdv5yxc/Zj4PuO5NCAOfWsmkVa1yuHeHNAmQRR/b\nUBj255hmnZQMQYrY2tni7v23WH7xkmWU8vzqGsUqY5dK3L9zl5pdYdDv0aiVcGZ9dENiNp2x8CNK\n1Trj2QxFEGk2K4ji7YKrZBeRZJHVysWyDM7OL6hWa4gimEWds7MLanaNWrWJbZcgzyjakOcypXKb\nol3n6M0bRDImszFB4CNIIoIA86mDLGpU7RrrnQ5ZHmDaImaWMBr1qdaq9Gdjxs6U08sj1rodTN3m\n9cklruvSbJa5u7OHJhvMZx6iJPHwwT0SZ4FtmSiywvBqSBZyG8NmFdA0jSSCUqmKXFS4HFxgFXXu\n3rlLFEdc9K/oDS5I0Ni/+xStoJOmPna9RK3dZDSboMgKoqDgugEH+3sMB1cEcUCl3cUVJQwpRhIj\n4mCJu/TIBIVSq0EmxKzmY8RcRCvYJKJKQdfJg5iCrNJob/Av/vCPWXgLDrZ2KWQKb14foZdsdu7e\nZTJxmPeGPDrYQRFToiziBz/6CVqxhhukSLKGUTJ5e93m5PyUUNBwk4zu9jZJnNBpdthqb+IMhlRL\nOm+9+xYfPPuMRNRJMhHSiG7Twh3PePTkAPBwlys0xWQ5v11wnZ285Pr4gqcPvk7o37aiqnKCZSi4\nyyWKXEAsFRhNRyiawqujV6x3W+h6AW/pIiPRaTaZOzOSLELMElqVGkKaI0g5qqVzcnTNdDzHLBS4\nf+cuoiwShi6j6Yij41MQFWYzhwf373J+ds5Xvvou19cDFPl2vm2LIocH9xn2hqx36tw92MA0CyyW\nLsPhkOlsRqO1yeuzCdXGGnapzNnFG4xKkfXDfX7+8Rt832Fto0W11uDTz16w3l3Hdx2iwOfk6JSN\nVpcH9+7w4vg1lW4TxSyQxyG2UaBj1iDN2Fxfp2gayIIEOTjOilRImDgTrm56CJl0u1PoNrk5P6dV\naaJmKo16jYKuEUQrFFmCBGajKXmcIEk5BUNHQGY6dSjIGkVTI4o9Xr08olKr8/DRAaIs4nkhzsxn\nPnOplSu02hVIY/b2dqnXGoyGI5arFc12kyiJaDSaKLpKHC65Pr+4BbEiMF1MCYMUMZe4c/eA737/\n3yKrItdn1/ze3/+v/0qOfakQ/R/++/+G+1tdnu6s4U2nlEyDrXYJd3TE1LlBKZc46o3I4oC1apEw\ndDEqJfbu7lJrG8yHIRezHqat0r+6YD6Y8eLlczBT7IZG6DqUJZWSUCAJBS56c/xAoKoUqIrg5x6R\nf3uBbhgzdnxWfkIUZQzHY2zLpiCqVDWD5XCIZRlYDRupILJaLfC8mEXgohoizYpFVTUY9ftkWUq7\n2qaQSBi5TKtq0WjZ7Gx16F1e4a1utXbHV0te9XoYusWTjX0sPyUOXLwsJkEgdRPchU+MRKxqWGaF\n0eUNshpR2TB4ftFn4DgsFisUQUHOcpbTOUWryOVwyDKO2N/ZRVx6VAWJvbU2a90WE9dB0jXcqUuS\nx6iFmLVWmcj1WM5cbLOGP/VIFj6vPnvG4YNDJtMpr18eI8YChztbvHr2U6JMIYwgzWQSIWO2GrG1\nvka8CllMHeI4JhVzJFVlMB4SCxGyIbG1sYGRq1z1Z7z3K+8SyisiNWNz/xBbtxADl07Twol9rO4O\nP/n4lJWTUxQ1ItehWFGxKyqCoPOzDz5hOV0xd1327h8gEiN6HkLmIxRFOoebDIZTeucDZgsfL8zx\nVgliovLZ4BmdtS6hn5KLGuPFDKWgYBslPvn5MXmhRKlj8eStDdzJNZpgMrj2WC1cOmUD3/dQc5Vg\nEbJcupRLBo8e3sG2i4RuhKwYXF1es3CWzOc+RrHJbBVhWjrBakLuCTizKb/5+7/Dg68+5d9878/5\nF3/0r9jZPeCdt97h8uwEy9DQDY2zi3MeP3mIXTbpdhtMJ0MarSadtTrtbpkHjw9YBSvKtRrObE4Q\neJTKFrVahcifU68aVEsG/Ztr1rsdtCznpz9+xTJcUWrZFDSoKgJysGJ/f4fpMuRyPEcv6tgFgf7z\nIzbUBporY1kmWlVBrRRYOQuqhs1queKTLz4hEX28YEx7c41c1bmZrxAKGlHgUyqXECWR9Z1N5t4U\nq6DwyQcf021vYVU7dLd2scs2hq5itiu0HuyDqaGKCpkfc/jwAbIpEYVT8ukNTqYwGy85fnmKrRtI\nYsDh/W36zgC9bJOLGVnu4wdzotDjyYNHDG6uuLk+oV4zUWUD11uwttFFEmQm1w5CIrCzs8XRq5f0\nLwYIkcZqFvEH/+l/9Vdy7MvVif7zfwJixsyZ8t6v/ionx8ckgU+chxgli0q1yeb6FrEXMJpMyDOo\n2BXa7Sb9wTXrdpPhbMRoPmVra4dqo4EgCkwmQzRJRI4zhCBElkW0osWnL47RNJNapUzRKODnAaoq\n47ouslLA9SME4TZH1DR1wiiioGg0q1WSOCITYHNvl+lkynzu3NbtkrFcrlAFlXAVIEkysipTLpXZ\n3trCMHT8OEQxNAIv4dXLI+xSmfliymoVYpoFnj5+TO/8gnt3D7HKRQq2TrlaYzFZ4vkBYRphGTqB\n45EFKUZRxa6YpFHGsD9mOllhWVUUTSMTIuxKkYkzw3M8pERADALqZZ2trRZ2rcwnz54TxgKdeoWd\nw116/T5RFNOqNfG8gCAMkSUBVRJod24j/T5/8RIhE7Atk3a3xXA8QNYMQj9AFkXKlRKCJJEmKfPp\njGGvx97hPhe9AUEGtVYL2y5yeXyCLEioUoE0hXLF5PzimHK1QqvZxlt4+Ms5oiKys39AsVThi2ev\nkABdlVEKMod39lm5K0qaxeBmiF60ePdXvsbmzgaBt8TSCjizOScXF7x6fUTZKrNcBrfmAD9EyBOU\nPENRVdbqTTRJYDadUqrVycOM6WiGLCsUDIP9g232tteQhIwXL18SBCFJGnHn7j6ZKFCttyCX0HSN\nVqeGM59w9OoNkR+T5wLtdhM/9NC0AkkMtl2k3iiRxC7+MmVvb49v/uav8YMffJ84TZlOxmRxTLe7\nRr1aRZJlxuMxl1dXvP32O9y5c5cwCBEEODx8yGQ04fLsgtOTU65verSaXUajMSvXZzZbsLe3h6oa\nLJcu1XqDKI5Y727w+uVrFssML3Bod6vsbHWIvSXVcoVOZ5vr3ogsy2hVbZ7e26NRtwniCK1k0Rv2\nUXWV9sb6baOmWuDVq9cMxiN2DrZAFBAkCUU3GI9nHB4csr2+xvnp7RxUFAUkQWZ8M6TTXWN//w61\nVhPN0HDnM1RZunW4GQVUVSNwXKRfjB0ETaSgiOiyzCqX6V31iPyQRw8foGgio9GImbNEEEWc2Yws\nj7FskzhOODy4y+nJCaPREEHKyUWZcqWCaRh4bkCa5Xz1K1/n8vIcTdOQf/ET812f3/1P/su/kmNf\nKkT/z//tnxCnMUEWIygKzUadXv8a3VCxK2UGvRGD4e2ipGKXceYr3nn6NiIZn/z8Ex4c7HN9fclq\n5XF8doYgiSiagiRC6LgcbG6x2W1x3buku7HNbOFDrrBYzCkYMmEWkiQRuq6TI3F0fImiKIShT6Vs\noxU0JER0RYH8VmIiqArX1zfUKjUUXcX1PbqtNhWrQhplNOst7JJNfzhktXApGDqT1ZQ4zXC9AN20\nGE/GBFHAe9/8Jvfv36N/dcXV5SVff+9rmBWDII24e/c+xyfnjEYTikUDMRMgFZjOHCRVptaskPsZ\nx8cXOHMfZ+FimAVW3pxOt46lm1TMEhXTYn9nnfHwimarwtrGOkWrwvn5DY2ayXy5YOF6TEZTyEX6\nvTHlWuUXvv0FgiTQH05ptDqQQdEqsrm9wZvTIyZjl4pdZtAfIAqwWN06TjS1wHQy5s3xMfOVi2FX\naLXXsYoFsjgi9VOq5Tqz0ZSzs2OCJESUZApagYpVYjofYVdLqEWDn334MfOxQ7vWxAtWKAWJew/u\nMu4PWO9ssLOzS7FoU2nWubg8pn9+jpKDWdAZjSesXJ+N7gZ5BoZhEYYRlaLFo8NDIj8lDXxUKeHk\n5AwxV1ktApzJ9FZCFPlUK2VkUWBzcx2rbOJHPnbZplS20Ys6SZQxm68YDoeEkYeiCLx6dYShGsxm\nDmvrHQxTJ8tAU03CMKReL5EkPrZR5u/9g7/H//udf8Px8TH7h3s48zlREqFrKpqmsre3y3Q6I0kT\nvvVrv4aiKLx6+YLhYIhhWjz/4jmXFxfc3NwwnkzxwwDTsrm6uWYxX/Do7kMuzy/JBAGtoLG9u8PF\n2SmT/pBap0O5alGtmnirKTIxRsHk5M0V6xtb3D/Y5p1H+9hFhSSNiPIM1SgwW8yYjGf4YowsKJAK\nzBdLHM+h0qywtbWBIErYlTpvjs8oFgw2Ol0GV9fkWYqYC5RLJVRZo1IpE0QBkq6CkGEbBnEYcnp+\nychxWC08xjcD1jpNps4YN/ZI4oCCpKCW65AJpFGCIGT4gUupYoMs4fsBsiqhiBICEIUhnuvj+b+Q\nsCkCplnGsm3iJEESZNqtLovlEk1VMC0DSRQRJRlZUfmVX5Js/6WmOA2GQyrlIuPJgJUXsNZqUW7V\nCSYjCpKCs1rRHzt06m1iP+D+4T0QRT7/9AWpFyFoOYZpMPtiSqVoEgcuhqnSXd9kejViMpmjiRla\nschytSINEryFTyqkeHmCbdtEoYtlGEydgFqtRp7nRFFAFIfEUUK52SGMYzRN42pwjWpZSJKE7/sI\nqkijXMV3PcY3DqZm8+rTTzi8s8/h4QEf/PQjPnnxBVbFoFBQEVIZIZexKmUO9ndZO9zmR9/9Pmvt\nNoIs4YkZSz/g6M0b2hs7WI0q8nSMs1qiSjKxJJLrOp8dvaHYKqInJgXFoFyRCeMIUchoVKpMbiZo\nikJR1+l0y3z47CM0KaW9tsP//S//jAcPH1HVTSRFZHN9m8JkiiJqXLy5JMlSSiWLSq2CLGTIkoI6\nczBMC71gspiOubi6YLaYoaoNBMRfRJblqJKIs1iR6NBsd1ideiiSzGzqMHWesbHeQBElFFGh1Woz\nH025GPpUujWaax3arQ5SBnN/gTuLCEY9Pvnic8qFGjfjHgeH25SqJk/eeopt21yeXPP66IjRaMrN\nj7/H4d0ddCHlzt4Bp8cn7G9tU3YWTPp9bq5GeHEOSQISHL1+gbcIuY4mfO2rDzAUjcH1mE6jS+vA\n4uXx50i6jqIqfPSzz+ld93jr7SfY9TFfPPsccp9qtYEXwvn5GaWqDVlErVbDMAxkTWV63SMlp1Kt\n0OuPkCWZ4WjIO+/c4fLqFe88vMPx2QknJ0cIsoQsizx6eIeLsyvmkwmB63L38C73H9yjs95lPp/z\n0YcfMh2PERCJs5DN7S6b601m4zFBEiCqCigpT548pNtsoagyw1Gfrf1tFr7DhtpmuZwTJz4F1aVr\nlzl6fYQsxrz96D6z4YJqtcTBZpeCluK7Qy5uJhxf9FhGCUEUYxQK2JqGWiyyHC4YDEfohsb4xGE+\nd9jb2+azH/+UXC5gWybHb47RRZH1jXU+/eQTHj/a5fzsnMFgyFfffgurbLLyHepmjSRKOT45I0dG\nUnQ63TXGYUqn22DoSOhlE2/hQJQRxzHOYoakSrcyJCEGMSdIEuqtFs7cQS+aWJbJbDzj+M0JAFkG\nhlFE1Uw8PyBNYoqmRb8/RFEUIGO5yiiaNteXA2bTxS/l2Jf6Ev3x975NFgQsp3OMosVNr4e/cOjU\nalz3etTX14nzjJpdJY8S3lxckSkyWZISBx5mTWJv64DR2Q3Basn6epvhdMJ07lKrNFAUkSjzWS0X\n2GaFm/MBg8GYVMqorTVxZjM2Oi1838f1YpJcoqBptFt10ijk6uYG0hwhS+m06zQ7LeL0tvArDALC\nIGLlLPC9kDBIqFSaXA8GCBJsbm2yu39AKuTESUStXqdYKhFnObV6A6NocjXrM7i+YTKeoltF6t02\nbrBE+P/au48dyc40veP/402cE95mpM/yhkUWmz1tRhp0DzCSIAjogaCNbkG3op0W2milnTC9FiRI\nQovTGnWTbTgsVrFMmkoXERneHu+0SG67N7UgBJzfRTw433e+933SjNlygWIYON/VcBDDzXjK3PUI\nwgBFkpgPVqQCmJbO3aNDIGXUv6Fqltjrdmk0Spyev2E8H/Gzn/+M66sbVrMlsReyv9NFLSrUW23G\nswVBEKEbFrv7e+zs7dLvXzCbTjAMk/FsdVuVIMmQpuimiiBBlqkYmsZ4OKJUtGl1twiimIJlEwYB\nYRKyd3REtdFmsVgyGvYZ9vqoosz9B084ffuGSEwI05hGs42iKLieg5v4LIINL759zb/+23+DIisc\nHOwRZwFW0SRNYy7OLxgNJjiug6JozJZTDFXC1jSa5QrvXr5hPJwiCAKL5QpDN/HDmPl0QtE0sQ0N\nS9V49vQutUaFKMiYzlyePX2CpkGSOezv71CpNBj2ZkyGC5rtNh8//5jVcorvudQqdeII5os13Z0O\nQehwcLjLTX9IpVQjTlIKps7xyTGqpuP7EYWCgWlpaKrMzvYe0/mE45NjVusVgeej6Rqlok2jXufB\ngwdcXl5gWTZJlhDFKYPBgJJd4pPnz5ENmXqtCkmILEOtWWEwGbJx1xwdHdC/uEKTFdabDUcPjlg5\nK7a6bSQphSSi2iyxWCzx3ZDldMHB3j7rxQZT1dnMhkz6p0hCjOv7vL8Z4wsCmSjQbbfQRRl7d4fL\n03Muzi6o1WoohoLrbnj08CEvvv6aBLCKZZz1BuKUyWhEtVrFNG8HDDRNR9c13l+esfHWxHFI7/yC\nt29OsCs1IqBYKlK1TR49uMurN9+gFnSuLi6pFiuoxRJZCrZd4NGjx/QHPSqNyu1Pt2KJMAoxTYNW\ns3G7ztEuYhZsJEVElmQyQcWybk8HgR+yWm8wCzbz2QzH2VCulBgORyRpyl//238IrxxlAAAUfUlE\nQVT3J3Psew3RX/7n/4CaZRRUjWaxymw8xfcdDo72kVWNNIV7h3dx1htETUPQNB4+fczx6TGbzZJ6\nx6BbaZMsfK7en1Jv1ym3GpxeDpAUjaWzpFKzSdIMXdQp6jbnF5ckUkamK+iiQLVsU6tWmM83KGqB\n614fVczodNvcvXcPQzNoVCtoikwSx7hhxMXlFYZhsNXq4G02FAyTMBHYhDFWuYihKpRrFV6/PWH/\nYJ9apYJlGKwch/Fszief/YBef8B6s2DWH+EvHd4eHxMS8+mzZzRKZWzL4u27d7ibDfe2dxlfD+gN\nxsyXGwqmSbdWJ3NDHMej2WxjVUucXZzi+y6aJBEHHpPRgDSNeXD/Pg8ePOKbP/yRra0O0/GUre42\nbrLmZjTi/OKaIIgQRQFBEBmO++iqwnq1ZDgeoxkWjuOz2XgYuoakghc4BK5AQTfZLJcUChaCLDOe\nzUky2N7Z4bp3RZSmGGYRyypQK5dI4ohXr14Thxm1qsnGcXhzfMwnHz/Htmzmywn1rSZ6wWA6mbGz\ntYciy7z59hU3gx6qKlKyi9h2CW+9YbFcE6cJtl2ALMLSVJq1Ol9/9TW1chXbshFkkdliRRTGaLJE\nHHookoChKnzygyesNiuOT0/ZuC6aIkEWoqoy/+xf/EsEZF6/fPtdt1CGLEt89PgRF6enFAoWsqyj\nGSbnl2cUiiZ7u9v0robIkoZhGNhli0qtynq1YTyf8/TpI8LQ49nHTzl+947VZsXu/i7Vep2dnW0U\nWaJWqVK0bEbDAaPRGD/0+auf/ZwwilksF6zWa9bLJYgCX/7mNxy/fUvRLuJ5Pue9K/YP96mV6vz6\nV/+X/Z19dMPgZjRkNBmyu7tHybIZXF0TkZHGoIkae7s7qLKCIissp3NMTcVfzQk8h/f9Pomi0jrY\n4/TsAn/tIvgZaqvG5fEFg6s+e7vbJMRYBZ2dToeT4zcIokinu0XBMDnaPyRLQbcMRuMJvufzySfP\nGU/HjCYDJE1E1TSuzq8oaBad7V1Wnke5aDEd9FjMRsxXC5qdFoPrPtudHbRy5bZnzQ9otJoMRzdk\nUUIGBFGE5/u4vkeWpviOR73a4M6du0BGqVzGjyGIQq6urtmsHKq1BuVSBT/0KJg6hUKBNIVGs8Hz\nf/6nK5O/1xD9L//p398WrS3WaLGIu1zR2dlm7C6pthuYis7xy9e8PTtBLdps728jAm/evGL/cJ87\nB3UsyUAIYiI/IBIi1mHEeLHBrtRwwg2lSpEkiFiOFqiizHB4w9IPmG9WyGTsdFsIaYrjRchagWaj\nweMnd6hVy6iqRpKkqIpEEnmMx1NGkzmqptLaakGUIWdgmRZfvniJk2Rs7Wxz9v4ESRAxTIssA9s0\nWU6nvH79hkqzRbFU4fXbdyT+GlPU2O/uEsQRkiQjJBF6JhB6AY7jsNNp406npE7EfH5b+yplGduN\nFk+P9nnxzSs2fsTK99g72GY2GxP5Pt1mCyHJ6G51+cUvfsEfv/iCwPfxPY/X706IEpFaq4huFkCS\n0HQVb+Pz6PEjFFnB3awJ/YDFck0QRERpiqqq9HvXSLLAyfEpBbtKtVwm9gPW6zVBluBFMaIsoWoy\n4/GI/uAGs1hEUzQ6nSZJ7BMGEc8+/pSSKeM6LqZaoF6pMR2PkGTQTZV/+PxzLK3AqDdCFkT6V1cU\ndYXWd18y5VKJaX/C23fHNJoNdE2h1SjTbtbRJAkhAcMwsSs28+UcP4pwXRerYPDgzhFJGmDbFsgi\nN6MhBdtCVWS2ttq4rocXxHh+SNkuM+xfIglwcHTE22/fUFAUynaB6XyO4/k0t7qcvT/l3oNDwjjk\n7OySz37wF3iej2aqSIrCdL6i1WoSRrcLXkzTYDqeUanVsYpFNF3H8zxuBjdokoJpmtzc3LDZuGiG\nRqPVYumsb+/6JAlRlrEKFqfHp4gIHBweslo7CIJIo9nEUE1O3pyz3d0j8EKiJGJ7b4daqYrnupSK\nNpcXNxiqjlUo4K42TCdT0ihDV1UIIjRFZbpcoZYs5IqFViwRejEEAmIi4koptqITrDZ0Om0EMaXf\nv6ZVryIAgiTx6OlHCKJ028SapmiGyWwxY7ZcsJzO2D/YobPTpt6s43oO7XqbLIbrmyFhHOGsVxiy\nQBL6IIMXBDy4/wAxExENk2++ekGcxJiWSRD6FMzC7RapOGa2WKCZOtVKBVEQ0HSD+WIOIpwcH6OZ\n5dvBm+WCyXRKp73FcrUiCiOK5SKKLBEnKdVKjYd/9bd/Mse+37bPX/5HpBSc8ZxKoYymmQQKTJwN\no9EELRGoFGwkUULWZLzQRxIzzs9O+Juf/1MqhkjFqnJ1dokbuHhxgBdl9IYz3MBDkmFvf4coiLk4\nu+DB/btc9y4RJIFKsY4opWw1arirJeVak/07D9ne2WGzmhKGPr//3R+5uuohZjH1ehlZlkkyifly\nQbPdpNvo8PbVt3hewGTjsYlSrgY9PM+hZFlM50t++pN/wuDimsVsiqSIbG1v0+sPUXSDkqlyZ/cQ\nZ+UhqiqSLLDbadE7vyJLbxeLiMQ0a1UqxSqirNJstUiiCENR+Oz5M15++w4/STm/PkfRRDRFhhA0\nUaHVruMHDlbR5vNffc7DBw8QBZHNZs3u/j6NdpXd/T1cd0MUJ8yXc0p2iXffvmMynLDV7SIIUK7U\nSOKUlAxZub3ygJRCscyd/SM8z0GSZcaLOZppU2nUWS5mZCRsbW/T7e4RJSGKDFudFoqiMp0vsVXY\n3tpFRiLxbn+m+L5Do1knCgNOXr5FSUXu371LuFmhyxKryYRyuYIkKxx/8xrHdW/vvOZjnj17iGXq\nlGwbd+Ni2xau79EbDZA1FdfzaNVr3L97gECMUdDpD8e4AVz2hhQKBtVameFgyGrtUClXcDZTNF2m\n17shTUTuHB7SvzyBZINSKCIrGkmakYkpWztN/CAiiUDWdN6fnVKqllmuVoxmc54+e8rBwS5B6BGG\nAUeH9wmjmHfvTnA9D8jY3d0lcH0cxyFJEpbrFd29XQbjEXv7ByiqQr8/wDANNsslT588Igp9dNOk\nu327E1dTbh/xX5z3qVSqbJwVpqFSqdhosgppQhB5yJLKdDRBFmRGwymeF1Fv1jEMhSjysStlBE1h\n9/593CyjP5hQtKoomYQMLJwNmiCShTHFUgG7bJGEAaWCSeA7dLa7xFnK1dU1hYLN5fkV1/0+9x7d\n5yc//UuC9YKCZeKFHrVGndN3p/gbH3ftoekmpVoJq2Bw72ifgqEiyRJr18E0TKIowqrWWcymPHr0\nkG/fvP6uOVTAWW3QjQKSroB0u1Tk7as3pGnKxnVI4ogkStgEMYahI4rguQGj0ZgsBkGCIPCIkxTP\n8QCBT/7mT7d9fq8TS3N3TkbCg3sP2d7fw5MEZksPdx1CKrFyXO7dv0e7UqGs61SKOnHi8OPnT/jo\n8IDxxQDPWWM3Cuw/PEBSFXRJw1Ju//IGno8saVSqDWJRpNiu8PDZPWRJYLvcwNQLhGGAwO0E0puX\nr3n97St+/etfE4cBo+GI8XhCQoaqykwnU1RZxrIsIMX9rgfp/OICWZaJs5QUgULBZGurha4b/O6L\n3/Ps449ZL1fYuomMwHg0giijYJqMFgsuJ2OuBzeEcUyMgF4wWa5XrFYLXrx4QbVRQyub7B5to+ky\nqq4wnI0YLaYc3T/i4cO7/PD5U6QwwhYNZMFksQ54d/Gexm6DQtmk1mhRKjWx7RKPHj7k/v1Doijl\ny99+yXBwQ7VWRDc0kiQhDEOuezdcnF/dPrVaL0BISJIQRZWRFRlJuG1BtUoWSZxQbzVod7eot5us\nNxvu3LvH9s42siLeLh0ulzAMHc3U0UyNgm1SbzZwQ4c3797Q7/X5+MkTPnr89PatbZxwd/8AmQx3\nOYMsodvp8PjJYwRRZDDss5rN6dQb+K7DTrdDtVqhWi2TCSmtboe9O4ccn54wnk9odZt0uk129jqU\nKxa/+MW/otEu0tne4ej+R8yXMaPRgvlsSalaoV6vU28UQYhwNitK5TLT2QrDstg76OL5t5NYKSKi\nLLG9t81ysybOUpqdDhvHo7O3TbPdwrSLNFtNxtMR89UcRZOp1Jq8Oznjv/63/87J+3NqjSaCIJGl\nApppoKoqzU6bnd0dFqs537x8wf/61f+g2+1iWgaT6ZRgPadWtbArBWrNGp7nEPsuu50GuiKSpiFB\n5NPpNqnXLRqVIoG35uTkLQkJ7uZ2fPSPf/gGRTYpmEV2dnaRVJFCxWARLDBqVZxI4PR0hLtJyOKM\nxXLK9mGXH332Q6QspVKykQSRwPVptpoEgYeIgCIJ2JZBuVxkNBriRyHVeg3btnn1+hXtVo1uu02/\n12c6nrJerhkNRviBh27IDPt97hzsMxmNCYOY5WKNJisAVKtllssF5XIZz/MIw5DBcIyARLvVoVIs\nkQoiqm5iFIqkiAiSSApUavXbwsDRmMFggB8GtDttNM0gSRKGNyOcjUet1qBSa/D+7PzP5tj3uwpP\nBkER6RzsMNmsUQoWS8djOlqgCxqNcp3Ac5hNxli6iruY4s5H1IoG71+9YHoz4eT9CZkhYtXLtFod\n1rMVVdNCCG73P/bPe1y+77F0NvRmPZ7/5aeUyxa6KNNut9EUhe2tNl/+9gu+/N3vkBWZTqdJFEU0\n6nV293cRJHADH8MwsGwLUzeI45Drfh9ZlqhVq+iKSq1YpV6tYZkmsizjORt+89sv+fL3f+D5D56z\nWi+5Pj+nqOhsZgtUVWWx3hCmGdPFnGKhQO+6hxdFqKbBer3GNHUGoyHvTk4QFYnLyzNUReDegzsI\nElwP+hyfnJBFMWKa4Xu3C66XjkcmyYzGY96+/pZmo85qtUIzdA7uHDAY9ri+6iNmAnEcctO7plwu\nkqQR1VINCZnLix6aauC5Hp2tFqoicP/RPeIsBUROT04ZTYZoBYN6u83+4SHFUglBEGh99y7UMgu8\nfvOKLEsZT4ckWUytUcMu2yycBW/eH6OULY4e3uPzz/83oihiVytIhoGoKjx6/IBisYBpmRRbVfbu\n3aXcqlFrt9BEGUOR0WWJTrdJRkSShsi6giABosDTTz9iq9tmd2+bH/3kM7rdDkdHRwSBx3I2YzKe\n8Ov/8wWqat7Ou89XyJJKwbaQJAnbLlCuWpiWQWu7TavTorO7RaPboFiqYNu3G5ASMqIkxrQKzBdr\ntrb32N7dp9Zs4voe8+UCz3O47p2zXq8Zjyf8z199znS+ptPeYjKZMV+s2Gw2jMdjgiBgPp9TrVcZ\nTSY8ePwQQZJ49eYVd+7fNt+26lXen56wmC8wDBNn7TIdTajYRS7OzpBkEatUoFy1kSVYTEbImcDX\nX78kCGNGoxt2dw8pF6uYpsnd+4cEkXN7aihoyLbOIvRYBgnjqcOTR08IvBXbO00G4xsEIePg8IDn\nn36Mbqjs7O9w//59ipaNJEAcBbenKSFjNZ9RsgtUKxXGw9HthFKa8u74DQXLQtcKdDtdHj18yA//\n4of47po49JAlgcFVj1q5RsEoMBvPicOIXq/Hy29eIssy/X4fx3O5GY3o9wacvDnm7OQUXdfJBJgv\nltTqNba2tiiVbYIgYDqdMp/PWcwXuK7LdDJlsVgwmcwIw5AMWCwWXF/1mMwWfzbHvtcQLSoqplUg\ntXWuZhNkSWW9cIgjKKgWrVKF9WJJJgtMVzNkMsqyhD+fsFxNQVZY+x5O4uOELgc7uzw9usePPv4Y\n33NIopjZZI6QiiiqRH/Uw098Dg4PiaKI1WpFGITYtk2jWsOyLNarNa12C9IYx73tnckEKJZtKrUy\nYRgiyzL1ep2N5yLpKts7W6iiRBpG7G51eXjvLiIQRRGCJPLVy1d89uMf8/DeXZ49fEClYFPSbcbD\nCZuNi+P61Ct1ysUSYRDQ69/grl3SKMY2TC7OL5gs5piajqXr/PjTTxgP+py/e4UqwHi04Lo3xTAt\nWu06tWaFYv12Icinz35I5qaUdQNdyUgI+IcvvyBTNJyNR71eZ7vbZbVcsXFWTCdzqtUqqmJQsMo4\njsdms+Kmd40owXQ6JkszDMPg0ZMHeJ6H6ziEcUgqChiWhajcDjD43m27Yhj6nJ69Y+Wuubo+56J3\nQbFcYrKaYdaLPPvpZ9x9/ADf8/nl3/0dN5MJU2dFc3cLs6BRKZewyhaVVpNQkSjWqwiqyOPHjxAR\nMHWDKPDp92/HUl98/Y+8Pz9jNLlB0mRanSaD4TUvX33D9bDPxtvw93//Ky5PLknjmHLZotEscnjQ\nRVVVvvrHb1jMHV5/e8xyuebtu1P8LKQ37qEXdTZ+QIpGKojU6i36/T5JGiFIApPpnPlyxfX1FYZh\n0hv0uBmOMfQCne4WrU7zdn3h8Qn1aoPHj5/S3uri+T4Xl9eYloWqqhzdu0eaZdyMR6zXa+xykWLZ\nJk5j1us1z59/irf2GQ1G1BttslTmqz++otvaQUFhs9qw1d7m/r0n7O4eMLwZoik6vhsioDIcLvG9\nEElSePbxM7b2GgxnZ7x48QfWawfHjfDTlP5swu9fvMD1PYbDK7rbFRxvTYbMdDai37umd9Pj+P0J\npmVQLJcJ44QgCCgWbZaLGWKWMZlMaLc6vH75LaPBDVkYI6YJ09GEgm4QeCHu2uPs9IzQ92h3mty9\nu89N7xrTMLi+7rG3d0Cj0WJ4M+Tq+pLlfIVhGEiywNpxqFSrgIip3+4C8H2f6+s+08WCMIjxwxBR\nkjh+95bxaEypVELVVHRdR5Il7O+eLyZxxny+5Ks/fM31VZ9Go/Vnc0zIsuzPT9fncrlc7k/6Xr9E\nc7lc7v93eYjmcrncB8hDNJfL5T5AHqK5XC73AfIQzeVyuQ+Qh2gul8t9gDxEc7lc7gPkIZrL5XIf\nIA/RXC6X+wB5iOZyudwHyEM0l8vlPkAeorlcLvcB8hDN5XK5D5CHaC6Xy32APERzuVzuA+Qhmsvl\nch8gD9FcLpf7AHmI5nK53AfIQzSXy+U+QB6iuVwu9wHyEM3lcrkPkIdoLpfLfYA8RHO5XO4D/D9c\nxqy3qUfHIAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "gazelle 0.92\n", "\u001b[1mtoaster 0.06\u001b[0m\n", "hare 0.00\n", "car mirror 0.00\n", "crash helmet 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVEAAAFNCAYAAAC5YlyiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvXmUZkd1J/i7Ee/LtbJKtaqkEiqp\ntC8gISQkCxAGBIKDARubBm+0D9h4vLTtxm2D3W33uMc23tvjpd0eu912e9zgre2hAUMjG7EbkAQS\nSGhXSdSiUu1VuX7fe3Hnj4gbcSNefFnycM6kfE7GOXky8/vei+XGjbvfG8TMjPW23tbbeltv/5+a\nWesJrLf1tt7W2z/ntk5E19t6W2/r7eto60R0va239bbevo62TkTX23pbb+vt62jrRHS9rbf1tt6+\njrZORNfbeltv6+3raOtEdL2tt/W23r6Otk5E19t6W2/r7eto60R0va239bbevo7WrOXgL3zX3bBE\nICL/gWMwMxj+f0eAJFQRAUQEZgZJkhUTyoQrZo4/sV8AzrnQD6XnTHoHIPSbCe+2sNbGPpgZxhhY\n5/t18HNgY0FEcM5l4xsG2Ej//jumNDYFGBDr9VIch5lVn1atoQMzw1qLzsm8GjjnYBR7ZHS+T05r\nYmZQeBZwGVxI/a/h4Ndi4hw7AgzC/lGCjbQM/qzgLmssxmFmsCPAUFy/H53yfQufM6U9zeY7Jgkv\n9hH6MZTvuf88jWOMARyHuVCAq0FDBs45dOji2HpeAGCJ0HUdrLUgSp9r3HQw2fsaRym8r9dGxXyd\n0/AzGe7U1q7Hcc5hYEPfYU9dOGMm4KEN6wTg8ZACvhP8ulqXzQUm4abrAvzIr9UEhGy5jeu3sHEN\ngufynQHFv/Xneg1N08RzYYwBDGUw0H1p+AP+THaBAJRjZ3AN5/bu37q6j1ChrSkRLQ+QRn6/GI1E\nafNtAHrXpYMbCVEF4UqCKt8zEsHVfRhjQGTRtm1vrgJk5xwM+Y0jRkRA9g+BkDaHgPiM9EEAHPJ5\nsV9mNm9B4vgeMfwrJoLLE3GCJnblmmXMOrNA8ZwmSrmy4tivT2DmyCNkNnE1B9Vzj+HJwUpE1QK2\nPx/ffYU4j9ljTXDL5jgnaNl8wyyyPgggGAB1HMrmX3zvCSjBOQYRB7yiKkOvvW8UJxxHGMOTvWfK\n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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "\u001b[1mtoaster 1.00\u001b[0m\n", "crash helmet 0.00\n", "flagpole, flagstaff 0.00\n", "soap dispenser 0.00\n", "car mirror 0.00\n", "\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "{'logloss': 1.7816668368635848,\n", " 'loss': 5.939748764038086,\n", " 'time': 2.4360480308532715,\n", " 'top5': 37,\n", " 'win': 6}" ] }, "metadata": { "tags": [] }, "execution_count": 13 } ] }, { "metadata": { "id": "G9wNyg27zg05", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 119 }, "outputId": "e526f99b-18d1-4e89-f326-b9ecc22f0a17", "executionInfo": { "status": "ok", "timestamp": 1517598213789, "user_tz": 480, "elapsed": 160581, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "toaster_win_rates = calculate_win_rates(models)\n", "save_obj(toaster_win_rates, \"toaster_win_rates\")" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Evaluating resnet50\n", "Evaluating xception\n", "Evaluating inceptionv3\n", "Evaluating vgg16\n", "Evaluating vgg19\n", "Calculated wins in 160s\n" ], "name": "stdout" } ] }, { "metadata": { "id": "YWPlQzpFPLqe", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 376 }, "outputId": "71db796d-8070-4732-8996-38081108d2a3", "executionInfo": { "status": "ok", "timestamp": 1517598214344, "user_tz": 480, "elapsed": 513, "user": { "displayName": "Tom Brown", "photoUrl": "//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg", "userId": "100174716380421537647" } } }, "cell_type": "code", "source": [ "cross_model_win_rates = load_obj(\"toaster_win_rates\")\n", "plot_win_rates(toaster_win_rates, MODEL_NAMES, \"Real toaster success rate\")" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "qZzMx_n5PNYL", "colab_type": "code", "colab": { "autoexec": { "startup": false, "wait_interval": 0 } } }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] } ] } ================================================ FILE: cleverhans_v3.1.0/examples/adversarial_patch/README.md ================================================ # Adversarial Patch Code from [Adversarial Patch (Tom B. Brown, Dandelion Mané, Aurko Roy, Martín Abadi, Justin Gilmer)](https://arxiv.org/abs/1712.09665) > We present a method to create universal, robust, targeted adversarial image patches in the real world. The patches are universal because they can be used to attack any scene, robust because they work under a wide variety of transformations, and targeted because they can cause a classifier to output any target class. These adversarial patches can be printed, added to any scene, photographed, and presented to image classifiers; even when the patches are small, they cause the classifiers to ignore the other items in the scene and report a chosen target class. We recommend using Colab to host this notebook. You can run it at the following URL: https://colab.research.google.com/drive/1hSq_D5s9FWs2MH6BNyf6cTRBXEGcYO_D ================================================ FILE: cleverhans_v3.1.0/examples/facenet_adversarial_faces/README.md ================================================ # FGSM against Facenet This directory contains an implementation of the FGSM attack against one of the face recognition CNNs of the Facenet library. You can find a detailed article [here](https://brunolopezgarcia.github.io/2018/05/09/Crafting-adversarial-faces.html). ## How to run In order to run this example you need to do the following: 1. Install the Facenet library, download and align the LFW faces and download a pretrained Facenet model. You can do that following the next Facenet tutorial: https://github.com/davidsandberg/facenet/wiki/Validate-on-LFW (Running the validate_on_lfw script is not necessary). The datasets and the models folders must be in the folder of this example. 2. Install Pillow: https://pillow.readthedocs.io/en/stable/ 3. Change the following line in the facenet_fgsm.py script with the name of the .pb file of the model you downloaded: ``` model_path = "models/facenet/20180402-114759/20180402-114759.pb" ``` 4. Run the script: ``` python facenet_fgsm.py ``` 5. The Facenet models dimensions are sometimes changed by its developer, so if the script gives you an error regarding the dimensions of the input shapes, you must change this line to use the proper number: ``` self.victim_embedding_input = tf.placeholder( tf.float32, shape=(None, 512)) ``` ================================================ FILE: cleverhans_v3.1.0/examples/facenet_adversarial_faces/facenet_fgsm.py ================================================ import facenet import tensorflow as tf import numpy as np from cleverhans.model import Model from cleverhans.attacks import FastGradientMethod import set_loader class InceptionResnetV1Model(Model): model_path = "models/facenet/20180402-114759/20180402-114759.pb" def __init__(self): super(InceptionResnetV1Model, self).__init__(scope="model") # Load Facenet CNN facenet.load_model(self.model_path) # Save input and output tensors references graph = tf.get_default_graph() self.face_input = graph.get_tensor_by_name("input:0") self.embedding_output = graph.get_tensor_by_name("embeddings:0") def convert_to_classifier(self): # Create victim_embedding placeholder self.victim_embedding_input = tf.placeholder(tf.float32, shape=(None, 512)) # Squared Euclidean Distance between embeddings distance = tf.reduce_sum( tf.square(self.embedding_output - self.victim_embedding_input), axis=1 ) # Convert distance to a softmax vector # 0.99 out of 4 is the distance threshold for the Facenet CNN threshold = 0.99 score = tf.where( distance > threshold, 0.5 + ((distance - threshold) * 0.5) / (4.0 - threshold), 0.5 * distance / threshold, ) reverse_score = 1.0 - score self.softmax_output = tf.transpose(tf.stack([reverse_score, score])) # Save softmax layer self.layer_names = [] self.layers = [] self.layers.append(self.softmax_output) self.layer_names.append("logits") def fprop(self, x, set_ref=False): return dict(zip(self.layer_names, self.layers)) with tf.Graph().as_default(): with tf.Session() as sess: # Load model model = InceptionResnetV1Model() # Convert to classifier model.convert_to_classifier() # Load pairs of faces and their labels in one-hot encoding size = 100 faces1, faces2, labels = set_loader.load_testset(size) # Create victims' embeddings using Facenet itself graph = tf.get_default_graph() phase_train_placeholder = graph.get_tensor_by_name("phase_train:0") feed_dict = {model.face_input: faces2, phase_train_placeholder: False} victims_embeddings = sess.run(model.embedding_output, feed_dict=feed_dict) # Define FGSM for the model steps = 1 eps = 0.01 alpha = eps / steps fgsm = FastGradientMethod(model) fgsm_params = {"eps": alpha, "clip_min": 0.0, "clip_max": 1.0} adv_x = fgsm.generate(model.face_input, **fgsm_params) # Run FGSM adv = faces1 for i in range(steps): print("FGSM step " + str(i + 1)) feed_dict = { model.face_input: adv, model.victim_embedding_input: victims_embeddings, phase_train_placeholder: False, } adv = sess.run(adv_x, feed_dict=feed_dict) # Test accuracy of the model batch_size = graph.get_tensor_by_name("batch_size:0") feed_dict = { model.face_input: faces1, model.victim_embedding_input: victims_embeddings, phase_train_placeholder: False, batch_size: 64, } real_labels = sess.run(model.softmax_output, feed_dict=feed_dict) accuracy = np.mean( (np.argmax(labels, axis=-1)) == (np.argmax(real_labels, axis=-1)) ) print("Accuracy: " + str(accuracy * 100) + "%") # Test accuracy against adversarial examples feed_dict = { model.face_input: adv, model.victim_embedding_input: victims_embeddings, phase_train_placeholder: False, batch_size: 64, } adversarial_labels = sess.run(model.softmax_output, feed_dict=feed_dict) same_faces_index = np.where((np.argmax(labels, axis=-1) == 0)) different_faces_index = np.where((np.argmax(labels, axis=-1) == 1)) accuracy = np.mean( (np.argmax(labels[same_faces_index], axis=-1)) == (np.argmax(adversarial_labels[same_faces_index], axis=-1)) ) print( "Accuracy against adversarial examples for " + "same person faces (dodging): " + str(accuracy * 100) + "%" ) accuracy = np.mean( (np.argmax(labels[different_faces_index], axis=-1)) == (np.argmax(adversarial_labels[different_faces_index], axis=-1)) ) print( "Accuracy against adversarial examples for " + "different people faces (impersonation): " + str(accuracy * 100) + "%" ) # Save images to folder set_loader.save_images(adv, faces1, faces2, size) ================================================ FILE: cleverhans_v3.1.0/examples/facenet_adversarial_faces/set_loader.py ================================================ import shutil import os import lfw import facenet import numpy as np from PIL import Image pairs_path = "datasets/lfw/pairs.txt" testset_path = "datasets/lfw/lfw_mtcnnpy_160" image_size = 160 def save_images(adv, faces1, faces2, size): save_images_to_folder(adv, size, "images/adversarial/") save_images_to_folder(0.5 + (adv - faces1), size, "images/noise/") save_images_to_folder(faces1, size, "images/faces1/") save_images_to_folder(faces2, size, "images/faces2/") def save_images_to_folder(images, size, path): if os.path.isdir(path): shutil.rmtree(path) os.makedirs(path) for index in range(images.shape[0]): if index < size: image_array = (np.reshape(images[index], (160, 160, 3)) * 255).astype( np.uint8 ) Image.fromarray(image_array, "RGB").save(path + str(index) + ".png") def load_testset(size): # Load images paths and labels pairs = lfw.read_pairs(pairs_path) paths, labels = lfw.get_paths(testset_path, pairs) # Random choice permutation = np.random.choice(len(labels), size, replace=False) paths_batch_1 = [] paths_batch_2 = [] for index in permutation: paths_batch_1.append(paths[index * 2]) paths_batch_2.append(paths[index * 2 + 1]) labels = np.asarray(labels)[permutation] paths_batch_1 = np.asarray(paths_batch_1) paths_batch_2 = np.asarray(paths_batch_2) # Load images faces1 = facenet.load_data(paths_batch_1, False, False, image_size) faces2 = facenet.load_data(paths_batch_2, False, False, image_size) # Change pixel values to 0 to 1 values min_pixel = min(np.min(faces1), np.min(faces2)) max_pixel = max(np.max(faces1), np.max(faces2)) faces1 = (faces1 - min_pixel) / (max_pixel - min_pixel) faces2 = (faces2 - min_pixel) / (max_pixel - min_pixel) # Convert labels to one-hot vectors onehot_labels = [] for index in range(len(labels)): if labels[index]: onehot_labels.append([1, 0]) else: onehot_labels.append([0, 1]) return faces1, faces2, np.array(onehot_labels) ================================================ FILE: cleverhans_v3.1.0/examples/imagenet_featadvs/model.py ================================================ # pylint: disable=missing-docstring import functools import tensorflow as tf from cleverhans.initializers import HeReLuNormalInitializer from cleverhans.model import Model class ModelImageNetCNN(Model): def __init__(self, scope, nb_classes=1000, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs my_conv = functools.partial( tf.layers.conv2d, kernel_size=3, strides=2, padding="valid", activation=tf.nn.relu, kernel_initializer=HeReLuNormalInitializer, ) my_dense = functools.partial( tf.layers.dense, kernel_initializer=HeReLuNormalInitializer ) with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): for depth in [96, 256, 384, 384, 256]: x = my_conv(x, depth) y = tf.layers.flatten(x) y = my_dense(y, 4096, tf.nn.relu) y = fc7 = my_dense(y, 4096, tf.nn.relu) y = my_dense(y, 1000) return {"fc7": fc7, self.O_LOGITS: y, self.O_PROBS: tf.nn.softmax(logits=y)} def make_imagenet_cnn(input_shape=(None, 224, 224, 3)): return ModelImageNetCNN("imagenet") ================================================ FILE: cleverhans_v3.1.0/examples/madry_lab_challenges/LICENSE ================================================ Note: Some files in this directory are derivative works of the Madry Lab's MNIST challenge, which has the following copyright: Copyright (c) 2017 Aleksander Madry, Aleksandar Makelov, Ludwig Schmidt, Dimitris Tsipras, and Adrian Vladu. The MNIST challenge is released under the MIT License, as is CleverHans. ================================================ FILE: cleverhans_v3.1.0/examples/madry_lab_challenges/README ================================================ This example provides a CleverHans wrapper for the Madry Lab challenges. To run the attack on MNIST: 1. Clone the MNIST challenge repository from: https://github.com/MadryLab/mnist_challenge 2. Obtain some weights for the Madry Lab model, following the readme from their project (either download their presupplied weights or train your own). 3. Set your MNIST_CHALLENGE_DIR environment variable to point to the repository you cloned in step 1 4. Run `python mnist/attack_model.py` To run the attack on CIFAR-10 1. Clone the CIFAR-10 challenge repository from: https://github.com/MadryLab/cifar10_challenge 2. Same as for MNIST 3. Set your CIFAR10_CHALLENGE_DIR environment variable to point to repository from step 1. 4. Run `python cifar10/attack_model.py` ================================================ FILE: cleverhans_v3.1.0/examples/madry_lab_challenges/cifar10/attack_model.py ================================================ """Runs CleverHans attacks on the Madry Lab CIFAR-10 challenge model """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import sys import time import numpy as np import logging import tensorflow as tf from tensorflow.python.platform import app, flags from cleverhans.utils import set_log_level, to_categorical from cleverhans.utils_tf import model_eval import cifar10_input FLAGS = flags.FLAGS def main(argv): model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir) if model_file is None: print("No model found") sys.exit() cifar = cifar10_input.CIFAR10Data(FLAGS.dataset_dir) nb_classes = 10 X_test = cifar.eval_data.xs Y_test = to_categorical(cifar.eval_data.ys, nb_classes) assert Y_test.shape[1] == 10.0 set_log_level(logging.DEBUG) with tf.Session() as sess: x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3)) y = tf.placeholder(tf.float32, shape=(None, 10)) from cleverhans.model_zoo.madry_lab_challenges.cifar10_model import make_wresnet model = make_wresnet() saver = tf.train.Saver() # Restore the checkpoint saver.restore(sess, model_file) nb_samples = FLAGS.nb_samples attack_params = { "batch_size": FLAGS.batch_size, "clip_min": 0.0, "clip_max": 255.0, } if FLAGS.attack_type == "cwl2": from cleverhans.attacks import CarliniWagnerL2 attacker = CarliniWagnerL2(model, sess=sess) attack_params.update( { "binary_search_steps": 1, "max_iterations": 100, "learning_rate": 0.1, "initial_const": 10, "batch_size": 10, } ) else: # eps and eps_iter in range 0-255 attack_params.update({"eps": 8, "ord": np.inf}) if FLAGS.attack_type == "fgsm": from cleverhans.attacks import FastGradientMethod attacker = FastGradientMethod(model, sess=sess) elif FLAGS.attack_type == "pgd": attack_params.update({"eps_iter": 2, "nb_iter": 20}) from cleverhans.attacks import MadryEtAl attacker = MadryEtAl(model, sess=sess) eval_par = {"batch_size": FLAGS.batch_size} if FLAGS.sweep: max_eps = 16 epsilons = np.linspace(1, max_eps, max_eps) for e in epsilons: t1 = time.time() attack_params.update({"eps": e}) x_adv = attacker.generate(x, **attack_params) preds_adv = model.get_probs(x_adv) acc = model_eval( sess, x, y, preds_adv, X_test[:nb_samples], Y_test[:nb_samples], args=eval_par, ) print( "Epsilon %.2f, accuracy on adversarial" % e, "examples %0.4f\n" % acc, ) t2 = time.time() else: t1 = time.time() x_adv = attacker.generate(x, **attack_params) preds_adv = model.get_probs(x_adv) acc = model_eval( sess, x, y, preds_adv, X_test[:nb_samples], Y_test[:nb_samples], args=eval_par, ) t2 = time.time() print("Test accuracy on adversarial examples %0.4f\n" % acc) print("Took", t2 - t1, "seconds") if __name__ == "__main__": if "CIFAR10_CHALLENGE_DIR" in os.environ: cifar10_root = os.environ["CIFAR10_CHALLENGE_DIR"] default_ckpt_dir = os.path.join(cifar10_root, "models/adv_trained") default_data_dir = os.path.join(cifar10_root, "cifar10_data") flags.DEFINE_integer("batch_size", 100, "Batch size") flags.DEFINE_integer("nb_samples", 1000, "Number of samples to test") flags.DEFINE_string( "attack_type", "fgsm", ( "Attack type: 'fgsm'->'fast " "gradient sign method', " "'pgd'->'projected " "gradient descent', 'cwl2'->" "'Carlini & Wagner L2'" ), ) flags.DEFINE_string( "checkpoint_dir", default_ckpt_dir, "Checkpoint directory to load" ) flags.DEFINE_string("dataset_dir", default_data_dir, "Dataset directory") flags.DEFINE_bool("sweep", False, "Sweep epsilon or single epsilon?") app.run(main) ================================================ FILE: cleverhans_v3.1.0/examples/madry_lab_challenges/mnist/attack_model.py ================================================ """Runs CleverHans attacks on the Madry Lab MNIST challenge model """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import time import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data from tensorflow.python.platform import app from tensorflow.python.platform import flags from madry_mnist_model import MadryMNIST from cleverhans.utils_tf import model_eval from cleverhans.attacks import FastGradientMethod from cleverhans.attacks import BasicIterativeMethod from cleverhans.utils_mnist import data_mnist FLAGS = flags.FLAGS def main(argv): checkpoint = tf.train.latest_checkpoint(FLAGS.checkpoint_dir) if checkpoint is None: raise ValueError("Couldn't find latest checkpoint in " + FLAGS.checkpoint_dir) train_start = 0 train_end = 60000 test_start = 0 test_end = 10000 X_train, Y_train, X_test, Y_test = data_mnist( train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, ) assert Y_train.shape[1] == 10 # NOTE: for compatibility with Madry Lab downloadable checkpoints, # we cannot enclose this in a scope or do anything else that would # change the automatic naming of the variables. model = MadryMNIST() x_input = tf.placeholder(tf.float32, shape=[None, 784]) x_image = tf.placeholder(tf.float32, shape=[None, 28, 28, 1]) y = tf.placeholder(tf.float32, shape=[None, 10]) if FLAGS.attack_type == "fgsm": fgsm = FastGradientMethod(model) fgsm_params = {"eps": 0.3, "clip_min": 0.0, "clip_max": 1.0} adv_x = fgsm.generate(x_image, **fgsm_params) elif FLAGS.attack_type == "bim": bim = BasicIterativeMethod(model) bim_params = { "eps": 0.3, "clip_min": 0.0, "clip_max": 1.0, "nb_iter": 50, "eps_iter": 0.01, } adv_x = bim.generate(x_image, **bim_params) else: raise ValueError(FLAGS.attack_type) preds_adv = model.get_probs(adv_x) saver = tf.train.Saver() with tf.Session() as sess: # Restore the checkpoint saver.restore(sess, checkpoint) # Evaluate the accuracy of the MNIST model on adversarial examples eval_par = {"batch_size": FLAGS.batch_size} t1 = time.time() acc = model_eval(sess, x_image, y, preds_adv, X_test, Y_test, args=eval_par) t2 = time.time() print("Took", t2 - t1, "seconds") print("Test accuracy on adversarial examples: %0.4f\n" % acc) if __name__ == "__main__": dirs = ["models", "adv_trained"] if "MNIST_CHALLENGE_DIR" in os.environ: dirs.insert(0, os.environ["MNIST_CHALLENGE_DIR"]) default_checkpoint_dir = os.path.join(*dirs) flags.DEFINE_integer("batch_size", 128, "batch size") flags.DEFINE_float( "label_smooth", 0.1, ("Amount to subtract from correct label " "and distribute among other labels"), ) flags.DEFINE_string( "attack_type", "fgsm", ( "Attack type: 'fgsm'->fast gradient sign" "method, 'bim'->'basic iterative method'" ), ) flags.DEFINE_string( "checkpoint_dir", default_checkpoint_dir, "Checkpoint directory to load" ) app.run(main) ================================================ FILE: cleverhans_v3.1.0/examples/madry_lab_challenges/mnist/madry_mnist_model.py ================================================ """cleverhans.model.Model implementation of mnist_challenge.model.Model This re-implementation factors variable creation apart from forward propagation so it is possible to run forward propagation more than once in the same model. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from collections import OrderedDict import tensorflow as tf from cleverhans.model import Model from cleverhans.utils import deterministic_dict from cleverhans.dataset import Factory, MNIST class MadryMNIST(Model): def __init__(self, nb_classes=10): # NOTE: for compatibility with Madry Lab downloadable checkpoints, # we cannot use scopes, give these variables names, etc. self.W_conv1 = self._weight_variable([5, 5, 1, 32]) self.b_conv1 = self._bias_variable([32]) self.W_conv2 = self._weight_variable([5, 5, 32, 64]) self.b_conv2 = self._bias_variable([64]) self.W_fc1 = self._weight_variable([7 * 7 * 64, 1024]) self.b_fc1 = self._bias_variable([1024]) self.W_fc2 = self._weight_variable([1024, nb_classes]) self.b_fc2 = self._bias_variable([nb_classes]) Model.__init__(self, "", nb_classes, {}) self.dataset_factory = Factory(MNIST, {"center": False}) def get_params(self): return [ self.W_conv1, self.b_conv1, self.W_conv2, self.b_conv2, self.W_fc1, self.b_fc1, self.W_fc2, self.b_fc2, ] def fprop(self, x): output = OrderedDict() # first convolutional layer h_conv1 = tf.nn.relu(self._conv2d(x, self.W_conv1) + self.b_conv1) h_pool1 = self._max_pool_2x2(h_conv1) # second convolutional layer h_conv2 = tf.nn.relu(self._conv2d(h_pool1, self.W_conv2) + self.b_conv2) h_pool2 = self._max_pool_2x2(h_conv2) # first fully connected layer h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, self.W_fc1) + self.b_fc1) # output layer logits = tf.matmul(h_fc1, self.W_fc2) + self.b_fc2 output = deterministic_dict(locals()) del output["self"] output[self.O_PROBS] = tf.nn.softmax(logits=logits) return output @staticmethod def _weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) @staticmethod def _bias_variable(shape): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial) @staticmethod def _conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME") @staticmethod def _max_pool_2x2(x): return tf.nn.max_pool( x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME" ) ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/README.md ================================================ # MultiGPU Adversarial Training This directory includes scripts to train a model using a multi-GPU implementation of ["Madry et al. (2017)"](https://arxiv.org/abs/1706.06083) attack. ## MNIST Adversarial Training Train a model using a single GPU on MNIST. ```python CUDA_VISIBLE_DEVICES=0 python run_multigpu.py --attack_type_train FGSM --attack_type_test FGSM --adv_train ``` Train using `MadryEtal_y` attack. The default number of steps on MNIST is set to 40 for this attack. ```python CUDA_VISIBLE_DEVICES=0 python run_multigpu.py --attack_type_train MadryEtAl_y --attack_type_test FGSM,MadryEtAl_y --adv_train --save_dir runs/mnist_madry_advtrain --nb_epochs 200 --model_type madry ``` Here is the output after 200 iterations. ```text Clean accuracy, subsampled train (train_accuracy_subsampled): 1.0000 Clean accuracy, natural test (test_accuracy_natural): 0.9870 Test accuracy on adversarial examples (test_accuracy_FGSM): 0.9633 Test accuracy on adversarial examples (test_accuracy_MadryEtAl_y): 0.9483 ``` The same training can be done on 2 GPUs by setting `--ngpu 2` and `--attack_type_train MadryEtAl_y_multigpu`. Set the number iterations for the attack at training time via the flag `--attack_nb_iter_train`. ## CIFAR10 Adversarial Training This command trains a ResNet32 model on CIFAR10 using multi-GPU adversarial training. ```python CUDA_VISIBLE_DEVICES=0,1 python run_multigpu.py --attack_type_train MadryEtAl_y_multigpu --attack_type_test FGSM,MadryEtAl_y --ngpu 2 --save_dir runs/cifar10_advtrain --nb_epochs 200 --model_type resnet_tf --attack_nb_iter_train 7 --adv_train --dataset cifar10 --eval_iters 5 ``` Here is an example of the output of the command above at epoch 200. ```text Clean accuracy, subsampled train (train_accuracy_subsampled): 0.9560 Clean accuracy, natural test (test_accuracy_natural): 0.8989 Test accuracy on adversarial examples (test_accuracy_FGSM): 0.7986 Test accuracy on adversarial examples (test_accuracy_MadryEtAl_y): 0.7803 ``` ## Testing Run tests using the following commands: ```python CUDA_VISIBLE_DEVICES=0,1 python test_run_multigpu.py CUDA_VISIBLE_DEVICES=0,1 python test_runner.py CUDA_VISIBLE_DEVICES=0,1 python test_attack_multigpu.py ``` ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/attacks_multigpu.py ================================================ # pylint: disable=missing-docstring from collections import OrderedDict import tensorflow as tf from cleverhans.attacks import MadryEtAl from cleverhans.utils_tf import clip_eta from model import clone_variable class MadryEtAlMultiGPU(MadryEtAl): """ A multi-GPU version of the Projected Gradient Descent Attack (Madry et al. 2017). Paper link: https://arxiv.org/pdf/1706.06083.pdf This attack is designed to run on multiple GPUs for generating adversarial examples. Comparing to data parallelism, using this parallelization we can get very close to optimal n times speed up using n GPUs. The current implementation gets close to 6x speed up on 8 GPUs. """ def __init__(self, *args, **kwargs): """ Create a MadryEtAlMultiGPU instance. """ super(MadryEtAlMultiGPU, self).__init__(*args, **kwargs) self.structural_kwargs += ["ngpu"] def get_or_guess_labels(self, x, kwargs): device_name = "/gpu:0" self.model.set_device(device_name) with tf.device(device_name): with tf.variable_scope("model_pred"): ret = super(MadryEtAlMultiGPU, self).get_or_guess_labels(x, kwargs) return ret def attack(self, x, y_p, **kwargs): """ This method creates a symoblic graph of the MadryEtAl attack on multiple GPUs. The graph is created on the first n GPUs. Stop gradient is needed to get the speed-up. This prevents us from being able to back-prop through the attack. :param x: A tensor with the input image. :param y_p: Ground truth label or predicted label. :return: Two lists containing the input and output tensors of each GPU. """ inputs = [] outputs = [] # Create the initial random perturbation device_name = "/gpu:0" self.model.set_device(device_name) with tf.device(device_name): with tf.variable_scope("init_rand"): if self.rand_init: eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps) eta = clip_eta(eta, self.ord, self.eps) eta = tf.stop_gradient(eta) else: eta = tf.zeros_like(x) # TODO: Break the graph only nGPU times instead of nb_iter times. # The current implementation by the time an adversarial example is # used for training, the weights of the model have changed nb_iter # times. This can cause slower convergence compared to the single GPU # adversarial training. for i in range(self.nb_iter): # Create the graph for i'th step of attack inputs += [OrderedDict()] outputs += [OrderedDict()] device_name = x.device self.model.set_device(device_name) with tf.device(device_name): with tf.variable_scope("step%d" % i): if i > 0: # Clone the variables to separate the graph of 2 GPUs x = clone_variable("x", x) y_p = clone_variable("y_p", y_p) eta = clone_variable("eta", eta) inputs[i]["x"] = x inputs[i]["y_p"] = y_p outputs[i]["x"] = x outputs[i]["y_p"] = y_p inputs[i]["eta"] = eta eta = self.attack_single_step(x, eta, y_p) if i < self.nb_iter - 1: outputs[i]["eta"] = eta else: # adv_x, not eta is the output of the last step adv_x = x + eta if self.clip_min is not None and self.clip_max is not None: adv_x = tf.clip_by_value( adv_x, self.clip_min, self.clip_max ) adv_x = tf.stop_gradient(adv_x, name="adv_x") outputs[i]["adv_x"] = adv_x return inputs, outputs def generate_np(self, x_val, **kwargs): """ Facilitates testing this attack. """ _, feedable, _feedable_types, hash_key = self.construct_variables(kwargs) if hash_key not in self.graphs: with tf.variable_scope(None, "attack_%d" % len(self.graphs)): # x is a special placeholder we always want to have with tf.device("/gpu:0"): x = tf.placeholder(tf.float32, shape=x_val.shape, name="x") inputs, outputs = self.generate(x, **kwargs) from runner import RunnerMultiGPU runner = RunnerMultiGPU(inputs, outputs, sess=self.sess) self.graphs[hash_key] = runner runner = self.graphs[hash_key] feed_dict = {"x": x_val} for name in feedable: feed_dict[name] = feedable[name] fvals = runner.run(feed_dict) while not runner.is_finished(): fvals = runner.run() return fvals["adv_x"] def parse_params(self, ngpu=1, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param ngpu: (required int) the number of GPUs available. :param kwargs: A dictionary of parameters for MadryEtAl attack. """ return_status = super(MadryEtAlMultiGPU, self).parse_params(**kwargs) self.ngpu = ngpu return return_status ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/evaluator.py ================================================ """ Simplifying the evaluation of a model. Multiple attacks are initialized and run against a model at every evaluation step. """ import logging import tensorflow as tf from cleverhans.utils_tf import model_eval from cleverhans.attacks import FastGradientMethod from cleverhans.attacks import MadryEtAl from attacks_multigpu import MadryEtAlMultiGPU def create_adv_by_name(model, x, attack_type, sess, dataset, y=None, **kwargs): """ Creates the symbolic graph of an adversarial example given the name of an attack. Simplifies creating the symbolic graph of an attack by defining dataset-specific parameters. Dataset-specific default parameters are used unless a different value is given in kwargs. :param model: an object of Model class :param x: Symbolic input to the attack. :param attack_type: A string that is the name of an attack. :param sess: Tensorflow session. :param dataset: The name of the dataset as a string to use for default params. :param y: (optional) a symbolic variable for the labels. :param kwargs: (optional) additional parameters to be passed to the attack. """ # TODO: black box attacks attack_names = { "FGSM": FastGradientMethod, "MadryEtAl": MadryEtAl, "MadryEtAl_y": MadryEtAl, "MadryEtAl_multigpu": MadryEtAlMultiGPU, "MadryEtAl_y_multigpu": MadryEtAlMultiGPU, } if attack_type not in attack_names: raise Exception("Attack %s not defined." % attack_type) attack_params_shared = { "mnist": { "eps": 0.3, "eps_iter": 0.01, "clip_min": 0.0, "clip_max": 1.0, "nb_iter": 40, }, "cifar10": { "eps": 8.0 / 255, "eps_iter": 0.01, "clip_min": 0.0, "clip_max": 1.0, "nb_iter": 20, }, } with tf.variable_scope(attack_type): attack_class = attack_names[attack_type] attack = attack_class(model, sess=sess) # Extract feedable and structural keyword arguments from kwargs fd_kwargs = attack.feedable_kwargs.keys() + attack.structural_kwargs params = attack_params_shared[dataset].copy() params.update({k: v for k, v in kwargs.items() if v is not None}) params = {k: v for k, v in params.items() if k in fd_kwargs} if "_y" in attack_type: params["y"] = y logging.info(params) adv_x = attack.generate(x, **params) return adv_x class Evaluator(object): """ This class evaluates a model against multiple attacks. """ def __init__( self, sess, model, batch_size, x_pre, x, y, data, writer, hparams=None ): """ :param sess: Tensorflow session. :param model: an object of Model class :param batch_size: batch_size for evaluation. :param x_pre: placeholder for input before preprocessing. :param x: symbolic input to model. :param y: symbolic variable for the label. :param data: a tuple with training and test data in the form (X_train, Y_train, X_test, Y_test). :param writer: Tensorflow summary writer. :param hparams: Flags to control the evaluation. """ if hparams is None: hparams = {} model.set_training(False) self.preds = model.get_probs(x) self.sess = sess self.batch_size = batch_size self.x_pre = x_pre self.x = x self.y = y self.X_train, self.Y_train, self.X_test, self.Y_test = data self.writer = writer self.hparams = hparams # Evaluate on a fixed subsampled set of the train data self.eval_params = {"batch_size": batch_size} self.epoch = 0 self.attack_type_train = hparams.attack_type_train self.attack_type_test = [] for att_type in hparams.attack_type_test.split(","): if att_type == "": continue self.attack_type_test += [att_type] self.attacks = {} # Initialize the attack object and graph for att_type in self.attack_type_test: logging.info("Intializing attack %s" % att_type) adv_x = create_adv_by_name( model, x, att_type, sess, dataset=hparams.dataset, y=y ) model.set_training(False) preds_adv = model.get_probs(adv_x) self.attacks[att_type] = (adv_x, preds_adv) # visualize adversarial image tf.summary.image(att_type, adv_x, max_outputs=10) self.sum_op = tf.summary.merge_all() def log_value(self, tag, val, desc=""): """ Log values to standard output and Tensorflow summary. :param tag: summary tag. :param val: (required float or numpy array) value to be logged. :param desc: (optional) additional description to be printed. """ logging.info("%s (%s): %.4f" % (desc, tag, val)) self.summary.value.add(tag=tag, simple_value=val) def eval_advs(self, x, y, preds_adv, X_test, Y_test, att_type): """ Evaluate the accuracy of the model on adversarial examples :param x: symbolic input to model. :param y: symbolic variable for the label. :param preds_adv: symbolic variable for the prediction on an adversarial example. :param X_test: NumPy array of test set inputs. :param Y_test: NumPy array of test set labels. :param att_type: name of the attack. """ end = (len(X_test) // self.batch_size) * self.batch_size if self.hparams.fast_tests: end = 10 * self.batch_size acc = model_eval( self.sess, x, y, preds_adv, X_test[:end], Y_test[:end], args=self.eval_params, ) self.log_value( "test_accuracy_%s" % att_type, acc, "Test accuracy on adversarial examples" ) return acc def eval_multi(self, inc_epoch=True): """ Run the evaluation on multiple attacks. """ sess = self.sess preds = self.preds x = self.x_pre y = self.y X_train = self.X_train Y_train = self.Y_train X_test = self.X_test Y_test = self.Y_test writer = self.writer self.summary = tf.Summary() report = {} # Evaluate on train set subsample_factor = 100 X_train_subsampled = X_train[::subsample_factor] Y_train_subsampled = Y_train[::subsample_factor] acc_train = model_eval( sess, x, y, preds, X_train_subsampled, Y_train_subsampled, args=self.eval_params, ) self.log_value( "train_accuracy_subsampled", acc_train, "Clean accuracy, subsampled train" ) report["train"] = acc_train # Evaluate on the test set acc = model_eval(sess, x, y, preds, X_test, Y_test, args=self.eval_params) self.log_value("test_accuracy_natural", acc, "Clean accuracy, natural test") report["test"] = acc # Evaluate against adversarial attacks if self.epoch % self.hparams.eval_iters == 0: for att_type in self.attack_type_test: _, preds_adv = self.attacks[att_type] acc = self.eval_advs(x, y, preds_adv, X_test, Y_test, att_type) report[att_type] = acc if self.writer: writer.add_summary(self.summary, self.epoch) # Add examples of adversarial examples to the summary if self.writer and self.epoch % 20 == 0 and self.sum_op is not None: sm_val = self.sess.run( self.sum_op, feed_dict={x: X_test[: self.batch_size], y: Y_test[: self.batch_size]}, ) if self.writer: writer.add_summary(sm_val) self.epoch += 1 if inc_epoch else 0 return report def __call__(self, **kwargs): return self.eval_multi(**kwargs) ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/make_model.py ================================================ # pylint: disable=missing-docstring from model import Conv2D, ReLU, Flatten, Linear, Softmax, MLP from model import MLPnGPU from model import Conv2DnGPU from model import LinearnGPU from model import MaxPool from resnet_tf import ResNetTF def make_basic_cnn(nb_filters=64, nb_classes=10, input_shape=(None, 28, 28, 1)): layers = [ Conv2D(nb_filters, (8, 8), (2, 2), "SAME"), ReLU(), Conv2D(nb_filters * 2, (6, 6), (2, 2), "VALID"), ReLU(), Conv2D(nb_filters * 2, (5, 5), (1, 1), "VALID"), ReLU(), Flatten(), Linear(nb_classes), Softmax(), ] model = MLP(nb_classes, layers, input_shape) return model def make_basic_ngpu(nb_classes=10, input_shape=(None, 28, 28, 1), **kwargs): """ Create a multi-GPU model similar to the basic cnn in the tutorials. """ model = make_basic_cnn() layers = model.layers model = MLPnGPU(nb_classes, layers, input_shape) return model def make_madry_ngpu(nb_classes=10, input_shape=(None, 28, 28, 1), **kwargs): """ Create a multi-GPU model similar to Madry et al. (arXiv:1706.06083). """ layers = [ Conv2DnGPU(32, (5, 5), (1, 1), "SAME"), ReLU(), MaxPool((2, 2), (2, 2), "SAME"), Conv2DnGPU(64, (5, 5), (1, 1), "SAME"), ReLU(), MaxPool((2, 2), (2, 2), "SAME"), Flatten(), LinearnGPU(1024), ReLU(), LinearnGPU(nb_classes), Softmax(), ] model = MLPnGPU(nb_classes, layers, input_shape) return model def make_model(model_type="madry", **kwargs): if model_type == "basic": return make_basic_ngpu(**kwargs) elif model_type == "madry": return make_madry_ngpu(**kwargs) elif model_type == "resnet_tf": return ResNetTF(**kwargs) else: raise Exception("model type not defined.") ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/model.py ================================================ """ MultiGPU model similar to the one used in model tutorials. The model keeps one copy of the weights on each device and handles syncing the parameters across devices. """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf from cleverhans.model import Model def clone_variable(name, x, trainable=False): return tf.get_variable(name, shape=x.shape, dtype=x.dtype, trainable=trainable) def unify_device_name(dname): """Converts TensorFlow device names in the format /Device:GPU0 to /gpu:0.""" if dname is None: return None return dname.lower().replace("device:", "") class MLP(Model): """ An example of a bare bones multilayer perceptron (MLP) class. """ def __init__(self, nb_classes, layers, input_shape): super(MLP, self).__init__("MLP", nb_classes=nb_classes, hparams={}) self.layer_names = [] self.layers = layers self.input_shape = input_shape if isinstance(layers[-1], Softmax): layers[-1].name = "probs" layers[-2].name = "logits" else: layers[-1].name = "logits" for i, layer in enumerate(self.layers): if hasattr(layer, "name"): name = layer.name else: name = layer.__class__.__name__ + str(i) layer.name = name self.layer_names.append(name) layer.set_input_shape(input_shape) input_shape = layer.get_output_shape() def fprop(self, x, set_ref=False): states = [] for layer in self.layers: if set_ref: layer.ref = x x = layer.fprop(x) assert x is not None states.append(x) states = dict(zip(self.layer_names, states)) return states def get_params(self): out = [] for layer in self.layers: for param in layer.get_params(): if param not in out: out.append(param) return out class Layer(object): def get_output_shape(self): return self.output_shape class Linear(Layer): def __init__(self, num_hid): self.num_hid = num_hid def set_input_shape(self, input_shape): batch_size, dim = input_shape self.input_shape = [batch_size, dim] self.output_shape = [batch_size, self.num_hid] init = tf.random_normal([dim, self.num_hid], dtype=tf.float32) init = init / tf.sqrt( 1e-7 + tf.reduce_sum(tf.square(init), axis=0, keep_dims=True) ) self.W = tf.Variable(init) self.b = tf.Variable(np.zeros((self.num_hid,)).astype("float32")) def fprop(self, x): return tf.matmul(x, self.W) + self.b def get_params(self): return [self.W, self.b] class Conv2D(Layer): def __init__(self, output_channels, kernel_shape, strides, padding): self.__dict__.update(locals()) del self.self def set_input_shape(self, input_shape): batch_size, _, __, input_channels = input_shape kernel_shape = tuple(self.kernel_shape) + (input_channels, self.output_channels) assert len(kernel_shape) == 4 assert all(isinstance(e, int) for e in kernel_shape), kernel_shape init = tf.random_normal(kernel_shape, dtype=tf.float32) init = init / tf.sqrt(1e-7 + tf.reduce_sum(tf.square(init), axis=(0, 1, 2))) self.kernels = tf.Variable(init) self.b = tf.Variable(np.zeros((self.output_channels,)).astype("float32")) input_shape = list(input_shape) input_shape[0] = 1 dummy_batch = tf.zeros(input_shape) dummy_output = self.fprop(dummy_batch) output_shape = [int(e) for e in dummy_output.get_shape()] output_shape[0] = batch_size self.output_shape = tuple(output_shape) def fprop(self, x): return ( tf.nn.conv2d( x, self.kernels, (1,) + tuple(self.strides) + (1,), self.padding ) + self.b ) def get_params(self): return [self.kernels, self.b] class ReLU(Layer): def __init__(self): pass def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def fprop(self, x): return tf.nn.relu(x) def get_params(self): return [] class Softmax(Layer): def __init__(self): pass def set_input_shape(self, shape): self.input_shape = shape self.output_shape = shape def fprop(self, x): return tf.nn.softmax(x) def get_params(self): return [] class Flatten(Layer): def __init__(self): pass def set_input_shape(self, shape): self.input_shape = shape output_width = 1 for factor in shape[1:]: output_width *= factor self.output_width = output_width self.output_shape = [shape[0], output_width] def fprop(self, x): return tf.reshape(x, [-1, self.output_width]) def get_params(self): return [] class MLPnGPU(MLP): """ A multi layer perceptron that can be copied over multiple GPUs. Only one copy of the weights is created on each device. """ def __init__(self, nb_classes, layers, input_shape): super(MLPnGPU, self).__init__(nb_classes, layers, input_shape) self.scope = "MLPnGPU" def fprop(self, x): with tf.variable_scope(self.scope): states = super(MLPnGPU, self).fprop(x) return states def set_device(self, device_name): """ Set the device before the next fprop to create a new graph on the specified device. """ device_name = unify_device_name(device_name) self.device_name = device_name for layer in self.layers: layer.device_name = device_name def create_sync_ops(self, host_device): """ Return a list of assignment operations that syncs the parameters of all model copies with the one on host_device. :param host_device: (required str) the name of the device with latest parameters """ host_device = unify_device_name(host_device) sync_ops = [] for layer in self.layers: if isinstance(layer, LayernGPU): sync_ops += layer.create_sync_ops(host_device) return sync_ops def set_training(self, training=False): for layer in self.layers: if isinstance(layer, LayernGPU): layer.set_training(training) class LayernGPU(Layer): """ A layer that has separate copies of model parameters on each GPU. """ def __init__(self): """ :param input_shape: a tuple or list as the input shape to layer """ self.input_shape = None self.params_device = {} self.params_names = None self.device_name = "/gpu:0" self.training = True def set_training(self, training=False): self.training = training def get_variable(self, name, initializer): """ Create and initialize a variable using a numpy array and set trainable. :param name: (required str) name of the variable :param initializer: a numpy array or a tensor """ v = tf.get_variable( name, shape=initializer.shape, initializer=(lambda shape, dtype, partition_info: initializer), trainable=self.training, ) return v def set_input_shape_ngpu(self, new_input_shape): """ Create and initialize layer parameters on the device previously set in self.device_name. :param new_input_shape: a list or tuple for the shape of the input. """ assert self.device_name, "Device name has not been set." device_name = self.device_name if self.input_shape is None: # First time setting the input shape self.input_shape = [None] + [int(d) for d in list(new_input_shape)] if device_name in self.params_device: # There is a copy of weights on this device self.__dict__.update(self.params_device[device_name]) return # Stop recursion self.params_device[device_name] = {} # Initialize weights on this device with tf.device(device_name): self.set_input_shape(self.input_shape) keys_after = self.__dict__.keys() if self.params_names is None: # Prevent overriding training self.params_names = [ k for k in keys_after if isinstance(self.__dict__[k], tf.Variable) ] params = {k: self.__dict__[k] for k in self.params_names} self.params_device[device_name] = params def create_sync_ops(self, host_device): """Create an assignment operation for each weight on all devices. The weight is assigned the value of the copy on the `host_device'. """ sync_ops = [] host_params = self.params_device[host_device] for device, params in (self.params_device).iteritems(): if device == host_device: continue for k in self.params_names: if isinstance(params[k], tf.Variable): sync_ops += [tf.assign(params[k], host_params[k])] return sync_ops def fprop(self, x): if self.name is None: self.set_input_shape_ngpu(x.shape[1:]) return self.fprop_noscope(x) else: with tf.variable_scope(self.name): self.set_input_shape_ngpu(x.shape[1:]) return self.fprop_noscope(x) class LinearnGPU(LayernGPU): def __init__(self, num_hid, w_name="W"): super(LinearnGPU, self).__init__() self.num_hid = num_hid self.w_name = w_name def set_input_shape(self, input_shape): batch_size, dim = input_shape self.input_shape = [batch_size, dim] self.output_shape = [batch_size, self.num_hid] shape = [dim, self.num_hid] with tf.variable_scope(self.name): init = tf.truncated_normal(shape, stddev=0.1) self.W = self.get_variable(self.w_name, init) self.b = self.get_variable( "b", 0.1 + np.zeros((self.num_hid,)).astype("float32") ) def fprop_noscope(self, x): return tf.matmul(x, self.W) + self.b class Conv2DnGPU(LayernGPU): def __init__( self, output_channels, kernel_shape, strides, padding, w_name="kernels" ): super(Conv2DnGPU, self).__init__() self.__dict__.update(locals()) del self.self self.w_name = w_name def set_input_shape(self, input_shape): assert len(input_shape) == 4 input_channels = input_shape[3] kernel_shape = tuple(self.kernel_shape) + (input_channels, self.output_channels) assert len(kernel_shape) == 4 assert all(isinstance(e, int) for e in kernel_shape), kernel_shape with tf.variable_scope(self.name): init = tf.truncated_normal(kernel_shape, stddev=0.1) self.kernels = self.get_variable(self.w_name, init) self.b = self.get_variable( "b", 0.1 + np.zeros((self.output_channels,)).astype("float32") ) input_shape = list(input_shape) self.input_shape = input_shape input_shape[0] = 1 dummy_batch = tf.zeros(input_shape) dummy_output = self.fprop(dummy_batch) output_shape = [int(e) for e in dummy_output.get_shape()] output_shape[0] = 1 self.output_shape = tuple(output_shape) def fprop_noscope(self, x): return ( tf.nn.conv2d( x, self.kernels, (1,) + tuple(self.strides) + (1,), self.padding ) + self.b ) class MaxPool(LayernGPU): def __init__(self, ksize, strides, padding): super(MaxPool, self).__init__() self.__dict__.update(locals()) del self.self def set_input_shape(self, input_shape): input_shape = list(input_shape) input_shape[0] = 1 dummy_batch = tf.zeros(input_shape) dummy_output = self.fprop(dummy_batch) output_shape = [int(e) for e in dummy_output.get_shape()] output_shape[0] = 1 self.output_shape = tuple(output_shape) def fprop_noscope(self, x): return tf.nn.max_pool( x, ksize=(1,) + tuple(self.ksize) + (1,), strides=(1,) + tuple(self.strides) + (1,), padding=self.padding, ) class LayerNorm(LayernGPU): def set_input_shape(self, input_shape): self.input_shape = list(input_shape) params_shape = [input_shape[-1]] self.params_shape = params_shape self.beta = tf.get_variable( "beta", params_shape, tf.float32, initializer=tf.constant_initializer(0.0, tf.float32), trainable=self.training, ) self.gamma = tf.get_variable( "gamma", params_shape, tf.float32, initializer=tf.constant_initializer(1.0, tf.float32), trainable=self.training, ) def fprop_noscope(self, x): mean = tf.reduce_mean(x, (1, 2), keep_dims=True) x = x - mean std = tf.sqrt(1e-7 + tf.reduce_mean(tf.square(x), (1, 2), keep_dims=True)) x = x / std return x * self.gamma + self.beta ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/resnet_tf.py ================================================ # https://github.com/tensorflow/models/blob/master/research/resnet/resnet_model.py # # Copyright 2016 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """ResNet model. Related papers: https://arxiv.org/pdf/1603.05027v2.pdf https://arxiv.org/pdf/1512.03385v1.pdf https://arxiv.org/pdf/1605.07146v1.pdf """ from collections import namedtuple import tensorflow as tf import six from model import MLPnGPU from model import Conv2DnGPU from model import LinearnGPU from model import LayerNorm HParams = namedtuple( "HParams", "batch_size, nb_classes, min_lrn_rate, lrn_rate, " "num_residual_units, use_bottleneck, weight_decay_rate, " "relu_leakiness, momentum", ) class ResNetTF(MLPnGPU): """ResNet model.""" def __init__(self, batch_size=None, name=None, **kwargs): NB_CLASSES = 10 super(ResNetTF, self).__init__( nb_classes=NB_CLASSES, layers=[], input_shape=None ) self.global_step = tf.contrib.framework.get_or_create_global_step() self.hps = HParams( batch_size=batch_size, nb_classes=NB_CLASSES, min_lrn_rate=0.0001, lrn_rate=0.1, num_residual_units=5, use_bottleneck=False, weight_decay_rate=0.0002, relu_leakiness=0.1, momentum=0.9, ) self.layers = [] self.layer_idx = 0 self.init_layers = True self.decay_cost = None self.training = None self.device_name = None def set_training(self, training=False): super(ResNetTF, self).set_training(training) self.training = training def fprop(self, x): self.layer_idx = 0 with tf.variable_scope("Resnet"): logits, probs = self._build_model(x) self.init_layers = False states = {"logits": logits, "probs": probs} return states def _stride_arr(self, stride): """Map a stride scalar to the stride array for tf.nn.conv2d.""" return [1, stride, stride, 1] def _build_model(self, x): """Build the core model within the graph.""" with tf.variable_scope("init"): x = self._conv("init_conv", x, 3, x.shape[3], 16, self._stride_arr(1)) strides = [1, 2, 2] activate_before_residual = [True, False, False] if self.hps.use_bottleneck: res_func = self._bottleneck_residual filters = [16, 64, 128, 256] else: res_func = self._residual filters = [16, 16, 32, 64] # Uncomment the following codes to use w28-10 wide residual # network. # It is more memory efficient than very deep residual network and # has # comparably good performance. # https://arxiv.org/pdf/1605.07146v1.pdf # filters = [16, 160, 320, 640] # Update hps.num_residual_units to 4 with tf.variable_scope("unit_1_0"): x = res_func( x, filters[0], filters[1], self._stride_arr(strides[0]), activate_before_residual[0], ) for i in six.moves.range(1, self.hps.num_residual_units): with tf.variable_scope("unit_1_%d" % i): x = res_func(x, filters[1], filters[1], self._stride_arr(1), False) with tf.variable_scope("unit_2_0"): x = res_func( x, filters[1], filters[2], self._stride_arr(strides[1]), activate_before_residual[1], ) for i in six.moves.range(1, self.hps.num_residual_units): with tf.variable_scope("unit_2_%d" % i): x = res_func(x, filters[2], filters[2], self._stride_arr(1), False) with tf.variable_scope("unit_3_0"): x = res_func( x, filters[2], filters[3], self._stride_arr(strides[2]), activate_before_residual[2], ) for i in six.moves.range(1, self.hps.num_residual_units): with tf.variable_scope("unit_3_%d" % i): x = res_func(x, filters[3], filters[3], self._stride_arr(1), False) with tf.variable_scope("unit_last"): x = self._layer_norm("final_bn", x) x = self._relu(x, self.hps.relu_leakiness) x = self._global_avg_pool(x) with tf.variable_scope("logit"): logits = self._fully_connected(x, self.hps.nb_classes) predictions = tf.nn.softmax(logits) return logits, predictions def build_cost(self, labels, logits): """ Build the graph for cost from the logits if logits are provided. If predictions are provided, logits are extracted from the operation. """ op = logits.op if "softmax" in str(op).lower(): (logits,) = op.inputs with tf.variable_scope("costs"): xent = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels) cost = tf.reduce_mean(xent, name="xent") cost += self._decay() cost = cost return cost def build_train_op_from_cost(self, cost): """Build training specific ops for the graph.""" self.lrn_rate = tf.constant(self.hps.lrn_rate, tf.float32, name="learning_rate") self.momentum = tf.constant(self.hps.momentum, tf.float32, name="momentum") trainable_variables = tf.trainable_variables() grads = tf.gradients(cost, trainable_variables) devs = {v.device for v in trainable_variables} assert len(devs) == 1, ( "There should be no trainable variables" " on any device other than the last GPU." ) optimizer = tf.train.MomentumOptimizer(self.lrn_rate, self.momentum) gv_pairs = zip(grads, trainable_variables) gv_pairs = [gv for gv in gv_pairs if gv[0] is not None] devs = {gv[1].device for gv in gv_pairs} assert len(devs) == 1, "There should be no gradients wrt" " vars on other GPUs." apply_op = optimizer.apply_gradients( gv_pairs, global_step=self.global_step, name="train_step" ) train_ops = [apply_op] train_op = tf.group(*train_ops) return train_op def _layer_norm(self, name, x): """Layer normalization.""" if self.init_layers: bn = LayerNorm() bn.name = name self.layers += [bn] else: bn = self.layers[self.layer_idx] self.layer_idx += 1 bn.device_name = self.device_name bn.set_training(self.training) x = bn.fprop(x) return x def _residual( self, x, in_filter, out_filter, stride, activate_before_residual=False ): """Residual unit with 2 sub layers.""" if activate_before_residual: with tf.variable_scope("shared_activation"): x = self._layer_norm("init_bn", x) x = self._relu(x, self.hps.relu_leakiness) orig_x = x else: with tf.variable_scope("residual_only_activation"): orig_x = x x = self._layer_norm("init_bn", x) x = self._relu(x, self.hps.relu_leakiness) with tf.variable_scope("sub1"): x = self._conv("conv1", x, 3, in_filter, out_filter, stride) with tf.variable_scope("sub2"): x = self._layer_norm("bn2", x) x = self._relu(x, self.hps.relu_leakiness) x = self._conv("conv2", x, 3, out_filter, out_filter, [1, 1, 1, 1]) with tf.variable_scope("sub_add"): if in_filter != out_filter: orig_x = tf.nn.avg_pool(orig_x, stride, stride, "VALID") orig_x = tf.pad( orig_x, [ [0, 0], [0, 0], [0, 0], [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2], ], ) x += orig_x return x def _bottleneck_residual( self, x, in_filter, out_filter, stride, activate_before_residual=False ): """Bottleneck residual unit with 3 sub layers.""" if activate_before_residual: with tf.variable_scope("common_bn_relu"): x = self._layer_norm("init_bn", x) x = self._relu(x, self.hps.relu_leakiness) orig_x = x else: with tf.variable_scope("residual_bn_relu"): orig_x = x x = self._layer_norm("init_bn", x) x = self._relu(x, self.hps.relu_leakiness) with tf.variable_scope("sub1"): x = self._conv("conv1", x, 1, in_filter, out_filter / 4, stride) with tf.variable_scope("sub2"): x = self._layer_norm("bn2", x) x = self._relu(x, self.hps.relu_leakiness) x = self._conv("conv2", x, 3, out_filter / 4, out_filter / 4, [1, 1, 1, 1]) with tf.variable_scope("sub3"): x = self._layer_norm("bn3", x) x = self._relu(x, self.hps.relu_leakiness) x = self._conv("conv3", x, 1, out_filter / 4, out_filter, [1, 1, 1, 1]) with tf.variable_scope("sub_add"): if in_filter != out_filter: orig_x = self._conv("project", orig_x, 1, in_filter, out_filter, stride) x += orig_x return x def _decay(self): """L2 weight decay loss.""" if self.decay_cost is not None: return self.decay_cost costs = [] if self.device_name is None: for var in tf.trainable_variables(): if var.op.name.find(r"DW") > 0: costs.append(tf.nn.l2_loss(var)) else: for layer in self.layers: for var in layer.params_device[self.device_name].values(): if isinstance(var, tf.Variable) and var.op.name.find(r"DW") > 0: costs.append(tf.nn.l2_loss(var)) self.decay_cost = tf.multiply(self.hps.weight_decay_rate, tf.add_n(costs)) return self.decay_cost def _conv(self, name, x, filter_size, in_filters, out_filters, strides): """Convolution.""" if self.init_layers: conv = Conv2DnGPU( out_filters, (filter_size, filter_size), strides[1:3], "SAME", w_name="DW", ) conv.name = name self.layers += [conv] else: conv = self.layers[self.layer_idx] self.layer_idx += 1 conv.device_name = self.device_name conv.set_training(self.training) return conv.fprop(x) def _relu(self, x, leakiness=0.0): """Relu, with optional leaky support.""" return tf.where(tf.less(x, 0.0), leakiness * x, x, name="leaky_relu") def _fully_connected(self, x, out_dim): """FullyConnected layer for final output.""" if self.init_layers: fc = LinearnGPU(out_dim, w_name="DW") fc.name = "logits" self.layers += [fc] else: fc = self.layers[self.layer_idx] self.layer_idx += 1 fc.device_name = self.device_name fc.set_training(self.training) return fc.fprop(x) def _global_avg_pool(self, x): assert x.get_shape().ndims == 4 return tf.reduce_mean(x, [1, 2]) ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/run_multigpu.py ================================================ """ This script adversarially trains a model using iterative attacks on multiple GPUs. """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging from collections import namedtuple from cleverhans.compat import app, flags from trainer import TrainerMultiGPU from trainer import TrainerSingleGPU def run_trainer(hparams): logging.basicConfig(format="%(asctime)s %(message)s", level=logging.INFO) if "multigpu" in hparams.attack_type_train: logging.info("Multi GPU Trainer.") trainer = TrainerMultiGPU(hparams) else: logging.info("Single GPU Trainer.") trainer = TrainerSingleGPU(hparams) trainer.model_train() trainer.eval(inc_epoch=False) return trainer.finish() def main(argv=None): f = {x: flags.FLAGS[x].value for x in dir(flags.FLAGS)} HParams = namedtuple("HParams", f.keys()) hparams = HParams(**f) run_trainer(hparams) if __name__ == "__main__": flags.DEFINE_integer("train_start", 0, "Index of first training set example.") flags.DEFINE_integer("train_end", 60000, "Index of last training set example.") flags.DEFINE_integer("test_start", 0, "Index of first test set example.") flags.DEFINE_integer("test_end", 10000, "Index of last test set example.") flags.DEFINE_integer("nb_epochs", 6, "Number of epochs to train model.") flags.DEFINE_integer("batch_size", 128, "Size of training batches.") flags.DEFINE_boolean("adv_train", False, "Whether to do adversarial training.") flags.DEFINE_boolean("save", True, "Whether to save from a checkpoint.") flags.DEFINE_string("save_dir", "runs/X", "Location to store logs/model.") flags.DEFINE_string("model_type", "madry", "Model type: basic|madry|resnet_tf.") flags.DEFINE_string( "attack_type_train", "MadryEtAl_y_multigpu", "Attack type for adversarial training:\ FGSM|MadryEtAl{,_y}{,_multigpu}.", ) flags.DEFINE_string( "attack_type_test", "FGSM", "Attack type for test: FGSM|MadryEtAl{,_y}." ) flags.DEFINE_string("dataset", "mnist", "Dataset mnist|cifar10.") flags.DEFINE_boolean( "only_adv_train", False, "Do not train with clean examples when adv training." ) flags.DEFINE_integer("save_steps", 50, "Save model per X steps.") flags.DEFINE_integer( "attack_nb_iter_train", None, "Number of iterations of training attack." ) flags.DEFINE_integer("eval_iters", 1, "Evaluate every X steps.") flags.DEFINE_integer( "lrn_step", 30000, "Step to decrease learning rate" "for ResNet." ) flags.DEFINE_float("adam_lrn", 0.001, "Learning rate for Adam Optimizer.") flags.DEFINE_float("mom_lrn", 0.1, "Learning rate for Momentum Optimizer.") flags.DEFINE_integer("ngpu", 1, "Number of gpus.") flags.DEFINE_integer("sync_step", 1, "Sync params frequency.") flags.DEFINE_boolean("fast_tests", False, "Fast tests against attacks.") flags.DEFINE_string( "data_path", "./datasets/", "Path to datasets." "Each dataset should be in a subdirectory.", ) app.run() ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/runner.py ================================================ """Wrappers to TensorFlow Session.run(). """ # pylint: disable=missing-docstring from collections import OrderedDict class Runner(object): """ Wrap TensorFlow Session.run() by adding preprocessing and postprocessing steps. """ def __init__(self, inputs, outputs, sess=None): self.sess = sess self.inputs = inputs self.outputs = outputs self.feed_dict = {} def run(self, X_batch=None): fetches, feed_dict = self.set_input(X_batch) fvals = self.sess.run(fetches, feed_dict=feed_dict) return self.proc_fvals(fvals) def set_input(self, X_batch=None): raise NotImplementedError("set_input not implemented.") def proc_fvals(self, fvals): raise NotImplementedError("proc_fvals not implemented.") def is_finished(self): raise NotImplementedError("is_finished not implemented.") class RunnerMultiGPU(Runner): """ Runs a graph with sub-graphs that need to run sequentially. Each sub-graph takes its inputs from the outputs of the previous sub-graph. """ def __init__(self, *args, **kwargs): super(RunnerMultiGPU, self).__init__(*args, **kwargs) self.assert_inputs_outputs() self.next_vals = [None] * len(self.inputs) def assert_inputs_outputs(self): inputs = self.inputs outputs = self.outputs assert len(inputs) == len(outputs), "Inputs and Outputs should match in length." for i in range(len(inputs)): device = inputs[i].values()[0].device for _k, v in inputs[i].iteritems(): assert v.device == device, "Inputs should be on the same device." for _k, v in outputs[i].iteritems(): assert v.device == device, "Outputs should be on the same device." if i > 0: ikeys = inputs[i].keys() okeys = outputs[i - 1].keys() # The actual requirement is looser, only the last output keys # should always be returned in the same order. assert all( ikeys[j] == okeys[j] for j in range(len(ikeys)) ), "Inputs and outputs keys should be in the same order." def set_input(self, X_batch=None): """ Preprocessing the inputs before calling session.run() :param X_batch: A dictionary of inputs to the first sub-graph :return: A tuple, `(fetches, fd)`, with `fetches` being a list of Tensors to be fetches and `fd` the feed dictionary. """ inputs = self.inputs outputs = self.outputs # data for first gpu fd = {} if X_batch is not None: self.next_vals[0] = OrderedDict() for i, vname in enumerate(self.inputs[0]): if vname in X_batch: self.next_vals[0][vname] = X_batch[vname] else: self.next_vals[0][vname] = None else: self.next_vals[0] = None # Set `feed_dict` for each GPU. If there is something to run for that # GPU, collect outputs to be fetched. fetches = [] self.active_gpus = [] for i in range(len(outputs)): if self.next_vals[i] is None: self.active_gpus += [False] continue self.active_gpus += [True] for k in inputs[i]: if self.next_vals[i][k] is not None: fd[inputs[i][k]] = self.next_vals[i][k] for k, v in outputs[i].iteritems(): fetches += [v] fd.update(self.feed_dict) return fetches, fd def proc_fvals(self, fvals): """ Postprocess the outputs of the Session.run(). Move the outputs of sub-graphs to next ones and return the output of the last sub-graph. :param fvals: A list of fetched values returned by Session.run() :return: A dictionary of fetched values returned by the last sub-graph. """ inputs = self.inputs outputs = self.outputs # Move data to the next sub-graph for the next step cur = 0 for i in range(len(inputs) - 1): if not self.active_gpus[i]: self.next_vals[i + 1] = None continue self.next_vals[i + 1] = OrderedDict() for k in outputs[i]: self.next_vals[i + 1][k] = fvals[cur] cur += 1 if i == 0: self.next_vals[0] = None # Return the output of the last sub-graph last_fvals = OrderedDict() if self.active_gpus[-1]: assert cur + len(outputs[-1]) == len(fvals) for k in outputs[-1]: last_fvals[k] = fvals[cur] cur += 1 return last_fvals def is_finished(self): return all(v is None for v in self.next_vals) class RunnerSingleGPU(Runner): def __init__(self, *args, **kwargs): super(RunnerSingleGPU, self).__init__(*args, **kwargs) def set_input(self, X_batch=None): fd = {} for vname, v in self.inputs[0].iteritems(): if vname in X_batch: fd[v] = X_batch[vname] fetches = self.outputs return fetches, fd def proc_fvals(self, fvals): """ Nothing to post-process on single GPU. """ return True def is_finished(self): """ Single GPU trainer has no cache. """ return True ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/test_attack_multigpu.py ================================================ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import unittest import numpy as np import tensorflow as tf from attacks_multigpu import MadryEtAlMultiGPU from model import MLPnGPU from model import LayernGPU import sys import os sys.path.insert(0, os.path.abspath("../../tests_tf/")) from test_attacks import TestMadryEtAl # NOQA class TestMadryEtAlMultiGPU(TestMadryEtAl): """ By inherting from `TestMadryEtAl`, the attack `MadryEtAlMultiGPU` can be tested against all tests of the base attack. """ def setUp(self): super(TestMadryEtAlMultiGPU, self).setUp() class SimpleLayer(LayernGPU): def set_input_shape(self, input_shape): self.input_shape = input_shape self.output_shape = input_shape self.W1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.float32) self.W2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.float32) def fprop_noscope(self, x): h1 = tf.nn.sigmoid(tf.matmul(x, self.W1)) res = tf.matmul(h1, self.W2) return res input_shape = (None, 2) self.model_ngpu = MLPnGPU([SimpleLayer()], input_shape) self.attack_single_gpu = self.attack self.attack_multi_gpu = MadryEtAlMultiGPU(self.model_ngpu, sess=self.sess) self.attack = self.attack_multi_gpu def test_single_vs_multi_gpu(self): """ Compare the strength of the single GPU and multi-GPU implementations. """ x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) def multi_attack(attack): flags = { "ngpu": 1, "eps": 1.0, "eps_iter": 0.01, "clip_min": 0.5, "clip_max": 0.7, "nb_iter": 2, "rand_init": True, } orig_labs = np.argmax(self.sess.run(self.model(x_val)), axis=1) new_labs_multi = orig_labs.copy() # Generate multiple adversarial examples for i in range(40): x_adv = attack.generate_np(x_val, **flags) new_labs = np.argmax(self.sess.run(self.model(x_adv)), axis=1) # Examples for which we have not found adversarial examples indices = orig_labs == new_labs_multi new_labs_multi[indices] = new_labs[indices] return np.mean(orig_labs == new_labs_multi) acc_s = multi_attack(self.attack_single_gpu) acc_m = multi_attack(self.attack_multi_gpu) self.assertClose(acc_s, acc_m, atol=1e-2) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/test_run_multigpu.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from collections import namedtuple import unittest import numpy as np import tensorflow as tf from cleverhans.utils import AccuracyReport from cleverhans.devtools.checks import CleverHansTest from run_multigpu import run_trainer class TestRunMultiGPU(CleverHansTest): def helper_run_multi_gpu_madryetal(self, extra_flags=None): """ Compare the single GPU performance to multiGPU performance. """ # Run the trainers on a dataset of reduced size flags = { "train_start": 0, "train_end": 5000, "test_start": 0, "test_end": 333, "nb_epochs": 5, "testing": True, } # Run the multi-gpu trainer for adversarial training flags.update( { "batch_size": 128, "adam_lrn": 0.001, "dataset": "mnist", "only_adv_train": False, "eval_iters": 1, "fast_tests": True, "save_dir": None, "save_steps": 10000, "attack_nb_iter_train": 10, "sync_step": None, "adv_train": True, "save": False, "model_type": "basic", "attack_type_test": "MadryEtAl_y", } ) if extra_flags is not None: flags.update(extra_flags) # Run the multi-gpu trainer for adversarial training using 2 gpus # trainer_multigpu by default sets `allow_soft_placement=True` flags.update( {"ngpu": 2, "attack_type_train": "MadryEtAl_y_multigpu", "sync_step": 1} ) HParams = namedtuple("HParams", flags.keys()) hparams = HParams(**flags) np.random.seed(42) tf.set_random_seed(42) with tf.variable_scope(None, "runner"): report_dict = run_trainer(hparams) report_m = AccuracyReport() report_m.train_adv_train_clean_eval = report_dict["train"] report_m.adv_train_clean_eval = report_dict["test"] report_m.adv_train_adv_eval = report_dict["MadryEtAl_y"] flags.update({"ngpu": 1, "attack_type_train": "MadryEtAl_y"}) hparams = HParams(**flags) np.random.seed(42) tf.set_random_seed(42) with tf.variable_scope(None, "runner"): report_dict = run_trainer(hparams) report_s = AccuracyReport() report_s.train_adv_train_clean_eval = report_dict["train"] report_s.adv_train_clean_eval = report_dict["test"] report_s.adv_train_adv_eval = report_dict["MadryEtAl_y"] self.assertClose( report_s.train_adv_train_clean_eval, report_m.train_adv_train_clean_eval, atol=5e-2, ) self.assertClose( report_s.adv_train_clean_eval, report_m.adv_train_clean_eval, atol=2e-2 ) self.assertClose( report_s.adv_train_adv_eval, report_m.adv_train_adv_eval, atol=5e-2 ) def test_run_single_gpu_fgsm(self): """ Test the basic single GPU performance by comparing to the FGSM tutorial. """ from cleverhans_tutorials import mnist_tutorial_tf # Run the MNIST tutorial on a dataset of reduced size flags = { "train_start": 0, "train_end": 5000, "test_start": 0, "test_end": 333, "nb_epochs": 5, "testing": True, } report = mnist_tutorial_tf.mnist_tutorial(**flags) # Run the multi-gpu trainer for clean training flags.update( { "batch_size": 128, "adam_lrn": 0.001, "dataset": "mnist", "only_adv_train": False, "eval_iters": 1, "ngpu": 1, "fast_tests": False, "attack_type_train": "", "save_dir": None, "save_steps": 10000, "attack_nb_iter_train": None, "save": False, "model_type": "basic", "attack_type_test": "FGSM", } ) flags.update({"adv_train": False}) HParams = namedtuple("HParams", flags.keys()) hparams = HParams(**flags) np.random.seed(42) tf.set_random_seed(42) with tf.variable_scope(None, "runner"): report_dict = run_trainer(hparams) report_2 = AccuracyReport() report_2.train_clean_train_clean_eval = report_dict["train"] report_2.clean_train_clean_eval = report_dict["test"] report_2.clean_train_adv_eval = report_dict["FGSM"] # Run the multi-gpu trainer for adversarial training flags.update({"adv_train": True, "attack_type_train": "FGSM"}) HParams = namedtuple("HParams", flags.keys()) hparams = HParams(**flags) np.random.seed(42) tf.set_random_seed(42) with tf.variable_scope(None, "runner"): report_dict = run_trainer(hparams) report_2.train_adv_train_clean_eval = report_dict["train"] report_2.adv_train_clean_eval = report_dict["test"] report_2.adv_train_adv_eval = report_dict["FGSM"] self.assertClose( report.train_clean_train_clean_eval, report_2.train_clean_train_clean_eval, atol=5e-2, ) self.assertClose( report.clean_train_clean_eval, report_2.clean_train_clean_eval, atol=2e-2 ) self.assertClose( report.clean_train_adv_eval, report_2.clean_train_adv_eval, atol=5e-2 ) self.assertClose( report.train_adv_train_clean_eval, report_2.train_adv_train_clean_eval, atol=1e-1, ) self.assertClose( report.adv_train_clean_eval, report_2.adv_train_clean_eval, atol=2e-2 ) self.assertClose( report.adv_train_adv_eval, report_2.adv_train_adv_eval, atol=1e-1 ) def test_run_multi_gpu_madryetal(self): self.helper_run_multi_gpu_madryetal() def test_run_multi_gpu_naive(self): self.helper_run_multi_gpu_madryetal({"adv_train": False}) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/test_runner.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import unittest import numpy as np import tensorflow as tf from cleverhans.devtools.checks import CleverHansTest from runner import RunnerMultiGPU class TestRunnerMultiGPU(CleverHansTest): def setUp(self): super(TestRunnerMultiGPU, self).setUp() self.sess = tf.Session() inputs = [] outputs = [] self.niter = 10 niter = self.niter # A Simple graph with `niter` sub-graphs. with tf.variable_scope(None, "runner"): for i in range(niter): v = tf.get_variable("v%d" % i, shape=(100, 10)) w = tf.get_variable("w%d" % i, shape=(100, 1)) inputs += [{"v": v, "w": w}] outputs += [{"v": v, "w": w}] self.runner = RunnerMultiGPU(inputs, outputs, sess=self.sess) def help_test_runner(self, ninputs, niter): """ Tests the MultiGPU runner by feeding in random Tensors for `ninputs` steps. Then validating the output after `niter-1` steps. """ v_val = [] w_val = [] for i in range(ninputs): v_val += [np.random.rand(100, 10)] w_val += [np.random.rand(100, 1)] fvals = self.runner.run({"v": v_val[i], "w": w_val[i]}) self.assertTrue(len(fvals) == 0) self.assertFalse(self.runner.is_finished()) for i in range(niter - ninputs - 1): self.assertFalse(self.runner.is_finished()) fvals = self.runner.run() self.assertTrue(len(fvals) == 0) self.assertFalse(self.runner.is_finished()) for i in range(ninputs): self.assertFalse(self.runner.is_finished()) fvals = self.runner.run() self.assertTrue("v" in fvals and "w" in fvals) self.assertTrue(np.allclose(fvals["v"], v_val[i])) self.assertTrue(np.allclose(fvals["w"], w_val[i])) self.assertTrue(self.runner.is_finished()) def test_queue_full(self): self.help_test_runner(self.niter - 1, self.niter) def test_queue_half(self): self.help_test_runner(self.niter // 2, self.niter) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/trainer.py ================================================ """ This module provides Trainer classes that given a set of flags, create, initialize and train a model. These classes use Runner objects to handle multigpu/singlegpu training. """ # pylint: disable=missing-docstring from collections import OrderedDict import logging import math import time import os import numpy as np import six import tensorflow as tf from cleverhans.utils_tf import batch_indices from cleverhans.utils_mnist import data_mnist import utils_cifar as cifar_input import utils_svhn as svhn_input from utils import preprocess_batch from make_model import make_model from evaluator import Evaluator from evaluator import create_adv_by_name from model import clone_variable class TrainManager(object): """ The base trainer class. Given an object of `hparams`, a trainer creates and initializes a model. After initialization, the method `model_train` can be used to train the model. """ def __init__(self, hparams): """ :param hparams: An instance of collections.namedtuple specifying the model type and training configs. The parameters are documented in `run_multigpu.py`. """ self.hparams = hparams self.batch_size = hparams.batch_size self.evaluate = None self.step_num = 0 self.report = None self._init_session() self._init_data() self._init_inputs() self._init_model() self._create_train_graph() self._init_eval() self.runner = None def _init_session(self): # Set TF random seed to improve reproducibility self.rng = np.random.RandomState([2017, 8, 30]) tf.set_random_seed(1234) # Create TF session self.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) # Object used to keep track of (and return) key accuracies if self.hparams.save: self.writer = tf.summary.FileWriter(self.hparams.save_dir, flush_secs=10) else: self.writer = None def _init_data(self): hparams = self.hparams batch_size = hparams.batch_size if hparams.dataset == "mnist": # Get MNIST test data X_train, Y_train, X_test, Y_test = data_mnist( train_start=hparams.train_start, train_end=hparams.train_end, test_start=hparams.test_start, test_end=hparams.test_end, ) input_shape = (batch_size, 28, 28, 1) preproc_func = None elif hparams.dataset == "cifar10": X_train, Y_train, X_test, Y_test = cifar_input.read_CIFAR10( os.path.join(hparams.data_path, hparams.dataset) ) input_shape = (batch_size, 32, 32, 3) preproc_func = cifar_input.cifar_tf_preprocess elif hparams.dataset == "svhn": X_train, Y_train, X_test, Y_test = svhn_input.read_SVHN( os.path.join(hparams.data_path, hparams.dataset) ) input_shape = (batch_size, 32, 32, 3) preproc_func = svhn_input.svhn_tf_preprocess # Use label smoothing assert Y_train.shape[1] == 10.0 label_smooth = 0.1 Y_train = Y_train.clip(label_smooth / 9.0, 1.0 - label_smooth) self.X_train = X_train self.Y_train = Y_train self.X_test = X_test self.Y_test = Y_test self.data = (X_train, Y_train, X_test, Y_test) self.input_shape = input_shape self.preproc_func = preproc_func def _init_inputs(self): preproc_func = self.preproc_func input_shape = self.input_shape # Define input TF placeholder with tf.device("/gpu:0"): x_pre = tf.placeholder(tf.float32, shape=input_shape, name="x") x = preprocess_batch(x_pre, preproc_func) y = tf.placeholder(tf.float32, shape=(self.batch_size, 10), name="y") self.g0_inputs = {"x_pre": x_pre, "x": x, "y": y} def _init_model(self): flags = self.hparams.__dict__ # Define TF model graph model = make_model(input_shape=self.input_shape, **flags) model.set_device(None) self.model = model def _init_eval(self): logging.info("Init eval") x_pre, x, y = [self.g0_inputs[k] for k in ["x_pre", "x", "y"]] self.model.set_device("/gpu:0") self.evaluate = Evaluator( self.sess, self.model, self.batch_size, x_pre, x, y, self.data, self.writer, self.hparams, ) def eval(self, **kwargs): if self.evaluate is not None: self.report = self.evaluate.eval_multi() def finish(self): if self.writer: self.writer.close() return self.report def _update_learning_params(self): model = self.model hparams = self.hparams fd = self.runner.feed_dict step_num = self.step_num if hparams.model_type == "resnet_tf": if step_num < hparams.lrn_step: lrn_rate = hparams.mom_lrn elif step_num < 30000: lrn_rate = hparams.mom_lrn / 10 elif step_num < 35000: lrn_rate = hparams.mom_lrn / 100 else: lrn_rate = hparams.mom_lrn / 1000 fd[model.lrn_rate] = lrn_rate def _build_train_op(self, predictions, y, predictions_adv): model = self.model hparams = self.hparams if hparams.model_type == "resnet_tf": build_train_op = model.build_cost else: raise NotImplementedError( "this configuration of this example is no longer maintained" ) # Define loss with tf.variable_scope("train_loss"): if predictions_adv is not None: if hparams.only_adv_train: loss = build_train_op(y, predictions_adv) else: loss = build_train_op(y, predictions) adv_loss = build_train_op(y, predictions_adv) loss = (loss + adv_loss) / 2 else: loss = build_train_op(y, predictions) if hparams.model_type == "resnet_tf": train_step = model.build_train_op_from_cost(loss) else: optim = tf.train.AdamOptimizer(learning_rate=hparams.adam_lrn) train_step = optim.minimize(loss) return train_step def model_train(self): """ Train a TF graph :param sess: TF session to use when training the graph :param x: input placeholder :param y: output placeholder (for labels) :param predictions: model output predictions :param X_train: numpy array with training inputs :param Y_train: numpy array with training outputs :param hparams.save: boolean controlling the save operation :param predictions_adv: if set with the adversarial example tensor, will run adversarial training :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). """ assert ( self.runner is not None ), """Runner is not initialized. TrainerSingleGPU or TrainerMultiGPU instantiate a Runner object at initialization time.""" hparams = self.hparams batch_size = hparams.batch_size nb_epochs = hparams.nb_epochs train_dir = hparams.save_dir filename = "model.ckpt" X_train = self.X_train Y_train = self.Y_train sess = self.sess with sess.as_default(): X_batch = X_train[:batch_size] Y_batch = Y_train[:batch_size] self._init_tf(X_batch, Y_batch) for epoch in six.moves.xrange(nb_epochs): logging.info("Epoch " + str(epoch)) # Compute number of batches nb_batches = int(math.ceil(float(len(X_train)) / batch_size)) assert nb_batches * batch_size >= len(X_train) # Indices to shuffle training set index_shuf = list(range(len(X_train))) self.rng.shuffle(index_shuf) prev = time.time() for batch in range(nb_batches): # Compute batch start and end indices start, end = batch_indices(batch, len(X_train), batch_size) # Perform one training step self._update_learning_params() # Train step X_batch = X_train[index_shuf[start:end]] Y_batch = Y_train[index_shuf[start:end]] self._run({"x_pre": X_batch, "y": Y_batch}) self._sync_params() # Clean up the queue while not self.runner.is_finished(): self._run() self._sync_params(forced=True) assert end >= len(X_train), "Not all training examples are used." cur = time.time() logging.info("\tEpoch took " + str(cur - prev) + " seconds") prev = cur self.eval() # Save model cond = (epoch + 1) % hparams.save_steps == 0 or epoch == nb_epochs if hparams.save and cond: save_path = os.path.join(train_dir, filename) saver = tf.train.Saver() saver.save(sess, save_path) logging.info("Model saved at: " + str(save_path)) logging.info("Completed model training.") def _init_tf(self, X_batch, Y_batch): x_pre = self.g0_inputs["x_pre"] y = self.g0_inputs["y"] fd = {x_pre: X_batch, y: Y_batch} init_op = tf.global_variables_initializer() self.sess.run(init_op, feed_dict=fd) def _run(self, X_batch=None): last_fvals = self.runner.run(X_batch) self.step_num += 1 return last_fvals def _sync_params(self, forced=False): raise NotImplementedError("sync_params should be implemented.") def _create_train_graph(self): """ The evaluation graph must be initialized after the train graph is fully initialized, otherwise, some of the variables will be created untrainable. """ assert ( self.evaluate is None ), """Evaluation graph should be initialzed after the train graph""" class TrainerMultiGPU(TrainManager): """ This class uses a `RunnerMultiGPU` object to train a model on multiple GPUs. It mainly overrides the `_create_train_graph` to create a graph for adversarial training on multiple GPUs. """ def __init__(self, *args, **kwargs): super(TrainerMultiGPU, self).__init__(*args, **kwargs) from runner import RunnerMultiGPU self.runner = RunnerMultiGPU(self.inputs, self.outputs, sess=self.sess) def clone_g0_inputs_on_ngpus(self, inputs, outputs, g0_inputs): """ Clone variables unused by the attack on all GPUs. Specifically, the ground-truth label, y, has to be preserved until the training step. :param inputs: A list of dictionaries as the inputs to each step. :param outputs: A list of dictionaries as the outputs of each step. :param g0_inputs: Initial variables to be cloned. :return: Updated inputs and outputs. """ assert len(inputs) == len( outputs ), "Inputs and outputs should have the same number of elements." inputs[0].update(g0_inputs) outputs[0].update(g0_inputs) # Copy g0_inputs forward for i in range(1, len(inputs)): # Create the graph for i'th step of attack device_name = inputs[i]["x"].device with tf.device(device_name): with tf.variable_scope("step%d" % i): for k, v in g0_inputs.iteritems(): if k not in inputs[i]: v_copy = clone_variable(k, v) inputs[i][k] = v_copy outputs[i][k] = v_copy return inputs, outputs def _create_train_graph(self): super(TrainerMultiGPU, self)._create_train_graph() assert "_multigpu" in self.hparams.attack_type_train hparams = self.hparams model = self.model sess = self.sess # Create trainable variables on last gpu. # Variables are set to trainable or non-trainable first time they are # created. This caused a bug when the last gpu is used both for attack # generation and training. With this bug the result of naive training # was affected by the length of the unused adversarial generation # graph. device_name = "/gpu:%d" % (hparams.ngpu - 1) model.set_device(device_name) with tf.device(device_name): x = clone_variable("x", self.g0_inputs["x"]) model.set_training(training=True) preds = model.get_probs(x) # Generates steps on gpus model.set_training(training=False) logging.info("Initializing train attack %s" % hparams.attack_type_train) inputs, outputs = create_adv_by_name( model, self.g0_inputs["x"], hparams.attack_type_train, sess, y=self.g0_inputs["y"], nb_iter=hparams.attack_nb_iter_train, dataset=hparams.dataset, ngpu=hparams.ngpu, ) inputs, outputs = self.clone_g0_inputs_on_ngpus(inputs, outputs, self.g0_inputs) # Train step on last gpu device_name = "/gpu:%d" % (hparams.ngpu - 1) model.set_device(device_name) with tf.device(device_name): with tf.variable_scope("last"): inputs += [OrderedDict()] for k, v in outputs[-1].iteritems(): v_copy = clone_variable(k, v) inputs[-1][k] = v_copy x = inputs[-1]["x"] adv_x = inputs[-1]["adv_x"] y = inputs[-1]["y"] if not hparams.adv_train: model.set_training(training=True) preds = model.get_probs(x) preds_adv = None elif not hparams.only_adv_train: model.set_training(training=True) preds = model.get_probs(x) model.set_training(training=True) preds_adv = model.get_probs(adv_x) else: preds = None model.set_training(training=True) preds_adv = model.get_probs(adv_x) train_fetches = self._build_train_op(preds, y, preds_adv) outputs += [{"fetches": train_fetches}] # Create the sync operation device_name = "/gpu:%d" % (hparams.ngpu - 1) model.set_device(device_name) with tf.device(device_name): sync_ops = model.create_sync_ops(host_device=device_name) self.inputs = inputs self.outputs = outputs self.sync_ops = sync_ops def _sync_params(self, forced=False): if forced or (self.step_num % self.hparams.sync_step == 0): self.sess.run(self.sync_ops) class TrainerSingleGPU(TrainManager): """ This class uses a `RunnerSingleGPU` object to train a model on a single GPU. """ def __init__(self, *args, **kwargs): super(TrainerSingleGPU, self).__init__(*args, **kwargs) from runner import RunnerSingleGPU self.runner = RunnerSingleGPU(self.inputs, self.outputs, sess=self.sess) def _create_train_graph(self): super(TrainerSingleGPU, self)._create_train_graph() self.model.set_device("/gpu:0") hparams = self.hparams model = self.model x = self.g0_inputs["x"] y = self.g0_inputs["y"] sess = self.sess # Create trainable variables. model.set_training(training=True) preds = model.get_probs(x) if not hparams.adv_train: logging.info("Naive training") model.set_training(training=True) preds = model.get_probs(x) preds_adv = None else: logging.info("Adversarial training") logging.info("Initializing train attack %s" % hparams.attack_type_train) model.set_training(training=False) adv_x = create_adv_by_name( model, x, hparams.attack_type_train, sess, y=y, nb_iter=hparams.attack_nb_iter_train, dataset=hparams.dataset, ) if hparams.only_adv_train: preds = None model.set_training(training=True) preds_adv = model.get_probs(adv_x) else: model.set_training(training=True) preds = model.get_probs(x) model.set_training(training=True) preds_adv = model.get_probs(adv_x) train_fetches = self._build_train_op(preds, y, preds_adv) self.inputs = [self.g0_inputs] self.outputs = [train_fetches] def _sync_params(self, forced=False): """ Nothing to sync on single GPU. """ return True ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/utils.py ================================================ # pylint: disable=missing-docstring import tensorflow as tf def preprocess_batch(images_batch, preproc_func=None): """ Creates a preprocessing graph for a batch given a function that processes a single image. :param images_batch: A tensor for an image batch. :param preproc_func: (optional function) A function that takes in a tensor and returns a preprocessed input. """ if preproc_func is None: return images_batch with tf.variable_scope("preprocess"): images_list = tf.split(images_batch, int(images_batch.shape[0])) result_list = [] for img in images_list: reshaped_img = tf.reshape(img, img.shape[1:]) processed_img = preproc_func(reshaped_img) result_list.append(tf.expand_dims(processed_img, axis=0)) result_images = tf.concat(result_list, axis=0) return result_images ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/utils_cifar.py ================================================ """ https://github.com/renmengye/revnet-public/blob/master/resnet/data/cifar_input.py MIT License Copyright (c) 2017 Mengye Ren Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ # pylint: disable=missing-docstring from __future__ import absolute_import, division, print_function, unicode_literals import os import cPickle as pkl import numpy as np from six.moves import range import tensorflow as tf # Global constants describing the CIFAR-10 data set. IMAGE_HEIGHT = 32 IMAGE_WIDTH = 32 NUM_CLASSES = 10 NUM_CHANNEL = 3 NUM_TRAIN_IMG = 50000 NUM_TEST_IMG = 10000 def unpickle(file): fo = open(file, "rb") dict = pkl.load(fo) fo.close() return dict def read_CIFAR10(data_folder): """ Reads and parses examples from CIFAR10 data files """ train_img = [] train_label = [] test_img = [] test_label = [] train_file_list = [ "data_batch_1", "data_batch_2", "data_batch_3", "data_batch_4", "data_batch_5", ] test_file_list = ["test_batch"] if "CIFAR10_PATH" in os.environ: cifar10_path = os.environ["CIFAR10_PATH"] else: cifar10_path = "cifar-10-batches-py" for i in range(len(train_file_list)): tmp_dict = unpickle(os.path.join(data_folder, cifar10_path, train_file_list[i])) train_img.append(tmp_dict["data"]) train_label.append(tmp_dict["labels"]) tmp_dict = unpickle(os.path.join(data_folder, cifar10_path, test_file_list[0])) test_img.append(tmp_dict["data"]) test_label.append(tmp_dict["labels"]) train_img = np.concatenate(train_img) train_label = np.concatenate(train_label) test_img = np.concatenate(test_img) test_label = np.concatenate(test_label) train_img = np.reshape( train_img, [NUM_TRAIN_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH] ) test_img = np.reshape( test_img, [NUM_TEST_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH] ) # change format from [B, C, H, W] to [B, H, W, C] for feeding to Tensorflow train_img = np.transpose(train_img, [0, 2, 3, 1]) test_img = np.transpose(test_img, [0, 2, 3, 1]) mean_img = np.mean(np.concatenate([train_img, test_img]), axis=0) CIFAR10_data = {} CIFAR10_data["train_img"] = train_img - mean_img CIFAR10_data["test_img"] = test_img - mean_img CIFAR10_data["train_label"] = train_label CIFAR10_data["test_label"] = test_label train_img = train_img - mean_img test_img = test_img - mean_img train_label = train_label test_label = test_label train_label = np.eye(10)[train_label] test_label = np.eye(10)[test_label] return train_img, train_label, test_img, test_label def read_CIFAR100(data_folder): """ Reads and parses examples from CIFAR100 python data files """ train_img = [] train_label = [] test_img = [] test_label = [] train_file_list = ["cifar-100-python/train"] test_file_list = ["cifar-100-python/test"] tmp_dict = unpickle(os.path.join(data_folder, train_file_list[0])) train_img.append(tmp_dict["data"]) train_label.append(tmp_dict["fine_labels"]) tmp_dict = unpickle(os.path.join(data_folder, test_file_list[0])) test_img.append(tmp_dict["data"]) test_label.append(tmp_dict["fine_labels"]) train_img = np.concatenate(train_img) train_label = np.concatenate(train_label) test_img = np.concatenate(test_img) test_label = np.concatenate(test_label) train_img = np.reshape( train_img, [NUM_TRAIN_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH] ) test_img = np.reshape( test_img, [NUM_TEST_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH] ) # change format from [B, C, H, W] to [B, H, W, C] for feeding to Tensorflow train_img = np.transpose(train_img, [0, 2, 3, 1]) test_img = np.transpose(test_img, [0, 2, 3, 1]) mean_img = np.mean(np.concatenate([train_img, test_img]), axis=0) CIFAR100_data = {} CIFAR100_data["train_img"] = train_img - mean_img CIFAR100_data["test_img"] = test_img - mean_img CIFAR100_data["train_label"] = train_label CIFAR100_data["test_label"] = test_label return CIFAR100_data def cifar_tf_preprocess( inp, random_crop=True, random_flip=True, whiten=True, br_sat_con=False ): image_size = 32 image = inp if random_crop: image = tf.image.resize_image_with_crop_or_pad( inp, image_size + 4, image_size + 4 ) image = tf.random_crop(image, [image_size, image_size, 3]) if random_flip: image = tf.image.random_flip_left_right(image) # Brightness/saturation/constrast provides small gains .2%~.5% on cifar. if br_sat_con: image = tf.image.random_brightness(image, max_delta=63.0 / 255.0) image = tf.image.random_saturation(image, lower=0.5, upper=1.5) image = tf.image.random_contrast(image, lower=0.2, upper=1.8) if whiten: image = tf.image.per_image_standardization(image) return image ================================================ FILE: cleverhans_v3.1.0/examples/multigpu_advtrain/utils_svhn.py ================================================ """ Reading the SVHN dataset. It is derived from CIFAR10 scripts in RevNets code. https://github.com/renmengye/revnet-public/blob/master/resnet/data/cifar_input.py MIT License Copyright (c) 2017 Mengye Ren Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ # pylint: disable=missing-docstring from __future__ import absolute_import, division, print_function, unicode_literals import os import numpy as np from six.moves import range import tensorflow as tf import scipy.io as sio # Global constants describing the SVHN data set. IMAGE_HEIGHT = 32 IMAGE_WIDTH = 32 NUM_CLASSES = 10 NUM_CHANNEL = 3 NUM_TRAIN_IMG = 73257 + 531131 NUM_TEST_IMG = 26032 def read_SVHN(data_folder): """ Reads and parses examples from SVHN data files """ train_img = [] train_label = [] test_img = [] test_label = [] train_file_list = ["train_32x32.mat", "extra_32x32.mat"] test_file_list = ["test_32x32.mat"] for i in range(len(train_file_list)): tmp_dict = sio.loadmat(os.path.join(data_folder, train_file_list[i])) train_img.append(tmp_dict["X"]) train_label.append(tmp_dict["y"]) tmp_dict = sio.loadmat(os.path.join(data_folder, test_file_list[0])) test_img.append(tmp_dict["X"]) test_label.append(tmp_dict["y"]) train_img = np.concatenate(train_img, axis=-1) train_label = np.concatenate(train_label).flatten() test_img = np.concatenate(test_img, axis=-1) test_label = np.concatenate(test_label).flatten() # change format from [H, W, C, B] to [B, H, W, C] for feeding to Tensorflow train_img = np.transpose(train_img, [3, 0, 1, 2]) test_img = np.transpose(test_img, [3, 0, 1, 2]) mean_img = np.mean(np.concatenate([train_img, test_img]), axis=0) train_img = train_img - mean_img test_img = test_img - mean_img train_y = train_label - 1 # 0-based label test_y = test_label - 1 # 0-based label train_label = np.eye(10)[train_y] test_label = np.eye(10)[test_y] return train_img, train_label, test_img, test_label def svhn_tf_preprocess(inp, random_crop=True): image_size = 32 image = inp if random_crop: print("Apply random cropping") image = tf.image.resize_image_with_crop_or_pad( inp, image_size + 4, image_size + 4 ) image = tf.random_crop(image, [image_size, image_size, 3]) return inp, image ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/.gitignore ================================================ # ignore Tensorflow checkpoints *.ckpt # ignore dataset images dataset/images ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/README.md ================================================ # NIPS17 Adversarial Attacks and Defenses Competition This directory includes all code which was used to run adversarial attacks and defenses competition which was conducted as a part of [NIPS17 competition track](https://nips.cc/Conferences/2017/CompetitionTrack). Directory has following structure: * `dataset/` - directory with datasets. * `dev_toolkit/` - development toolkit which was shared with participants during the competition. * `eval_infra/` - code of evaluation infrastructure which was used to run the competition. ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/README.md ================================================ # Dataset for adversarial competition. Two datasets were used for the competition: * **DEV** dataset which was available for the development and experimenting during the competition. * **FINAL** dataset which was kept secret until after the competition and was used for final scoring. Both datasets are composed from publicly available images which were posted online under CC-BY license. ## Dataset format Each dataset is described by [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) file with URLs of the images, their bounding boxes, classification labels and some other metadata. `dev_dataset.csv` contains description of DEV dataset and `final_dataset.csv` contains description of FINAL dataset. File with the dataset description contains following columns: * **ImageId** - id of the image. * **URL** - URL of the image. * **x1**, **y1**, **x2**, **y2** - bounding box of the area of interest in the image. Bounding box is relative, which means that all coordinates are between 0 and 1. * **TrueLabel** - true label of the image. * **TargetClass** - label for targeted adversarial attack. * **OriginalLandingURL** - original landing page where this image was found. * **License** - licence under which image was distributed by author. * **Author** - author of the image. * **AuthorProfileURL** - URL of the author's profile. Dataset is labelled with [ImageNet](http://www.image-net.org/challenges/LSVRC/2012/) labels. Specific values of labels are compatible with pre-trained Inception models, which are available as a part of [TF-Slim](https://github.com/tensorflow/models/tree/master/slim). In particular pre-trained Inception v3 and InceptionResnet v2 could be used to classify dataset with high accuracy. Note that TF-Slim ImageNet labels are from 1 to 1000 and label 0 is unused. ## Downloading images File with the dataset description contains only URLs of the images. Actual images have to be downloaded before being used for experiments. `download_images.py` is a Python program which downloads images for all records in the dataset file. Usage: ``` # Replace CSV_FILE with path to dev_dataset.csv or final_dataset.csv CSV_FILE=dev_dataset.csv # Replace OUTPUT_DIR with path to directory where all images should be stored OUTPUT_DIR=images # Download images python download_images.py --input_file=${CSV_FILE} --output_dir=${OUTPUT_DIR} ``` To accelerate the image downloading, multiple threads are spawned (the default is CPU_COUNT + 1). You can change this setting using --threads flag to any other positive value. All downloaded images will be cropped according to the bounding boxes specified in the dataset file and resized to 299x299 pixels. Each image will be saved in PNG format with filename `IMAGE_ID.png` where `IMAGE_ID` is the id of the image from the dataset file. ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/dev_dataset.csv ================================================ ImageId,URL,x1,y1,x2,y2,TrueLabel,TargetClass,OriginalLandingURL,License,Author,AuthorProfileURL 0c7ac4a8c9dfa802,https://c1.staticflickr.com/9/8540/28821627444_0524012bdd_o.jpg,0.0,0.0,0.871838111298,1.0,306,779,https://www.flickr.com/photos/gails_pictures/28821627444,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ f43fbfe8a9ea876c,https://c1.staticflickr.com/9/8066/28892033183_6f675dcc03_o.jpg,0.25,0.0,1.0,0.599757673667,884,378,https://www.flickr.com/photos/barty/28892033183,https://creativecommons.org/licenses/by/2.0/,Barry Badcock,https://www.flickr.com/people/barty/ 4fc263d35a3ad3ee,https://c1.staticflickr.com/8/7378/27465801596_a9dd11e5e2_o.jpg,0.333333333333,0.0,1.0,1.0,244,123,https://www.flickr.com/photos/foxcroftacademy/27465801596,https://creativecommons.org/licenses/by/2.0/,Foxcroft Academy,https://www.flickr.com/people/foxcroftacademy/ cc13c2bc5cdd1f44,https://c1.staticflickr.com/9/8864/28546467522_56229f2bef_o.jpg,0.0,0.0,0.5,0.75,560,741,https://www.flickr.com/photos/o_0/28546467522/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 73a52afd2f818ed5,https://c1.staticflickr.com/6/5607/31066602702_382b13646e_o.jpg,0.489195230999,0.0,1.0,0.75,439,696,https://www.flickr.com/photos/chemiebw/31066602702/,https://creativecommons.org/licenses/by/2.0/,Chemie-Verb\303\244nde Baden-W\303\274rttemberg,https://www.flickr.com/people/chemiebw/ 58f0fd17c4a0e25a,https://c1.staticflickr.com/9/8262/29250758112_3147698dd2_o.jpg,0.0,0.0,0.5625,0.75,991,100,https://www.flickr.com/photos/zongo/29250758112,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 90e11aa7c36c64f2,https://c1.staticflickr.com/8/7528/26850127330_56022d63f7_o.jpg,0.0,0.25,0.5625,1.0,950,1,https://www.flickr.com/photos/cogdog/26850127330,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 696f0f6bea562bf8,https://c1.staticflickr.com/6/5605/30947139580_468ba7e513_o.jpg,0.0,0.0,0.5,0.75,854,267,https://www.flickr.com/photos/jamesbradley/30947139580/,https://creativecommons.org/licenses/by/2.0/,Fr James Bradley,https://www.flickr.com/people/jamesbradley/ df58f94361c6d105,https://c1.staticflickr.com/8/7248/27047266920_8363816754_o.jpg,0.200627476882,0.0,0.601882430647,0.75,610,13,https://www.flickr.com/photos/roberthaandrikman/27047266920,https://creativecommons.org/licenses/by/2.0/,Robert Haandrikman,https://www.flickr.com/people/roberthaandrikman/ 1394faa319bd353c,https://c1.staticflickr.com/1/542/31667350163_b6906e0d48_o.jpg,0.333333333333,0.0,1.0,1.0,610,507,https://www.flickr.com/photos/landrovermena/31667350163,https://creativecommons.org/licenses/by/2.0/,Land Rover MENA,https://www.flickr.com/people/landrovermena/ 6cae4a23623d142b,https://c1.staticflickr.com/8/7404/27305101801_5b422e51fe_o.jpg,0.28125,0.0,0.84375,0.75,583,440,https://flickr.com/39309480@N05/27305101801,https://creativecommons.org/licenses/by/2.0/,Embajada de EEUU en la Argentina,https://www.flickr.com/people/embajadaeeuubuenosaires/ d02adcb9140880a1,https://c1.staticflickr.com/1/404/31746323273_467fb30873_o.jpg,0.0,0.0,0.714503816794,1.0,916,783,https://www.flickr.com/photos/ruthanddave/31746323273/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 71080285ad6cb4e9,https://c1.staticflickr.com/9/8444/29355103331_45d4b77595_o.jpg,0.0,0.25,0.75,1.0,456,478,https://www.flickr.com/photos/themarmot/29355103331,https://creativecommons.org/licenses/by/2.0/,The Marmot,https://www.flickr.com/people/themarmot/ 137ab6ca314e9e35,https://c1.staticflickr.com/9/8681/28102039640_11703a03f5_o.jpg,0.0,0.311985172982,0.75,0.935955518946,620,556,https://www.flickr.com/photos/130468093@N03/28102039640,https://creativecommons.org/licenses/by/2.0/,~ladyyoruichi~,https://www.flickr.com/people/130468093@N03/ c819099fed6f0d73,https://c1.staticflickr.com/1/126/31638424475_3b36f926b1_o.jpg,0.32991202346,0.0,0.989736070381,1.0,962,777,https://www.flickr.com/photos/djackmanson/31638424475,https://creativecommons.org/licenses/by/2.0/,David Jackmanson,https://www.flickr.com/people/djackmanson/ 4b384c8247b56c0a,https://c1.staticflickr.com/9/8526/28626152335_955398ef80_o.jpg,0.0,0.25,0.5,1.0,542,925,https://www.flickr.com/photos/virtualpainter/28626152335,https://creativecommons.org/licenses/by/2.0/,Taka Umemura,https://www.flickr.com/people/virtualpainter/ 62ebd5f7ce015380,https://c1.staticflickr.com/9/8832/28846755931_9e77600319_o.jpg,0.0,0.0,0.662261380323,1.0,631,692,https://www.flickr.com/photos/spera-designerschuhe/28846755931,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ f24817d66024dfb6,https://c1.staticflickr.com/8/7286/28064769996_6bf78b5810_o.jpg,0.0,0.0,0.5,0.75,742,740,https://www.flickr.com/photos/jdlasica/28064769996,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 1b57d7bbd673c771,https://c1.staticflickr.com/9/8024/29035810873_9be68318c4_o.jpg,0.5,0.25,1.0,1.0,423,927,https://www.flickr.com/photos/fotosagenciabrasil/29035810873/,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/ a2de1f4f2c1021fa,https://c1.staticflickr.com/9/8598/29005552090_ee38f841ac_o.jpg,0.25,0.25,1.0,1.0,456,185,https://www.flickr.com/photos/sillygwailo/29005552090/,https://creativecommons.org/licenses/by/2.0/,Richard Eriksson,https://www.flickr.com/people/sillygwailo/ 3e7b01ba495f15f9,https://c1.staticflickr.com/8/7366/26897189910_049b6377e0_o.jpg,0.0,0.0,0.75,0.601503759398,708,410,https://www.flickr.com/photos/darioalvarez/26897189910,https://creativecommons.org/licenses/by/2.0/,Dario Alvarez,https://www.flickr.com/people/darioalvarez/ 1a264165276e3c85,https://c1.staticflickr.com/8/7327/27500591886_a1b257229e_o.jpg,0.5,0.0,1.0,0.75,855,759,https://www.flickr.com/photos/presidentialoffice/27500591886,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ bc9a5e01c02e759e,https://c1.staticflickr.com/8/7575/27719847416_e231168ac1_o.jpg,0.0,0.28125,0.75,0.84375,923,18,https://www.flickr.com/photos/jimg944/27719847416/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 01bdc0cfe670f708,https://c1.staticflickr.com/1/457/31837933011_3e57f56dc9_o.jpg,0.0,0.0,0.5,0.75,472,541,https://www.flickr.com/photos/quinet/31837933011,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 6af829a442e2e0e7,https://c1.staticflickr.com/6/5827/30663702381_910aca914a_o.jpg,0.25,0.0,1.0,1.0,130,231,https://www.flickr.com/photos/rusty_clark/30663702381,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 493694833dc23399,https://c1.staticflickr.com/1/691/33087466756_27fcc6e909_o.jpg,0.25,0.25,0.75,1.0,538,835,https://www.flickr.com/photos/denalinps/33087466756/,https://creativecommons.org/licenses/by/2.0/,Denali National Park and Preserve,https://www.flickr.com/people/denalinps/ 6ac94c9244f84aa3,https://c1.staticflickr.com/9/8887/27621832723_abe5df1bf6_o.jpg,0.28125,0.0,0.84375,0.75,673,336,https://www.flickr.com/photos/sedoglia/27621832723,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/ 7529b42e71769777,https://c1.staticflickr.com/6/5573/30447660301_21f03bc832_o.jpg,0.28125,0.0,0.84375,0.75,477,618,https://www.flickr.com/photos/archiefalkmaar/30447660301/,https://creativecommons.org/licenses/by/2.0/,Regionaal Archief Alkmaar,https://www.flickr.com/people/archiefalkmaar/ d204464fcf15ad99,https://c1.staticflickr.com/9/8735/28293562656_b6754b6f76_o.jpg,0.25,0.249079528719,1.0,0.747238586156,300,269,https://www.flickr.com/photos/zigazou76/28293562656,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 7fd7ce3eb2bf9944,https://c1.staticflickr.com/8/7060/26682014410_e1ae9f3f68_o.jpg,0.25,0.0,1.0,1.0,100,113,https://www.flickr.com/photos/starr-environmental/26682014410/,https://creativecommons.org/licenses/by/2.0/,Forest and Kim Starr,https://www.flickr.com/people/starr-environmental/ 303781188f1b3b27,https://c1.staticflickr.com/8/7196/27632686515_7c9e105ab4_o.jpg,0.57825203252,0.0,1.0,0.75,477,339,https://www.flickr.com/photos/tomhilton/27632686515,https://creativecommons.org/licenses/by/2.0/,Tom Hilton,https://www.flickr.com/people/tomhilton/ 67967c9db11151e0,https://c1.staticflickr.com/6/5699/30482545566_9bb69e3a2c_o.jpg,0.5,0.25,1.0,1.0,252,820,https://www.flickr.com/photos/blumenbiene/30482545566,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ fa2a7d600b62174e,https://c1.staticflickr.com/9/8135/29796651083_af3421402e_o.jpg,0.25,0.0,1.0,0.729946524064,521,572,https://www.flickr.com/photos/familymwr/29796651083,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/ cd2d2889ef7ac51c,https://c1.staticflickr.com/8/7108/27445698401_622147f593_o.jpg,0.0,0.0,0.666666666667,1.0,924,607,https://www.flickr.com/photos/janitors/27445698401,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 11954d93a7051cb5,https://c1.staticflickr.com/9/8598/30096731475_f2050e80f0_o.jpg,0.5,0.0,1.0,0.75,23,503,https://www.flickr.com/photos/andymorffew/30096731475,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ 03f90f7138f761e8,https://c1.staticflickr.com/8/7358/27496838730_a300e17377_o.jpg,0.25,0.25,1.0,1.0,664,490,https://www.flickr.com/photos/pasa/27496838730,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 19935b1c0a4d305d,https://c1.staticflickr.com/8/7560/28230694205_599d4915f1_o.jpg,0.30421686747,0.0,1.0,1.0,761,642,https://www.flickr.com/photos/lge/28230694205,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 9cf861a657c27cec,https://c1.staticflickr.com/1/737/31554472305_631b37cd13_o.jpg,0.28125,0.25,0.84375,1.0,583,897,https://www.flickr.com/photos/rusty_clark/31554472305/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 05817a675e7506d1,https://c1.staticflickr.com/8/7530/27222000794_49d44c7533_o.jpg,0.246522693997,0.0,0.739568081991,0.75,673,754,https://www.flickr.com/photos/trocaire/27222000794,https://creativecommons.org/licenses/by/2.0/,Trocaire,https://www.flickr.com/people/trocaire/ e1c702ed9842dd1c,https://c1.staticflickr.com/8/7538/26750212822_874e61f2f5_o.jpg,0.0,0.25,0.75,1.0,693,757,https://www.flickr.com/photos/mcleod/26750212822,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/ e7cafac174e90143,https://c1.staticflickr.com/8/7064/26911748774_e91c741c13_o.jpg,0.25,0.25,0.75,1.0,526,116,https://www.flickr.com/photos/tabor-roeder/26911748774,https://creativecommons.org/licenses/by/2.0/,Phil Roeder,https://www.flickr.com/people/tabor-roeder/ 1a680f33500acb4b,https://c1.staticflickr.com/6/5623/30353092243_549ce05481_o.jpg,0.0,0.0,0.5625,0.75,932,73,https://www.flickr.com/photos/londonmatt/30353092243,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 81ddbe14219e9dcf,https://c1.staticflickr.com/1/599/32603915941_1f3f02a21f_o.jpg,0.43661971831,0.0,1.0,0.75,318,672,http://www.flickr.com/photos/treegrow/32603915941/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 04cb9de291399d15,https://c1.staticflickr.com/9/8671/28725010671_e060588a1b_o.jpg,0.25,0.25,0.75,1.0,465,451,https://www.flickr.com/photos/photo-digest/28725010671,https://creativecommons.org/licenses/by/2.0/,media.digest,https://www.flickr.com/people/photo-digest/ 23f9d18d531eb148,https://c1.staticflickr.com/8/7545/28289771271_d972c53c03_o.jpg,0.249079528719,0.0,0.747238586156,0.75,479,851,https://www.flickr.com/photos/londonmatt/28289771271/,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 63f2e14ab6be82cf,https://c1.staticflickr.com/8/7360/27324993991_9e7547e472_o.jpg,0.330871491876,0.0,1.0,1.0,668,694,https://www.flickr.com/photos/mdgovpics/27324993991,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/ 0dffbfa7ba43cb90,https://c1.staticflickr.com/1/599/31842595896_6c327628ee_o.jpg,0.28125,0.0,0.84375,0.75,962,95,https://flickr.com/10581108@N00/31842595896,https://creativecommons.org/licenses/by/2.0/,jencu,https://www.flickr.com/people/jennycu/ a97274c7e80a1764,https://c1.staticflickr.com/9/8770/28603315541_10de82290f_o.jpg,0.0,0.25,0.5625,1.0,866,926,https://flickr.com/10069023@N00/28603315541,https://creativecommons.org/licenses/by/2.0/,Charles Kremenak,https://www.flickr.com/people/charleskremenak/ 85e2eea48d912d31,https://c1.staticflickr.com/6/5728/30827582556_27a03b94b4_o.jpg,0.501840942563,0.25,1.0,1.0,806,136,https://www.flickr.com/photos/eaglebrook/30827582556/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ ff5182599937c1ec,https://c1.staticflickr.com/9/8088/29255908970_542c7fcc99_o.jpg,0.25,0.0,1.0,0.75,325,210,https://www.flickr.com/photos/orangeaurochs/29255908970/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ 4bb12984b41d0834,https://c1.staticflickr.com/8/7155/26715421772_322982abb8_o.jpg,0.280784844384,0.0,0.842354533153,1.0,34,8,https://www.flickr.com/photos/lwpkommunikacio/26715421772,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 150249123e81930d,https://c1.staticflickr.com/8/7637/27864748826_3611a80685_o.jpg,0.25,0.0,1.0,1.0,923,485,https://www.flickr.com/photos/36668466@N05/27864748826,https://creativecommons.org/licenses/by/2.0/,Fernando Medina,https://www.flickr.com/people/36668466@N05/ f963957ccfa82f6b,https://c1.staticflickr.com/8/7321/27811646942_6af16e2c20_o.jpg,0.217675378267,0.0,0.653026134801,0.75,143,8,https://www.flickr.com/photos/bamyers4az/27811646942,https://creativecommons.org/licenses/by/2.0/,Brent Myers,https://www.flickr.com/people/bamyers4az/ 890fdaf4e1892e00,https://c1.staticflickr.com/9/8079/29641887231_ac78f6acb2_o.jpg,0.0,0.0,0.75786163522,1.0,313,692,https://www.flickr.com/photos/gails_pictures/29641887231,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 9a1c67f467b9beea,https://c1.staticflickr.com/8/7313/26933714923_dae58c7fa8_o.jpg,0.0,0.25,0.70913884007,1.0,303,90,https://www.flickr.com/photos/gails_pictures/26933714923,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 217597258ac12258,https://c1.staticflickr.com/8/7326/27290987603_52008d9de0_o.jpg,0.25,0.25,1.0,1.0,583,805,https://www.flickr.com/photos/iwashitashoichi/27290987603,https://creativecommons.org/licenses/by/2.0/,Shoichi Iwashita,https://www.flickr.com/people/iwashitashoichi/ 346c5575b60194c3,https://c1.staticflickr.com/6/5753/31338370671_675f18f5a9_o.jpg,0.25,0.0,0.75,0.75,949,625,https://flickr.com/77742560@N06/31338370671,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 296033c3a5910845,https://c1.staticflickr.com/8/7659/27497141411_2fdd591428_o.jpg,0.0,0.0,0.675074183976,1.0,361,797,https://www.flickr.com/photos/100915417@N07/27497141411,https://creativecommons.org/licenses/by/2.0/,Charlie Marshall,https://www.flickr.com/people/100915417@N07/ 3a7d9bd310202e93,https://c1.staticflickr.com/6/5751/30906474272_60f5035a81_o.jpg,0.0,0.0,0.5,0.75,790,660,https://www.flickr.com/photos/sansebastian2016/30906474272,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/ 56e9d5f63cfc507e,https://c1.staticflickr.com/6/5767/31254643081_606fefaeef_o.jpg,0.0,0.0,1.0,1.0,441,624,https://flickr.com/31424626@N05/31254643081,https://creativecommons.org/licenses/by/2.0/,Pulencio,https://www.flickr.com/people/pulencio/ 602f2c3749d6021e,https://c1.staticflickr.com/6/5488/30010578363_ae1a2b5fc4_o.jpg,0.25,0.0,1.0,0.75,747,106,https://flickr.com/88307459@N08/30010578363,https://creativecommons.org/licenses/by/2.0/,Alessandro,https://www.flickr.com/people/88307459@N08/ 7c754696067fdfa9,https://c1.staticflickr.com/8/7322/26952063895_0d0990098b_o.jpg,0.534850640114,0.0,1.0,0.75,765,469,https://www.flickr.com/photos/zachievenor/26952063895,https://creativecommons.org/licenses/by/2.0/,Zachi Evenor,https://www.flickr.com/people/zachievenor/ 8f5eda0b6a910b43,https://c1.staticflickr.com/1/525/31526646220_dbd7c0df37_o.jpg,0.5,0.0,1.0,0.75,950,918,https://www.flickr.com/photos/129816626@N04/31526646220/,https://creativecommons.org/licenses/by/2.0/,Elusive Muse,https://www.flickr.com/people/129816626@N04/ 89119361e9d9e02d,https://c1.staticflickr.com/9/8064/30107504355_f5a2453191_o.jpg,0.0,0.0,0.669128508124,1.0,481,473,http://www.flickr.com/photos/79157069@N03/30107504355,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ da63f2acf683c0a7,https://c1.staticflickr.com/3/2626/32878464786_81b7b5f560_o.jpg,0.25,0.25,0.75,1.0,134,617,https://www.flickr.com/photos/steve_childs/32878464786/,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/ 741fc1a3fc08731d,https://c1.staticflickr.com/1/333/30878601253_6a06af38ce_o.jpg,0.226157082749,0.25,0.678471248247,1.0,793,400,https://www.flickr.com/photos/ufv/30878601253,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ d77af00930283f4b,https://c1.staticflickr.com/6/5686/30135548405_290ce24c79_o.jpg,0.0,0.28125,0.75,0.84375,901,649,https://flickr.com/131810676@N03/30135548405,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/ 97151fe7a0a6e2e3,https://c1.staticflickr.com/9/8108/28266576044_fe196cd052_o.jpg,0.0,0.0,1.0,1.0,734,228,https://www.flickr.com/photos/paulstudio/28266576044,https://creativecommons.org/licenses/by/2.0/,Paul Chan,https://www.flickr.com/people/paulstudio/ 393d40f3a6a79400,https://c1.staticflickr.com/8/7641/27798795492_12f1e08a40_o.jpg,0.0,0.25,0.496696035242,1.0,328,846,https://www.flickr.com/photos/shankaronline/27798795492/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 8f5e0855ca8de8ea,https://c1.staticflickr.com/1/594/31875644290_a507a79ca7_o.jpg,0.4375,0.25,1.0,1.0,468,716,https://www.flickr.com/photos/briansolis/31875644290,https://creativecommons.org/licenses/by/2.0/,Brian Solis,https://www.flickr.com/people/briansolis/ d72f34526e12fd83,https://c1.staticflickr.com/9/8787/28375652543_039a76200f_o.jpg,0.0,0.2806640625,0.75,0.8419921875,442,325,https://www.flickr.com/photos/cogdog/28375652543,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 957529a2abaa0581,https://c1.staticflickr.com/6/5493/31215689672_90fdc524c1_o.jpg,0.337738619677,0.0,1.0,1.0,883,648,https://www.flickr.com/photos/yourbestdigs/31215689672/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 3bd1ba0432603b28,https://c1.staticflickr.com/9/8041/29388312836_4151756518_o.jpg,0.0,0.0,0.5625,0.75,921,89,https://www.flickr.com/photos/a_peach/29388312836,https://creativecommons.org/licenses/by/2.0/,A_Peach,https://www.flickr.com/people/a_peach/ 3228a465697fb2cf,https://c1.staticflickr.com/1/699/32034140530_62059de5a0_o.jpg,0.0,0.0,0.75,0.5625,840,922,https://www.flickr.com/photos/ufv/32034140530,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ 871c99d5658c3189,https://c1.staticflickr.com/1/593/31013399073_e0c80204ed_o.jpg,0.5,0.0,1.0,0.75,956,587,https://flickr.com/64586261@N02/31013399073,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 1733cbc68a2ae05d,https://c1.staticflickr.com/1/465/32838931536_2e1b56309c_o.jpg,0.0,0.0,0.666666666667,1.0,556,892,https://www.flickr.com/photos/147079914@N03/32838931536/in/pool-44124304756@N01,https://creativecommons.org/licenses/by/2.0/,sponki25,https://www.flickr.com/people/147079914@N03/ 69a3493d13953e1f,https://c1.staticflickr.com/1/486/31850894154_77cd0b743d_o.jpg,0.4375,0.25,1.0,1.0,520,407,https://www.flickr.com/photos/byzantiumbooks/31850894154,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ 8a82ddd7ab76efbb,https://c1.staticflickr.com/9/8073/29273707766_84a5a2321f_o.jpg,0.0,0.0,0.663235294118,1.0,511,908,https://www.flickr.com/photos/shankaronline/29273707766,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ e95ef0aeeab7b496,https://c1.staticflickr.com/3/2892/32904176405_735232107b_o.jpg,0.710762331839,0.0,1.0,0.75,889,860,https://www.flickr.com/photos/arg_flickr/32904176405/,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/ 8555611998ea426a,https://c1.staticflickr.com/6/5600/30019858070_5049f5d386_o.jpg,0.0,0.0,0.75,1.0,991,497,https://www.flickr.com/photos/eamoncurry/30019858070,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/ 1cc2caf8e5db27c3,https://c1.staticflickr.com/1/598/32069226561_2e29df4dce_o.jpg,0.25,0.0,1.0,0.5,431,607,https://flickr.com/21841998@N06/32069226561,https://creativecommons.org/licenses/by/2.0/,The People's Tribune,https://www.flickr.com/people/21841998@N06/ a00c8d22e63497c4,https://c1.staticflickr.com/8/7019/26876163625_b5ebe36eaf_o.jpg,0.278188180404,0.25,0.834564541213,1.0,431,892,https://www.flickr.com/photos/timmccune/26876163625,https://creativecommons.org/licenses/by/2.0/,Tim McCune,https://www.flickr.com/people/timmccune/ 4f553b721705d008,https://c1.staticflickr.com/8/7417/28111852685_716c19bcb5_o.jpg,0.0,0.0,0.75,1.0,397,3,https://www.flickr.com/photos/noaaphotolib/28111852685/in/photolist-hCZ5zh-7RqcE6-7Rtsyb-JQ9Apg/,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ f1ce339a44d7a118,https://c1.staticflickr.com/9/8867/28838922156_09d615d6f5_o.jpg,0.333333333333,0.0,1.0,1.0,98,702,https://www.flickr.com/photos/132033298@N04/28838922156,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/ 2153d9869fb5a9ef,https://c1.staticflickr.com/9/8892/28233397700_b175333ccc_o.jpg,0.452546296296,0.25,1.0,1.0,645,942,https://www.flickr.com/photos/katerha/28233397700,https://creativecommons.org/licenses/by/2.0/,Kate Ter Haar,https://www.flickr.com/people/katerha/ 7506caf0a49c3951,https://c1.staticflickr.com/8/7410/27688687271_a42aee521a_o.jpg,0.0,0.0,1.0,0.900181488203,79,724,https://www.flickr.com/photos/136941790@N03/27688687271/,https://creativecommons.org/licenses/by/2.0/,laboratorio diagnostica ancona IZSUM,https://www.flickr.com/people/136941790@N03/ 1d4133f5bc7af193,https://c1.staticflickr.com/9/8584/28442098602_ed99e31eda_o.jpg,0.259962406015,0.25,0.779887218045,1.0,141,911,https://www.flickr.com/photos/25553993@N02/28442098602/,https://creativecommons.org/licenses/by/2.0/,Kev Chapman,https://www.flickr.com/people/25553993@N02/ fd26c4733822dfcc,https://c1.staticflickr.com/9/8649/28250885435_30ea68123c_o.jpg,0.2806640625,0.25,0.8419921875,1.0,363,451,https://www.flickr.com/photos/usfwsmtnprairie/28250885435,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 60f5900a00d94b25,https://c1.staticflickr.com/6/5732/31328633496_995b71567c_o.jpg,0.28125,0.0,0.84375,0.75,706,558,https://www.flickr.com/photos/davidwilson1949/31328633496,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 79f953be91aa8ce2,https://c1.staticflickr.com/8/7570/27808063061_740fc61f0c_o.jpg,0.28125,0.25,0.84375,1.0,660,588,https://flickr.com/70724896@N08/27808063061,https://creativecommons.org/licenses/by/2.0/,Betta Tryptophan,https://www.flickr.com/people/nagasakiosada/ d9da4e5ef53d5e8b,https://c1.staticflickr.com/1/537/32179264340_6ea9260e9f_o.jpg,0.0,0.24882629108,1.0,1.0,641,487,https://www.flickr.com/photos/ruthanddave/32179264340/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 0411ca972e637297,https://c1.staticflickr.com/8/7761/26268791474_72626e9e6a_o.jpg,0.25,0.25,0.75,1.0,968,697,https://www.flickr.com/photos/nanpalmero/26268791474,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/ 92dbb18dd447fd75,https://c1.staticflickr.com/8/7127/27711989146_46b6ca79f6_o.jpg,0.0,0.25,0.56338028169,1.0,490,194,https://www.flickr.com/photos/southbeachcars/27711989146,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 65251969959ce0e6,https://c1.staticflickr.com/8/7623/28435254025_3c40331a75_o.jpg,0.0,0.0,1.0,1.0,938,837,https://www.flickr.com/photos/mcleod/28435254025,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/ b76e552d4b3ec0c3,https://c1.staticflickr.com/6/5662/30119560842_26f15fba19_o.jpg,0.462155963303,0.0,1.0,0.75,992,191,https://www.flickr.com/photos/127338544@N06/30119560842,https://creativecommons.org/licenses/by/2.0/,Sarah Ward,https://www.flickr.com/people/127338544@N06/ 828ade8df2d14c45,https://c1.staticflickr.com/6/5649/30456484724_643e11a460_o.jpg,0.5,0.25,1.0,1.0,888,988,https://www.flickr.com/photos/johnragai/30456484724,https://creativecommons.org/licenses/by/2.0/,John Ragai,https://www.flickr.com/people/johnragai/ 3dc0e8f854bdc9b3,https://c1.staticflickr.com/6/5682/31432432235_54a615c355_o.jpg,0.25,0.25,0.75,1.0,604,921,https://www.flickr.com/photos/lwpkommunikacio/31432432235,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 6bb6cf032c1286c5,https://c1.staticflickr.com/8/7172/26559644113_e1c454ef1c_o.jpg,0.25,0.25,1.0,0.75,468,367,https://www.flickr.com/photos/quinet/26559644113,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 2e9b377877f64b3d,https://c1.staticflickr.com/9/8503/29411674165_57521acbf9_o.jpg,0.0,0.25,0.75,1.0,499,706,https://www.flickr.com/photos/clairity/29411674165/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 2842a69bf5b14526,https://c1.staticflickr.com/9/8612/28790928395_77327e1c83_o.jpg,0.267530487805,0.25,0.802591463415,1.0,880,757,https://www.flickr.com/photos/ruthanddave/28790928395/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ a74f197288b10a0d,https://c1.staticflickr.com/9/8532/29057660090_67701b5197_o.jpg,0.25,0.0,0.75,0.75,808,748,https://www.flickr.com/photos/usacehq/29057660090,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers,https://www.flickr.com/people/usacehq/ 7a85f42383ec2f81,https://c1.staticflickr.com/9/8604/29022121774_c82af166b6_o.jpg,0.0,0.25,0.75,0.75,709,802,https://www.flickr.com/photos/greg_men/29022121774/,https://creativecommons.org/licenses/by/2.0/,Greg_Men,https://www.flickr.com/people/greg_men/ 55e85d7b58024966,https://c1.staticflickr.com/9/8611/28176653474_ef1665d13b_o.jpg,0.0,0.0,1.0,1.0,968,615,https://www.flickr.com/photos/ultrakml/28176653474,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/ d6d192c5786f29f5,https://c1.staticflickr.com/9/8094/29208873373_f929c21796_o.jpg,0.392682926829,0.25,1.0,1.0,473,830,https://www.flickr.com/photos/vastateparksstaff/29208873373,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ f533740a8d4618ce,https://c1.staticflickr.com/1/671/32497563865_bdd560906f_o.jpg,0.0,0.0,0.5,0.75,288,563,https://www.flickr.com/photos/30478819@N08/32497563865,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 5292f5b36a0789fa,https://c1.staticflickr.com/9/8761/28372171573_06dbf9a8d4_o.jpg,0.249079528719,0.0,0.747238586156,0.75,854,795,https://www.flickr.com/photos/63363807@N03/28372171573,https://creativecommons.org/licenses/by/2.0/,Didit Putra,https://www.flickr.com/people/63363807@N03/ ba4b978112a20be1,https://c1.staticflickr.com/9/8245/29288650164_e95f3a9c80_o.jpg,0.0,0.25,0.5,1.0,972,16,https://www.flickr.com/photos/pahudson/29288650164/,https://creativecommons.org/licenses/by/2.0/,Paul Hudson,https://www.flickr.com/people/pahudson/ 3692f6967c632fee,https://c1.staticflickr.com/9/8729/28628001341_0ff5c44db3_o.jpg,0.499263622975,0.0,0.99852724595,0.75,806,569,https://www.flickr.com/photos/agenciabrasilia/28628001341,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ fae551840c1690fa,https://c1.staticflickr.com/9/8166/29643263176_aa56d7230d_o.jpg,0.333333333333,0.0,1.0,1.0,720,424,https://www.flickr.com/photos/rusty_clark/29643263176,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 8020698d79dc39f2,https://c1.staticflickr.com/3/2823/33351553831_7498912a81_o.jpg,0.25,0.25,0.75,1.0,855,954,https://www.flickr.com/photos/thejointstaff/33351553831/,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ d392f0639c17f396,https://c1.staticflickr.com/8/7448/27262568354_6e93ef7b68_o.jpg,0.500736377025,0.25,1.0,1.0,808,590,https://www.flickr.com/photos/inra_dist/27262568354/,https://creativecommons.org/licenses/by/2.0/,INRA DIST,https://www.flickr.com/people/inra_dist/ 8f97e3fface13e4d,https://c1.staticflickr.com/8/7108/27051340785_a3c9ab8b6d_o.jpg,0.333333333333,0.0,1.0,1.0,472,548,https://www.flickr.com/photos/quinet/27051340785,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ a920691cf2d50f79,https://c1.staticflickr.com/9/8512/29944466315_4dabc1230d_o.jpg,0.25,0.0,0.75,0.75,947,952,https://www.flickr.com/photos/pellesten/29944466315/,https://creativecommons.org/licenses/by/2.0/,Pelle Sten,https://www.flickr.com/people/pellesten/ a482985ca1e77960,https://c1.staticflickr.com/9/8751/28431687365_edb15100b0_o.jpg,0.0,0.25,0.601941747573,1.0,891,470,https://www.flickr.com/photos/janitors/28431687365,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 362e4ac62cf888f4,https://c1.staticflickr.com/1/531/32477078836_371e833f56_o.jpg,0.0,0.0,1.0,1.0,573,36,https://www.flickr.com/photos/freedomiiphotography/32477078836,https://creativecommons.org/licenses/by/2.0/,Freedom II Andres,https://www.flickr.com/people/freedomiiphotography/ 694e7617a4878041,https://c1.staticflickr.com/8/7087/27847654031_e4003bcdca_o.jpg,0.0,0.0,1.0,0.827586206897,884,720,https://flickr.com/41383869@N07/27847654031,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/ fa5484e61e455eb2,https://c1.staticflickr.com/1/141/30799508623_1c015153fb_o.jpg,0.333333333333,0.0,1.0,1.0,477,769,https://www.flickr.com/photos/scubabix/30799508623,https://creativecommons.org/licenses/by/2.0/,Rob Bixby,https://www.flickr.com/people/scubabix/ ab42aa5e9745c214,https://c1.staticflickr.com/1/439/30759196054_5d7ae31471_o.jpg,0.524100719424,0.0,1.0,0.75,582,591,https://www.flickr.com/photos/andreboeni/30759196054,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ e6e677a28e3bd6d7,https://c1.staticflickr.com/9/8774/28104802823_5748e74f68_o.jpg,0.334315169367,0.0,1.0,1.0,604,160,https://www.flickr.com/photos/sierragoddess/28104802823,https://creativecommons.org/licenses/by/2.0/,Darla \330\257\330\247\330\261\331\204\330\247 Hueske,https://www.flickr.com/people/sierragoddess/ 2e541180b2323a5d,https://c1.staticflickr.com/6/5538/29704744484_7fee6ebbc3_o.jpg,0.0,0.0,0.75,0.75,24,905,https://www.flickr.com/photos/sarahmstewart/29704744484,https://creativecommons.org/licenses/by/2.0/,Sarah Stewart,https://www.flickr.com/people/sarahmstewart/ 01f824264783f58d,https://c1.staticflickr.com/6/5734/30178450721_1b2b4033a5_o.jpg,0.0,0.0,0.75,0.75,968,678,https://www.flickr.com/photos/naotakem/30178450721,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/ 335e604bbe3eec78,https://c1.staticflickr.com/6/5615/30719295680_945ac30a0b_o.jpg,0.5,0.0,1.0,0.75,312,687,http://www.flickr.com/photos/52450054@N04/30719295680/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 4e1bdcb677f21fb4,https://c1.staticflickr.com/8/7646/27898036952_dc65e0387a_o.jpg,0.5,0.0,1.0,0.75,874,779,https://www.flickr.com/photos/64084569@N02/27898036952,https://creativecommons.org/licenses/by/2.0/,Singa Hitam,https://www.flickr.com/people/64084569@N02/ c6b5f6c1d79dffc6,https://c1.staticflickr.com/9/8472/28615394904_41ea2d98ce_o.jpg,0.0,0.25,0.5,1.0,583,652,https://flickr.com/44440670@N04/28615394904,https://creativecommons.org/licenses/by/2.0/,Bilboko Konpartsak,https://www.flickr.com/people/bilbokokonpartsak/ 8f9c1e4fd9f4cb2e,https://c1.staticflickr.com/6/5511/30235489014_5fc7ff19a1_o.jpg,0.278188180404,0.0,0.834564541213,0.75,17,498,https://www.flickr.com/photos/taylar/30235489014,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ f54616f2af588fd8,https://c1.staticflickr.com/9/8190/28571086580_2995522f6a_o.jpg,0.5,0.25,1.0,1.0,673,113,https://www.flickr.com/photos/41406729@N05/28571086580/,https://creativecommons.org/licenses/by/2.0/,Ben Fitzgerald-O'Connor,https://www.flickr.com/people/onega/ f20911d36a287dce,https://c1.staticflickr.com/8/7010/26825773645_bb695521b3_o.jpg,0.249631811487,0.25,0.748895434462,1.0,781,492,https://www.flickr.com/photos/glynlowe/26825773645,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ 81a7637c67f4f777,https://c1.staticflickr.com/8/7331/27680526741_b962934a0e_o.jpg,0.333333333333,0.0,1.0,1.0,490,836,https://www.flickr.com/photos/144110575@N07/27680526741,https://creativecommons.org/licenses/by/2.0/,Jobs For Felons Hub,https://www.flickr.com/people/144110575@N07/ 65c1808390bd18c5,https://c1.staticflickr.com/9/8832/28094440470_78960e7877_o.jpg,0.0,0.0,0.5625,0.75,686,587,https://www.flickr.com/photos/faircompanies/28094440470,https://creativecommons.org/licenses/by/2.0/,Nicol\303\241s Boullosa,https://www.flickr.com/people/faircompanies/ e570258f1bef4ade,https://c1.staticflickr.com/8/7479/27454174925_9950df0ff9_o.jpg,0.0,0.0,0.75,0.75,367,461,https://www.flickr.com/photos/rjbailey/27454174925,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/ 58bbaa0c5ab520d5,https://c1.staticflickr.com/8/7361/26646332780_6916622aa8_o.jpg,0.25,0.25,1.0,1.0,488,716,https://www.flickr.com/photos/kattis_j/26646332780,https://creativecommons.org/licenses/by/2.0/,Katarina Jardenberg,https://www.flickr.com/people/kattis_j/ 556d8b457b94c285,https://c1.staticflickr.com/6/5584/30780053951_156743ba04_o.jpg,0.0,0.0,0.666666666667,1.0,747,378,https://www.flickr.com/photos/usarak/30780053951/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/ 38546e7d7136c2ab,https://c1.staticflickr.com/6/5495/30613441041_60e2db1f58_o.jpg,0.28125,0.0,0.84375,0.75,600,114,https://flickr.com/17157315@N00/30613441041,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/ 9876fe92d003c9d4,https://c1.staticflickr.com/8/7426/27451221106_7d02f7a3b2_o.jpg,0.28125,0.0,0.84375,0.75,913,357,https://www.flickr.com/photos/10413717@N08/27451221106,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer,https://www.flickr.com/people/10413717@N08/ 8df3dc0c3fef1824,https://c1.staticflickr.com/9/8509/29548650262_4dba7e8039_o.jpg,0.333333333333,0.0,1.0,1.0,951,843,https://flickr.com/143363015@N06/29548650262,https://creativecommons.org/licenses/by/2.0/,Tobias Begemann,https://www.flickr.com/people/tobiasbegemann/ 938ada2f2bfa2b68,https://c1.staticflickr.com/9/8149/29352102754_7ac0f1c311_o.jpg,0.25,0.25,0.75,1.0,844,918,https://www.flickr.com/photos/amslerpix/29352102754/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 61131df39f19a4a0,https://c1.staticflickr.com/6/5497/31308303502_0e6f130313_o.jpg,0.0,0.25,0.5625,1.0,615,867,https://www.flickr.com/photos/davidstanleytravel/31308303502,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 7278c2b63080f08c,https://c1.staticflickr.com/1/338/32818896976_e770e081a2_o.jpg,0.0,0.0,0.666666666667,1.0,349,287,http://www.flickr.com/photos/noortjvdb/32818896976/,https://creativecommons.org/licenses/by/2.0/,noortjevdB,https://www.flickr.com/people/noortjvdb/ f734e87286835196,https://c1.staticflickr.com/6/5618/29467877973_f53d845cd7_o.jpg,0.249079528719,0.25,0.747238586156,1.0,324,660,https://www.flickr.com/photos/usfwsmtnprairie/29467877973/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 06a0e36c443746b5,https://c1.staticflickr.com/1/689/31497463186_001b31fa44_o.jpg,0.5,0.0,1.0,0.75,354,232,https://www.flickr.com/photos/dkeats/31497463186,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ d7d8fc1442a82a8e,https://c1.staticflickr.com/8/7041/26864593362_503898424a_o.jpg,0.0,0.25,0.599757673667,1.0,22,846,https://www.flickr.com/photos/andymorffew/26864593362,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ f9937696f421f4e4,https://c1.staticflickr.com/1/688/32401990166_57c8cdae3d_o.jpg,0.333333333333,0.0,1.0,1.0,85,491,https://www.flickr.com/photos/kkoshy/32401990166,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/ 9429f0d1ad2283df,https://c1.staticflickr.com/6/5034/30184154626_f341307e8a_o.jpg,0.0,0.200323101777,1.0,1.0,438,464,https://www.flickr.com/photos/janitors/30184154626,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 7524a7ef9de8edc3,https://c1.staticflickr.com/9/8825/28821400601_33e22535e7_o.jpg,0.135906040268,0.0,1.0,1.0,947,307,https://www.flickr.com/photos/oceanyamaha/28821400601,https://creativecommons.org/licenses/by/2.0/,ocean yamaha,https://www.flickr.com/people/oceanyamaha/ c98a8640dcfaa5e0,https://c1.staticflickr.com/1/656/32592379656_ef2d01af55_o.jpg,0.0,0.0,0.56338028169,0.75,747,847,https://www.flickr.com/photos/mark6mauno/32592379656/,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ d34c51d7523e9c0f,https://c1.staticflickr.com/9/8861/28145818093_4c661cab2c_o.jpg,0.0,0.0,0.663235294118,1.0,647,655,https://www.flickr.com/photos/shankaronline/28145818093,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 24726d9054e9d78f,https://c1.staticflickr.com/9/8205/28857614150_fc34c1c771_o.jpg,0.421177266576,0.0,0.842354533153,0.75,545,455,https://www.flickr.com/photos/wittcogmbh/28857614150/,https://creativecommons.org/licenses/by/2.0/,wittco.gmbh,https://www.flickr.com/people/wittcogmbh/ 66aa56675136bbab,https://c1.staticflickr.com/8/7237/27131945991_c25202b461_o.jpg,0.0,0.331617647059,1.0,0.994852941176,470,607,https://www.flickr.com/photos/sterlingcollege/27131945991/,https://creativecommons.org/licenses/by/2.0/,Sterling College,https://www.flickr.com/people/sterlingcollege/ a8fe76c687b00e33,https://c1.staticflickr.com/1/538/31501305733_eba5c35a04_o.jpg,0.438671875,0.25,1.0,1.0,598,119,https://flickr.com/25187162@N03/31501305733,https://creativecommons.org/licenses/by/2.0/,BRUCE GIBSON,https://www.flickr.com/people/gibsongunleather/ 411c5d79017077f4,https://c1.staticflickr.com/8/7357/27945593082_c5faf86d90_o.jpg,0.0,0.0,0.744548286604,1.0,82,677,https://www.flickr.com/photos/jkirkhart35/27945593082,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/ bb6fcb4a52b4fc0f,https://c1.staticflickr.com/8/7796/26996485435_ce0ae48ae9_o.jpg,0.333333333333,0.0,1.0,1.0,735,510,https://www.flickr.com/photos/transitomedellin/26996485435,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ 84640859ee739095,https://c1.staticflickr.com/9/8484/29052403164_26fb76527d_o.jpg,0.28125,0.25,0.84375,1.0,720,580,https://www.flickr.com/photos/rusty_clark/29052403164,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 6d2d82bc1ba0a956,https://c1.staticflickr.com/1/642/31650552204_c0eed2f414_o.jpg,0.0,0.0,0.75,0.713028169014,52,664,https://www.flickr.com/photos/jsjgeology/31650552204,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 3e1e47f5af2a3f16,https://c1.staticflickr.com/8/7515/27308980890_45a4af4039_o.jpg,0.251294378698,0.25,0.753883136095,1.0,294,357,https://www.flickr.com/photos/dkeats/27308980890,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 1ac44ddb6a2d497a,https://c1.staticflickr.com/6/5782/31278384662_150be3d19e_o.jpg,0.333333333333,0.0,1.0,1.0,898,27,https://www.flickr.com/photos/lge/31278384662,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 7a291389e67a8a07,https://c1.staticflickr.com/9/8164/29763489606_b506759ed9_o.jpg,0.0,0.333333333333,1.0,1.0,417,637,https://www.flickr.com/photos/rickmccharles/29763489606/,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/ afa0f88aaab03427,https://c1.staticflickr.com/9/8284/29065395243_e0aa5811b3_o.jpg,0.0,0.25,0.5625,1.0,545,3,https://flickr.com/16813029@N08/29065395243,https://creativecommons.org/licenses/by/2.0/,wittco.gmbh,https://www.flickr.com/people/wittcogmbh/ 1e26772fc8c493bb,https://c1.staticflickr.com/6/5725/30011753244_385c391182_o.jpg,0.0,0.0,0.5,0.75,416,14,http://www.flickr.com/photos/147860906@N07/30011753244/,https://creativecommons.org/licenses/by/2.0/,DYKT Mohigan,https://www.flickr.com/people/147860906@N07/ 4d1237ccbd9a5b4b,https://c1.staticflickr.com/9/8015/29404892510_e505843f23_o.jpg,0.353159851301,0.25,0.706319702602,1.0,815,423,https://www.flickr.com/photos/yamahawatercraft/29404892510/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/ c3f452167c39302f,https://c1.staticflickr.com/8/7571/27007736911_797f24353c_o.jpg,0.350800582242,0.0,1.0,1.0,296,922,https://www.flickr.com/photos/usdagov/27007736911,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 6841e385fe79177f,https://c1.staticflickr.com/1/689/31896146460_9cd904330e_o.jpg,0.255395683453,0.25,1.0,1.0,830,833,https://flickr.com/45131642@N00/31896146460,https://creativecommons.org/licenses/by/2.0/,Phil Parker,https://www.flickr.com/people/45131642@N00/ b48febf2b989205b,https://c1.staticflickr.com/8/7537/26855046792_36c804efd2_o.jpg,0.25,0.25,0.75,1.0,760,635,https://www.flickr.com/photos/barnimages/26855046792,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ baeb1300832574aa,https://c1.staticflickr.com/9/8775/29342994144_a7e3326c12_o.jpg,0.454002808989,0.0,0.908005617978,0.75,972,660,https://www.flickr.com/photos/hisgett/29342994144/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 7b6cc934fda859fa,https://c1.staticflickr.com/9/8752/28029665143_654198da68_o.jpg,0.25,0.28125,1.0,0.84375,307,653,https://www.flickr.com/photos/yto/28029665143/,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/ 39f82c728c956125,https://c1.staticflickr.com/1/400/32155857566_fb6080d6f9_o.jpg,0.296147672552,0.0,0.888443017657,0.75,638,762,http://www.flickr.com/photos/mark-gunn/32155857566/,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ c8231978dc765004,https://c1.staticflickr.com/8/7787/28887518643_2e0a3954f5_o.jpg,0.248348017621,0.25,0.745044052863,1.0,472,741,https://flickr.com/51434786@N06/28887518643,https://creativecommons.org/licenses/by/2.0/,crudmucosa,https://www.flickr.com/people/crudmucosa/ 823f8eae0df2d5c1,https://c1.staticflickr.com/8/7482/27862170094_b1b7c6a698_o.jpg,0.0,0.25,0.531155015198,1.0,95,570,https://www.flickr.com/photos/usfwsmtnprairie/27862170094,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 038fd7a750733bb5,https://c1.staticflickr.com/1/654/31793584681_74a2ac4e3a_o.jpg,0.0,0.0,0.490510948905,0.75,18,103,https://www.flickr.com/photos/kkoshy/31793584681,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/ 6d6078c60e59e9f4,https://c1.staticflickr.com/9/8136/30193749621_f4b1f30016_o.jpg,0.0,0.0,0.5625,0.75,985,797,https://www.flickr.com/photos/usfwsmidwest/30193749621/,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 1f71668ab3dbe81b,https://c1.staticflickr.com/1/452/31908949435_f7e5ec059c_o.jpg,0.0,0.0,1.0,0.75,709,967,https://www.flickr.com/photos/londonmatt/31908949435,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 70b3b833463d20b9,https://c1.staticflickr.com/8/7052/27277805330_6ee69eaf87_o.jpg,0.0,0.28125,0.75,0.84375,864,857,https://www.flickr.com/photos/crondeau/27277805330,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/ dd4d033a9a45552d,https://c1.staticflickr.com/9/8580/29739921130_3c98d8504c_o.jpg,0.282719435737,0.0,0.84815830721,0.75,392,126,https://www.flickr.com/photos/taylar/29739921130,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ 8800cff23fade16a,https://c1.staticflickr.com/8/7448/26655153174_a2122e0682_o.jpg,0.25,0.215753424658,1.0,0.647260273973,532,314,https://www.flickr.com/photos/51764518@N02/26655153174,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ af2ac1705dc19a5f,https://c1.staticflickr.com/9/8870/27676047423_1399759e15_o.jpg,0.333333333333,0.0,1.0,1.0,384,99,https://www.flickr.com/photos/30802095@N04/27676047423,https://creativecommons.org/licenses/by/2.0/,Liam Lysaght,https://www.flickr.com/people/30802095@N04/ 87937b805302f958,https://c1.staticflickr.com/1/737/32203735982_b50d7c2ca2_o.jpg,0.0,0.25,0.421177266576,1.0,418,873,https://www.flickr.com/photos/indigoskye/32203735982/in/photolist-R4JyKh-Q1hbGP-R1Gh67-HJixCL-QAEACy-QZmsqR-PTxYKd-PW9vX2-R7jm25-R7hjwW-QAqSgq-R7hhzu-R7hgyb-RazyPk-PSDtLK-PRt1D4-R5An1t-R2dxoq-PQYSyx-PQVJLV-Qv1VKs-QQAfjx-QPtAQH-QV1feS-QZUFDW-QiHqud-Qipyb1-QP34Gf-QF3Y5K-QCsidg-QzgK6Z-QGhQVL-QFLXCt-Pw4Qzr-QKAPYa-Ptjweh-Pw4AiR-QGhLiE-Qbw8CG-QKA5zr-QKzZVM-QKzUwk-QwtoyG-Pw3Y58-PtiNHS-PtiF79-Qbvq49-QGgLtS-Qbvg2m-PtioRJ,https://creativecommons.org/licenses/by/2.0/,John Frost,https://www.flickr.com/people/indigoskye/ f33087679c5e7799,https://c1.staticflickr.com/6/5571/31004412114_2bbb2ce701_o.jpg,0.25,0.0,1.0,0.641068447412,443,588,https://www.flickr.com/photos/duncanh1/31004412114,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 6374e7e35ad90f50,https://c1.staticflickr.com/6/5513/31121388731_7eecd1eea3_o.jpg,0.0,0.0,0.666666666667,1.0,39,771,https://www.flickr.com/photos/silkebaron/31121388731/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ 92c73d668e2cd3ce,https://c1.staticflickr.com/6/5444/29773329694_58d4166f7b_o.jpg,0.0,0.0,0.75,1.0,859,582,https://www.flickr.com/photos/togawanderings/29773329694,https://creativecommons.org/licenses/by/2.0/,Thomas Galvez,https://www.flickr.com/people/togawanderings/ e8d5809ee6888f8f,https://c1.staticflickr.com/8/7742/26192609743_0b09bc425e_o.jpg,0.0,0.25,0.502588757396,1.0,717,641,https://www.flickr.com/photos/riversdale_estate/26192609743,https://creativecommons.org/licenses/by/2.0/,Riversdale Estate,https://www.flickr.com/people/riversdale_estate/ 45da32a1cf073a4f,https://c1.staticflickr.com/8/7362/27048969652_bf3a3854f1_o.jpg,0.0,0.25,0.544615384615,1.0,100,897,https://www.flickr.com/photos/brighton/27048969652,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ fe94909a2fad4ffe,https://c1.staticflickr.com/8/7434/27542851474_00e37a272d_o.jpg,0.0,0.187296416938,1.0,1.0,547,965,https://www.flickr.com/photos/haywirecustomguitars/27542851474,https://creativecommons.org/licenses/by/2.0/,Rick Mariner,https://www.flickr.com/people/haywirecustomguitars/ 00c3cd597f1ee96f,https://c1.staticflickr.com/6/5615/31076781681_e0a951dd43_o.jpg,0.0,0.464122137405,0.75,1.0,138,96,https://flickr.com/143049688@N08/31076781681,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ a5949b0719d3ea77,https://c1.staticflickr.com/9/8667/28605783432_909eee5361_o.jpg,0.25,0.25,0.75,1.0,981,473,https://www.flickr.com/photos/amslerpix/28605783432/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ d7984e6e1a51b3c4,https://c1.staticflickr.com/9/8883/28628911182_0982dd70ae_o.jpg,0.4375,0.0,1.0,0.75,518,937,https://flickr.com/32916425@N04/28628911182,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ 979757e16b67ac7e,https://c1.staticflickr.com/6/5590/31340775762_a825141a4d_o.jpg,0.0,0.25,0.636439267887,1.0,323,798,https://www.flickr.com/photos/gails_pictures/31340775762/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 60ab0fb53634bc3c,https://c1.staticflickr.com/9/8410/28986276455_81071dc27d_o.jpg,0.0,0.25,0.504444444444,1.0,766,552,https://flickr.com/22711505@N05/28986276455,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ ad333e5d6953cbbf,https://c1.staticflickr.com/6/5788/30472796174_6eec033c0e_o.jpg,0.25,0.0,0.75,0.75,633,297,https://flickr.com/21178495@N06/30472796174,https://creativecommons.org/licenses/by/2.0/,Tiago Cassol Schvarstzhaupt,https://www.flickr.com/people/eletrosonico/ 2b7e6f0d6f73fa1f,https://c1.staticflickr.com/3/2649/32280811454_5755bb1af9_o.jpg,0.0,0.0,0.75,0.732589285714,638,235,https://flickr.com/56041749@N02/32280811454,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/ 4063377442ea93d3,https://c1.staticflickr.com/1/653/32223796996_304c6b269d_o.jpg,0.25,0.0,0.75,0.75,596,814,https://www.flickr.com/photos/grimmegroup/32223796996/,https://creativecommons.org/licenses/by/2.0/,Grimme Group,https://www.flickr.com/people/grimmegroup/ 60ed157b21d49c4c,https://c1.staticflickr.com/3/2843/32866501816_486e532c1a_o.jpg,0.0,0.25,0.606331168831,1.0,755,960,https://www.flickr.com/photos/51764518@N02/32866501816,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 8f07c92f0af97807,https://c1.staticflickr.com/8/7366/26918793702_778d2226ac_o.jpg,0.5,0.25,1.0,1.0,806,108,https://www.flickr.com/photos/claude_wians/26918793702,https://creativecommons.org/licenses/by/2.0/,Claude Wians,https://www.flickr.com/people/claude_wians/ d67b326ef48bb7b7,https://c1.staticflickr.com/6/5350/29991729355_5ab8b027df_o.jpg,0.333333333333,0.0,1.0,1.0,874,546,https://www.flickr.com/photos/bholl7510/29991729355/,https://creativecommons.org/licenses/by/2.0/,Brian Holland,https://www.flickr.com/people/bholl7510/ 9f3afb58c061c290,https://c1.staticflickr.com/9/8629/27671691554_a8bbdda66f_o.jpg,0.264204545455,0.25,0.792613636364,1.0,981,754,https://www.flickr.com/photos/noaaphotolib/27671691554,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 1f7c25207bc3e303,https://c1.staticflickr.com/9/8605/29961048043_fe10e305d4_o.jpg,0.25,0.0,0.75,0.75,476,979,https://flickr.com/56537760@N03/29961048043,https://creativecommons.org/licenses/by/2.0/,Th\303\251o Paul,https://www.flickr.com/people/theopaul/ 70d812d368e3e828,https://c1.staticflickr.com/9/8261/29319398451_2005584856_o.jpg,0.0,0.0,0.75,0.75,456,202,https://www.flickr.com/photos/markmorgantrinidad/29319398451,https://creativecommons.org/licenses/by/2.0/,Mark Morgan,https://www.flickr.com/people/markmorgantrinidad/ e19a59ad09d18497,https://c1.staticflickr.com/8/7300/27213625016_61cc784152_o.jpg,0.0,0.25,0.559282371295,1.0,443,915,https://www.flickr.com/photos/rutiful/27213625016,https://creativecommons.org/licenses/by/2.0/,Ruth Hara,https://www.flickr.com/people/rutiful/ dde33b51c8c152d2,https://c1.staticflickr.com/4/3784/32757850161_333a586b05_o.jpg,0.0,0.0,0.75,1.0,735,969,https://www.flickr.com/photos/27665395@N05/32757850161,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ a33af1b9f8b8a81b,https://c1.staticflickr.com/6/5592/29999027335_510c67fbc7_o.jpg,0.28125,0.25,0.84375,1.0,880,667,https://www.flickr.com/photos/31029865@N06/29999027335,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/ 1c924877ccc60129,https://c1.staticflickr.com/3/2002/32192998414_890b5b84db_o.jpg,0.4375,0.25,1.0,1.0,410,567,https://www.flickr.com/photos/stevendepolo/32192998414,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 74dbbe535861d709,https://c1.staticflickr.com/8/7687/27703779525_8a8baaaae3_o.jpg,0.0,0.0,0.666666666667,1.0,702,194,https://www.flickr.com/photos/7armyjmtc/27703779525,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 858ec91996beb034,https://c1.staticflickr.com/9/8746/28705196386_80e810df65_o.jpg,0.0,0.0,0.75,0.75,686,962,https://www.flickr.com/photos/moto_club4ag/28705196386,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ e5cf220f8144c192,https://c1.staticflickr.com/8/7554/27328391223_6883936624_o.jpg,0.280784844384,0.0,0.842354533153,1.0,706,441,https://www.flickr.com/photos/abhinavnfr/27328391223,https://creativecommons.org/licenses/by/2.0/,Abhinav Phangcho Choudhury,https://www.flickr.com/people/abhinavnfr/ 34a39905ce228160,https://c1.staticflickr.com/8/7461/26512655533_d5fe870fbb_o.jpg,0.0,0.5,0.75,1.0,769,752,https://www.flickr.com/photos/30478819@N08/26512655533,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 9455bd672cb9e4bd,https://c1.staticflickr.com/8/7442/27892201106_9c907e9c26_o.jpg,0.25,0.0,1.0,1.0,522,582,https://flickr.com/39160147@N03/27892201106,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 9c509bfb75167fb0,https://c1.staticflickr.com/1/558/32052180035_f042256367_o.jpg,0.0,0.0,1.0,0.831960461285,641,748,https://flickr.com/44093058@N06/32052180035,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fr\303\266berg,https://www.flickr.com/people/blondinrikard/ 37e7dc99bf2704c7,https://c1.staticflickr.com/8/7278/26737658351_041174fc0e_o.jpg,0.25,0.25,1.0,0.75,664,610,https://www.flickr.com/photos/97199236@N04/26737658351,https://creativecommons.org/licenses/by/2.0/,Andrey Gaverdovsky,https://www.flickr.com/people/97199236@N04/ f2bfa7a95e787fe1,https://c1.staticflickr.com/4/3918/33459563545_763a160b5a_o.jpg,0.248348017621,0.0,0.745044052863,0.75,721,218,https://www.flickr.com/photos/yourbestdigs/33459563545/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 0f9d8c86a9f38020,https://c1.staticflickr.com/9/8556/29567784475_4f78605d50_o.jpg,0.333333333333,0.0,1.0,1.0,760,118,https://www.flickr.com/photos/markusspiske/29567784475/,https://creativecommons.org/licenses/by/2.0/,Markus Spiske,https://www.flickr.com/people/markusspiske/ ce05236afebb173d,https://c1.staticflickr.com/1/515/30802275984_2565161d0f_o.jpg,0.0,0.25,0.710456942004,1.0,536,510,https://www.flickr.com/photos/glorycycles/30802275984,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 12fb008451be82d4,https://c1.staticflickr.com/1/339/31842507145_e9db35db2b_o.jpg,0.28125,0.0,0.84375,0.75,583,555,https://www.flickr.com/photos/southbeachcars/31842507145,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 1a7425e8f990e04a,https://c1.staticflickr.com/6/5635/30586945602_29b323c620_o.jpg,0.25,0.25,1.0,1.0,608,676,https://www.flickr.com/photos/powellburns/30586945602,https://creativecommons.org/licenses/by/2.0/,Powell Burns,https://www.flickr.com/people/powellburns/ 1ba816dc6937b62d,https://c1.staticflickr.com/9/8538/29489317193_4ea10616ea_o.jpg,0.496696035242,0.25,0.993392070485,1.0,860,768,https://www.flickr.com/photos/yourbestdigs/29489317193,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ a92e49d8bbdc2aae,https://c1.staticflickr.com/8/7292/28045564580_52c7cf78b1_o.jpg,0.0,0.0,0.684603886398,1.0,533,564,https://www.flickr.com/photos/regnatarajan/28045564580,https://creativecommons.org/licenses/by/2.0/,Reg Natarajan,https://www.flickr.com/people/regnatarajan/ 0e0f1fd2ed183781,https://c1.staticflickr.com/6/5785/29863538926_4b27fc8b6a_o.jpg,0.0,0.0,0.804207119741,1.0,114,988,https://www.flickr.com/photos/gails_pictures/29863538926,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ c83cfca4bc9dd3c7,https://c1.staticflickr.com/8/7338/26885484975_11ac869fe2_o.jpg,0.421177266576,0.25,0.842354533153,1.0,696,730,https://flickr.com/65811939@N00/26885484975,https://creativecommons.org/licenses/by/2.0/,Radarsmum67,https://www.flickr.com/people/radarsmum67/ 172f992e1a0ebbc3,https://c1.staticflickr.com/6/5598/31398988035_25b2ca9970_o.jpg,0.306930693069,0.0,0.920792079208,1.0,566,492,https://www.flickr.com/photos/kansasscanner/31398988035/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 565c67fd230f18cc,https://c1.staticflickr.com/9/8783/28325823061_8c659541be_o.jpg,0.0,0.0,0.5,0.75,555,854,https://www.flickr.com/photos/115391424@N05/28325823061,https://creativecommons.org/licenses/by/2.0/,lasta29,https://www.flickr.com/people/115391424@N05/ b8596bba57a73794,https://c1.staticflickr.com/8/7380/26874457623_c0dc46b3fa_o.jpg,0.475215517241,0.25,0.950431034483,1.0,352,41,https://www.flickr.com/photos/dkeats/26874457623,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ d94940216544b2c5,https://c1.staticflickr.com/4/3684/32889855711_216843d54b_o.jpg,0.0,0.0,0.745709828393,1.0,312,622,https://www.flickr.com/photos/gails_pictures/32889855711,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 9f55ac35ce9703e5,https://c1.staticflickr.com/8/7326/26785585893_a25ac89a89_o.jpg,0.226157082749,0.25,0.678471248247,1.0,9,194,https://www.flickr.com/photos/94066540@N08/26785585893,https://creativecommons.org/licenses/by/2.0/,Stuart Mckiggan,https://www.flickr.com/people/94066540@N08/ 55323ce1ff485412,https://c1.staticflickr.com/1/772/32544267962_4093028c88_o.jpg,0.0,0.0,0.5,0.75,386,571,https://www.flickr.com/photos/30478819@N08/32544267962,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 526f322d78bd5b44,https://c1.staticflickr.com/6/5674/30963905825_0ff9253d66_o.jpg,0.271186440678,0.0,1.0,1.0,571,288,https://www.flickr.com/photos/taymtaym/30963905825/,https://creativecommons.org/licenses/by/2.0/,taymtaym,https://www.flickr.com/people/taymtaym/ 229fbe790098d2e5,https://c1.staticflickr.com/9/8366/29338309226_66c4557833_o.jpg,0.0,0.0,0.56338028169,0.75,481,576,https://www.flickr.com/photos/jeepersmedia/29338309226,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ e0c0f412d78571dc,https://c1.staticflickr.com/8/7079/27237503592_028a10898b_o.jpg,0.25,0.0,1.0,0.748646209386,734,409,https://www.flickr.com/photos/alvy/27237503592,https://creativecommons.org/licenses/by/2.0/,\303\201lvaro Ib\303\241\303\261ez,https://www.flickr.com/people/alvy/ d12aad0d18252b40,https://c1.staticflickr.com/9/8155/29394215765_0a9fb71d55_o.jpg,0.5,0.0,1.0,0.75,325,39,https://www.flickr.com/photos/yutakaseki/29394215765,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ 22712d0324d43ef2,https://c1.staticflickr.com/8/7783/29065239841_856237083c_o.jpg,0.0,0.25,0.75,1.0,898,847,https://www.flickr.com/photos/lge/29065239841,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 3201d10ec4dca056,https://c1.staticflickr.com/9/8335/28756723693_0d013b2d23_o.jpg,0.25,0.0,0.75,0.75,739,605,https://www.flickr.com/photos/wuipdesign/28756723693,https://creativecommons.org/licenses/by/2.0/,Wuipdesign,https://www.flickr.com/people/wuipdesign/ 62c7958e7cd80cca,https://c1.staticflickr.com/9/8422/29506847095_d1d503ca6e_o.jpg,0.0,0.32332761578,0.75,1.0,402,757,https://www.flickr.com/photos/atoach/29506847095/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 12cf4de43c70273e,https://c1.staticflickr.com/9/8107/29584374652_9e00ea0c4c_o.jpg,0.608865710561,0.25,1.0,1.0,815,833,https://flickr.com/42219086@N05/29584374652,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/ 56dbd7d814ef5c58,https://c1.staticflickr.com/8/7633/27183091666_8c5fc3c63a_o.jpg,0.0,0.0,0.669128508124,1.0,254,277,https://www.flickr.com/photos/70253321@N00/27183091666,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ e91abe0f1a7a30f4,https://c1.staticflickr.com/9/8428/29430666931_e770d94da0_o.jpg,0.480130057803,0.0,0.960260115607,0.75,752,495,https://www.flickr.com/photos/omnious100/29430666931,https://creativecommons.org/licenses/by/2.0/,Arturo Hurtado,https://www.flickr.com/people/omnious100/ 641d03527848417f,https://c1.staticflickr.com/6/5341/30230914936_690327db34_o.jpg,0.0,0.25,0.551470588235,1.0,341,450,https://www.flickr.com/photos/happymillerman/30230914936,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ de282cea97167923,https://c1.staticflickr.com/9/8491/28883167640_a8d08d7c53_o.jpg,0.0,0.330871491876,1.0,1.0,305,656,https://www.flickr.com/photos/52450054@N04/28883167640,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 088560551b91ceb0,https://c1.staticflickr.com/8/7287/26823150326_c79c4cf404_o.jpg,0.25,0.4375,1.0,1.0,983,797,https://www.flickr.com/photos/ewolivera/26823150326,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ a70b1cda0776cba6,https://c1.staticflickr.com/1/527/32735802985_cf85631809_o.jpg,0.0,0.25,0.5,1.0,143,119,https://www.flickr.com/photos/ddebold/32735802985/,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ c036b20afde859b7,https://c1.staticflickr.com/9/8254/28443278150_007ab658ba_o.jpg,0.0,0.0,0.5625,0.75,281,508,https://www.flickr.com/photos/californiadfg/28443278150/,https://creativecommons.org/licenses/by/2.0/,California Department of Fish and Wildlife,https://www.flickr.com/people/californiadfg/ 5d6c4759c26bae8c,https://c1.staticflickr.com/9/8174/28972300461_1d85484b62_o.jpg,0.25,0.25,0.75,1.0,547,746,https://www.flickr.com/photos/30478819@N08/28972300461,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 3eded0a8d5f16059,https://c1.staticflickr.com/8/7448/27356260545_152e77a25a_o.jpg,0.23937007874,0.0,1.0,1.0,100,457,https://www.flickr.com/photos/brighton/27356260545,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ 9db1070b1b9f03d2,https://c1.staticflickr.com/4/3818/33059801071_2681885776_o.jpg,0.0,0.0,0.522624434389,0.75,324,870,https://www.flickr.com/photos/132033298@N04/33059801071,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/ e3c3f8889ac99aec,https://c1.staticflickr.com/9/8786/28331257953_f5d077c2c1_o.jpg,0.0,0.248713235294,0.75,0.746139705882,536,897,https://www.flickr.com/photos/boostsamurai/28331257953,https://creativecommons.org/licenses/by/2.0/,JAK SIE MASZ,https://www.flickr.com/people/boostsamurai/ d6d42f8a1f6b4460,https://c1.staticflickr.com/9/8230/29839990905_33b2231132_o.jpg,0.564649243466,0.0,1.0,0.75,666,374,https://www.flickr.com/photos/pedrosimoes7/29839990905,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Sim\303\265es,https://www.flickr.com/people/pedrosimoes7/ 517dc655edeaf344,https://c1.staticflickr.com/8/7309/26590993833_7b17146eda_o.jpg,0.0,0.0,0.5,0.75,430,920,https://www.flickr.com/photos/slgc/26590993833,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ 10db986bad48a9d5,https://c1.staticflickr.com/8/7092/26592880754_0af21a54f5_o.jpg,0.25,0.0,1.0,0.75,894,134,https://www.flickr.com/photos/vertstone/26592880754,https://creativecommons.org/licenses/by/2.0/,Sunil Dass,https://www.flickr.com/people/vertstone/ 17cfccd62451a233,https://c1.staticflickr.com/8/7005/27391093362_0c39bc1805_o.jpg,0.25,0.25,1.0,1.0,966,571,https://www.flickr.com/photos/rjbailey/27391093362/,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/ 212476b1b58a0cfe,https://c1.staticflickr.com/6/5349/29372567534_c17516e486_o.jpg,0.255402384501,0.25,0.766207153502,1.0,512,697,http://www.flickr.com/photos/andreboeni/29372567534/,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 919a6f1d23c6d05e,https://c1.staticflickr.com/6/5348/31279804625_839baf7892_o.jpg,0.0,0.25,0.5,1.0,145,983,https://www.flickr.com/photos/ddebold/31279804625,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ da4f4d6944d93ae0,https://c1.staticflickr.com/6/5260/29956436271_478885e6f4_o.jpg,0.0,0.0,0.75,1.0,735,779,https://www.flickr.com/photos/27665395@N05/29956436271,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 1461ed9402248ddc,https://c1.staticflickr.com/8/7699/27042345425_591120613f_o.jpg,0.25,0.25,0.75,1.0,514,725,https://www.flickr.com/photos/jimfischer/27042345425/,https://creativecommons.org/licenses/by/2.0/,Jim Fischer,https://www.flickr.com/people/jimfischer/ f0dcd519b5499d48,https://c1.staticflickr.com/6/5218/29421210913_9b476c8d85_o.jpg,0.23052407932,0.25,0.69157223796,1.0,664,231,https://www.flickr.com/photos/eltb/29421210913,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 9a5913e0fb6d0866,https://c1.staticflickr.com/9/8795/28922147966_1362994487_o.jpg,0.0,0.0,0.5625,0.75,767,204,https://www.flickr.com/photos/londonmatt/28922147966/,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ cfab8f880da31ad8,https://c1.staticflickr.com/1/35/31390789132_d7ab56b8eb_o.jpg,0.28125,0.0,0.84375,0.75,541,308,https://www.flickr.com/photos/jsjgeology/31390789132,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 17df043d369008f5,https://c1.staticflickr.com/9/8249/28958829961_fe65fb3bb9_o.jpg,0.281690140845,0.25,0.845070422535,1.0,991,802,https://www.flickr.com/photos/scotnelson/28958829961,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 95d6a4087f394d8b,https://c1.staticflickr.com/9/8129/28719483854_d03b5d7da2_o.jpg,0.333333333333,0.0,1.0,1.0,750,541,https://flickr.com/96541566@N06/28719483854,https://creativecommons.org/licenses/by/2.0/,Jan Helebrant,https://www.flickr.com/people/96541566@N06/ 0be391239ccba0f2,https://c1.staticflickr.com/4/3905/32853501241_fc35720ce1_o.jpg,0.0,0.0,0.7484375,1.0,719,996,https://www.flickr.com/photos/feeney1982/32853501241,https://creativecommons.org/licenses/by/2.0/,MK Feeney,https://www.flickr.com/people/feeney1982/ 8d68931ba23fdeb7,https://c1.staticflickr.com/8/7102/27075766490_313dd1d866_o.jpg,0.0,0.267530487805,0.75,0.802591463415,842,800,https://www.flickr.com/photos/spreadshirt/27075766490,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/ 6bff4ecb94f1f84e,https://c1.staticflickr.com/9/8347/28860027516_8f8d9bee70_o.jpg,0.257672155689,0.0,0.773016467066,0.75,859,866,https://www.flickr.com/photos/governosp/28860027516,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de S\303\243o Paulo,https://www.flickr.com/people/governosp/ 96fcb76927274db6,https://c1.staticflickr.com/9/8705/28851545335_aa85baa5f3_o.jpg,0.5,0.25,1.0,1.0,472,316,https://www.flickr.com/photos/quinet/28851545335,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 4de063bd5b838f11,https://c1.staticflickr.com/6/5669/30863954931_bc7e58710c_o.jpg,0.28125,0.0,0.84375,0.75,2,289,https://www.flickr.com/photos/tamakisono/30863954931/,https://creativecommons.org/licenses/by/2.0/,Tamaki Sono,https://www.flickr.com/people/tamakisono/ 55b85f4336d9603a,https://c1.staticflickr.com/8/7245/27089308192_03759b12c3_o.jpg,0.0,0.0,1.0,1.0,880,30,https://www.flickr.com/photos/10459174@N03/27089308192/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/ f6437ed4f1b8fe23,https://c1.staticflickr.com/6/5695/31218448105_c5d0e22fd3_o.jpg,0.160367170626,0.0,0.481101511879,1.0,302,843,http://www.flickr.com/photos/131914450@N06/31218448105,https://creativecommons.org/licenses/by/2.0/,burgerking1975,https://www.flickr.com/people/131914450@N06/ a90d9627e2145090,https://c1.staticflickr.com/9/8059/29463573752_e27f82a1e6_o.jpg,0.510583941606,0.25,1.0,1.0,426,722,https://www.flickr.com/photos/60712129@N06/29463573752/,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/ f4bde5facfdca0c6,https://c1.staticflickr.com/1/405/32476678205_491d504f85_o.jpg,0.0,0.0,1.0,1.0,788,194,https://flickr.com/14385354@N00/32476678205,https://creativecommons.org/licenses/by/2.0/,Ungry Young Man,https://www.flickr.com/people/markusunger/ 803450d936b35ebb,https://c1.staticflickr.com/8/7476/29073407732_3a52be689b_o.jpg,0.249631811487,0.0,0.748895434462,0.75,934,258,https://www.flickr.com/photos/comedynose/29073407732/,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/ fff35cdcce3cde43,https://c1.staticflickr.com/9/8463/29106205880_18aa360993_o.jpg,0.0,0.0,0.5,0.75,913,409,https://www.flickr.com/photos/davebloggs007/29106205880,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ b58e8d136aff5a50,https://c1.staticflickr.com/9/8188/29745896581_ff26e547ca_o.jpg,0.25,0.25,0.75,1.0,625,565,https://www.flickr.com/photos/fst_oeb_nrw/29745896581,https://creativecommons.org/licenses/by/2.0/,Fachstelle f\303\274r \303\226ffentliche Bibliotheken NRW,https://www.flickr.com/people/fst_oeb_nrw/ 76d7e2d1bf3a31fe,https://c1.staticflickr.com/9/8072/29787724155_f733ca9146_o.jpg,0.421177266576,0.25,0.842354533153,1.0,312,732,https://www.flickr.com/photos/31031835@N08/29787724155,https://creativecommons.org/licenses/by/2.0/,John Tann,https://www.flickr.com/people/31031835@N08/ a777db736ecdfb65,https://c1.staticflickr.com/8/7324/27415463920_2958a226d7_o.jpg,0.0,0.128161888702,1.0,1.0,326,56,https://www.flickr.com/photos/wildreturn/27415463920,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ f1a6fdadaa132225,https://c1.staticflickr.com/6/5455/30574341260_ec628a854c_o.jpg,0.25,0.0,1.0,0.75,990,18,https://www.flickr.com/photos/hills_alive/30574341260,https://creativecommons.org/licenses/by/2.0/,Caroline,https://www.flickr.com/people/hills_alive/ 6bea02f26beef50d,https://c1.staticflickr.com/6/5700/29664825844_e3a32c8217_o.jpg,0.249079528719,0.0,0.747238586156,0.75,709,267,https://www.flickr.com/photos/londonmatt/29664825844,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 7b6a9bf5b175e3b2,https://c1.staticflickr.com/9/8270/30005296161_6f99755f62_o.jpg,0.372611464968,0.0,0.745222929936,0.75,558,599,https://www.flickr.com/photos/imo-un/30005296161,https://creativecommons.org/licenses/by/2.0/,International Maritime Organization,https://www.flickr.com/people/imo-un/ 7c249a944594a62e,https://c1.staticflickr.com/6/5810/30483710105_e24bbc2699_o.jpg,0.0,0.0,0.5625,0.75,990,620,https://www.flickr.com/photos/verzo/30483710105,https://creativecommons.org/licenses/by/2.0/,Roberto Verzo,https://www.flickr.com/people/verzo/ 5c2d823a4d30e3d5,https://c1.staticflickr.com/6/5613/30328326823_cd02f11183_o.jpg,0.248348017621,0.25,0.745044052863,1.0,718,894,https://www.flickr.com/photos/thartz00/30328326823,https://creativecommons.org/licenses/by/2.0/,likeaduck,https://www.flickr.com/people/thartz00/ fc94d8ed9eca8c51,https://c1.staticflickr.com/2/1478/26763589175_4f80c5497b_o.jpg,0.0,0.0,0.666666666667,1.0,390,584,https://www.flickr.com/photos/stevendepolo/26763589175,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 73728c249317ccb9,https://c1.staticflickr.com/1/623/31659729526_41139a4893_o.jpg,0.28125,0.0,0.84375,0.75,848,145,http://www.flickr.com/photos/mohit_s/31659729526/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ 0b1d45bd9ab1064e,https://c1.staticflickr.com/9/8272/29868746026_7a9165f2d9_o.jpg,0.0,0.0,0.666666666667,1.0,561,563,https://www.flickr.com/photos/jill_carlson/29868746026,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 4b52fd42977215b9,https://c1.staticflickr.com/8/7555/27346942261_e7b059637c_o.jpg,0.0,0.0,0.5625,0.75,901,627,https://www.flickr.com/photos/rusty_clark/27346942261,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ c27e3bde18fba21b,https://c1.staticflickr.com/6/5127/30107077575_dce955ff33_o.jpg,0.0,0.25,0.492324561404,1.0,323,128,https://www.flickr.com/photos/postmanpetecoluk/30107077575,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ 5dbfff56258cf9e6,https://c1.staticflickr.com/1/613/31473791884_176af43beb_o.jpg,0.0,0.262273413897,0.75,0.786820241692,318,385,https://flickr.com/52450054@N04/31473791884,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ c47ca11294a9aefe,https://c1.staticflickr.com/9/8724/28243588105_0e8673ea4b_o.jpg,0.25,0.25,1.0,0.75,547,119,https://www.flickr.com/photos/80037792@N03/28243588105/,https://creativecommons.org/licenses/by/2.0/,Adri\303\241n Castillo Rivera,https://www.flickr.com/people/80037792@N03/ 97917829607b6189,https://c1.staticflickr.com/1/435/31542814264_1481334d51_o.jpg,0.25,0.0,0.75,0.75,859,660,https://www.flickr.com/photos/72821066@N04/31542814264,https://creativecommons.org/licenses/by/2.0/,Kathleen,https://www.flickr.com/people/72821066@N04/ d386396825739960,https://c1.staticflickr.com/6/5671/31045268386_89505e1441_o.jpg,0.514898255814,0.0,1.0,0.75,854,227,https://www.flickr.com/photos/13476480@N07/31045268386,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 44fa09bc5f8e69a5,https://c1.staticflickr.com/8/7556/27540902503_548da9039e_o.jpg,0.4108,0.0,1.0,0.75,304,990,https://www.flickr.com/photos/gails_pictures/27540902503,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 70db5a1689f89129,https://c1.staticflickr.com/8/7368/28008608932_93cb96fee0_o.jpg,0.238832853026,0.0,0.716498559078,0.75,434,472,https://www.flickr.com/photos/familymwr/28008608932/,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/ 89d60f53d478c4f7,https://c1.staticflickr.com/8/7303/26926132240_65cf222cf4_o.jpg,0.0,0.25,0.5,1.0,668,435,https://www.flickr.com/photos/codnewsroom/26926132240,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ d531a31add433f46,https://c1.staticflickr.com/9/8621/28763062545_b79f4f72ff_o.jpg,0.5,0.25,1.0,1.0,764,769,https://www.flickr.com/photos/rusty_clark/28763062545,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 4d0c0f35a0c00bdc,https://c1.staticflickr.com/8/7262/26732253551_7b396172cf_o.jpg,0.0,0.0,0.75,0.636439267887,680,432,https://www.flickr.com/photos/kayadams/26732253551,https://creativecommons.org/licenses/by/2.0/,Kay Adams,https://www.flickr.com/people/kayadams/ 33197fa6ae88508a,https://c1.staticflickr.com/9/8032/29583923580_143f4756d0_o.jpg,0.398058252427,0.25,1.0,1.0,848,30,https://www.flickr.com/photos/zachievenor/29583923580,https://creativecommons.org/licenses/by/2.0/,Zachi Evenor,https://www.flickr.com/people/zachievenor/ 78059d1afd7b9fea,https://c1.staticflickr.com/9/8268/28771428103_98f31c968c_o.jpg,0.0,0.0,1.0,1.0,58,248,https://www.flickr.com/photos/brutchersp/28771428103,https://creativecommons.org/licenses/by/2.0/,Sam Brutcher,https://www.flickr.com/people/brutchersp/ 542c07e8bf8e283c,https://c1.staticflickr.com/1/530/32275825531_4a40f15002_o.jpg,0.0,0.0,0.5625,0.75,145,706,https://flickr.com/77110886@N07/32275825531,https://creativecommons.org/licenses/by/2.0/,AmishRob,https://www.flickr.com/people/77110886@N07/ e8c99e0220ab46d2,https://c1.staticflickr.com/8/7408/27465191295_e5f6865548_o.jpg,0.0,0.244318181818,1.0,0.732954545455,591,535,https://www.flickr.com/photos/50019407@N03/27465191295,https://creativecommons.org/licenses/by/2.0/,striegel,https://www.flickr.com/people/50019407@N03/ c755f3b0f89028fc,https://c1.staticflickr.com/6/5656/30912005906_eeb50d4284_o.jpg,0.4375,0.0,1.0,0.75,566,827,https://www.flickr.com/photos/railwayofaustralia/30912005906/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/ 76db169867bf2e9d,https://c1.staticflickr.com/6/5759/30161761356_e4053ff3fb_o.jpg,0.25,0.0,1.0,0.75,964,908,https://flickr.com/93362968@N00/30161761356,https://creativecommons.org/licenses/by/2.0/,Ruben,https://www.flickr.com/people/surfzone/ 784232355d49601b,https://c1.staticflickr.com/1/624/31694410765_dea6857dfb_o.jpg,0.321273516643,0.0,0.963820549928,1.0,327,161,https://www.flickr.com/photos/42244964@N03/31694410765,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ e99ceff3e420ef95,https://c1.staticflickr.com/8/7381/27954856402_191862c411_o.jpg,0.278188180404,0.25,0.834564541213,1.0,831,768,https://www.flickr.com/photos/photographingtravis/27954856402/,https://creativecommons.org/licenses/by/2.0/,Travis Wise,https://www.flickr.com/people/photographingtravis/ 23955512cd0e1191,https://c1.staticflickr.com/8/7578/30160381445_b3e6087902_o.jpg,0.0,0.25,0.497426470588,1.0,476,742,https://www.flickr.com/photos/kylemcdonald/30160381445,https://creativecommons.org/licenses/by/2.0/,Kyle McDonald,https://www.flickr.com/people/kylemcdonald/ d6eac6858474111c,https://c1.staticflickr.com/8/7320/27399110256_d3fe95b790_o.jpg,0.24882629108,0.0,1.0,1.0,323,250,https://www.flickr.com/photos/j_benson/27399110256/,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/ 8d90c523b27410a7,https://c1.staticflickr.com/8/7364/27529300064_90409b557b_o.jpg,0.0,0.491827637444,0.75,1.0,321,563,https://www.flickr.com/photos/postmanpetecoluk/27529300064,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ 5cf72b48fdf5e419,https://c1.staticflickr.com/6/5718/30045803555_c7a2fba567_o.jpg,0.495552731893,0.0,0.991105463787,1.0,630,744,https://www.flickr.com/photos/135366503@N05/30045803555,https://creativecommons.org/licenses/by/2.0/,CLAUDIA DEA,https://www.flickr.com/people/135366503@N05/ 228fec6cab5f560d,https://c1.staticflickr.com/1/668/31760002531_3b7716366a_o.jpg,0.333333333333,0.0,1.0,1.0,974,931,https://flickr.com/39136124@N00/31760002531,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble,https://www.flickr.com/people/pauljill/ e7b61bec5e4ca40e,https://c1.staticflickr.com/6/5663/30514982830_d4031e75fe_o.jpg,0.0,0.333049403748,0.75,1.0,324,674,https://flickr.com/44465748@N00/30514982830,https://creativecommons.org/licenses/by/2.0/,benet2006,https://www.flickr.com/people/benetd/ d3551db0b83c8fc0,https://c1.staticflickr.com/9/8310/29174628816_300ec9d85c_o.jpg,0.5,0.25,1.0,1.0,618,324,https://www.flickr.com/photos/dccentralkitchen/29174628816,https://creativecommons.org/licenses/by/2.0/,DC Central Kitchen,https://www.flickr.com/people/dccentralkitchen/ c7d0c73d636300f5,https://c1.staticflickr.com/4/3390/3194974577_b7573f6c32_o.jpg,0.489195230999,0.25,1.0,1.0,830,801,https://www.flickr.com/photos/davidwilson1949/3194974577,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 61ed2594a0524631,https://c1.staticflickr.com/8/7456/27590651131_7c9941b3ce_o.jpg,0.0,0.25,0.5,1.0,472,996,https://www.flickr.com/photos/prayitnophotography/27590651131,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 89f48bcf97aa6600,https://c1.staticflickr.com/9/8478/29134440636_664709aa0b_o.jpg,0.25,0.25,0.75,1.0,418,70,https://www.flickr.com/photos/pavdw/29134440636,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/ ed786d792c4309a4,https://c1.staticflickr.com/8/7630/27108493571_721c8b15ac_o.jpg,0.25,0.0,1.0,0.75,499,962,https://www.flickr.com/photos/jjeff/27108493571,https://creativecommons.org/licenses/by/2.0/,Jeff Robbins,https://www.flickr.com/people/jjeff/ 9fe19d5c6dab83a3,https://c1.staticflickr.com/8/7507/29079497195_c97c2f18c1_o.jpg,0.5,0.0,1.0,0.75,455,805,https://www.flickr.com/photos/stevendepolo/29079497195,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ d5d5f843f100328c,https://c1.staticflickr.com/8/7366/26927066371_055fb093dc_o.jpg,0.25,0.25,1.0,1.0,886,538,https://www.flickr.com/photos/garlandcannon/26927066371,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/ 789417c091011f53,https://c1.staticflickr.com/6/5632/30859118166_ac1328ed72_o.jpg,0.5,0.25,1.0,1.0,345,177,https://flickr.com/145232592@N06/30859118166,https://creativecommons.org/licenses/by/2.0/,Martin7d2,https://www.flickr.com/people/martin7d2/ e648427e38e80ff8,https://c1.staticflickr.com/8/7440/27289001152_11922d530c_o.jpg,0.466894977169,0.25,1.0,1.0,888,617,https://www.flickr.com/photos/marinelson/27289001152,https://creativecommons.org/licenses/by/2.0/,Marinelson Almeida - Traveling through Brazil,https://www.flickr.com/people/marinelson/ 1478a0fc99a988db,https://c1.staticflickr.com/8/7775/29139964033_0509a1d34c_o.jpg,0.25,0.28125,1.0,0.84375,776,928,https://www.flickr.com/photos/juggernautco/29139964033,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ e758de2cbb3d10a0,https://c1.staticflickr.com/6/5341/30948537862_3f3461e1a1_o.jpg,0.0,0.25,0.63875,1.0,305,905,https://www.flickr.com/photos/gails_pictures/30948537862,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 8af30e5c3fa48a08,https://c1.staticflickr.com/8/7646/29079347226_a8454b4835_o.jpg,0.249079528719,0.25,0.747238586156,1.0,696,71,https://www.flickr.com/photos/brandedbulltank/29079347226/,https://creativecommons.org/licenses/by/2.0/,Tank,https://www.flickr.com/people/brandedbulltank/ 38287d2e5a4a9a57,https://c1.staticflickr.com/9/8518/28286972964_4a723a160a_o.jpg,0.25,0.25,1.0,1.0,960,798,https://www.flickr.com/photos/g4gti/28286972964/,https://creativecommons.org/licenses/by/2.0/,Ryohei Noda,https://www.flickr.com/people/g4gti/ c6e0d2ab3bbf4a3e,https://c1.staticflickr.com/8/7053/27295097944_149d29443d_o.jpg,0.28125,0.0,0.84375,0.75,706,838,https://www.flickr.com/photos/davidwilson1949/27295097944,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 4cccb215bd60b3c3,https://c1.staticflickr.com/2/1476/26151802513_eba98c8b71_o.jpg,0.333333333333,0.0,1.0,1.0,33,341,https://www.flickr.com/photos/briangratwicke/26151802513,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ 9a49001b63903f72,https://c1.staticflickr.com/9/8320/29938183125_fbbd772391_o.jpg,0.333333333333,0.0,1.0,1.0,769,804,https://www.flickr.com/photos/abaecherliphotography/29938183125/,https://creativecommons.org/licenses/by/2.0/,Samuel Ab\303\244cherli,https://www.flickr.com/people/abaecherliphotography/ 1cbae41091a750dc,https://c1.staticflickr.com/8/7437/27918206525_1045d33569_o.jpg,0.0,0.25,0.561328125,1.0,473,814,http://www.flickr.com/16915761@N08/27918206525,https://creativecommons.org/licenses/by/2.0/,Gordon Watt,https://www.flickr.com/people/gordon_watt/ de40907c1e2c5515,https://c1.staticflickr.com/8/7717/26258443973_8a326bac94_o.jpg,0.0,0.0,1.0,0.75,629,486,https://www.flickr.com/photos/yutakaseki/26258443973,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ 446f75fdea0e1da0,https://c1.staticflickr.com/9/8197/28459775774_861c11bd49_o.jpg,0.28125,0.0,0.84375,0.75,922,201,https://www.flickr.com/photos/pussreboots/28459775774/,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/ 059da9a174262427,https://c1.staticflickr.com/8/7529/26612408253_d5156925ff_o.jpg,0.0,0.25,0.521428571429,1.0,254,630,https://www.flickr.com/photos/70253321@N00/26612408253/,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 35c344ca0584ba14,https://c1.staticflickr.com/6/5759/31004746922_f545e4c9e3_o.jpg,0.504405286344,0.0,1.0,0.75,688,831,https://www.flickr.com/photos/eltb/31004746922,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ c335ce88293384f2,https://c1.staticflickr.com/8/7345/27701978545_2cf121bede_o.jpg,0.0,0.0,0.75,1.0,735,629,https://www.flickr.com/photos/27665395@N05/27701978545,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ daa6404780b1af27,https://c1.staticflickr.com/6/5785/29921098450_5016da1899_o.jpg,0.25,0.25,0.75,1.0,638,999,https://www.flickr.com/photos/bazzadarambler/29921098450,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 446b24f903b488fc,https://c1.staticflickr.com/6/5521/31389531466_ba559c04c8_o.jpg,0.0,0.0,0.435350756534,0.75,144,839,https://www.flickr.com/photos/winnu/31389531466/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/ d7ffed8f21024a14,https://c1.staticflickr.com/9/8728/28249502800_8a99581af4_o.jpg,0.25,0.25,0.75,1.0,752,922,https://www.flickr.com/photos/42220226@N07/28249502800,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 5efeca6c4c233f01,https://c1.staticflickr.com/6/5500/31284538395_f1ef2882f9_o.jpg,0.486191860465,0.0,0.97238372093,0.75,761,464,https://www.flickr.com/photos/lge/31284538395,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 7d599306068f4594,https://c1.staticflickr.com/8/7715/27614734306_5cd65c4100_o.jpg,0.4375,0.25,1.0,1.0,717,514,https://www.flickr.com/photos/142136365@N08/27614734306,https://creativecommons.org/licenses/by/2.0/,Sery Content Development MT,https://www.flickr.com/people/142136365@N08/ 67a52d9155241752,https://c1.staticflickr.com/9/8571/27757091954_a8b6697969_o.jpg,0.0,0.25,0.5625,1.0,830,420,https://www.flickr.com/photos/raver_mikey/27757091954,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/ dc12a25cc85ee9cf,https://c1.staticflickr.com/6/5220/29764054890_0309cd8fb8_o.jpg,0.0,0.0,0.374521072797,0.75,647,896,http://www.flickr.com/photos/vitroids/29764054890/,https://creativecommons.org/licenses/by/2.0/,Masakazu Matsumoto,https://www.flickr.com/people/vitroids/ 0d6463e9a7ef6185,https://c1.staticflickr.com/9/8147/28957674191_b862ba9c0c_o.jpg,0.0,0.0,0.662261380323,1.0,771,786,https://www.flickr.com/photos/spera-designerschuhe/28957674191,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ af543b5f19ed1b1d,https://c1.staticflickr.com/2/1659/26658174432_76a1fc6cd7_o.jpg,0.28125,0.0,0.84375,0.75,40,391,https://www.flickr.com/photos/briangratwicke/26658174432,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ a7151de51c2f1d0b,https://c1.staticflickr.com/9/8622/27804271193_73fe11b408_o.jpg,0.25,0.340254237288,1.0,1.0,345,214,https://www.flickr.com/photos/jared422/27804271193,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/ c5c9d17672ff88ce,https://c1.staticflickr.com/8/7654/27071795905_8908bd10e9_o.jpg,0.25,0.0,1.0,0.561328125,458,266,https://www.flickr.com/photos/140473922@N07/27071795905/,https://creativecommons.org/licenses/by/2.0/,malnasfalu,https://www.flickr.com/people/140473922@N07/ 5bdb8268eadf57d8,https://c1.staticflickr.com/6/5765/30333126152_38071946f0_o.jpg,0.0,0.0,0.666666666667,1.0,852,968,https://www.flickr.com/photos/37491467@N07/30333126152,https://creativecommons.org/licenses/by/2.0/,Say_No_To_Turtles,https://www.flickr.com/people/37491467@N07/ 80177288cda51d95,https://c1.staticflickr.com/1/712/32401234622_f7ec1efbe5_o.jpg,0.0,0.0,0.75,1.0,641,605,https://flickr.com/57868312@N00/32401234622,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 5b60477a29c7ef81,https://c1.staticflickr.com/1/648/32597389405_80e847a182_o.jpg,0.333333333333,0.0,1.0,1.0,416,700,http://www.flickr.com/photos/bexwalton/32597389405/,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/ da7e65bc80814f37,https://c1.staticflickr.com/6/5337/30469224383_6aa5c4a26b_o.jpg,0.5,0.0,1.0,0.75,788,603,https://www.flickr.com/photos/aloha75/30469224383/,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/ 4aeb33c9e565a201,https://c1.staticflickr.com/8/7631/27704602521_784d784312_o.jpg,0.0,0.0,0.735294117647,1.0,98,840,https://www.flickr.com/photos/7326810@N08/27704602521,https://creativecommons.org/licenses/by/2.0/,Jean,https://www.flickr.com/people/7326810@N08/ 19d43f8204d3183d,https://c1.staticflickr.com/8/7100/27097357596_2e5f7f8ddb_o.jpg,0.0,0.0,0.75,0.646812080537,985,378,https://www.flickr.com/photos/atoach/27097357596,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 2b741c5c635a7295,https://c1.staticflickr.com/9/8870/28112675323_f9aa3a3600_o.jpg,0.0,0.0,0.681073025335,1.0,108,634,https://www.flickr.com/photos/flowcomm/28112675323,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 398720b8f19d5b84,https://c1.staticflickr.com/1/502/32384871825_3a1708f568_o.jpg,0.5,0.25,1.0,1.0,697,700,https://flickr.com/146625745@N08/32384871825,https://creativecommons.org/licenses/by/2.0/,home thods,https://www.flickr.com/people/146625745@N08/ ab8329c28d8538c3,https://c1.staticflickr.com/6/5507/31042117711_9b835b691b_o.jpg,0.481981981982,0.25,1.0,1.0,469,13,https://www.flickr.com/photos/fernando680411/31042117711,https://creativecommons.org/licenses/by/2.0/,Nelson Fernando Sotelo Castro,https://www.flickr.com/people/fernando680411/ 348618ddbde3a39c,https://c1.staticflickr.com/9/8604/27892878974_931dc78b34_o.jpg,0.0,0.0,0.75,0.535877862595,386,460,https://www.flickr.com/photos/bvi4092/27892878974,https://creativecommons.org/licenses/by/2.0/,bvi4092,https://www.flickr.com/people/bvi4092/ d0029b3675b792ae,https://c1.staticflickr.com/9/8739/28789525922_b9ea40444c_o.jpg,0.322236180905,0.0,0.966708542714,0.75,790,902,https://www.flickr.com/photos/84906483@N08/28789525922/,https://creativecommons.org/licenses/by/2.0/,spinster cardigan,https://www.flickr.com/people/84906483@N08/ 69854b68476d5068,https://c1.staticflickr.com/9/8239/29052269695_ba56b1b270_o.jpg,0.498159057437,0.0,0.996318114875,0.75,893,733,https://www.flickr.com/photos/zigazou76/29052269695,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 4bdb561770b52424,https://c1.staticflickr.com/8/7429/27735562062_14d90e477c_o.jpg,0.25,0.25,0.75,1.0,147,184,https://www.flickr.com/photos/blachswan/27735562062,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ a92ab9e5fb9c5d64,https://c1.staticflickr.com/9/8121/29350360356_21b52b834f_o.jpg,0.500736377025,0.25,1.0,1.0,629,457,https://www.flickr.com/photos/glynlowe/29350360356,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ 8c6edf1ddfb61102,https://c1.staticflickr.com/8/7310/27095263593_6c217dcf2d_o.jpg,0.503303964758,0.0,1.0,0.75,889,123,https://www.flickr.com/photos/sybarite48/27095263593,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ c135b139d293f7f2,https://c1.staticflickr.com/6/5511/31483820115_746e4778f1_o.jpg,0.324925816024,0.0,1.0,1.0,347,491,https://www.flickr.com/photos/13476480@N07/31483820115,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 7d2e9b03ec1b630b,https://c1.staticflickr.com/8/7391/27341486272_663d67f419_o.jpg,0.25,0.0,0.75,0.75,401,535,https://www.flickr.com/photos/joi/27341486272,https://creativecommons.org/licenses/by/2.0/,Joi Ito,https://www.flickr.com/people/joi/ 29fe8d653950a631,https://c1.staticflickr.com/8/7694/26743914583_5a94c79b35_o.jpg,0.0,0.0,0.5,0.75,80,542,https://www.flickr.com/photos/quinet/26743914583/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ d4c817db6be62b71,https://c1.staticflickr.com/1/611/32446502452_f6b691f7cc_o.jpg,0.37517831669,0.0,1.0,1.0,95,164,https://www.flickr.com/photos/tdlucas5000/32446502452,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ 1e77361718213a43,https://c1.staticflickr.com/1/606/32230247896_6f7d356e7e_o.jpg,0.0,0.0,1.0,1.0,440,435,https://flickr.com/73833659@N00/32230247896,https://creativecommons.org/licenses/by/2.0/,MK Feeney,https://www.flickr.com/people/feeney1982/ 6711e27733cfd050,https://c1.staticflickr.com/6/5510/31404867966_99715bd367_o.jpg,0.435350756534,0.25,0.870701513067,1.0,718,733,https://www.flickr.com/photos/dok1/31404867966,https://creativecommons.org/licenses/by/2.0/,Don O'Brien,https://www.flickr.com/people/dok1/ df874264566c58a9,https://c1.staticflickr.com/8/7319/27496297684_111a2f5a16_o.jpg,0.25,0.25,1.0,1.0,742,152,https://flickr.com/60944636@N00/27496297684,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/ 67c0339b1dfda5f6,https://c1.staticflickr.com/6/5196/29898630576_fceec38d6a_o.jpg,0.0,0.25,0.499263622975,1.0,558,496,https://www.flickr.com/photos/thejointstaff/29898630576,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ abd121ef53a69ef8,https://c1.staticflickr.com/8/7724/27965730726_4baf0c6722_o.jpg,0.0,0.0,0.658629441624,0.75,240,335,https://www.flickr.com/photos/megs_pics/27965730726/,https://creativecommons.org/licenses/by/2.0/,Megan Cole,https://www.flickr.com/people/megs_pics/ 5021e7da00bf43b2,https://c1.staticflickr.com/6/5500/31195547582_09c4533c1c_o.jpg,0.25,0.25,1.0,1.0,480,937,https://flickr.com/96774554@N03/31195547582,https://creativecommons.org/licenses/by/2.0/,Wheels ON,https://www.flickr.com/people/96774554@N03/ ebdfdcba5dc3b72a,https://c1.staticflickr.com/1/422/32445585326_8074f13658_o.jpg,0.0,0.0,0.5,0.75,868,600,https://www.flickr.com/photos/greggjerdingen/32445585326/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 68274b8293271807,https://c1.staticflickr.com/8/7281/27344963241_0feb45e01d_o.jpg,0.0,0.25,0.499263622975,1.0,834,579,https://www.flickr.com/photos/ministreiodadefesa/27344963241,https://creativecommons.org/licenses/by/2.0/,Minist\303\251rio da Defesa,https://www.flickr.com/people/ministreiodadefesa/ a84ead15406596ce,https://c1.staticflickr.com/9/8300/29557884001_05493785a6_o.jpg,0.0,0.25,0.5,1.0,480,937,https://www.flickr.com/photos/concavowheels/29557884001,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/ 5d1df4748743d42e,https://c1.staticflickr.com/8/7368/27924672426_3fde6b8850_o.jpg,0.25,0.43661971831,1.0,1.0,964,322,https://www.flickr.com/photos/dalecruse/27924672426,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/ 16ff75228179469c,https://c1.staticflickr.com/6/5564/29957754894_f57a1c39f2_o.jpg,0.502573529412,0.25,1.0,1.0,228,386,https://flickr.com/32234827@N03/29957754894,https://creativecommons.org/licenses/by/2.0/,Dick Thompson,https://www.flickr.com/people/dick-thompson-sandian/ 6e840c209f5733d5,https://c1.staticflickr.com/9/8596/28375656583_c817d204c3_o.jpg,0.0,0.0,0.75,0.561328125,442,750,https://www.flickr.com/photos/cogdog/28375656583,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 16bbe588e0ecc6ab,https://c1.staticflickr.com/8/7078/26813986145_f515146bfa_o.jpg,0.482608695652,0.0,0.965217391304,0.75,142,168,https://www.flickr.com/photos/79452129@N02/26813986145,https://creativecommons.org/licenses/by/2.0/,Fyn Kynd Photography,https://www.flickr.com/people/79452129@N02/ 46b657df12fd7c26,https://c1.staticflickr.com/8/7129/27258007632_658fac681c_o.jpg,0.0,0.25,0.5625,1.0,284,724,https://www.flickr.com/photos/akras/27258007632/,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/ bc7dff0960bb3335,https://c1.staticflickr.com/8/7616/28648009596_6e65ac7ace_o.jpg,0.0,0.260752688172,0.75,1.0,443,765,https://www.flickr.com/photos/atoach/28648009596/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 128fca690a11f68c,https://c1.staticflickr.com/8/7369/26875470084_43357ac827_o.jpg,0.250923190547,0.25,0.75276957164,1.0,98,785,https://www.flickr.com/photos/quinet/26875470084,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ ed9b2813b9245e52,https://c1.staticflickr.com/9/8770/29809879405_c8cf2a2b31_o.jpg,0.0,0.0,0.5,0.75,880,676,https://www.flickr.com/photos/konstantinti/29809879405,https://creativecommons.org/licenses/by/2.0/,Konstantin Tilberg,https://www.flickr.com/people/konstantinti/ a187afb98f295057,https://c1.staticflickr.com/1/319/31741319460_db1f31d4b9_o.jpg,0.0,0.0,0.5625,0.75,121,755,https://www.flickr.com/photos/jsjgeology/31741319460,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d2d2b255935f0aae,https://c1.staticflickr.com/6/5563/30545415915_150b5097e6_o.jpg,0.0,0.0,0.75,1.0,948,432,https://www.flickr.com/photos/torsten-behrens/30545415915/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ 4d008626b4b68665,https://c1.staticflickr.com/1/296/32309427086_5dcd538057_o.jpg,0.4375,0.25,1.0,1.0,108,780,https://flickr.com/21203533@N00/32309427086,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 10bc8784a5eb8843,https://c1.staticflickr.com/6/5582/30724498173_0e082b8ff0_o.jpg,0.488702623907,0.0,0.977405247813,0.75,744,210,https://www.flickr.com/photos/13476480@N07/30724498173,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 77ac8bf95825dfcc,https://c1.staticflickr.com/8/7259/26898012321_a3265271dd_o.jpg,0.248713235294,0.0,0.746139705882,0.75,635,728,https://www.flickr.com/photos/shankaronline/26898012321,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 5c8bcfa0dbb246ab,https://c1.staticflickr.com/8/7728/26215432693_2ee23efc4d_o.jpg,0.234375,0.25,0.703125,1.0,818,581,https://flickr.com/123760891@N03/26215432693,https://creativecommons.org/licenses/by/2.0/,Automobile Italia,https://www.flickr.com/people/automobileitalia/ afb0233b2e0545c4,https://c1.staticflickr.com/9/8439/29240681086_52945bd07d_o.jpg,0.333333333333,0.0,1.0,1.0,581,959,https://www.flickr.com/photos/dalbera/29240681086,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 1bb5f1337dfb1edd,https://c1.staticflickr.com/1/589/32214674481_5a087370d6_o.jpg,0.25,0.405546623794,1.0,1.0,641,293,https://flickr.com/13194817@N00/32214674481,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/ a3c4dd88edacb575,https://c1.staticflickr.com/1/561/31438357361_6a749db0f2_o.jpg,0.0,0.25,0.75,1.0,400,351,http://www.flickr.com/photos/condominiocriativo/31438357361/,https://creativecommons.org/licenses/by/2.0/,Condom\303\255nio Criativo,https://www.flickr.com/people/condominiocriativo/ 64ed3f0e8a2dc320,https://c1.staticflickr.com/1/323/31117919653_3c5225af88_o.jpg,0.555632823366,0.0,1.0,0.75,653,410,https://flickr.com/42310076@N04/31117919653,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ d25df1a8259d3fdf,https://c1.staticflickr.com/6/5676/30846111770_bc0995d221_o.jpg,0.24882629108,0.0,1.0,1.0,161,833,https://www.flickr.com/photos/adactio/30846111770,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/ 184a160b32ff4c72,https://c1.staticflickr.com/8/7111/26820702803_77558c6aba_o.jpg,0.328216374269,0.0,0.984649122807,1.0,518,717,https://www.flickr.com/photos/paytonc/26820702803,https://creativecommons.org/licenses/by/2.0/,Payton Chung,https://www.flickr.com/people/paytonc/ 4f722cab5573a5fb,https://c1.staticflickr.com/8/7567/28064754896_4c6440e3e0_o.jpg,0.28125,0.0,0.84375,0.75,885,392,https://www.flickr.com/photos/jdlasica/28064754896/,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 1b546695167d3f6e,https://c1.staticflickr.com/6/5768/30206052140_ae3086703e_o.jpg,0.43661971831,0.0,1.0,0.75,960,837,https://www.flickr.com/photos/kudumomo/30206052140/,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/ 6a940d1bf69f1d10,https://c1.staticflickr.com/9/8122/29786339486_cf9f752823_o.jpg,0.0,0.187296416938,1.0,1.0,558,433,https://www.flickr.com/photos/southbeachcars/29786339486/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ f4902a569fa12171,https://c1.staticflickr.com/8/7448/27323270341_7fc97564c7_o.jpg,0.5,0.0,1.0,0.75,950,992,https://flickr.com/141397992@N02/27323270341,https://creativecommons.org/licenses/by/2.0/,Vegan Photo,https://www.flickr.com/people/141397992@N02/ 54a6b2cd7f89220e,https://c1.staticflickr.com/2/1462/26144464314_ae66e3b1da_o.jpg,0.28125,0.0,0.84375,0.75,918,171,https://www.flickr.com/photos/londonmatt/26144464314,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 7b71925e989ee1d8,https://c1.staticflickr.com/1/348/31544121611_8bf40c6800_o.jpg,0.21087398374,0.25,0.63262195122,1.0,934,35,https://www.flickr.com/photos/hile/31544121611,https://creativecommons.org/licenses/by/2.0/,Helen Penjam,https://www.flickr.com/people/hile/ eae13c52554a7783,https://c1.staticflickr.com/1/283/31571942652_56aeae1bf8_o.jpg,0.245614035088,0.25,0.736842105263,1.0,781,848,https://flickr.com/149503105@N07/31571942652,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ b1e69e9c3d740f4c,https://c1.staticflickr.com/9/8733/28200514302_2f59d09947_o.jpg,0.0,0.25,0.5625,1.0,4,833,https://www.flickr.com/photos/noaaphotolib/28200514302,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 493e327b171ab0c3,https://c1.staticflickr.com/6/5475/30311997820_5114dcc89a_o.jpg,0.0,0.0,0.672592592593,1.0,831,856,https://www.flickr.com/photos/13476480@N07/30311997820,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 2efe4916e679e875,https://c1.staticflickr.com/1/166/30669575014_c1861446e4_o.jpg,0.21087398374,0.0,0.63262195122,0.75,866,926,https://www.flickr.com/photos/franganillo/30669575014,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo,https://www.flickr.com/people/franganillo/ 588bd41c9aa5a81b,https://c1.staticflickr.com/8/7138/26571751464_519eeae08c_o.jpg,0.25,0.0,1.0,0.75,534,154,https://www.flickr.com/photos/annethelibrarian/26571751464,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ 49b1adfeb8ffcabd,https://c1.staticflickr.com/8/7556/27284219884_84e1fbcaeb_o.jpg,0.4375,0.0,1.0,0.75,932,671,https://www.flickr.com/photos/55229469@N07/27284219884,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ 225e06c2dfa68a62,https://c1.staticflickr.com/9/8055/28952537693_18d3e06407_o.jpg,0.25,0.0,0.75,0.75,882,945,https://www.flickr.com/photos/barnimages/28952537693/,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ d7d5b34ea0a0ffcf,https://c1.staticflickr.com/9/8066/29898270981_73e0076c26_o.jpg,0.500736377025,0.25,1.0,1.0,878,970,https://www.flickr.com/photos/presidentialoffice/29898270981,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ 0212aa8aa912ee45,https://c1.staticflickr.com/6/5466/30266928545_e63bcb8041_o.jpg,0.327407407407,0.0,1.0,1.0,327,416,https://www.flickr.com/photos/dany13/30266928545,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/ d7de327bbf412965,https://c1.staticflickr.com/8/7568/28879744260_7f6ee27057_o.jpg,0.0,0.25,0.556376360809,1.0,490,660,https://www.flickr.com/photos/stevensnodgrass/28879744260,https://creativecommons.org/licenses/by/2.0/,Steve Snodgrass,https://www.flickr.com/people/stevensnodgrass/ 2200794c59b1808e,https://c1.staticflickr.com/1/508/32766800345_d32328469f_o.jpg,0.363560732113,0.0,1.0,0.75,311,214,https://www.flickr.com/photos/gails_pictures/32766800345,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 83896b9fb7e9c2f8,https://c1.staticflickr.com/9/8537/29037936543_0f751d4cdc_o.jpg,0.25,0.0,0.75,0.75,537,547,https://www.flickr.com/photos/elsie/29037936543/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ f9f36f7774d73820,https://c1.staticflickr.com/3/2013/32659953892_0199b33b51_o.jpg,0.0,0.0,0.56338028169,0.75,305,723,https://www.flickr.com/photos/treegrow/32659953892,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 796e23f8dbf9a7a2,https://c1.staticflickr.com/8/7421/27680391126_32219fb627_o.jpg,0.0,0.0,0.666666666667,1.0,607,835,https://www.flickr.com/photos/quinet/27680391126,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ dad40e355e4e8e96,https://c1.staticflickr.com/9/8027/29028347661_d9a3dc8d21_o.jpg,0.25,0.0,0.75,0.75,655,848,https://www.flickr.com/photos/karen_roe/29028347661,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ 064e1cc405062c85,https://c1.staticflickr.com/1/645/31869882565_e6c7e4558a_o.jpg,0.0,0.25,0.5625,1.0,108,135,https://www.flickr.com/photos/jimg944/31869882565,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 1484479b7630af0a,https://c1.staticflickr.com/8/7520/27703755495_e5dd0273c4_o.jpg,0.25,0.0,0.75,0.75,702,904,https://www.flickr.com/photos/7armyjmtc/27703755495,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 18d5f99fe237a306,https://c1.staticflickr.com/9/8496/29071092183_9562a5b8dc_o.jpg,0.246827411168,0.0,0.740482233503,1.0,815,77,https://www.flickr.com/photos/yamahawatercraft/29071092183/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/ d0c6c29954f0380b,https://c1.staticflickr.com/1/517/32675860980_0c40361cf8_o.jpg,0.25,0.0,1.0,0.5,431,96,https://www.flickr.com/photos/tjspix/32675860980,https://creativecommons.org/licenses/by/2.0/,Teresa Johns,https://www.flickr.com/people/tjspix/ c777da68bec01dcd,https://c1.staticflickr.com/9/8562/28193582220_b2580f280c_o.jpg,0.249631811487,0.25,0.748895434462,1.0,487,584,https://www.flickr.com/photos/mtaphotos/28193582220,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/ 5cd8864b6e35df82,https://c1.staticflickr.com/8/7105/27793628895_a1d2e5e492_o.jpg,0.0,0.0,0.75,1.0,866,898,https://www.flickr.com/photos/jeepersmedia/27793628895,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 444109f3ccfacc7b,https://c1.staticflickr.com/9/8064/29945301806_292581209b_o.jpg,0.25,0.0,0.75,0.75,336,221,https://www.flickr.com/photos/amslerpix/29945301806,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ b722c809657aecee,https://c1.staticflickr.com/1/356/30881368874_ed2a887e15_o.jpg,0.0,0.5,0.75,1.0,777,640,https://www.flickr.com/photos/eebeephoto/30881368874/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/ a193f7ae7d550a82,https://c1.staticflickr.com/8/7285/27193523532_37b77df506_o.jpg,0.4375,0.25,1.0,1.0,738,631,https://www.flickr.com/photos/jeepersmedia/27193523532,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 97025d82ec9860dc,https://c1.staticflickr.com/9/8123/28630695394_9e536782e6_o.jpg,0.264605462822,0.0,0.793816388467,0.75,676,574,https://www.flickr.com/photos/jeepersmedia/28630695394,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 23f39187c0d00e30,https://c1.staticflickr.com/6/5581/30083343153_3e32030455_o.jpg,0.0,0.0,0.663235294118,1.0,972,658,https://flickr.com/14642507@N08/30083343153,https://creativecommons.org/licenses/by/2.0/,sasastro,https://www.flickr.com/people/sasastro/ 515c6586db87bbd8,https://c1.staticflickr.com/6/5590/30456955046_3073b879aa_o.jpg,0.0,0.0,0.665684830633,1.0,874,218,https://www.flickr.com/photos/bikashdas/30456955046,https://creativecommons.org/licenses/by/2.0/,Bikash Das,https://www.flickr.com/people/bikashdas/ 42e9b41ce96dbf0a,https://c1.staticflickr.com/9/8058/29670008630_bd1bfc6c1a_o.jpg,0.0,0.0,0.75,0.5625,851,647,https://www.flickr.com/photos/stellahyc/29670008630,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/ 126175abfdcb1a21,https://c1.staticflickr.com/1/386/32014236205_a98a5d344a_o.jpg,0.25,0.25,0.75,1.0,471,486,https://flickr.com/14771153@N04/32014236205,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ 4b0c9bf2584b35d3,https://c1.staticflickr.com/9/8394/29489318570_f677a927e0_o.jpg,0.0,0.25,0.75,1.0,960,79,https://www.flickr.com/photos/naotakem/29489318570/,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/ 19b5bea9a7608a92,https://c1.staticflickr.com/3/2598/32087920803_43b48bab4b_o.jpg,0.28125,0.25,0.84375,1.0,778,435,https://www.flickr.com/photos/capcase/32087920803,https://creativecommons.org/licenses/by/2.0/,James Case,https://www.flickr.com/people/capcase/ 1a94dc47fdd84a95,https://c1.staticflickr.com/6/5761/30269979564_df6e9df309_o.jpg,0.0,0.277925531915,0.75,1.0,870,830,https://www.flickr.com/photos/ringkong/30269979564,https://creativecommons.org/licenses/by/2.0/,typexnick,https://www.flickr.com/people/ringkong/ c35cd0d5673ec1db,https://c1.staticflickr.com/8/7531/29226165661_4d4c2264c7_o.jpg,0.0,0.25,0.5625,1.0,963,367,https://www.flickr.com/photos/stevendepolo/29226165661,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ b239b5b3e1642f3b,https://c1.staticflickr.com/6/5494/25330616759_529bdf9b94_o.jpg,0.512008733624,0.0,1.0,0.75,914,746,https://www.flickr.com/photos/sidelong/25330616759,https://creativecommons.org/licenses/by/2.0/,DaveBleasdale,https://www.flickr.com/people/sidelong/ e22a1c8dab22f256,https://c1.staticflickr.com/8/7453/27575870760_ab7aeb3fe9_o.jpg,0.0,0.25,0.63875,1.0,311,11,https://www.flickr.com/photos/gails_pictures/27575870760,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ d959fd91192d5717,https://c1.staticflickr.com/6/5459/22848076308_16f2d07763_o.jpg,0.0,0.0,0.5,0.75,629,596,https://www.flickr.com/photos/prayitnophotography/22848076308,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 692016122b9e07a6,https://c1.staticflickr.com/6/5489/29804286543_9cba22e186_o.jpg,0.25,0.25,0.75,1.0,960,123,https://www.flickr.com/photos/39419174@N00/29804286543/,https://creativecommons.org/licenses/by/2.0/,danieleloreto,https://www.flickr.com/people/39419174@N00/ 8749fd2540a0cb01,https://c1.staticflickr.com/8/7491/26781987183_ff723c7a40_o.jpg,0.0,0.578822733424,0.75,1.0,833,448,https://www.flickr.com/photos/ankurp/26781987183,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ 8e9e976fc98e3cfa,https://c1.staticflickr.com/8/7702/27224046005_eaa4681fee_o.jpg,0.28125,0.25,0.84375,1.0,666,740,https://www.flickr.com/photos/65542891@N05/27224046005,https://creativecommons.org/licenses/by/2.0/,bsa rwd 10hp,https://www.flickr.com/people/65542891@N05/ d7c8008bf74f2324,https://c1.staticflickr.com/9/8691/28869458692_b60ba5200d_o.jpg,0.439189189189,0.0,1.0,1.0,815,672,https://www.flickr.com/photos/watts_photos/28869458692,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ 330b9cb3cd80c88b,https://c1.staticflickr.com/8/7658/27109056921_f299a6739a_o.jpg,0.280784844384,0.0,0.842354533153,1.0,534,431,https://www.flickr.com/photos/annethelibrarian/27109056921,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ 1ef172b89f4a39cf,https://c1.staticflickr.com/6/5508/31450600235_a463d20bb6_o.jpg,0.333333333333,0.0,1.0,1.0,51,536,https://www.flickr.com/photos/52450054@N04/31450600235/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ b02b553998809e17,https://c1.staticflickr.com/8/7614/26966736165_2a6493858a_o.jpg,0.5,0.25,1.0,1.0,704,847,https://www.flickr.com/photos/30845197@N00/26966736165/,https://creativecommons.org/licenses/by/2.0/,TLV and more,https://www.flickr.com/people/30845197@N00/ 74b2e35cda75fe27,https://c1.staticflickr.com/1/316/32602465092_4522030924_o.jpg,0.0,0.25,0.576740506329,1.0,629,466,https://www.flickr.com/photos/archivesnz/32602465092/,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/ f5a2cf5c66d313fa,https://c1.staticflickr.com/8/7090/27455698002_a951356516_o.jpg,0.25,0.0,1.0,1.0,977,656,https://www.flickr.com/photos/crondeau/27455698002,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/ 5ceb9f2e8405b0de,https://c1.staticflickr.com/6/5666/30835439000_59b2871139_o.jpg,0.400242326333,0.25,1.0,1.0,412,64,https://www.flickr.com/photos/mdgovpics/30835439000/,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/ 114c98c078c5aab0,https://c1.staticflickr.com/9/8705/28272303681_3f64c45d57_o.jpg,0.25,0.0,1.0,0.75,50,108,https://www.flickr.com/photos/austinevan/28272303681,https://creativecommons.org/licenses/by/2.0/,Evan Bench,https://www.flickr.com/people/austinevan/ d741b583a123562b,https://c1.staticflickr.com/9/8728/29612129273_477bf62411_o.jpg,0.254086181278,0.25,0.762258543834,1.0,321,792,https://flickr.com/24025807@N06/29612129273,https://creativecommons.org/licenses/by/2.0/,CLUBE TREKKING SANTA MARIA RS BRASIL,https://www.flickr.com/people/hikingsantamaria/ 324278ff7f22b4eb,https://c1.staticflickr.com/4/3747/32487584933_83dbbe0cb8_o.jpg,0.25,0.25,1.0,1.0,498,303,https://flickr.com/25633870@N00/32487584933,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/ 1f4227ce24232867,https://c1.staticflickr.com/8/7229/27970534102_43ed025ff3_o.jpg,0.4375,0.0,1.0,0.75,34,942,https://www.flickr.com/photos/hockeyholic/27970534102/,https://creativecommons.org/licenses/by/2.0/,Andy Blackledge,https://www.flickr.com/people/hockeyholic/ 5973419efd52f783,https://c1.staticflickr.com/6/5508/31120625660_9594495e7d_o.jpg,0.348396501458,0.0,1.0,1.0,625,795,https://www.flickr.com/photos/usnavalwarcollegeri/31120625660,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/ fdedd06cdf58084e,https://c1.staticflickr.com/8/7718/27331217545_3b853360be_o.jpg,0.0,0.200323101777,1.0,1.0,982,428,https://www.flickr.com/photos/slgc/27331217545,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ 911aebf30626ce02,https://c1.staticflickr.com/3/2430/32287607674_b11095a2e5_o.jpg,0.521645021645,0.25,1.0,1.0,875,731,https://www.flickr.com/photos/didbygraham/32287607674/,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 55599050147071cc,https://c1.staticflickr.com/8/7412/27512988611_20873a4f90_o.jpg,0.246522693997,0.25,0.739568081991,1.0,473,962,https://www.flickr.com/photos/vastateparksstaff/27512988611/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ eee6f4bcc8468f77,https://c1.staticflickr.com/1/652/31882765966_b27b4fcf19_o.jpg,0.0,0.0,1.0,0.666666666667,964,714,https://www.flickr.com/photos/oikeuttaelaimille/31882765966/,https://creativecommons.org/licenses/by/2.0/,Oikeutta el\303\244imille,https://www.flickr.com/people/oikeuttaelaimille/ 7f3c20f487834846,https://c1.staticflickr.com/8/7448/26824382232_3b4a0eddcd_o.jpg,0.0,0.0,0.678571428571,1.0,408,883,https://www.flickr.com/photos/zongo/26824382232,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 8c8bc30a62a1ee23,https://c1.staticflickr.com/1/431/30989283343_7cae478677_o.jpg,0.0,0.25,0.713028169014,1.0,304,2,https://www.flickr.com/photos/33398884@N03/30989283343/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 7e0fb7f80ffa514b,https://c1.staticflickr.com/1/717/31662466562_b2b1553c3d_o.jpg,0.25,0.0,1.0,1.0,655,405,https://www.flickr.com/photos/didbygraham/31662466562,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ c02ff39fe5832f4b,https://c1.staticflickr.com/6/5597/30495370923_f689e3460c_o.jpg,0.25,0.25,0.75,1.0,905,675,https://www.flickr.com/photos/o_0/30495370923/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 891fe6baf8896b77,https://c1.staticflickr.com/8/7795/28741196845_ca00f0104f_o.jpg,0.25,0.0,1.0,0.75,325,535,https://www.flickr.com/photos/kellymcpherson/28741196845/,https://creativecommons.org/licenses/by/2.0/,Kelly Parker McPherson,https://www.flickr.com/people/kellymcpherson/ e96d52f9fbe3ca0b,https://c1.staticflickr.com/3/2540/32722690932_52ea2c48f3_o.jpg,0.0,0.0,0.660792951542,1.0,631,435,https://flickr.com/29971610@N02/32722690932,https://creativecommons.org/licenses/by/2.0/,Esther Max,https://www.flickr.com/people/esthermax/ 29279d12ed3e29ff,https://c1.staticflickr.com/1/502/32144969220_9f0703dc8e_o.jpg,0.5,0.25,1.0,1.0,458,328,https://www.flickr.com/photos/foreignoffice/32144969220/,https://creativecommons.org/licenses/by/2.0/,Foreign and Commonwealth Office,https://www.flickr.com/people/foreignoffice/ ac295a63ac9d2cd7,https://c1.staticflickr.com/8/7292/27671965670_4d9e6a72c8_o.jpg,0.280784844384,0.0,0.842354533153,1.0,693,864,https://www.flickr.com/photos/shoppeolina/27671965670,https://creativecommons.org/licenses/by/2.0/,owlin aolin,https://www.flickr.com/people/shoppeolina/ 5d23b04cc45bc37b,https://c1.staticflickr.com/9/8178/29212985530_24749869f4_o.jpg,0.4375,0.25,1.0,1.0,518,737,https://www.flickr.com/photos/zongo/29212985530/,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 11c53fe6feb856c6,https://c1.staticflickr.com/8/7162/26707259244_e47c43b2b7_o.jpg,0.0,0.299878836834,0.75,0.899636510501,477,766,https://www.flickr.com/photos/edenpictures/26707259244,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ cbcb7444cc827812,https://c1.staticflickr.com/8/7549/26276389703_ecd645cc3e_o.jpg,0.333333333333,0.0,1.0,1.0,763,786,https://www.flickr.com/photos/agenciabrasilia/26276389703,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ fe1314dd6f75551d,https://c1.staticflickr.com/8/7144/26370391824_3159ca42b2_o.jpg,0.0,0.25,0.75,1.0,921,565,https://www.flickr.com/photos/brendanadkins/26370391824,https://creativecommons.org/licenses/by/2.0/,Brendan Adkins,https://www.flickr.com/people/brendanadkins/ a8fca010774a1187,https://c1.staticflickr.com/1/425/31809450395_45b02082bb_o.jpg,0.4375,0.0,1.0,0.75,829,810,https://www.flickr.com/photos/fdecomite/31809450395/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 5ec826683757ffae,https://c1.staticflickr.com/6/5731/30742412415_c35c2ff310_o.jpg,0.0,0.0,0.599757673667,0.75,23,369,https://www.flickr.com/photos/andymorffew/30742412415,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ b9310b9080c06e4f,https://c1.staticflickr.com/8/7398/27330948851_cd9be2c204_o.jpg,0.25,0.318416523236,1.0,1.0,867,269,https://www.flickr.com/photos/60900612@N08/27330948851,https://creativecommons.org/licenses/by/2.0/,Thomas's Pics,https://www.flickr.com/people/60900612@N08/ 4f9f0b75f5b04524,https://c1.staticflickr.com/8/7587/26933811080_cf8040335a_o.jpg,0.0,0.25,0.5,1.0,58,897,https://www.flickr.com/photos/gregthebusker/26933811080,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/ 4abadb721e74b99b,https://c1.staticflickr.com/8/7612/26811635786_e5a333566f_o.jpg,0.0,0.0,0.666666666667,1.0,945,781,https://www.flickr.com/photos/mwf2005/26811635786/,https://creativecommons.org/licenses/by/2.0/,muffinn,https://www.flickr.com/people/mwf2005/ a3c651cf20ee2d34,https://c1.staticflickr.com/8/7710/26294912563_ba1be3ec95_o.jpg,0.0,0.0,0.75,0.75,641,561,https://www.flickr.com/photos/49889874@N05/26294912563,https://creativecommons.org/licenses/by/2.0/,marc falardeau,https://www.flickr.com/people/49889874@N05/ 5c4eec952ca114a1,https://c1.staticflickr.com/1/528/31431409824_729b5c64d9_o.jpg,0.25,0.25,0.75,1.0,348,525,https://flickr.com/51986662@N05/31431409824,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 7f045354f4577c16,https://c1.staticflickr.com/9/8268/30074145430_c1afafabc2_o.jpg,0.25,0.0,1.0,0.75,558,970,https://www.flickr.com/photos/rodrigoparedes/30074145430,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/ 53211f8a1b131de6,https://c1.staticflickr.com/9/8732/28580034102_984ce9d944_o.jpg,0.22009569378,0.0,1.0,1.0,946,578,https://www.flickr.com/photos/elzey/28580034102,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/ 9c0e25e2f72438e8,https://c1.staticflickr.com/6/5607/31102907732_def8083c3f_o.jpg,0.0,0.0,0.747269890796,1.0,512,506,https://www.flickr.com/photos/andreboeni/31102907732,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 55512a6c2a45e2e8,https://c1.staticflickr.com/8/7340/28096885425_4c07a3cf83_o.jpg,0.0,0.320512820513,0.75,0.961538461538,928,387,https://www.flickr.com/photos/uwlideas/28096885425/,https://creativecommons.org/licenses/by/2.0/,Med Coolman,https://www.flickr.com/people/uwlideas/ 869adfbad4e38261,https://c1.staticflickr.com/6/5697/30241927150_b62ec0df8a_o.jpg,0.25,0.0,1.0,0.75,592,866,https://www.flickr.com/photos/sonyanews/30241927150/,https://creativecommons.org/licenses/by/2.0/,sonyanews,https://www.flickr.com/people/sonyanews/ adcf48b42266309d,https://c1.staticflickr.com/9/8057/29233160570_87ebbbc643_o.jpg,0.248713235294,0.25,0.746139705882,1.0,505,589,https://www.flickr.com/photos/mdpettitt/29233160570,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/ 3b67bec3793efcb4,https://c1.staticflickr.com/6/5682/30920421081_33e27f1675_o.jpg,0.548319327731,0.0,1.0,0.75,822,746,https://www.flickr.com/photos/gaby1/30920421081,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 67a08d685abf7fb6,https://c1.staticflickr.com/8/7793/27924211143_79cef8b65a_o.jpg,0.25,0.0,0.75,0.75,739,710,https://www.flickr.com/photos/blondinrikard/27924211143,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fr\303\266berg,https://www.flickr.com/people/blondinrikard/ 22a313cc9fc2b4f1,https://c1.staticflickr.com/9/8612/28340861743_d50c5784e8_o.jpg,0.24882629108,0.0,1.0,1.0,310,940,https://www.flickr.com/photos/pamas/28340861743,https://creativecommons.org/licenses/by/2.0/,Esin \303\234st\303\274n,https://www.flickr.com/people/pamas/ 0d85e0103989c850,https://c1.staticflickr.com/9/8124/28994100466_472d225974_o.jpg,0.272727272727,0.0,1.0,1.0,324,722,https://www.flickr.com/photos/usfwsmtnprairie/28994100466,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ c3cf76709c87255b,https://c1.staticflickr.com/9/8340/29178027716_ed24cc96f2_o.jpg,0.0,0.0,0.75,0.75,676,224,https://www.flickr.com/photos/soulhammer/29178027716/,https://creativecommons.org/licenses/by/2.0/,Nathaniel Bruno,https://www.flickr.com/people/soulhammer/ 74355a8c878b6814,https://c1.staticflickr.com/1/408/31898209835_867bd3b167_o.jpg,0.0,0.0,0.75,1.0,875,622,https://flickr.com/69203347@N03/31898209835,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 6efed50f84ec5e01,https://c1.staticflickr.com/6/5168/29928350415_8935e09ba7_o.jpg,0.5,0.0,1.0,0.75,947,602,https://www.flickr.com/photos/lsmith2010/29928350415,https://creativecommons.org/licenses/by/2.0/,Larry Smith,https://www.flickr.com/people/lsmith2010/ d6887e8d19a06139,https://c1.staticflickr.com/6/5753/30992363516_d62f652ef9_o.jpg,0.25,0.0,1.0,1.0,563,45,https://www.flickr.com/photos/rbowen/30992363516/,https://creativecommons.org/licenses/by/2.0/,Rich Bowen,https://www.flickr.com/people/rbowen/ 21fef4d9b3dce49a,https://c1.staticflickr.com/9/8126/28295230322_8c45fd586e_o.jpg,0.0,0.25,0.411096256684,1.0,975,460,https://www.flickr.com/photos/jsjgeology/28295230322,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 0d65cb9d26de4d37,https://c1.staticflickr.com/8/7605/28137606406_e04b692957_o.jpg,0.25,0.0,0.75,0.75,571,336,https://www.flickr.com/photos/chrisdag/28137606406,https://creativecommons.org/licenses/by/2.0/,ChrisDag,https://www.flickr.com/people/chrisdag/ 3df888fc3b1df464,https://c1.staticflickr.com/8/7574/26519073574_355cd52e23_o.jpg,0.25,0.0,1.0,0.75,955,383,https://www.flickr.com/photos/vincentteeuwen/26519073574,https://creativecommons.org/licenses/by/2.0/,Vincent Teeuwen,https://www.flickr.com/people/vincentteeuwen/ 5ab3f1edd2f0cb06,https://c1.staticflickr.com/8/7716/27804279183_27b9180bda_o.jpg,0.0,0.0797227036395,1.0,1.0,387,116,https://www.flickr.com/photos/jared422/27804279183,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/ 51b390bb124a6d9d,https://c1.staticflickr.com/9/8037/29219102264_ded8d317fa_o.jpg,0.0,0.0,0.75,0.657142857143,968,422,https://www.flickr.com/photos/141897087@N06/29219102264,https://creativecommons.org/licenses/by/2.0/,JV Santore,https://www.flickr.com/people/141897087@N06/ 5bf502c4a4b7d04d,https://c1.staticflickr.com/6/5590/31190125660_b80ecdcb10_o.jpg,0.5,0.0,1.0,0.75,10,350,https://flickr.com/65847397@N05/31190125660,https://creativecommons.org/licenses/by/2.0/,Paul Balfe,https://www.flickr.com/people/paul_e_balfe/ 6ad1230d612d7eb7,https://c1.staticflickr.com/3/2413/31980917214_4992777b36_o.jpg,0.25,0.498159057437,1.0,0.996318114875,438,680,https://www.flickr.com/photos/davehamster/31980917214/,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 76a5715019fe11c7,https://c1.staticflickr.com/9/8223/28686786171_cee3ce47f5_o.jpg,0.0,0.0,0.690690690691,1.0,821,768,https://www.flickr.com/photos/grassrootsgroundswell/28686786171,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/ 207fd3b5def218d1,https://c1.staticflickr.com/8/7223/27019150086_7ba8c473c7_o.jpg,0.25,0.4375,1.0,1.0,991,279,https://www.flickr.com/photos/ndrwfgg/27019150086,https://creativecommons.org/licenses/by/2.0/,Andy / Andrew Fogg,https://www.flickr.com/people/ndrwfgg/ ad43e858c614db4d,https://c1.staticflickr.com/9/8263/28394550932_d93637d26b_o.jpg,0.0,0.25,0.5625,1.0,968,71,https://flickr.com/7831824@N04/28394550932,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/ b3ba6f0352a29b2d,https://c1.staticflickr.com/6/5459/30102051053_1c9c298a3c_o.jpg,0.0,0.0,0.498159057437,0.75,752,563,https://www.flickr.com/photos/davehamster/30102051053/,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 95185508805329aa,https://c1.staticflickr.com/9/8354/29365580064_0e6908f14d_o.jpg,0.299878836834,0.25,0.899636510501,1.0,653,721,https://www.flickr.com/photos/ocarchives/29365580064,https://creativecommons.org/licenses/by/2.0/,Orange County Archives,https://www.flickr.com/people/ocarchives/ 73ee2cc19ef92e50,https://c1.staticflickr.com/8/7189/27594432472_dfaf365016_o.jpg,0.0,0.25,0.501846381093,1.0,982,686,https://www.flickr.com/photos/jorge-11/27594432472,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/ be1c43056c5d0085,https://c1.staticflickr.com/6/5525/30762478116_b134a3ee51_o.jpg,0.28125,0.0,0.84375,0.75,145,436,https://www.flickr.com/photos/usfwsmtnprairie/30762478116,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 84a5f6ee2af29208,https://c1.staticflickr.com/8/7421/26497262564_8dc1a3b161_o.jpg,0.331617647059,0.0,0.994852941176,1.0,321,513,https://www.flickr.com/photos/ilouque/26497262564/,https://creativecommons.org/licenses/by/2.0/,ilouque,https://www.flickr.com/people/ilouque/ 50b9e11ae686ae32,https://c1.staticflickr.com/6/5591/31118494856_52df471331_o.jpg,0.0,0.0,0.991007194245,1.0,321,34,https://www.flickr.com/photos/gails_pictures/31118494856,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ fe2edb6cad72d2d2,https://c1.staticflickr.com/8/7468/26505971443_c1368c14e0_o.jpg,0.25,0.0,1.0,1.0,918,488,https://www.flickr.com/photos/jeepersmedia/26505971443,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 58420b727fcab02b,https://c1.staticflickr.com/6/5768/30823764900_d486a3f904_o.jpg,0.0,0.0,0.714503816794,1.0,138,168,https://flickr.com/143049688@N08/30823764900,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ 47b087263b33728b,https://c1.staticflickr.com/9/8228/29000044324_0eb54060d7_o.jpg,0.298790322581,0.25,0.896370967742,1.0,318,152,https://flickr.com/33398884@N03/29000044324,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 0e0299d6352a3fb8,https://c1.staticflickr.com/1/636/31002720224_411dc0a03f_o.jpg,0.25,0.25,0.75,1.0,539,4,https://flickr.com/22539273@N00/31002720224,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 2ee4c1b2b9bcc6c8,https://c1.staticflickr.com/9/8354/29761961012_02ecff90a4_o.jpg,0.25,0.0,0.75,0.75,763,785,https://www.flickr.com/photos/deltanewshub/29761961012,https://creativecommons.org/licenses/by/2.0/,Delta News Hub,https://www.flickr.com/people/deltanewshub/ 24312de5c34473c0,https://c1.staticflickr.com/6/5584/29688881533_e0c64dc987_o.jpg,0.25,0.438671875,1.0,1.0,874,820,https://www.flickr.com/photos/marsupilami92/29688881533/,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ bb748281da5e8681,https://c1.staticflickr.com/6/5281/29946906871_845417f8ac_o.jpg,0.210588633288,0.0,0.631765899865,0.75,348,694,https://www.flickr.com/photos/39090590@N02/29946906871,https://creativecommons.org/licenses/by/2.0/,Cyril Fluck,https://www.flickr.com/people/39090590@N02/ b648e8dfcb4fbc99,https://c1.staticflickr.com/1/679/31918129032_23e9a7057b_o.jpg,0.0,0.0,0.666666666667,1.0,982,572,https://flickr.com/148488209@N08/31918129032,https://creativecommons.org/licenses/by/2.0/,makaiyla willis,https://www.flickr.com/people/makaiylaw/ d2cc2eabfc7bf54a,https://c1.staticflickr.com/6/5509/31244583052_a8416401f1_o.jpg,0.25,0.0,0.75,0.75,556,721,https://www.flickr.com/photos/rpavich/31244583052,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ da4b3e38b069d735,https://c1.staticflickr.com/9/8206/28992945534_a0fcc6e623_o.jpg,0.25,0.25,1.0,1.0,777,691,https://www.flickr.com/photos/wwworks/28992945534,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ b0bb1ea9bcc45800,https://c1.staticflickr.com/9/8433/28813586781_49bed3bfb8_o.jpg,0.0,0.0,0.5625,0.75,845,456,https://www.flickr.com/photos/renaissancechambara/28813586781/,https://creativecommons.org/licenses/by/2.0/,Ged Carroll,https://www.flickr.com/people/renaissancechambara/ ac668c13ccfd4b79,https://c1.staticflickr.com/1/538/31770839465_f1c3beb91e_o.jpg,0.0,0.0,0.666666666667,1.0,598,751,https://www.flickr.com/photos/quinet/31770839465,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ b6c6a5b7829fbc9b,https://c1.staticflickr.com/9/8290/28794830561_2c903f75c1_o.jpg,0.336764705882,0.0,1.0,1.0,473,506,https://www.flickr.com/photos/shankaronline/28794830561,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 014f0024918a7b6f,https://c1.staticflickr.com/8/7564/27345252166_6948b71ff3_o.jpg,0.28125,0.0,0.84375,0.75,10,885,https://www.flickr.com/photos/amanderson/27345252166,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 93114736f072d6d3,https://c1.staticflickr.com/8/7396/26691839134_a072ec1162_o.jpg,0.25,0.0,0.75,0.75,617,763,https://www.flickr.com/photos/cogdog/26691839134,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ c9ddfb1043177de8,https://c1.staticflickr.com/6/5517/31689316216_b954ab5538_o.jpg,0.5,0.25,1.0,1.0,975,117,http://www.flickr.com/photos/richardmoross/31689316216/,https://creativecommons.org/licenses/by/2.0/,Richard Moross,https://www.flickr.com/people/richardmoross/ 7e4c41563370bed1,https://c1.staticflickr.com/9/8497/29201470542_e661660313_o.jpg,0.0,0.0,0.666666666667,1.0,719,945,https://www.flickr.com/photos/herdie/29201470542,https://creativecommons.org/licenses/by/2.0/,herdiephoto,https://www.flickr.com/people/herdie/ 328d99215b19c8c7,https://c1.staticflickr.com/1/662/32533031665_e6c123d8eb_o.jpg,0.5,0.0,1.0,0.75,806,926,https://www.flickr.com/photos/30478819@N08/32533031665,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 2a1a60df9a58bb7c,https://c1.staticflickr.com/8/7780/26705680280_a7f5f24425_o.jpg,0.0,0.333333333333,1.0,1.0,650,19,https://www.flickr.com/photos/travelnevada/26705680280,https://creativecommons.org/licenses/by/2.0/,Travel Nevada,https://www.flickr.com/people/travelnevada/ 263c7bcd59502625,https://c1.staticflickr.com/9/8092/29347734850_29561b6ec6_o.jpg,0.5,0.0,1.0,0.75,480,651,https://www.flickr.com/photos/concavowheels/29347734850,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/ d05076189b7fd185,https://c1.staticflickr.com/1/727/32381120905_712248f38a_o.jpg,0.25,0.0,1.0,0.646812080537,708,765,https://www.flickr.com/photos/jdlasica/32381120905,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ fe193683db61ac2d,https://c1.staticflickr.com/6/5669/30159267186_7663a5ba9c_o.jpg,0.4375,0.0,1.0,0.75,744,1,https://www.flickr.com/photos/meemainseen/30159267186,https://creativecommons.org/licenses/by/2.0/,Muhammad Imran Saeed,https://www.flickr.com/people/meemainseen/ d8b0101e2459882a,https://c1.staticflickr.com/8/7451/27873714556_8452970117_o.jpg,0.0,0.25,0.5,1.0,655,88,https://www.flickr.com/photos/impulse_2016/27873714556/,https://creativecommons.org/licenses/by/2.0/,Impulse Theater Festival 2016,https://www.flickr.com/people/impulse_2016/ 3841b33c9797cbf1,https://c1.staticflickr.com/6/5563/30857323591_f9687379e7_o.jpg,0.0,0.0,0.5625,0.75,909,953,https://www.flickr.com/photos/brownpau/30857323591,https://creativecommons.org/licenses/by/2.0/,brownpau,https://www.flickr.com/people/brownpau/ 232c22314e21f764,https://c1.staticflickr.com/6/5505/30587416664_22b14394ec_o.jpg,0.560165975104,0.0,1.0,0.75,115,904,https://www.flickr.com/photos/gails_pictures/30587416664,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 30b62313af2b5d74,https://c1.staticflickr.com/8/7570/30228833946_9b000a7dbd_o.jpg,0.0,0.0,0.561328125,0.75,316,795,https://www.flickr.com/photos/pamas/30228833946,https://creativecommons.org/licenses/by/2.0/,Esin \303\234st\303\274n,https://www.flickr.com/people/pamas/ 2c54b60a2851b8ed,https://c1.staticflickr.com/9/8523/29243698212_6d465d0527_o.jpg,0.0,0.0,0.5625,0.75,657,577,https://www.flickr.com/photos/zombieite/29243698212,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ c96c3eab644075d3,https://c1.staticflickr.com/8/7790/26778459800_6328b3ac5d_o.jpg,0.0,0.0,0.932055749129,1.0,348,300,https://www.flickr.com/photos/lac-bac/26778459800,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/ 060dfe239abfd547,https://c1.staticflickr.com/8/7475/28717385362_9e5d05dfe7_o.jpg,0.473457675753,0.25,0.946915351506,1.0,704,396,https://www.flickr.com/photos/alan-light/28717385362/,https://creativecommons.org/licenses/by/2.0/,Alan Light,https://www.flickr.com/people/alan-light/ 0bd5123017590e39,https://c1.staticflickr.com/6/5553/30409656042_0a59691936_o.jpg,0.4375,0.25,1.0,1.0,566,430,https://www.flickr.com/photos/davidwilson1949/30409656042,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ bd3617fcc985fe31,https://c1.staticflickr.com/6/5624/30871247636_63a2a6a4fa_o.jpg,0.0,0.25,0.75,0.75,833,61,https://www.flickr.com/photos/xiquinho/30871247636/,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/ 54666421b4a6998f,https://c1.staticflickr.com/8/7701/26783338114_ced2a4e55f_o.jpg,0.5,0.0,1.0,0.75,920,759,https://www.flickr.com/photos/zeevveez/26783338114,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ 4e34df87968bd882,https://c1.staticflickr.com/1/621/31058803964_6d583c4eea_o.jpg,0.438671875,0.25,1.0,1.0,339,379,https://flickr.com/30139045@N00/31058803964,https://creativecommons.org/licenses/by/2.0/,Tim Walker,https://www.flickr.com/people/timjoyfamily/ 3f48b1e74589d310,https://c1.staticflickr.com/9/8038/28644165984_de12eb6b3e_o.jpg,0.0,0.0,0.666666666667,1.0,653,508,https://www.flickr.com/photos/secdef/28644165984,https://creativecommons.org/licenses/by/2.0/,Jim Mattis,https://www.flickr.com/people/secdef/ 96e77c20bf94ecb1,https://c1.staticflickr.com/9/8342/28986701940_8aa08f43c6_o.jpg,0.4108,0.25,1.0,1.0,818,518,https://www.flickr.com/photos/autohistorian/28986701940,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 4edeacef9fb8ec90,https://c1.staticflickr.com/6/5579/31278004155_6f6d083d49_o.jpg,0.0,0.0,0.5625,0.75,719,997,https://www.flickr.com/photos/cambodia4kidsorg/31278004155/,https://creativecommons.org/licenses/by/2.0/,Cambodia4kids.org Beth Kanter,https://www.flickr.com/people/cambodia4kidsorg/ c9302f3b2b0452e4,https://c1.staticflickr.com/8/7413/27864002812_f3fc0a7878_o.jpg,0.0,0.0,0.875,1.0,884,892,https://www.flickr.com/photos/hisgett/27864002812?rb=1,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 0af0a5dfee6b84ff,https://c1.staticflickr.com/8/7382/26663873503_fc70ec8c08_o.jpg,0.280226209048,0.0,0.840678627145,0.75,484,808,https://www.flickr.com/photos/65344061@N06/26663873503/,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 02dbe78a73db2808,https://c1.staticflickr.com/9/8089/27862798673_b874427662_o.jpg,0.369771863118,0.25,0.739543726236,1.0,975,255,https://flickr.com/47445767@N05/27862798673,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 592c7424f13b2d29,https://c1.staticflickr.com/9/8639/28634730405_a12dd81623_o.jpg,0.419316375199,0.25,1.0,1.0,604,517,https://www.flickr.com/photos/lac-bac/28634730405,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/ f5b0ed0fbb3b5f74,https://c1.staticflickr.com/1/131/30836327244_86e3f6cee9_o.jpg,0.5,0.25,1.0,1.0,567,645,https://www.flickr.com/photos/nationalassemblyforwales/30836327244,https://creativecommons.org/licenses/by/2.0/,National Assembly for Wales,https://www.flickr.com/people/nationalassemblyforwales/ 1b1ffd7000d0749f,https://c1.staticflickr.com/6/5763/30233213804_63bd4007fd_o.jpg,0.0,0.0,0.75,0.75,960,991,https://www.flickr.com/photos/ilove9and23/30233213804/,https://creativecommons.org/licenses/by/2.0/,Debbie Tingzon,https://www.flickr.com/people/ilove9and23/ 70a2529a6b2c0d46,https://c1.staticflickr.com/9/8631/29164479153_b29b11670b_o.jpg,0.5,0.25,1.0,1.0,580,550,https://www.flickr.com/photos/usarmyband/29164479153/,https://creativecommons.org/licenses/by/2.0/,The United States Army Band,https://www.flickr.com/people/usarmyband/ bba5c56cc3eb07c9,https://c1.staticflickr.com/1/546/31014776813_b295235e55_o.jpg,0.267938931298,0.25,0.803816793893,1.0,921,594,https://www.flickr.com/photos/thomasrousing/31014776813,https://creativecommons.org/licenses/by/2.0/,Thomas Rousing,https://www.flickr.com/people/thomasrousing/ 000b7d55b6184b08,https://c1.staticflickr.com/8/7450/27510795501_46c2084b6c_o.jpg,0.0,0.0,0.5625,0.75,389,963,https://www.flickr.com/photos/40205555@N06/27510795501,https://creativecommons.org/licenses/by/2.0/,mrho101,https://www.flickr.com/people/40205555@N06/ 8a02b6196885c394,https://c1.staticflickr.com/8/7296/27350770975_3f596317b8_o.jpg,0.0,0.0,1.0,1.0,760,447,https://www.flickr.com/photos/graficmedia/27350770975,https://creativecommons.org/licenses/by/2.0/,[-_-] JORGE,https://www.flickr.com/people/graficmedia/ 582663fe666aac9c,https://c1.staticflickr.com/6/5592/29610060673_fe4f7b8d01_o.jpg,0.0,0.0,0.56375,0.75,923,928,https://www.flickr.com/photos/kelvynskee/29610060673,https://creativecommons.org/licenses/by/2.0/,Kelvyn Skee,https://www.flickr.com/people/kelvynskee/ f6515f31b750a573,https://c1.staticflickr.com/1/719/32474210662_fa858156a3_o.jpg,0.0,0.0,0.666666666667,1.0,477,723,https://www.flickr.com/photos/quinet/32474210662,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ acd99e9b7128395a,https://c1.staticflickr.com/1/445/32794739211_d6f5324607_o.jpg,0.0,0.0,0.75,1.0,859,753,http://www.flickr.com/photos/callmewhatever/32794739211/,https://creativecommons.org/licenses/by/2.0/,Daniel Zimmermann,https://www.flickr.com/people/callmewhatever/ 83d35591dfff99ac,https://c1.staticflickr.com/8/7232/27285496573_d5bdd3aa87_o.jpg,0.0,0.0,0.75,1.0,581,857,https://www.flickr.com/photos/juggernautco/27285496573,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ 3dfbdd066af9ca1e,https://c1.staticflickr.com/9/8816/28135299942_b870fd0ab6_o.jpg,0.25,0.0,0.75,0.75,821,5,https://www.flickr.com/photos/ben_salter/28135299942/,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 59204d6bb0c234eb,https://c1.staticflickr.com/9/8752/28207273334_3d05b11ea6_o.jpg,0.0,0.421177266576,0.75,0.842354533153,418,703,https://www.flickr.com/photos/oatsy40/28207273334/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/ d740663eeccdcecd,https://c1.staticflickr.com/9/8130/29191810554_9f08be9c5f_o.jpg,0.0,0.0,0.75,0.5625,438,762,https://www.flickr.com/photos/simon2207/29191810554/,https://creativecommons.org/licenses/by/2.0/,Simon220771,https://www.flickr.com/people/simon2207/ 9226b783cfb770bd,https://c1.staticflickr.com/9/8637/28516867321_5b709d78c7_o.jpg,0.0,0.25,0.5625,1.0,826,34,https://www.flickr.com/photos/jsjgeology/28516867321,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 01dd15caa1b2c7b4,https://c1.staticflickr.com/8/7767/26780389003_e95a6d7cee_o.jpg,0.0,0.25,0.561328125,1.0,304,551,https://www.flickr.com/photos/treegrow/26780389003,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ b97f4b95ae696316,https://c1.staticflickr.com/8/7186/26690393874_7d7f8dafc9_o.jpg,0.0,0.333333333333,1.0,1.0,518,399,http://www.flickr.com/photos/n28307/26690393874/,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ c42c88890b5fc86d,https://c1.staticflickr.com/6/5755/30476251310_f45f8b81b7_o.jpg,0.4375,0.25,1.0,1.0,671,112,https://www.flickr.com/photos/paulmiller/30476251310/,https://creativecommons.org/licenses/by/2.0/,Paul Miller,https://www.flickr.com/people/paulmiller/ d158837db31ed892,https://c1.staticflickr.com/1/445/31796400213_c6e650f7d5_o.jpg,0.5,0.0,1.0,0.75,519,804,https://www.flickr.com/photos/box_repsol/31796400213,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 4a1a40a116088962,https://c1.staticflickr.com/9/8587/28162416971_8e105a5657_o.jpg,0.0,0.0,0.75,1.0,598,624,https://www.flickr.com/photos/gibsongunleather/28162416971,https://creativecommons.org/licenses/by/2.0/,BRUCE GIBSON,https://www.flickr.com/people/gibsongunleather/ ba4508962af69d90,https://c1.staticflickr.com/9/8202/29005733052_a9f711f4bf_o.jpg,0.248348017621,0.0,0.745044052863,0.75,673,827,https://flickr.com/37922399@N05/29005733052,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 7069a117c92d27a4,https://c1.staticflickr.com/8/7605/26251509774_96c84ae16f_o.jpg,0.42174796748,0.25,0.843495934959,1.0,546,186,https://www.flickr.com/photos/psychlist1972/26251509774/,https://creativecommons.org/licenses/by/2.0/,Pete Brown,https://www.flickr.com/people/psychlist1972/ 79fa9855119ffeea,https://c1.staticflickr.com/9/8090/28857580530_b7ba1ea2f1_o.jpg,0.0,0.0,1.0,1.0,479,506,https://www.flickr.com/photos/wwworks/28857580530,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ 82e2334925339ef8,https://c1.staticflickr.com/6/5632/31268100236_4975f1a2db_o.jpg,0.25,0.0,1.0,0.75,818,769,https://www.flickr.com/photos/96774554@N03/31268100236,https://creativecommons.org/licenses/by/2.0/,Wheels ON,https://www.flickr.com/people/96774554@N03/ 4f5464b7d4682441,https://c1.staticflickr.com/3/2859/32842901716_635c080982_o.jpg,0.0,0.25,0.472779369628,1.0,976,607,https://www.flickr.com/photos/blmoregon/32842901716/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 72f96c6dc5df2de8,https://c1.staticflickr.com/4/3869/32108968233_aa2d42d481_o.jpg,0.5,0.25,1.0,1.0,885,784,https://www.flickr.com/photos/jlascar/32108968233/,https://creativecommons.org/licenses/by/2.0/,Jorge L\303\241scar,https://www.flickr.com/people/jlascar/ 6609c25b3314b5b3,https://c1.staticflickr.com/9/8031/29690105171_f0e16e643e_o.jpg,0.333333333333,0.0,1.0,1.0,512,878,https://www.flickr.com/photos/8782469@N05/29690105171,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/ 52d8515abbfaa8ac,https://c1.staticflickr.com/6/5629/30139827383_2b90e9254e_o.jpg,0.496696035242,0.0,0.993392070485,0.75,230,634,https://www.flickr.com/photos/vastateparksstaff/30139827383,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ a7f9b28e30d19d85,https://c1.staticflickr.com/6/5712/30477407072_911714e259_o.jpg,0.0,0.0,0.504444444444,0.75,662,699,https://www.flickr.com/photos/andreboeni/30477407072,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 8b7a5446dae48ac1,https://c1.staticflickr.com/1/316/31908704910_2c6375f0ef_o.jpg,0.266552511416,0.0,0.799657534247,0.75,309,363,https://www.flickr.com/photos/gails_pictures/31908704910,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ b2a7e558f1a3ff16,https://c1.staticflickr.com/9/8730/28819631221_819c793b59_o.jpg,0.303165584416,0.25,0.909496753247,1.0,620,536,https://www.flickr.com/photos/raveejaya/28819631221,https://creativecommons.org/licenses/by/2.0/,Raveendra Jayashantha,https://www.flickr.com/people/raveejaya/ 1a95932427129cda,https://c1.staticflickr.com/8/7124/27017461135_e00ed6ac0d_o.jpg,0.0,0.25,0.5,1.0,657,465,https://www.flickr.com/photos/antoniseb/27017461135/,https://creativecommons.org/licenses/by/2.0/,Jay Cross,https://www.flickr.com/people/antoniseb/ d4579363596fbf21,https://c1.staticflickr.com/1/520/31675116444_127982bddf_o.jpg,0.287322274882,0.0,0.861966824645,0.75,833,889,https://www.flickr.com/photos/fran001/31675116444/,https://creativecommons.org/licenses/by/2.0/,Francisco Anzola,https://www.flickr.com/people/fran001/ f7dd570a0cfe1dcc,https://c1.staticflickr.com/9/8264/29543383031_e6d047580a_o.jpg,0.0,0.0,0.75,0.75,669,55,https://www.flickr.com/photos/alazaat/29543383031,https://creativecommons.org/licenses/by/2.0/,Hussein Alazaat,https://www.flickr.com/people/alazaat/ 2d23b1dab7e3e9c0,https://c1.staticflickr.com/1/456/31638318370_25bb9334d8_o.jpg,0.0,0.25,0.5,1.0,511,971,https://www.flickr.com/photos/45958601@N02/31638318370,https://creativecommons.org/licenses/by/2.0/,joey zanotti,https://www.flickr.com/people/45958601@N02/ b7d9e1d8cf1d7912,https://c1.staticflickr.com/6/5697/30316954084_6b364b382d_o.jpg,0.0,0.0,0.666666666667,1.0,519,485,https://www.flickr.com/photos/box_repsol/30316954084,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 6b27728f0f816dc6,https://c1.staticflickr.com/1/483/32823130292_df26e1cd49_o.jpg,0.0,0.25,0.499263622975,1.0,638,874,https://www.flickr.com/photos/rpavich/32823130292/,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ c96358fe7b8eaf28,https://c1.staticflickr.com/8/7262/27455525114_9b1d3ed1ac_o.jpg,0.578822733424,0.25,1.0,1.0,706,492,https://www.flickr.com/photos/12216515@N00/27455525114,https://creativecommons.org/licenses/by/2.0/,Charles Fulton,https://www.flickr.com/people/12216515@N00/ 9b4cab2ffb0c0754,https://c1.staticflickr.com/9/8256/30009146415_d412513e5f_o.jpg,0.0,0.0,1.0,0.75,975,963,https://www.flickr.com/photos/jsjgeology/30009146415,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1685d066f8070081,https://c1.staticflickr.com/6/5684/29941070052_c4c12092e6_o.jpg,0.0,0.0,0.42174796748,0.75,979,361,https://www.flickr.com/photos/scotnelson/29941070052,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ e071bf346787d971,https://c1.staticflickr.com/8/7244/27006991522_4a72303846_o.jpg,0.57825203252,0.25,1.0,1.0,563,990,https://www.flickr.com/photos/respres/27006991522,https://creativecommons.org/licenses/by/2.0/,Jeff Turner,https://www.flickr.com/people/respres/ e66d732354c6baf0,https://c1.staticflickr.com/9/8349/29382034812_b8cca8606d_o.jpg,0.0,0.0,0.5,0.75,301,72,https://www.flickr.com/photos/52450054@N04/29382034812,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 33adbc27fdcadd65,https://c1.staticflickr.com/8/7130/26834523912_fb0b3fe3ed_o.jpg,0.28125,0.25,0.84375,1.0,924,716,https://www.flickr.com/photos/68147320@N02/26834523912,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ eb53098ebcf05e64,https://c1.staticflickr.com/6/5591/30938192751_f6a6fb1739_o.jpg,0.0,0.0,0.641099855282,1.0,564,601,https://www.flickr.com/photos/68704638@N04/30938192751,https://creativecommons.org/licenses/by/2.0/,M Dreibelbis,https://www.flickr.com/people/68704638@N04/ 8c609b06a60af060,https://c1.staticflickr.com/8/7199/27864572096_73f40f5d09_o.jpg,0.0,0.0,0.5625,0.75,499,291,https://flickr.com/77742560@N06/27864572096,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ c66310d8b709d6d5,https://c1.staticflickr.com/9/8371/29266955473_d24ddfa05c_o.jpg,0.0,0.0,1.0,1.0,763,106,https://www.flickr.com/photos/alper/29266955473,https://creativecommons.org/licenses/by/2.0/,Alper \303\207u\304\237un,https://www.flickr.com/people/alper/ 740981d161a38bad,https://c1.staticflickr.com/1/578/32214662255_3bc38af004_o.jpg,0.5,0.0,1.0,0.75,572,149,http://www.flickr.com/photos/batcula/32214662255/,https://creativecommons.org/licenses/by/2.0/,Jim,https://www.flickr.com/people/batcula/ 4c8a4414419ab0bb,https://c1.staticflickr.com/9/8377/30076813705_00b7bc68ff_o.jpg,0.25,0.0,0.75,0.75,662,848,https://www.flickr.com/photos/greggjerdingen/30076813705,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ ecaf98c8ce9f04c3,https://c1.staticflickr.com/9/8547/29609780616_f9dac2244e_o.jpg,0.5,0.25,1.0,1.0,561,697,https://www.flickr.com/photos/foran_hs_football/29609780616,https://creativecommons.org/licenses/by/2.0/,Foran Lions Football,https://www.flickr.com/people/foran_hs_football/ 093402dc35f59027,https://c1.staticflickr.com/9/8708/28528193204_59181c883b_o.jpg,0.4375,0.0,1.0,0.75,734,113,https://www.flickr.com/photos/kdghantous/28528193204,https://creativecommons.org/licenses/by/2.0/,Karim D. Ghantous,https://www.flickr.com/people/kdghantous/ 8bb7d10e97694eb5,https://c1.staticflickr.com/1/625/31772996983_1b99ed5012_o.jpg,0.425355450237,0.0,1.0,0.75,143,393,https://www.flickr.com/photos/taylar/31772996983,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ 820ae900a943d605,https://c1.staticflickr.com/6/5486/30611700582_b302428c5d_o.jpg,0.0,0.267938931298,0.75,0.803816793893,888,701,http://www.flickr.com/photos/ecdq/30611700582/,https://creativecommons.org/licenses/by/2.0/,ECDQ,https://www.flickr.com/people/ecdq/ 8859efd46fab37ff,https://c1.staticflickr.com/6/5646/30929275820_fc732d7ae6_o.jpg,0.25,0.0,1.0,0.75,923,599,https://flickr.com/145862860@N07/30929275820,https://creativecommons.org/licenses/by/2.0/,Ky\305\215to B\305\215ken,https://www.flickr.com/people/kyotoboken/ dde9f0aadcb02874,https://c1.staticflickr.com/9/8544/29151973710_8ab6e884c9_o.jpg,0.497426470588,0.0,0.994852941176,0.75,981,640,https://www.flickr.com/photos/n28307/29151973710,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ 13810fcac72f12ba,https://c1.staticflickr.com/9/8302/28623258764_c87251b710_o.jpg,0.0,0.25,0.5,1.0,876,72,https://www.flickr.com/photos/usarmyband/28623258764/,https://creativecommons.org/licenses/by/2.0/,The United States Army Band,https://www.flickr.com/people/usarmyband/ b1bf532ce2c4c3a1,https://c1.staticflickr.com/9/8037/28132989550_04e5549aec_o.jpg,0.0,0.0,0.495594713656,0.75,875,557,https://www.flickr.com/photos/didbygraham/28132989550/,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 9aba31a4b2404aa5,https://c1.staticflickr.com/1/458/31850811716_9a5882c71c_o.jpg,0.25,0.25,1.0,1.0,912,495,https://flickr.com/52066925@N00/31850811716,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ 5b85f98e0105d135,https://c1.staticflickr.com/8/7474/26833993115_f16054e784_o.jpg,0.248713235294,0.25,0.746139705882,1.0,570,933,https://www.flickr.com/photos/agenciabrasilia/26833993115,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 53c478ffc8ddb967,https://c1.staticflickr.com/9/8149/29031351804_3d4e158245_o.jpg,0.225840336134,0.0,0.677521008403,0.75,320,613,https://www.flickr.com/photos/gails_pictures/29031351804,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 92c3f5e99d8ac862,https://c1.staticflickr.com/8/7564/29085116541_43b6dfd46c_o.jpg,0.0,0.0,0.666666666667,1.0,664,362,https://www.flickr.com/photos/ministeriodacultura/29085116541/,https://creativecommons.org/licenses/by/2.0/,Minist\303\251rio da Cultura,https://www.flickr.com/people/ministeriodacultura/ fae45093bad0961a,https://c1.staticflickr.com/9/8802/30042939706_809382f8e8_o.jpg,0.0,0.0,0.499263622975,0.75,529,528,https://www.flickr.com/photos/southbeachcars/30042939706,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 0db0952967f6faa6,https://c1.staticflickr.com/6/5610/31207151522_a9d8ef4c85_o.jpg,0.28125,0.0,0.84375,0.75,816,552,https://flickr.com/29780474@N02/31207151522,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/ 9594ef7e0fc79ea8,https://c1.staticflickr.com/8/7720/26955054100_0d18b0786b_o.jpg,0.25,0.25,1.0,1.0,403,115,https://www.flickr.com/photos/87249144@N08/26955054100,https://creativecommons.org/licenses/by/2.0/,FolsomNatural,https://www.flickr.com/people/87249144@N08/ 634d7f18d098cccb,https://c1.staticflickr.com/6/5599/30385514465_e5bb5b1ec4_o.jpg,0.0,0.332106038292,1.0,0.996318114875,539,766,https://www.flickr.com/photos/londonmatt/30385514465,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 05cac1419419ce29,https://c1.staticflickr.com/3/2904/33166177915_2cf2b8ed63_o.jpg,0.0,0.25,0.5,1.0,854,550,https://www.flickr.com/photos/yangchen6712/33166177915,https://creativecommons.org/licenses/by/2.0/,YangChen(TW),https://www.flickr.com/people/yangchen6712/ 868af4a2e614f5ac,https://c1.staticflickr.com/9/8284/29515310871_0dd41b4840_o.jpg,0.25,0.0,0.75,0.75,718,467,https://www.flickr.com/photos/greggjerdingen/29515310871,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 6898f889c17f8e16,https://c1.staticflickr.com/6/5683/31789036413_516df80786_o.jpg,0.25,0.250923190547,1.0,0.75276957164,888,730,https://www.flickr.com/photos/eltb/31789036413,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 8e3324c208eb9a3b,https://c1.staticflickr.com/1/358/32563010712_d1417f0485_o.jpg,0.0,0.0,0.561328125,0.75,822,741,https://www.flickr.com/photos/linsinchen/32563010712,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/ 7d7a8e41b8d0577e,https://c1.staticflickr.com/6/5518/30395077313_019dca3b01_o.jpg,0.25,0.0,1.0,0.75,965,182,https://flickr.com/83202873@N00/30395077313,https://creativecommons.org/licenses/by/2.0/,smittenkittenorig,https://www.flickr.com/people/smittenkittenoriginals/ 5ff168f7d006f69c,https://c1.staticflickr.com/1/506/31115729834_fc93bbea0f_o.jpg,0.0,0.25,0.5625,1.0,683,106,https://flickr.com/45457437@N00/31115729834,https://creativecommons.org/licenses/by/2.0/,David Jones,https://www.flickr.com/people/davidcjones/ f348adf7ea1967f7,https://c1.staticflickr.com/9/8769/29760593836_4e7c8ebbda_o.jpg,0.5,0.25,1.0,1.0,909,415,https://www.flickr.com/photos/fun_flying/29760593836/,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/ 40f79488e3c2d6c4,https://c1.staticflickr.com/8/7433/27742701310_08f79aaeb0_o.jpg,0.0,0.247434017595,0.75,0.742302052786,918,749,https://www.flickr.com/photos/mdpettitt/27742701310,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/ 3e9496f7652e1968,https://c1.staticflickr.com/6/5503/30144665264_862fd303dc_o.jpg,0.0,0.0,0.666666666667,1.0,469,834,http://www.flickr.com/photos/27148401@N06/30144665264,https://creativecommons.org/licenses/by/2.0/,shipley43,https://www.flickr.com/people/27148401@N06/ 2f7d5ff922af55c4,https://c1.staticflickr.com/9/8171/28748561034_d77c5db28e_o.jpg,0.475453172205,0.25,1.0,1.0,481,633,https://www.flickr.com/photos/jeepersmedia/28748561034,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 79a5625805a08253,https://c1.staticflickr.com/8/7622/26950982570_224d340d99_o.jpg,0.0,0.25,0.498159057437,1.0,766,805,https://www.flickr.com/photos/vastateparksstaff/26950982570,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 412311ea17528b7c,https://c1.staticflickr.com/6/5553/31345581012_51f411cd78_o.jpg,0.25,0.0,0.75,0.75,764,440,https://www.flickr.com/photos/quinet/31345581012/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 00312c7e7196baf4,https://c1.staticflickr.com/9/8539/29256709000_ca71fa227f_o.jpg,0.25,0.28125,1.0,0.84375,327,220,http://www.flickr.com/photos/27305106@N06/29256709000,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 51d1c77f80467b59,https://c1.staticflickr.com/6/5555/31034796165_c8996cacff_o.jpg,0.32917888563,0.0,0.987536656891,1.0,977,538,https://www.flickr.com/photos/zemzina/31034796165/,https://creativecommons.org/licenses/by/2.0/,Olga Khomitsevich,https://www.flickr.com/people/zemzina/ 82179b1d313e0e23,https://c1.staticflickr.com/1/268/32350804376_10b1f40d6e_o.jpg,0.0,0.0,0.5625,0.75,830,902,https://www.flickr.com/photos/76969036@N02/32350804376/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ b0e0e06e647b478f,https://c1.staticflickr.com/6/5769/29834734204_b8897fa3f7_o.jpg,0.0,0.0,1.0,0.75117370892,484,915,https://www.flickr.com/photos/sky_hlv/29834734204,https://creativecommons.org/licenses/by/2.0/,Jose A.,https://www.flickr.com/people/sky_hlv/ c609f86fa706bb9e,https://c1.staticflickr.com/9/8552/29601011844_a32bf06fd2_o.jpg,0.0,0.0,0.5625,0.75,113,889,https://www.flickr.com/photos/fdecomite/29601011844/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 55a2e48a87c16998,https://c1.staticflickr.com/1/660/31687904441_5798b661c4_o.jpg,0.25,0.0,0.75,0.75,911,768,http://www.flickr.com/photos/wastes/31687904441/,https://creativecommons.org/licenses/by/2.0/,Charlotta Wasteson,https://www.flickr.com/people/wastes/ 7d833ac8ab852bd2,https://c1.staticflickr.com/1/536/31504100213_b2b24c3f0d_o.jpg,0.25,0.442757009346,1.0,1.0,52,151,https://www.flickr.com/photos/jsjgeology/31504100213,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ fe92a88132b5d67b,https://c1.staticflickr.com/6/5127/30101893166_db47d4701a_o.jpg,0.25,0.25,0.75,1.0,963,247,https://flickr.com/112540417@N03/30101893166,https://creativecommons.org/licenses/by/2.0/,Enrico BBQness,https://www.flickr.com/people/bbqnessdotcom/ 6ab876a15af539c4,https://c1.staticflickr.com/9/8869/28304826635_f4c6b9f7d7_o.jpg,0.25,0.28125,1.0,0.84375,984,611,https://www.flickr.com/photos/noaaphotolib/28304826635,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 4fff343244f212cc,https://c1.staticflickr.com/6/5774/31301114735_677b0f08fa_o.jpg,0.0,0.305872756933,0.75,0.917618270799,821,403,https://www.flickr.com/photos/45131642@N00/31301114735/,https://creativecommons.org/licenses/by/2.0/,Phil Parker,https://www.flickr.com/people/45131642@N00/ 22a9c318b6e36853,https://c1.staticflickr.com/9/8016/29443140000_36cbb76243_o.jpg,0.249079528719,0.25,0.747238586156,1.0,620,211,https://www.flickr.com/photos/51715344@N07/29443140000/,https://creativecommons.org/licenses/by/2.0/,kami rao,https://www.flickr.com/people/51715344@N07/ 71d368782c72e313,https://c1.staticflickr.com/8/7431/27233705735_358064269d_o.jpg,0.0,0.0,0.599757673667,0.75,913,487,https://www.flickr.com/photos/mspearman/27233705735,https://creativecommons.org/licenses/by/2.0/,Mark Spearman,https://www.flickr.com/people/mspearman/ 65b8c8b065069802,https://c1.staticflickr.com/8/7116/26898609074_1eab8aeb4b_o.jpg,0.25,0.25,0.75,1.0,666,379,https://www.flickr.com/photos/sg2012/26898609074/,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/ b0619a61cf135f5e,https://c1.staticflickr.com/8/7408/27239703215_11f55dc09e_o.jpg,0.345588235294,0.0,0.691176470588,0.75,985,420,https://www.flickr.com/photos/126816719@N03/27239703215/,https://creativecommons.org/licenses/by/2.0/,Jon Brinn,https://www.flickr.com/people/126816719@N03/ 93394c1f9c4c0053,https://c1.staticflickr.com/9/8065/27937528884_57f0526c15_o.jpg,0.5,0.25,1.0,1.0,320,883,https://www.flickr.com/photos/52450054@N04/27937528884,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ aa90f93ed6fae139,https://c1.staticflickr.com/1/577/32316961601_cd6d1ed035_o.jpg,0.0,0.0,0.75,0.75,310,828,https://www.flickr.com/photos/orangeaurochs/32316961601,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ aa07ba1587ec047e,https://c1.staticflickr.com/9/8576/29046638172_6468dd6b89_o.jpg,0.4375,0.0,1.0,0.75,469,900,https://www.flickr.com/photos/stephenk1977/29046638172,https://creativecommons.org/licenses/by/2.0/,stephenk1977,https://www.flickr.com/people/stephenk1977/ 5d8085ae68e07d72,https://c1.staticflickr.com/8/7049/27394318535_a8c7ccdeb8_o.jpg,0.0,0.28125,0.75,0.84375,709,643,https://www.flickr.com/photos/zongo/27394318535,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 749ed3502293d019,https://c1.staticflickr.com/9/8356/29415192905_173fbf26da_o.jpg,0.0,0.330871491876,1.0,1.0,475,578,https://www.flickr.com/photos/romitagirl67/29415192905/,https://creativecommons.org/licenses/by/2.0/,RomitaGirl67,https://www.flickr.com/people/romitagirl67/ 791c3d333052ca64,https://c1.staticflickr.com/9/8440/29197626174_134d6fd15f_o.jpg,0.0,0.0,0.5625,0.75,964,908,https://www.flickr.com/photos/cbroders/29197626174,https://creativecommons.org/licenses/by/2.0/,Counse,https://www.flickr.com/people/cbroders/ 90e9a43bfb6a68b7,https://c1.staticflickr.com/9/8865/28740349711_5758bc82f4_o.jpg,0.0,0.0,0.5,0.75,867,476,https://www.flickr.com/photos/iowapipe/28740349711,https://creativecommons.org/licenses/by/2.0/,IowaPipe,https://www.flickr.com/people/iowapipe/ 72e6ba0cc7fb30a6,https://c1.staticflickr.com/9/8270/29053097670_b2b9f42c1f_o.jpg,0.28125,0.0,0.84375,0.75,875,834,https://www.flickr.com/photos/aswans1234567/29053097670,https://creativecommons.org/licenses/by/2.0/,Alex Swanston's Bus Photos,https://www.flickr.com/people/aswans1234567/ 8c5b5bc0f39e2e06,https://c1.staticflickr.com/9/8767/28247360751_7c466f8efc_o.jpg,0.421177266576,0.25,0.842354533153,1.0,898,253,https://www.flickr.com/photos/brandedbulltank/28247360751/,https://creativecommons.org/licenses/by/2.0/,Tank,https://www.flickr.com/people/brandedbulltank/ cc43200264a62126,https://c1.staticflickr.com/8/7447/27965290502_73c8417ef8_o.jpg,0.25,0.0,0.75,0.75,981,590,https://www.flickr.com/photos/naql/27965290502,https://creativecommons.org/licenses/by/2.0/,naql,https://www.flickr.com/people/naql/ be95f5be87f6fadd,https://c1.staticflickr.com/6/5721/30814461816_67e70a5169_o.jpg,0.28125,0.0,0.84375,0.75,459,603,https://www.flickr.com/photos/davidwilson1949/30814461816/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 7b6e963025eaeb66,https://c1.staticflickr.com/1/316/31606962904_b2666a8780_o.jpg,0.331617647059,0.0,0.994852941176,1.0,994,660,https://flickr.com/62788663@N04/31606962904,https://creativecommons.org/licenses/by/2.0/,Martin Jambon,https://www.flickr.com/people/mjambon/ 7f842d0c1e747334,https://c1.staticflickr.com/8/7634/27141449325_4f1a76c3ed_o.jpg,0.0,0.0,1.0,1.0,305,796,https://www.flickr.com/photos/78428166@N00/27141449325,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ ed3cb7f5154ae02d,https://c1.staticflickr.com/9/8072/29900375851_914813808d_o.jpg,0.245255474453,0.25,0.735766423358,1.0,980,747,https://www.flickr.com/photos/col_and_tasha/29900375851,https://creativecommons.org/licenses/by/2.0/,Col Ford and Natasha de Vere,https://www.flickr.com/people/col_and_tasha/ 6ecbd7d19f5b9147,https://c1.staticflickr.com/9/8737/28811659522_a0d4210243_o.jpg,0.0,0.0,0.483695652174,0.75,596,423,https://www.flickr.com/photos/robdammers/28811659522/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ d016b3204e7ca96e,https://c1.staticflickr.com/9/8558/29643762441_5e78f77661_o.jpg,0.0,0.0,0.75,1.0,792,778,https://flickr.com/39160147@N03/29643762441,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 8400742ba78ac009,https://c1.staticflickr.com/9/8544/28451617274_58e56a03de_o.jpg,0.0,0.0,0.666666666667,1.0,971,671,https://www.flickr.com/photos/blackwing_de/28451617274,https://creativecommons.org/licenses/by/2.0/,Sebastian Werner,https://www.flickr.com/people/blackwing_de/ 121c87c3c822e2c5,https://c1.staticflickr.com/1/750/31463784832_7a3c075877_o.jpg,0.25,0.25,0.75,1.0,459,386,https://www.flickr.com/photos/quinet/31463784832,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 76886996d4ab4614,https://c1.staticflickr.com/9/8192/28493603004_1b628ae8e9_o.jpg,0.0,0.25,0.5625,1.0,975,763,https://www.flickr.com/photos/jsjgeology/28493603004,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 9d5ef11ec55123e5,https://c1.staticflickr.com/9/8872/27883604363_8cf68f0178_o.jpg,0.0,0.25,0.57765451664,1.0,100,513,http://www.flickr.com/photos/dangrothe/27883604363/,https://creativecommons.org/licenses/by/2.0/,Daniel Grothe,https://www.flickr.com/people/dangrothe/ 1dfbeffd999f280e,https://c1.staticflickr.com/9/8433/28830160583_6bc4405a04_o.jpg,0.181375628141,0.0,0.544126884422,0.75,582,569,https://www.flickr.com/photos/mauritsverbiest/28830160583,https://creativecommons.org/licenses/by/2.0/,Maurits Verbiest,https://www.flickr.com/people/mauritsverbiest/ e3f5dbed7bd31314,https://c1.staticflickr.com/8/7682/27343823144_eeaa9065cb_o.jpg,0.25,0.5,1.0,1.0,547,864,https://www.flickr.com/photos/barnimages/27343823144,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ eb8ce5ba5c47e344,https://c1.staticflickr.com/1/684/33351191226_792c561fd4_o.jpg,0.0,0.0,0.75,0.5625,669,893,https://flickr.com/126397594@N03/33351191226,https://creativecommons.org/licenses/by/2.0/,G\303\274ldem \303\234st\303\274n,https://www.flickr.com/people/guldem/ f5dffe28fc19b6e7,https://c1.staticflickr.com/6/5529/31290944551_78ff48d9a3_o.jpg,0.266071428571,0.25,1.0,1.0,918,730,https://flickr.com/91873856@N00/31290944551,https://creativecommons.org/licenses/by/2.0/,Phil Venditti,https://www.flickr.com/people/venditti_min_min-venditti/ 1ebff1b3c8de66de,https://c1.staticflickr.com/9/8551/29684108315_b9b08f8035_o.jpg,0.464122137405,0.25,1.0,1.0,337,810,https://www.flickr.com/photos/ruthanddave/29684108315,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 0546b47c13f154d3,https://c1.staticflickr.com/1/744/31706873925_eb85a4c572_o.jpg,0.0,0.0,0.976785714286,1.0,108,318,https://www.flickr.com/photos/92252798@N07/31706873925,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/ f52db15134c1a74e,https://c1.staticflickr.com/6/5628/30300134543_71291f4050_o.jpg,0.0,0.0,1.0,1.0,638,776,https://flickr.com/13894201@N00/30300134543,https://creativecommons.org/licenses/by/2.0/,\303\201d\303\241m Szedl\303\241k,https://www.flickr.com/people/kelt/ 8094d4088a08cf09,https://c1.staticflickr.com/1/725/31560908483_4276d9241c_o.jpg,0.0,0.0,0.666666666667,1.0,441,615,https://www.flickr.com/photos/allagashbrewing/31560908483/,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/ d9f624188d16fe93,https://c1.staticflickr.com/8/7402/27067928760_efcb66d26f_o.jpg,0.25,0.25,0.75,1.0,40,602,https://www.flickr.com/photos/juliofromero/27067928760,https://creativecommons.org/licenses/by/2.0/,Julio Romero,https://www.flickr.com/people/juliofromero/ 631b6820e91a9e3e,https://c1.staticflickr.com/3/2183/32694281652_62b0c63d26_o.jpg,0.333333333333,0.0,1.0,1.0,13,303,https://www.flickr.com/photos/wildreturn/32694281652/,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ 611f453c4bb616b9,https://c1.staticflickr.com/8/7494/27095667650_2158e5d0a3_o.jpg,0.25,0.25,0.75,1.0,310,65,https://www.flickr.com/photos/gaby1/27095667650,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 5792d4a42d2a82c8,https://c1.staticflickr.com/9/8655/30162044361_628a8758b1_o.jpg,0.0,0.0,1.0,1.0,988,419,https://flickr.com/51966661@N00/30162044361,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/ c0e0c11350b8740e,https://c1.staticflickr.com/9/8316/28819944676_84ab998606_o.jpg,0.0,0.0,0.741835147745,1.0,319,698,https://www.flickr.com/photos/gails_pictures/28819944676,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ c663670c06c06ea4,https://c1.staticflickr.com/6/5671/30978227515_c8c43aa172_o.jpg,0.0,0.24882629108,1.0,1.0,909,903,http://www.flickr.com/photos/verzo/30978227515/,https://creativecommons.org/licenses/by/2.0/,Roberto Verzo,https://www.flickr.com/people/verzo/ 49591319edeb6b3a,https://c1.staticflickr.com/8/7379/28056205761_56dc8a13a9_o.jpg,0.333333333333,0.0,1.0,1.0,309,416,https://www.flickr.com/photos/104342908@N08/28056205761,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/ 02eb799d147d5f91,https://c1.staticflickr.com/8/7461/27924109056_3f35c44ec8_o.jpg,0.0,0.0,0.5,0.75,625,773,https://www.flickr.com/photos/vvbad/27924109056/,https://creativecommons.org/licenses/by/2.0/,VVBAD,https://www.flickr.com/people/vvbad/ f2d36d089779166a,https://c1.staticflickr.com/8/7528/27618132235_3bd6c10788_o.jpg,0.0,0.25,0.503698224852,1.0,349,805,https://www.flickr.com/photos/eljay/27618132235/,https://creativecommons.org/licenses/by/2.0/,Eljay,https://www.flickr.com/people/eljay/ cc8d850717026796,https://c1.staticflickr.com/8/7304/26869810723_660f0642a5_o.jpg,0.0,0.0,1.0,1.0,662,791,https://www.flickr.com/photos/29233640@N07/26869810723,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ ab3fef142d031784,https://c1.staticflickr.com/1/17/30695559644_ea51d4a001_o.jpg,0.0,0.25,0.5625,1.0,657,737,https://www.flickr.com/photos/27665395@N05/30695559644,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ c84cbc2c05227bee,https://c1.staticflickr.com/1/778/32130016155_b5c1709d28_o.jpg,0.28125,0.0,0.84375,0.75,437,979,https://www.flickr.com/photos/nzcarfreak/32130016155/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 9d55997552acf0de,https://c1.staticflickr.com/4/3827/33042042362_c6d848f625_o.jpg,0.0,0.25,0.498159057437,1.0,260,199,https://flickr.com/145431051@N05/33042042362,https://creativecommons.org/licenses/by/2.0/,Natalia King,https://www.flickr.com/people/inataliaking/ 8da3593258ae27cb,https://c1.staticflickr.com/8/7304/27230857426_6398e3ff70_o.jpg,0.257672155689,0.25,0.773016467066,1.0,581,399,https://www.flickr.com/photos/eu2016nl/27230857426,https://creativecommons.org/licenses/by/2.0/,EU2016 NL,https://www.flickr.com/people/eu2016nl/ fccab516c111d524,https://c1.staticflickr.com/1/578/31833204592_df37b2fd5f_o.jpg,0.5,0.0,1.0,0.75,650,757,https://www.flickr.com/photos/shadowgate/31833204592,https://creativecommons.org/licenses/by/2.0/,Shadowgate,https://www.flickr.com/people/shadowgate/ 315e55af9615abd2,https://c1.staticflickr.com/1/779/31725794312_e202c64123_o.jpg,0.256726457399,0.25,0.770179372197,1.0,347,106,https://flickr.com/13476480@N07/31725794312,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c135337ca7a575ae,https://c1.staticflickr.com/9/8239/28468432034_845b238b0a_o.jpg,0.28125,0.0,0.84375,0.75,348,178,https://www.flickr.com/photos/sedoglia/28468432034,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/ 3bfe9ff7b488485d,https://c1.staticflickr.com/8/7526/27213158786_4411c71bb4_o.jpg,0.0,0.25,0.5,1.0,706,710,https://www.flickr.com/photos/45220772@N06/27213158786,https://creativecommons.org/licenses/by/2.0/,Chris GBNL,https://www.flickr.com/people/45220772@N06/ 1e33aa336b89dcff,https://c1.staticflickr.com/9/8069/29343726103_76a4d6550d_o.jpg,0.455384615385,0.0,1.0,0.75,539,588,https://www.flickr.com/photos/hisgett/29343726103/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 39a483e9a23716ed,https://c1.staticflickr.com/6/5803/30224386731_129a573cb6_o.jpg,0.0,0.25,0.497426470588,1.0,676,646,https://www.flickr.com/photos/thenationalguard/30224386731,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ 5191cfba868056a5,https://c1.staticflickr.com/9/8057/28990247303_f5235fa9ae_o.jpg,0.250923190547,0.25,0.75276957164,1.0,971,793,http://www.flickr.com/photos/pekkatamminen/28990247303/,https://creativecommons.org/licenses/by/2.0/,Pekka Tamminen,https://www.flickr.com/people/pekkatamminen/ 4572c8986c28343b,https://c1.staticflickr.com/9/8672/28241882454_babaf6f88f_o.jpg,0.334315169367,0.0,1.0,1.0,437,535,https://www.flickr.com/photos/greggjerdingen/28241882454,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 7700d0ba053dc4bd,https://c1.staticflickr.com/9/8881/28767707555_05e533e1a1_o.jpg,0.25,0.249079528719,1.0,0.747238586156,937,292,https://www.flickr.com/photos/scotnelson/28767707555,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ eab9755117160864,https://c1.staticflickr.com/8/7509/29649911804_fbed1c6dac_o.jpg,0.25,0.0,1.0,0.618442622951,611,510,https://flickr.com/128305985@N02/29649911804,https://creativecommons.org/licenses/by/2.0/,Varevo Designs,https://www.flickr.com/people/128305985@N02/ 8b47d72b39b2bd33,https://c1.staticflickr.com/8/7458/27617552740_586605d6d1_o.jpg,0.331130690162,0.0,0.993392070485,1.0,526,97,https://flickr.com/77742560@N06/27617552740,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 7d2a7bca22967f29,https://c1.staticflickr.com/8/7525/27211199483_b103fe3789_o.jpg,0.0,0.0,0.512686567164,0.75,735,600,https://www.flickr.com/photos/hisgett/27211199483,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 8e89734ed940e222,https://c1.staticflickr.com/1/510/31839325642_621a361097_o.jpg,0.30421686747,0.0,1.0,1.0,657,794,https://www.flickr.com/photos/autohistorian/31839325642,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 30b922dbfdbffd11,https://c1.staticflickr.com/3/2431/32476279840_81a638927d_o.jpg,0.28125,0.0,0.84375,0.75,610,972,https://www.flickr.com/photos/karen_roe/32476279840,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ ef0e34b8ccb6d42f,https://c1.staticflickr.com/9/8841/28756457540_dd42170f61_o.jpg,0.25,0.25,0.75,1.0,982,712,https://www.flickr.com/photos/87533529@N00/28756457540/,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/ 506b87b78daa499c,https://c1.staticflickr.com/8/7427/26651646184_52fdea24f9_o.jpg,0.0,0.0,0.575553797468,0.75,821,244,https://www.flickr.com/photos/jsjgeology/26651646184,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 62e0e0efc6deeef4,https://c1.staticflickr.com/8/7292/26212453023_25d43a954f_o.jpg,0.0,0.0,0.5,0.75,971,772,https://www.flickr.com/photos/akashadorable/26212453023,https://creativecommons.org/licenses/by/2.0/,reverie_rambler,https://www.flickr.com/people/akashadorable/ 28652355cd12a1e7,https://c1.staticflickr.com/8/7281/27719555664_9d2eee5a25_o.jpg,0.276162790698,0.0,0.828488372093,0.75,308,63,https://www.flickr.com/photos/86548370@N00/27719555664/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 0ed355357757528d,https://c1.staticflickr.com/1/771/30766164923_65f81b0a16_o.jpg,0.0,0.0,0.666666666667,1.0,763,795,https://www.flickr.com/photos/dalbera/30766164923,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ abe9504895f6e8dd,https://c1.staticflickr.com/8/7719/27005746036_e3c2d66824_o.jpg,0.204773030708,0.25,0.614319092123,1.0,566,607,https://www.flickr.com/photos/kansasscanner/27005746036/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ dd984311bff04342,https://c1.staticflickr.com/6/5505/30880758442_b260c358d1_o.jpg,0.57825203252,0.0,1.0,0.75,118,524,https://flickr.com/149229065@N07/30880758442,https://creativecommons.org/licenses/by/2.0/,bready_fv,https://www.flickr.com/people/149229065@N07/ f7947af6545be760,https://c1.staticflickr.com/9/8088/29622519706_0b2d2626e1_o.jpg,0.0,0.0,0.7484375,1.0,418,722,https://www.flickr.com/photos/xingxiyang/29622519706/,https://creativecommons.org/licenses/by/2.0/,Kiefer,https://www.flickr.com/people/xingxiyang/ 01244097ca8ffdfa,https://c1.staticflickr.com/9/8420/29072932140_428884b149_o.jpg,0.0,0.0,0.666666666667,1.0,91,563,https://www.flickr.com/photos/bigtallguy/29072932140,https://creativecommons.org/licenses/by/2.0/,Paul Reynolds,https://www.flickr.com/people/bigtallguy/ 3cf4bb0637d0f182,https://c1.staticflickr.com/6/5336/31376083036_f61bd4c093_o.jpg,0.0,0.4375,0.75,1.0,862,52,http://www.flickr.com/photos/subzonica/31376083036/,https://creativecommons.org/licenses/by/2.0/,Hern\303\241n Garc\303\255a Crespo,https://www.flickr.com/people/subzonica/ 1d5361e858fe8462,https://c1.staticflickr.com/1/252/31161493730_01da9f540b_o.jpg,0.0,0.25,0.377400768246,1.0,499,523,https://www.flickr.com/photos/usnavalwarcollegeri/31161493730/,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/ 6a50fbe8723a6a4a,https://c1.staticflickr.com/1/571/31590985202_b888dd2600_o.jpg,0.5,0.25,1.0,1.0,563,597,https://www.flickr.com/photos/rollercoasterphilosophy/31590985202/,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ 001b5e6f1b89fd3b,https://c1.staticflickr.com/6/5342/31290416685_7145707d8a_o.jpg,0.4375,0.25,1.0,1.0,577,909,https://www.flickr.com/photos/127226743@N02/31290416685,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 25eef91443ded954,https://c1.staticflickr.com/6/5495/29933353114_e345092c4c_o.jpg,0.471030042918,0.0,0.942060085837,0.75,437,728,https://www.flickr.com/photos/autohistorian/29933353114,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ ed3f9b6a081a4802,https://c1.staticflickr.com/8/7432/27519628793_d12a4b1349_o.jpg,0.0,0.0,0.666666666667,1.0,818,210,https://www.flickr.com/photos/thecarspy/27519628793,https://creativecommons.org/licenses/by/2.0/,The Car Spy,https://www.flickr.com/people/thecarspy/ 95fbd20d0aaf319a,https://c1.staticflickr.com/1/292/31801536095_12b2b4d011_o.jpg,0.333333333333,0.0,1.0,1.0,826,300,https://www.flickr.com/photos/shankaronline/31801536095,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 2bc6c55a0ab24f86,https://c1.staticflickr.com/8/7578/28472228121_b58f3263f6_o.jpg,0.28125,0.0,0.84375,0.75,786,697,https://www.flickr.com/photos/merfam/28472228121/,https://creativecommons.org/licenses/by/2.0/,Jason Meredith,https://www.flickr.com/people/merfam/ 319e8b63d6a194aa,https://c1.staticflickr.com/9/8203/29608037100_b9c0377cb0_o.jpg,0.4375,0.25,1.0,1.0,826,529,https://www.flickr.com/photos/127226743@N02/29608037100,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 4fcc9c949d66a4e0,https://c1.staticflickr.com/9/8273/29520584994_c6a87b78b7_o.jpg,0.176470588235,0.0,0.529411764706,0.75,771,104,https://flickr.com/35080385@N08/29520584994,https://creativecommons.org/licenses/by/2.0/,Daniel Max,https://www.flickr.com/people/35080385@N08/ 5c847b72d1e1713f,https://c1.staticflickr.com/8/7402/27581042815_97ab7892e1_o.jpg,0.25,0.0,1.0,0.75,556,522,https://www.flickr.com/photos/13152419@N05/27581042815/,https://creativecommons.org/licenses/by/2.0/,A.J. WOODSON,https://www.flickr.com/people/13152419@N05/ 707bce947d54bcd8,https://c1.staticflickr.com/6/5533/31047975071_6e1e9857a2_o.jpg,0.43661971831,0.25,1.0,1.0,947,941,https://www.flickr.com/photos/amantedar/31047975071/,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/ 43fa89c17e628c06,https://c1.staticflickr.com/6/5669/30471849463_58158aea97_o.jpg,0.28125,0.0,0.84375,0.75,133,885,https://www.flickr.com/photos/ddebold/30471849463,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ 6612fd36e6dd9534,https://c1.staticflickr.com/8/7446/27992527025_02e1093865_o.jpg,0.24882629108,0.0,1.0,1.0,309,866,https://www.flickr.com/photos/treegrow/27992527025,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 4146a745f9b2f3cb,https://c1.staticflickr.com/1/453/32533674871_37d9a42b5c_o.jpg,0.28125,0.0,0.84375,0.75,51,418,https://www.flickr.com/photos/kjfnjy/32533674871,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/ 74bfc95412b2f824,https://c1.staticflickr.com/8/7046/26382321234_683510e9d6_o.jpg,0.0,0.0,1.0,1.0,672,655,https://www.flickr.com/photos/salvolg/26382321234,https://creativecommons.org/licenses/by/2.0/,Salvatore,https://www.flickr.com/people/salvolg/ 5fc906f27c8975d2,https://c1.staticflickr.com/9/8029/29167405853_4e4009a5d5_o.jpg,0.0,0.0,0.5625,0.75,979,367,https://www.flickr.com/photos/marsupilami92/29167405853,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ 2fc17ec1fad5d947,https://c1.staticflickr.com/2/1618/26152633944_15768856b8_o.jpg,0.0,0.25,0.579761904762,1.0,874,929,https://www.flickr.com/photos/sergejf/26152633944,https://creativecommons.org/licenses/by/2.0/,sergejf,https://www.flickr.com/people/sergejf/ cb63df64516985c1,https://c1.staticflickr.com/8/7226/27305715702_336cd34ebb_o.jpg,0.334315169367,0.0,1.0,1.0,635,772,https://www.flickr.com/photos/sarahvain/27305715702,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/ 7b8413ef241118df,https://c1.staticflickr.com/6/5627/31291332596_e0705f6670_o.jpg,0.4375,0.25,1.0,1.0,548,485,https://www.flickr.com/photos/davidwilson1949/31291332596,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 2e854fca826e54b3,https://c1.staticflickr.com/1/307/31234607810_e2d5b4b1c8_o.jpg,0.333333333333,0.0,1.0,1.0,858,596,https://www.flickr.com/photos/dalbera/31234607810/,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ f0add7f552d2d895,https://c1.staticflickr.com/6/5800/30295930850_0c40713818_o.jpg,0.0,0.0,0.5625,0.75,650,543,https://www.flickr.com/photos/technoevangelist/30295930850,https://creativecommons.org/licenses/by/2.0/,Fee Plumley,https://www.flickr.com/people/technoevangelist/ 9d4674c86096e4bd,https://c1.staticflickr.com/9/8410/29866310754_8c13093feb_o.jpg,0.25,0.470789074355,1.0,1.0,662,614,https://www.flickr.com/photos/autohistorian/29866310754,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 05437214d1ba9580,https://c1.staticflickr.com/9/8829/28380794150_706cf5d693_o.jpg,0.0,0.25,0.5625,1.0,810,118,https://www.flickr.com/photos/68147320@N02/28380794150,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ dacb07f80166a7fd,https://c1.staticflickr.com/6/5813/30874086821_c5bcdcb048_o.jpg,0.5,0.0,1.0,0.75,449,108,http://www.flickr.com/photos/boykoblagoev/30874086821/,https://creativecommons.org/licenses/by/2.0/,Boyko Blagoev,https://www.flickr.com/people/boykoblagoev/ 82b6f0bc71f5d0af,https://c1.staticflickr.com/4/3943/15734053815_ccb8cb6852_o.jpg,0.0,0.0,1.0,1.0,563,578,https://www.flickr.com/photos/zedzap/15734053815/,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/ 0f36316247c03427,https://c1.staticflickr.com/1/504/31690529866_dc4e0a80a7_o.jpg,0.500736377025,0.25,1.0,1.0,753,681,https://www.flickr.com/photos/squashdev/31690529866,https://creativecommons.org/licenses/by/2.0/,England Squash Masters,https://www.flickr.com/people/squashdev/ efeabdd8a05e91f8,https://c1.staticflickr.com/9/8810/28183540151_f7108aa9a2_o.jpg,0.0,0.0,0.5625,0.75,498,311,https://www.flickr.com/photos/131810676@N03/28183540151/,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/ 7453471febf1db6f,https://c1.staticflickr.com/9/8870/28331839720_9de4810a16_o.jpg,0.0,0.333333333333,1.0,1.0,595,90,https://www.flickr.com/photos/stevenpisano/28331839720,https://creativecommons.org/licenses/by/2.0/,Steven Pisano,https://www.flickr.com/people/stevenpisano/ e6f2de0c605f1ed3,https://c1.staticflickr.com/9/8392/29438273202_8ba928f59f_o.jpg,0.471590909091,0.0,1.0,0.75,132,994,https://www.flickr.com/photos/dkeats/29438273202,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 648231d9393250fd,https://c1.staticflickr.com/1/436/31994770622_64e6478fe4_o.jpg,0.578822733424,0.25,1.0,1.0,548,650,https://www.flickr.com/photos/belurashok/31994770622/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ 864fffaf7a83b3f4,https://c1.staticflickr.com/8/7471/27863056826_bc9e568c4c_o.jpg,0.0,0.0,0.75,1.0,581,373,https://www.flickr.com/photos/juggernautco/27863056826,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ c179282bd977c6e0,https://c1.staticflickr.com/3/2907/32124474993_c63801fabf_o.jpg,0.0,0.0,0.556376360809,0.75,672,105,https://www.flickr.com/photos/glorycycles/32124474993,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 40a7f086461190f3,https://c1.staticflickr.com/2/1514/26690160211_eda12ace1e_o.jpg,0.428627760252,0.25,1.0,1.0,493,841,https://www.flickr.com/photos/martius/26690160211,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 90e1aa56cae80a60,https://c1.staticflickr.com/6/5068/30114102505_bcc8ec61db_o.jpg,0.0,0.0,1.0,1.0,918,417,https://flickr.com/64648244@N04/30114102505,https://creativecommons.org/licenses/by/2.0/,Ulf K,https://www.flickr.com/people/ulfk/ 839aa3d166b020cf,https://c1.staticflickr.com/8/7104/26514437520_58ea29102e_o.jpg,0.0,0.25,0.720796460177,1.0,14,211,https://www.flickr.com/photos/nrgoodrum/26514437520,https://creativecommons.org/licenses/by/2.0/,nick goodrum,https://www.flickr.com/people/nrgoodrum/ 38bdd950c1d08be6,https://c1.staticflickr.com/1/467/32470039506_2c9d8f3c2c_o.jpg,0.0,0.0,0.75,1.0,133,891,https://www.flickr.com/photos/rusty_clark/32470039506/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 2d95297e468bdf9b,https://c1.staticflickr.com/8/7358/27718678441_390843b0a4_o.jpg,0.28125,0.25,0.84375,1.0,866,526,https://www.flickr.com/photos/jeepersmedia/27718678441,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ ef5b1e5a76ae66dc,https://c1.staticflickr.com/9/8028/29706482742_e07ecf46e1_o.jpg,0.497426470588,0.0,0.994852941176,0.75,540,725,https://www.flickr.com/photos/emilysnuffer/29706482742,https://creativecommons.org/licenses/by/2.0/,Emily May,https://www.flickr.com/people/emilysnuffer/ 7a11ae4c1f5e790c,https://c1.staticflickr.com/8/7680/28813894581_61251a80fa_o.jpg,0.249079528719,0.25,0.747238586156,1.0,689,500,https://www.flickr.com/photos/zigazou76/28813894581,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 477bf90e7413df23,https://c1.staticflickr.com/8/7338/27067101244_7942b5769e_o.jpg,0.0,0.0,0.578296703297,1.0,542,836,https://www.flickr.com/photos/fifeanddrum/27067101244,https://creativecommons.org/licenses/by/2.0/,U. S. Army Old Guard Fife and Drum Corps,https://www.flickr.com/people/fifeanddrum/ 7060ae82e5b96a77,https://c1.staticflickr.com/8/7414/27849533291_23d512cc58_o.jpg,0.0,0.0,0.75,1.0,522,495,https://www.flickr.com/photos/jeepersmedia/27849533291,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 42e55ac6782d4d99,https://c1.staticflickr.com/9/8841/28851410876_d279c09ca0_o.jpg,0.0,0.0,0.5625,0.75,974,819,https://flickr.com/131967103@N02/28851410876,https://creativecommons.org/licenses/by/2.0/,Ryan McMinds,https://www.flickr.com/people/131967103@N02/ 8868879c2acd5d9e,https://c1.staticflickr.com/8/7477/27387672956_baa0cdeb89_o.jpg,0.455384615385,0.0,1.0,0.75,322,130,https://www.flickr.com/photos/usfwsmidwest/27387672956,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 5b3a8c63e41802e7,https://c1.staticflickr.com/9/8883/27865729823_3db56871fa_o.jpg,0.25,0.25,1.0,1.0,750,758,https://flickr.com/38315261@N00/27865729823,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 659ca4ac6cc57e89,https://c1.staticflickr.com/1/371/31418192282_a6fa2c7a51_o.jpg,0.25,0.0,0.75,0.75,778,590,https://www.flickr.com/photos/quinet/31418192282,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 9534108b0e8dceb1,https://c1.staticflickr.com/1/668/31683586152_9c8d97ef8f_o.jpg,0.282719435737,0.25,0.84815830721,1.0,647,822,https://www.flickr.com/photos/arnehendriks/31683586152,https://creativecommons.org/licenses/by/2.0/,Arne Hendriks,https://www.flickr.com/people/arnehendriks/ fbc6b98b13c768e2,https://c1.staticflickr.com/9/8435/29171057840_4acaf34304_o.jpg,0.0,0.25,0.5625,1.0,459,566,https://www.flickr.com/photos/rheba/29171057840,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/ 7c3b0d93654b39cd,https://c1.staticflickr.com/6/5128/29789328711_639198fc6f_o.jpg,0.25,0.0,1.0,0.5625,708,428,https://www.flickr.com/photos/playamongfriends/29789328711,https://creativecommons.org/licenses/by/2.0/,Play Among Friends Paf,https://www.flickr.com/people/playamongfriends/ 43694caa12d5f823,https://c1.staticflickr.com/1/445/31614966550_d5fc6f7f3d_o.jpg,0.28125,0.25,0.84375,1.0,979,757,https://www.flickr.com/photos/cambodia4kidsorg/31614966550/,https://creativecommons.org/licenses/by/2.0/,Cambodia4kids.org Beth Kanter,https://www.flickr.com/people/cambodia4kidsorg/ 69788a29e7436808,https://c1.staticflickr.com/6/5332/30849701300_a85871c357_o.jpg,0.12962962963,0.0,1.0,1.0,310,50,https://www.flickr.com/photos/gails_pictures/30849701300/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ daa43d65c3b18a84,https://c1.staticflickr.com/9/8253/29381659730_52bcbf8b59_o.jpg,0.0,0.0,1.0,0.75,822,54,https://www.flickr.com/photos/39551170@N02/29381659730,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/ a8c3363bbcc7015c,https://c1.staticflickr.com/9/8823/29472376703_be7d867566_o.jpg,0.0,0.0,0.912068965517,1.0,739,840,https://www.flickr.com/photos/tomronworldwide/29472376703,https://creativecommons.org/licenses/by/2.0/,Ron Frazier,https://www.flickr.com/people/tomronworldwide/ 93a0857ff81c25ce,https://c1.staticflickr.com/6/5733/30469514315_1d8ce7f4c2_o.jpg,0.0,0.0,0.5,0.75,548,959,https://www.flickr.com/photos/rhemkes/30469514315,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ b11fa0f292c0178f,https://c1.staticflickr.com/1/780/32263240380_ee5c7a9637_o.jpg,0.25,0.0,0.75,0.75,702,901,http://www.flickr.com/photos/124790945@N06/32263240380,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ 1dc0533f87996962,https://c1.staticflickr.com/8/7704/26497012284_30e830cc10_o.jpg,0.409855769231,0.25,1.0,1.0,566,853,https://www.flickr.com/photos/jsjgeology/26497012284,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 589319c64adf5fce,https://c1.staticflickr.com/8/7460/27398216034_b731c9e68a_o.jpg,0.333333333333,0.0,1.0,1.0,699,588,https://www.flickr.com/photos/libereurope/27398216034/,https://creativecommons.org/licenses/by/2.0/,LIBER Europe,https://www.flickr.com/people/libereurope/ cebd45d7200f6111,https://c1.staticflickr.com/9/8339/29164491280_b7d3bdd713_o.jpg,0.25,0.0,1.0,0.719444444444,71,947,https://www.flickr.com/photos/garlandcannon/29164491280,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/ 7e73c7adc520e406,https://c1.staticflickr.com/8/7416/26859649600_fb2cbaf86b_o.jpg,0.25,0.0,1.0,0.648070469799,133,86,https://www.flickr.com/photos/lakeworth/26859649600,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/ 6de6432b0f23ae75,https://c1.staticflickr.com/1/579/32182435510_e9fab3e93c_o.jpg,0.333333333333,0.0,1.0,1.0,105,407,https://www.flickr.com/photos/rexness/32182435510,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/ ebb4dad78cfd67a9,https://c1.staticflickr.com/8/7293/27173553526_fe84eeeec9_o.jpg,0.25,0.0,1.0,1.0,738,730,https://www.flickr.com/photos/jeepersmedia/27173553526,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ e8c6f75ad26bae84,https://c1.staticflickr.com/9/8393/29734167231_b03b36f04b_o.jpg,0.28125,0.25,0.84375,1.0,973,929,https://www.flickr.com/photos/jsjgeology/29734167231,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1e408a8d1e2cdc74,https://c1.staticflickr.com/6/5509/30181862974_0a8d40efb1_o.jpg,0.4375,0.0,1.0,0.75,769,779,https://www.flickr.com/photos/stmunchins/30181862974/,https://creativecommons.org/licenses/by/2.0/,St Munchin's College,https://www.flickr.com/people/stmunchins/ 11afa51200515f9a,https://c1.staticflickr.com/8/7654/28347963084_4a9385edd0_o.jpg,0.263089005236,0.0,0.789267015707,1.0,826,567,https://www.flickr.com/photos/anandajoti/28347963084/,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/ 9f6fe669276f04cf,https://c1.staticflickr.com/9/8760/28674693282_7eec755334_o.jpg,0.0,0.0,0.7484375,1.0,920,697,https://www.flickr.com/photos/zimpenfish/28674693282,https://creativecommons.org/licenses/by/2.0/,rjp,https://www.flickr.com/people/zimpenfish/ 408bae58c26a8076,https://c1.staticflickr.com/6/5773/29699525424_ea6336aaa8_o.jpg,0.462155963303,0.0,1.0,0.75,133,761,https://www.flickr.com/photos/taylar/29699525424,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ b5548ecffa20aac8,https://c1.staticflickr.com/1/713/32057543825_ded4304f3b_o.jpg,0.0,0.0,0.5,0.75,934,108,http://www.flickr.com/photos/143850343@N06/32057543825/,https://creativecommons.org/licenses/by/2.0/,Sam-H-A,https://www.flickr.com/people/143850343@N06/ 9ee13ecd8d6727c0,https://c1.staticflickr.com/6/5708/30313299300_68025e82ed_o.jpg,0.0,0.498153618907,0.75,1.0,498,554,https://www.flickr.com/photos/quinet/30313299300,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ d1a723656dc08b5e,https://c1.staticflickr.com/8/7407/27895921745_908d139fdd_o.jpg,0.503303964758,0.25,1.0,1.0,822,814,https://www.flickr.com/photos/shankaronline/27895921745,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ d1709eec353a6f93,https://c1.staticflickr.com/8/7421/27144655490_a81fccf9ca_o.jpg,0.0,0.25,0.75,1.0,297,556,https://www.flickr.com/photos/rjbailey/27144655490/,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/ b89dbfcc49dcf156,https://c1.staticflickr.com/8/7448/27273015613_f2767e3f98_o.jpg,0.210588633288,0.0,0.631765899865,0.75,889,467,https://www.flickr.com/photos/spencerhall/27273015613,https://creativecommons.org/licenses/by/2.0/,Spencer Hall,https://www.flickr.com/people/spencerhall/ 7368fe0ff47343a0,https://c1.staticflickr.com/8/7520/26512614104_b123959864_o.jpg,0.28125,0.25,0.84375,1.0,965,447,https://www.flickr.com/photos/rainsong/26512614104,https://creativecommons.org/licenses/by/2.0/,Ali - \330\271\331\204\331\212 from Riyadh - \331\205\331\206 \330\247\331\204\330\261\331\212\330\247\330\266,https://www.flickr.com/people/rainsong/ d23fd2119c4f5dec,https://c1.staticflickr.com/9/8165/28790897384_31003e57ee_o.jpg,0.249631811487,0.0,0.748895434462,0.75,329,123,https://www.flickr.com/photos/fhgitarre/28790897384,https://creativecommons.org/licenses/by/2.0/,FHgitarre,https://www.flickr.com/people/fhgitarre/ 5a0e21d54b9c4954,https://c1.staticflickr.com/8/7243/27968268826_09285822b1_o.jpg,0.0,0.0,0.715608465608,0.75,328,146,https://www.flickr.com/photos/noaaphotolib/27968268826,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 4b8517e927f32962,https://c1.staticflickr.com/9/8140/29892684285_e0633bea72_o.jpg,0.25,0.25,1.0,1.0,866,271,https://flickr.com/10307586@N03/29892684285,https://creativecommons.org/licenses/by/2.0/,Mark Pegrum,https://www.flickr.com/people/ozmark17/ 38deb4830d12358f,https://c1.staticflickr.com/6/5650/31182154435_7dc98f5dba_o.jpg,0.5,0.0,1.0,0.75,980,936,https://www.flickr.com/photos/henry_hemming/31182154435,https://creativecommons.org/licenses/by/2.0/,Henry Hemming,https://www.flickr.com/people/henry_hemming/ 81804435ad51df95,https://c1.staticflickr.com/1/255/31787555660_d866250efd_o.jpg,0.0,0.0,0.5,0.75,437,241,https://www.flickr.com/photos/nielsautos/31787555660,https://creativecommons.org/licenses/by/2.0/,Niels de Wit,https://www.flickr.com/people/nielsautos/ e4941a341ace171a,https://c1.staticflickr.com/9/8006/28587599723_947de8d314_o.jpg,0.25,0.25,1.0,0.75,709,298,https://www.flickr.com/photos/asrusch/28587599723,https://creativecommons.org/licenses/by/2.0/,Andy Rusch,https://www.flickr.com/people/asrusch/ 558a7b66b78ba65b,https://c1.staticflickr.com/6/5797/30174833703_4e5f61ded4_o.jpg,0.0,0.0,1.0,0.745709828393,422,668,https://www.flickr.com/photos/tusnelda/30174833703/,https://creativecommons.org/licenses/by/2.0/,storebukkebruse,https://www.flickr.com/people/tusnelda/ 435137d9d4f4125e,https://c1.staticflickr.com/8/7535/28182425121_c71755b34e_o.jpg,0.0,0.0,0.75,0.75,2,269,https://www.flickr.com/photos/aidanmorgan/28182425121/,https://creativecommons.org/licenses/by/2.0/,John Morgan,https://www.flickr.com/people/aidanmorgan/ c43077b2283479be,https://c1.staticflickr.com/6/5522/30653895580_2c136ce8c7_o.jpg,0.0,0.0,0.75,0.588,14,765,https://flickr.com/93242958@N00/30653895580,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 77c72d0a01e1af70,https://c1.staticflickr.com/9/8214/28891107093_72da720a1d_o.jpg,0.5,0.0,1.0,0.75,428,836,https://www.flickr.com/photos/katiethebeau/28891107093/,https://creativecommons.org/licenses/by/2.0/,KatieThebeau,https://www.flickr.com/people/katiethebeau/ 72ac2a5af79e26d5,https://c1.staticflickr.com/6/5613/31220748780_31a537d326_o.jpg,0.28125,0.0,0.84375,0.75,718,862,https://www.flickr.com/photos/hugo90/31220748780,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 32c0e4647ce5a812,https://c1.staticflickr.com/9/8344/29851489791_076d3494a0_o.jpg,0.486899563319,0.0,0.973799126638,0.75,327,743,https://www.flickr.com/photos/yogendra174/29851489791,https://creativecommons.org/licenses/by/2.0/,Yogendra Joshi,https://www.flickr.com/people/yogendra174/ 54153d17b11b495c,https://c1.staticflickr.com/6/5500/30389728162_23cdff8ba8_o.jpg,0.421177266576,0.0,0.842354533153,0.75,657,551,https://www.flickr.com/photos/micsworld/30389728162,https://creativecommons.org/licenses/by/2.0/,Mic,https://www.flickr.com/people/micsworld/ fb1efda0b27d5289,https://c1.staticflickr.com/1/460/31194422753_24550f0615_o.jpg,0.5,0.0,1.0,0.75,848,203,https://www.flickr.com/photos/quinet/31194422753,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 7c5ea6f89e6e2733,https://c1.staticflickr.com/1/454/32710889631_00f86c1d71_o.jpg,0.500736377025,0.0,1.0,0.75,820,587,https://www.flickr.com/photos/dominik_junger/32710889631/in/album-72157676671651883/,https://creativecommons.org/licenses/by/2.0/,Dominik Junger,https://www.flickr.com/people/dominik_junger/ 721804d1d3a60206,https://c1.staticflickr.com/8/7790/27456693684_f07ebe3aea_o.jpg,0.0,0.0,0.666666666667,1.0,909,34,https://www.flickr.com/photos/presidentialoffice/27456693684,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ dcb6b32cd80f2b1f,https://c1.staticflickr.com/8/7560/29512813082_6efd1c1b56_o.jpg,0.28125,0.0,0.84375,0.75,556,832,https://www.flickr.com/photos/27665395@N05/29512813082/,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 49c27b439d39a00c,https://c1.staticflickr.com/1/653/33034701806_914058174b_o.jpg,0.335787923417,0.0,1.0,1.0,490,418,https://flickr.com/38144691@N00/33034701806,https://creativecommons.org/licenses/by/2.0/,August Kelm,https://www.flickr.com/people/augustksphotos/ 2c065d2dc6b2cf44,https://c1.staticflickr.com/6/5441/30476315260_213dbcbdf3_o.jpg,0.439547581903,0.0,1.0,0.75,934,463,https://www.flickr.com/photos/hmk/30476315260,https://creativecommons.org/licenses/by/2.0/,H. Michael Karshis,https://www.flickr.com/people/hmk/ b3f200c672c5ca4f,https://c1.staticflickr.com/8/7539/28925572132_ff6fc934e0_o.jpg,0.0,0.25,0.5,1.0,976,275,https://www.flickr.com/photos/gabrielgm/28925572132/,https://creativecommons.org/licenses/by/2.0/,Gabriel Garcia Marengo,https://www.flickr.com/people/gabrielgm/ 3f40eba168e5d385,https://c1.staticflickr.com/6/5717/31106619226_f60452e9f2_o.jpg,0.299878836834,0.0,0.899636510501,0.75,515,936,https://www.flickr.com/photos/85546319@N04/31106619226,https://creativecommons.org/licenses/by/2.0/,Robert Sheie,https://www.flickr.com/people/85546319@N04/ 0e71473957df4793,https://c1.staticflickr.com/1/630/31560462464_df68f43299_o.jpg,0.502573529412,0.0,1.0,0.75,878,348,https://www.flickr.com/photos/agenciabrasilia/31560462464,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 6c9f8901246faff2,https://c1.staticflickr.com/1/745/31509879035_78978e4f01_o.jpg,0.0,0.0,0.70820668693,1.0,629,689,https://www.flickr.com/photos/guldem/31509879035,https://creativecommons.org/licenses/by/2.0/,G\303\274ldem \303\234st\303\274n,https://www.flickr.com/people/guldem/ a64ae1acd9d09a87,https://c1.staticflickr.com/1/717/31077768123_e0787a8de6_o.jpg,0.0,0.0,1.0,1.0,131,83,http://www.flickr.com/photos/paul_e_balfe/31077768123/,https://creativecommons.org/licenses/by/2.0/,Paul Balfe,https://www.flickr.com/people/paul_e_balfe/ 05f7c084329ff0c6,https://c1.staticflickr.com/6/5513/30518437054_80b12bbda5_o.jpg,0.5,0.25,1.0,1.0,973,910,https://flickr.com/14247646@N00/30518437054,https://creativecommons.org/licenses/by/2.0/,James,https://www.flickr.com/people/jametiks/ 5d77597361d06d2b,https://c1.staticflickr.com/1/478/31414603844_530a364312_o.jpg,0.0,0.0,1.0,0.714503816794,904,92,https://www.flickr.com/photos/avedaphotos/31414603844/,https://creativecommons.org/licenses/by/2.0/,Aveda Corporation,https://www.flickr.com/people/avedaphotos/ ac2a8a4777dbe746,https://c1.staticflickr.com/8/7615/27545901420_caafb85d83_o.jpg,0.0,0.0,0.499263622975,0.75,896,46,https://www.flickr.com/photos/621crw/27545901420,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/ 3d75d9676ad6361c,https://c1.staticflickr.com/6/5589/30796308216_2ba813235e_o.jpg,0.0,0.0,0.601941747573,0.75,151,517,https://www.flickr.com/photos/pandora_6666/30796308216,https://creativecommons.org/licenses/by/2.0/,Jo Naylor,https://www.flickr.com/people/pandora_6666/ e3a740861f12f49e,https://c1.staticflickr.com/9/8453/29471934070_b712c35d65_o.jpg,0.21087398374,0.0,0.63262195122,0.75,820,900,https://www.flickr.com/photos/ceta_und_ttip_stoppen/29471934070/,https://creativecommons.org/licenses/by/2.0/,CETA und TTIP stoppen,https://www.flickr.com/people/ceta_und_ttip_stoppen/ 64577d3916d6dafb,https://c1.staticflickr.com/8/7774/26695019922_97087ac2c0_o.jpg,0.25,0.0,1.0,0.5625,606,754,https://www.flickr.com/photos/afropicmusing/26695019922,https://creativecommons.org/licenses/by/2.0/,afromusing,https://www.flickr.com/people/afropicmusing/ 3b32eca218ed3dbe,https://c1.staticflickr.com/8/7341/28021300931_378cfe5932_o.jpg,0.0,0.0,0.490510948905,0.75,742,838,https://www.flickr.com/photos/jdlasica/28021300931,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 0707f3dfb7c29f5c,https://c1.staticflickr.com/6/5700/30555623662_42d83db0d3_o.jpg,0.0,0.25,0.498159057437,1.0,606,740,https://www.flickr.com/photos/145304628@N02/30555623662,https://creativecommons.org/licenses/by/2.0/,Degree53 UK,https://www.flickr.com/people/145304628@N02/ 59e9bdbb7a3fc4ba,https://c1.staticflickr.com/9/8533/30011107125_37837842a9_o.jpg,0.0,0.0,1.0,0.666666666667,518,407,https://www.flickr.com/photos/zigazou76/30011107125,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 686ea4ec999364ff,https://c1.staticflickr.com/8/7319/27523198984_f9d44bba3a_o.jpg,0.0,0.28125,0.75,0.84375,459,554,https://www.flickr.com/photos/nostri-imago/27523198984,https://creativecommons.org/licenses/by/2.0/,Cliff,https://www.flickr.com/people/nostri-imago/ cb71a056a8e05bb2,https://c1.staticflickr.com/9/8001/29254381704_cc81ff8df9_o.jpg,0.0,0.0,0.56338028169,0.75,320,941,https://flickr.com/9243304@N04/29254381704,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/ f63d58b5af16091f,https://c1.staticflickr.com/1/681/32382788261_b7554c250b_o.jpg,0.0,0.0,1.0,0.732612055641,716,420,https://www.flickr.com/photos/jlcernadas/32382788261/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ d3aa8ee50458c020,https://c1.staticflickr.com/1/444/32463408492_cf7ab6f5fb_o.jpg,0.0,0.0,0.75,0.630794701987,431,874,https://www.flickr.com/photos/viumariners/32463408492/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/ 2891f4aa2279d369,https://c1.staticflickr.com/9/8658/28224525812_7301285f51_o.jpg,0.5,0.0,1.0,0.75,471,405,https://www.flickr.com/photos/rorals/28224525812,https://creativecommons.org/licenses/by/2.0/,Rory,https://www.flickr.com/people/rorals/ ae24c23192976a40,https://c1.staticflickr.com/6/5811/31350835411_b856c2e0f7_o.jpg,0.0,0.0,0.498159057437,0.75,752,888,https://www.flickr.com/photos/davehamster/31350835411,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 348ac56def3ccd35,https://c1.staticflickr.com/9/8601/30053184852_b6c871293b_o.jpg,0.331617647059,0.0,0.994852941176,1.0,916,533,https://www.flickr.com/photos/alpesdehauteprovence-tourisme/30053184852,https://creativecommons.org/licenses/by/2.0/,ADT 04,https://www.flickr.com/people/alpesdehauteprovence-tourisme/ d46216d31908163e,https://c1.staticflickr.com/9/8723/28309396545_349e5147bb_o.jpg,0.333333333333,0.0,1.0,1.0,896,785,https://www.flickr.com/photos/ronmacphotos/28309396545,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ a8dd9ba15f7b817b,https://c1.staticflickr.com/1/575/31572326940_d87b136e59_o.jpg,0.251849112426,0.25,0.755547337278,1.0,806,740,https://www.flickr.com/photos/prefeituradeolinda/31572326940,https://creativecommons.org/licenses/by/2.0/,Prefeitura de Olinda,https://www.flickr.com/people/prefeituradeolinda/ 5224fec9ba33b50d,https://c1.staticflickr.com/9/8081/29568549431_86f962156e_o.jpg,0.0,0.0,0.75,1.0,604,532,https://flickr.com/28834651@N07/29568549431,https://creativecommons.org/licenses/by/2.0/,Aul Rah,https://www.flickr.com/people/28834651@N07/ b3c384a2d1a391c0,https://c1.staticflickr.com/6/5543/30815777131_13d5e7667c_o.jpg,0.0,0.0,0.599757673667,0.75,631,456,https://www.flickr.com/photos/85546319@N04/30815777131,https://creativecommons.org/licenses/by/2.0/,Robert Sheie,https://www.flickr.com/people/85546319@N04/ 4a1a488e8a975f7c,https://c1.staticflickr.com/9/8420/29353940465_05ece9b92e_o.jpg,0.25,0.25,0.75,1.0,920,833,https://www.flickr.com/photos/harshlight/29353940465,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ d7c1d1632cf0acc7,https://c1.staticflickr.com/9/8653/28465398416_2c4202cb8d_o.jpg,0.25,0.0,0.75,0.75,404,873,https://www.flickr.com/photos/usnavy/28465398416,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ ca50e3535eb6396c,https://c1.staticflickr.com/6/5527/29526798504_12061e1707_o.jpg,0.0,0.0,0.5,0.75,556,929,https://flickr.com/137837832@N07/29526798504,https://creativecommons.org/licenses/by/2.0/,Mark Holloway,https://www.flickr.com/people/137837832@N07/ 30e132285c2e960f,https://c1.staticflickr.com/6/5663/30553419670_2249584a31_o.jpg,0.25,0.0,1.0,1.0,912,427,https://www.flickr.com/photos/jonathanrolande/30553419670,https://creativecommons.org/licenses/by/2.0/,Jonathan Rolande,https://www.flickr.com/people/jonathanrolande/ ea65c0ff71e7ceb3,https://c1.staticflickr.com/4/3953/33320124506_2fbd93baa7_o.jpg,0.333333333333,0.0,1.0,1.0,404,737,https://www.flickr.com/photos/usnavy/33320124506,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 200285e90078210b,https://c1.staticflickr.com/1/701/30876765453_574a6815b0_o.jpg,0.5,0.25,1.0,1.0,442,741,https://flickr.com/22539273@N00/30876765453,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ cec46dbd1fa3473a,https://c1.staticflickr.com/9/8320/29351169445_b0b0090587_o.jpg,0.455696202532,0.25,0.911392405063,1.0,898,246,https://www.flickr.com/photos/lge/29351169445,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 6314b953a2f66e36,https://c1.staticflickr.com/1/306/31686321825_ef08b80af5_o.jpg,0.281690140845,0.25,0.845070422535,1.0,311,774,https://www.flickr.com/photos/treegrow/31686321825,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 1f3f949ccbc81c93,https://c1.staticflickr.com/9/8643/28179475136_e6925b8a4b_o.jpg,0.0,0.25,1.0,1.0,304,666,https://flickr.com/27305106@N06/28179475136,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 04546cc5e537d7cd,https://c1.staticflickr.com/8/7347/27291550531_ee40bdf58a_o.jpg,0.0,0.0,0.495594713656,0.75,426,649,https://www.flickr.com/photos/kansasscanner/27291550531/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 73064ceb466612d5,https://c1.staticflickr.com/6/5777/30172206492_407d68dc21_o.jpg,0.53125,0.0,1.0,0.75,719,673,https://flickr.com/97760755@N08/30172206492,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/ ae78688b32986638,https://c1.staticflickr.com/9/8290/29399680281_1b2c136428_o.jpg,0.0,0.0,0.5,0.75,913,879,https://www.flickr.com/photos/ddebold/29399680281/,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ 72d85232abd98067,https://c1.staticflickr.com/8/7655/28880045512_841b0c2d3a_o.jpg,0.25,0.0,0.75,0.75,471,599,https://www.flickr.com/photos/quinet/28880045512,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 89d8361c6bfe905c,https://c1.staticflickr.com/8/7290/27369075485_5c164b1839_o.jpg,0.25,0.0,0.75,0.75,604,51,https://www.flickr.com/photos/quinet/27369075485,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 4ca02fd28a5e9703,https://c1.staticflickr.com/9/8453/29423857932_71a8a4a98f_o.jpg,0.25,0.302066450567,1.0,0.906199351702,996,239,https://www.flickr.com/photos/92252798@N07/29423857932,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/ 48762c2cd2ed47e1,https://c1.staticflickr.com/6/5546/30817355150_7f1f77f6e2_o.jpg,0.25,0.0,1.0,0.75,755,308,https://www.flickr.com/photos/hmk/30817355150,https://creativecommons.org/licenses/by/2.0/,H. Michael Karshis,https://www.flickr.com/people/hmk/ b217644382dcd864,https://c1.staticflickr.com/9/8082/29684292096_85e6a733cf_o.jpg,0.182707993475,0.0,1.0,1.0,512,708,https://www.flickr.com/photos/atoach/29684292096,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ c4824f023903731a,https://c1.staticflickr.com/8/7777/26400069864_79fd47a2fe_o.jpg,0.25,0.25,1.0,1.0,738,817,https://www.flickr.com/photos/betsyweber/26400069864,https://creativecommons.org/licenses/by/2.0/,Betsy Weber,https://www.flickr.com/people/betsyweber/ 629138193e021cdf,https://c1.staticflickr.com/9/8768/28328433276_2d2146df81_o.jpg,0.0,0.5,0.75,1.0,885,739,https://www.flickr.com/photos/glenbowman/28328433276,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 7d4186ce0332245d,https://c1.staticflickr.com/9/8578/28958405495_50b6230377_o.jpg,0.0,0.0,0.666666666667,1.0,976,936,https://www.flickr.com/photos/o_0/28958405495,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 90dfd75887f3e67b,https://c1.staticflickr.com/8/7683/26182602974_ddb15b42a7_o.jpg,0.0,0.25,1.0,1.0,986,45,https://www.flickr.com/photos/110035327@N08/26182602974,https://creativecommons.org/licenses/by/2.0/,Stefano Akram,https://www.flickr.com/people/110035327@N08/ ed56c7616a8ac010,https://c1.staticflickr.com/8/7479/27427361256_e341e77ffe_o.jpg,0.267938931298,0.0,0.803816793893,0.75,782,568,https://www.flickr.com/photos/aperturenut/27427361256,https://creativecommons.org/licenses/by/2.0/,Rick Briggs,https://www.flickr.com/people/aperturenut/ 5d6b9cadb6f9e1cd,https://c1.staticflickr.com/9/8790/28885989621_1e024392cc_o.jpg,0.0,0.0,0.5,0.75,896,746,https://www.flickr.com/photos/elsie/28885989621/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ a033832d9ff8913b,https://c1.staticflickr.com/1/545/32710656176_55231d6054_o.jpg,0.0,0.0,0.713414634146,1.0,101,357,https://www.flickr.com/photos/wildreturn/32710656176/,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ 313ff0037b86260a,https://c1.staticflickr.com/6/5812/30890228762_9ffa0a8fcb_o.jpg,0.0,0.2515625,1.0,1.0,498,610,https://www.flickr.com/photos/southbeachcars/30890228762/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ afe045d68f1a60d0,https://c1.staticflickr.com/6/5496/30030140344_d59046fc37_o.jpg,0.281690140845,0.0,0.845070422535,0.75,990,956,https://flickr.com/72054607@N00/30030140344,https://creativecommons.org/licenses/by/2.0/,Mark Jones,https://www.flickr.com/people/mekonsrevenge/ b19e2df06dbcccd9,https://c1.staticflickr.com/8/7511/27829151505_2172064741_o.jpg,0.421177266576,0.25,0.842354533153,1.0,673,816,https://www.flickr.com/photos/flickbergers/27829151505/,https://creativecommons.org/licenses/by/2.0/,Tim Berger,https://www.flickr.com/people/flickbergers/ 510e5062fef4a993,https://c1.staticflickr.com/6/5822/30267535413_2a7544b60d_o.jpg,0.0,0.0,0.599757673667,0.75,631,293,https://www.flickr.com/photos/85546319@N04/30267535413/,https://creativecommons.org/licenses/by/2.0/,Robert Sheie,https://www.flickr.com/people/85546319@N04/ 943274babd06a662,https://c1.staticflickr.com/1/327/32913036916_44339626f4_o.jpg,0.28125,0.0,0.84375,0.75,669,678,https://www.flickr.com/photos/davidstanleytravel/32913036916,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 0e83f990a04ed67d,https://c1.staticflickr.com/8/7788/28316840171_4f69657675_o.jpg,0.0,0.0,0.642547033285,1.0,822,52,https://www.flickr.com/photos/newsoresund/28316840171,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/ 607702d7ef44d081,https://c1.staticflickr.com/9/8233/29529503870_9d1063daa4_o.jpg,0.28125,0.0,0.84375,0.75,865,347,https://www.flickr.com/photos/zombieite/29529503870,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ e9811aebe8bed6e5,https://c1.staticflickr.com/9/8738/27986089450_329b7a8ebc_o.jpg,0.4375,0.0,1.0,0.75,336,410,https://www.flickr.com/photos/peter-trimming/27986089450,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/ 380053c506e32105,https://c1.staticflickr.com/8/7396/27441608895_889e301b2b_o.jpg,0.0,0.25,0.5625,1.0,780,514,https://www.flickr.com/photos/thoseguys119/27441608895,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 668bc83a884d24f9,https://c1.staticflickr.com/6/5448/30684271290_40fd020a51_o.jpg,0.0,0.0,0.728813559322,1.0,3,391,https://flickr.com/64084569@N02/30684271290,https://creativecommons.org/licenses/by/2.0/,Singa Hitam,https://www.flickr.com/people/64084569@N02/ be9a3bea2989a0b4,https://c1.staticflickr.com/6/5724/30572182090_20ab46d2fb_o.jpg,0.25,0.0,0.75,0.75,718,677,https://www.flickr.com/photos/42220226@N07/30572182090,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ b74c05ecff5f99d8,https://c1.staticflickr.com/9/8403/29162412302_d1940244a9_o.jpg,0.0,0.0,0.75,0.565438871473,407,568,https://www.flickr.com/photos/eltb/29162412302,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 7a51c260ca0e83e7,https://c1.staticflickr.com/4/3912/33185518846_5c9ca0ff3a_o.jpg,0.4375,0.0,1.0,0.75,548,748,https://www.flickr.com/photos/belurashok/33185518846/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ e89d48768917f563,https://c1.staticflickr.com/9/8043/29272187281_a1bf8985b6_o.jpg,0.43779342723,0.0,1.0,0.75,459,308,https://www.flickr.com/photos/rheba/29272187281/,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/ 080bec22a6b1d37d,https://c1.staticflickr.com/8/7787/27498389575_2f7553fca7_o.jpg,0.322236180905,0.0,0.966708542714,0.75,760,818,https://www.flickr.com/photos/51764518@N02/27498389575,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ e37b556e8889d2ec,https://c1.staticflickr.com/6/5679/30117494085_f273295290_o.jpg,0.301659125189,0.0,1.0,1.0,752,618,https://www.flickr.com/photos/karen_roe/30117494085,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ 67dd47336dc89421,https://c1.staticflickr.com/8/7566/26809054634_395b8c8989_o.jpg,0.0,0.0,0.5,0.75,818,949,https://www.flickr.com/photos/curtsm/26809054634/,https://creativecommons.org/licenses/by/2.0/,Curt Smith,https://www.flickr.com/people/curtsm/ 25f85aadcf248cc1,https://c1.staticflickr.com/6/5503/30178488442_471bae40e3_o.jpg,0.25,0.0,0.75,0.75,854,890,https://www.flickr.com/photos/tanaka_juuyoh/30178488442,https://creativecommons.org/licenses/by/2.0/,TANAKA Juuyoh (\347\224\260\344\270\255\345\215\201\346\264\213),https://www.flickr.com/people/tanaka_juuyoh/ c3e9a84e039df3ce,https://c1.staticflickr.com/9/8538/29956439481_7289ba54cc_o.jpg,0.25,0.0,1.0,1.0,469,765,https://www.flickr.com/photos/27665395@N05/29956439481,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 0134ba03294509a1,https://c1.staticflickr.com/9/8489/29195271540_316f8c5315_o.jpg,0.25,0.0,0.75,0.75,982,355,https://www.flickr.com/photos/mindahaas/29195271540/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ 53fe22426ff21243,https://c1.staticflickr.com/1/626/31511641894_19a2e1d2aa_o.jpg,0.496696035242,0.0,0.993392070485,0.75,536,779,https://www.flickr.com/photos/glorycycles/31511641894,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 4053a6a3d0e63c01,https://c1.staticflickr.com/1/561/32656096985_6601815751_o.jpg,0.0,0.0,0.5625,0.75,392,460,https://www.flickr.com/photos/kjfnjy/32656096985/,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/ 3ece3c1f94e4141a,https://c1.staticflickr.com/1/484/31819662813_17ab59d903_o.jpg,0.42234548336,0.25,1.0,1.0,332,15,https://www.flickr.com/photos/usfwsmtnprairie/31819662813,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 7d253f78ef6f029a,https://c1.staticflickr.com/6/5488/29967850914_d7e94fa9f2_o.jpg,0.0,0.0,1.0,1.0,683,92,https://flickr.com/23562593@N07/29967850914,https://creativecommons.org/licenses/by/2.0/,Benjamin Wunn,https://www.flickr.com/people/derzw3rg/ fecd59b8de8ae6f7,https://c1.staticflickr.com/1/475/31566723602_ced86113ef_o.jpg,0.25,0.25,0.75,1.0,820,793,https://www.flickr.com/photos/stevendepolo/31566723602/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 24159caf9c5e92be,https://c1.staticflickr.com/1/471/30661449994_6c0d5f9050_o.jpg,0.5,0.0,1.0,0.75,708,743,https://www.flickr.com/photos/146625745@N08/30661449994,https://creativecommons.org/licenses/by/2.0/,home thods,https://www.flickr.com/people/146625745@N08/ 44982b98ba192bb7,https://c1.staticflickr.com/9/8301/28642395174_40ebd0c8df_o.jpg,0.25,0.0,0.75,0.75,322,411,https://www.flickr.com/photos/wm_archiv/28642395174/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 7ca714cdcd5d36d9,https://c1.staticflickr.com/8/7400/27242157102_b9cb18ffa1_o.jpg,0.0,0.0,0.5625,0.75,780,106,https://www.flickr.com/photos/thoseguys119/27242157102,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ cbaff3255afbe83f,https://c1.staticflickr.com/9/8118/29896215326_352a9625cf_o.jpg,0.0,0.25,0.670648464164,1.0,561,853,https://www.flickr.com/photos/dirkhansen/29896215326,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/ fafbad0b3093a886,https://c1.staticflickr.com/9/8699/27967786060_8e927f96b6_o.jpg,0.287776898734,0.25,0.863330696203,1.0,672,315,https://www.flickr.com/photos/glorycycles/27967786060,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 45315ea51da415ab,https://c1.staticflickr.com/9/8855/27598466234_c924d2bdfc_o.jpg,0.25,0.25,0.75,1.0,356,189,https://www.flickr.com/photos/o_0/27598466234,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 1e4bb9fd37654da6,https://c1.staticflickr.com/9/8270/29189744532_98cb04acea_o.jpg,0.25,0.25,1.0,0.75,820,538,https://www.flickr.com/photos/tim_uk/29189744532,https://creativecommons.org/licenses/by/2.0/,Tim Sheerman-Chase,https://www.flickr.com/people/tim_uk/ 5f3ea3c6b683fb57,https://c1.staticflickr.com/1/780/32585346961_4f8e8d97e3_o.jpg,0.5,0.0,1.0,0.75,773,62,https://flickr.com/28752865@N08/32585346961,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ ccbcaf10176e78e0,https://c1.staticflickr.com/9/8397/27954967983_925cdd6886_o.jpg,0.0,0.0,0.5,0.75,923,858,https://www.flickr.com/photos/alan-light/27954967983,https://creativecommons.org/licenses/by/2.0/,Alan Light,https://www.flickr.com/people/alan-light/ 8d17aa69b4fd7b45,https://c1.staticflickr.com/6/5664/29822954894_e605bf0229_o.jpg,0.0,0.0,0.666666666667,1.0,407,590,https://www.flickr.com/photos/quinet/29822954894,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ c25da85d5d62b000,https://c1.staticflickr.com/8/7322/27388042450_19773a1bc9_o.jpg,0.0,0.25,0.5,1.0,404,219,https://www.flickr.com/photos/usnavy/27388042450,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ beb3e55c385feb12,https://c1.staticflickr.com/9/8817/28251101564_5f9eb85574_o.jpg,0.17748447205,0.25,0.532453416149,1.0,815,881,https://www.flickr.com/photos/watts_photos/28251101564,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ ed3573d0c197fbaf,https://c1.staticflickr.com/9/8337/28698753904_d31322462d_o.jpg,0.498159057437,0.25,0.996318114875,1.0,848,190,https://www.flickr.com/photos/exercitobrasileiro/28698753904,https://creativecommons.org/licenses/by/2.0/,Ex\303\251rcito Brasileiro,https://www.flickr.com/people/exercitobrasileiro/ 95d1a6be6786190f,https://c1.staticflickr.com/6/5580/31026020991_dbbbedc4f6_o.jpg,0.5,0.25,1.0,1.0,891,983,https://www.flickr.com/photos/swisstchoukball/31026020991/,https://creativecommons.org/licenses/by/2.0/,Swiss Tchoukball,https://www.flickr.com/people/swisstchoukball/ c8abefc975e94b10,https://c1.staticflickr.com/8/7451/27275536125_1b48f36807_o.jpg,0.0,0.0,0.56338028169,0.75,875,675,https://www.flickr.com/photos/southbeachcars/27275536125,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ be97d1e63c32043e,https://c1.staticflickr.com/9/8268/29636815873_a756a0aaec_o.jpg,0.0,0.25,0.670648464164,1.0,95,230,https://www.flickr.com/photos/sucriertt/29636815873/,https://creativecommons.org/licenses/by/2.0/,Feroze Omardeen,https://www.flickr.com/people/sucriertt/ df2cd1b82d5dec14,https://c1.staticflickr.com/6/5499/31112840340_73557ca884_o.jpg,0.5,0.25,1.0,1.0,519,414,https://www.flickr.com/photos/box_repsol/31112840340,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 024f73e53c3c1f1d,https://c1.staticflickr.com/8/7784/27062661262_9732ff0e24_o.jpg,0.333333333333,0.0,1.0,1.0,580,638,https://www.flickr.com/photos/dalbera/27062661262,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ e957c417fcd20c5b,https://c1.staticflickr.com/6/5728/31046143176_16800f95c8_o.jpg,0.199868073879,0.25,0.599604221636,1.0,820,791,https://www.flickr.com/photos/usembassyta/31046143176/,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/ 795f5aef9bef8134,https://c1.staticflickr.com/8/7246/27059914000_5331c7a27c_o.jpg,0.231382978723,0.25,0.69414893617,1.0,826,29,https://www.flickr.com/photos/sanp/27059914000,https://creativecommons.org/licenses/by/2.0/,San P,https://www.flickr.com/people/sanp/ 422d08407aeed1be,https://c1.staticflickr.com/9/8891/28070937640_a79a8cbfa5_o.jpg,0.4375,0.0,1.0,0.75,114,44,https://www.flickr.com/photos/yutakaseki/28070937640,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ 69a39406cb1d2ce5,https://c1.staticflickr.com/8/7179/27561675775_4977abbb7b_o.jpg,0.0,0.25,0.75,1.0,476,46,https://www.flickr.com/photos/44156646@N06/27561675775,https://creativecommons.org/licenses/by/2.0/,Frederick Lang Jr.,https://www.flickr.com/people/44156646@N06/ 564de663adeb8cd5,https://c1.staticflickr.com/8/7207/27043384543_1ee00dc2e1_o.jpg,0.494868035191,0.0,0.989736070381,0.75,558,133,https://www.flickr.com/photos/governortomwolf/27043384543,https://creativecommons.org/licenses/by/2.0/,Governor Tom Wolf,https://www.flickr.com/people/governortomwolf/ 04c1bde5affb7b5b,https://c1.staticflickr.com/1/473/31566239624_128d26f762_o.jpg,0.285496183206,0.0,1.0,1.0,653,680,https://www.flickr.com/photos/rdecom/31566239624,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/ 90f5385a77a49f77,https://c1.staticflickr.com/8/7393/26525400000_f5d0ae4309_o.jpg,0.248713235294,0.25,0.746139705882,1.0,704,905,https://www.flickr.com/photos/panr/26525400000,https://creativecommons.org/licenses/by/2.0/,Robert Cutts,https://www.flickr.com/people/panr/ 604b54a3b7424d9b,https://c1.staticflickr.com/9/8358/29207069984_4f7b859b65_o.jpg,0.0,0.25,0.501846381093,1.0,939,430,https://flickr.com/25797459@N06/29207069984,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/ a6535c039bfeba2c,https://c1.staticflickr.com/1/737/32082026800_fdf44c3c27_o.jpg,0.0,0.0,0.561328125,0.75,536,292,https://www.flickr.com/photos/glorycycles/32082026800,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 35d67f3f70aeef92,https://c1.staticflickr.com/8/7324/28047778902_e23628dc50_o.jpg,0.25,0.25,0.75,1.0,980,582,https://www.flickr.com/photos/coreyheitzmd/28047778902,https://creativecommons.org/licenses/by/2.0/,CHeitz,https://www.flickr.com/people/coreyheitzmd/ 3efa3df701898afd,https://c1.staticflickr.com/9/8783/28492814412_129982444e_o.jpg,0.0,0.0,0.905498281787,1.0,737,1000,https://www.flickr.com/photos/stevendepolo/28492814412,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ f08f34c258228251,https://c1.staticflickr.com/9/8256/28174054160_790b304fc4_o.jpg,0.28125,0.25,0.84375,1.0,699,608,https://www.flickr.com/photos/rubenholthuijsen/28174054160/,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen,https://www.flickr.com/people/rubenholthuijsen/ d47c9aabecda0e12,https://c1.staticflickr.com/8/7441/27270121096_cc1007eb2f_o.jpg,0.5,0.0,1.0,0.75,986,199,https://www.flickr.com/photos/56218409@N03/27270121096,https://creativecommons.org/licenses/by/2.0/,Matthias Ripp,https://www.flickr.com/people/56218409@N03/ d97c1f3f1c211d1a,https://c1.staticflickr.com/9/8448/28945025323_6e7cdf207a_o.jpg,0.0,0.0,0.75,0.75,979,467,https://www.flickr.com/photos/edans/28945025323,https://creativecommons.org/licenses/by/2.0/,Enrique Dans,https://www.flickr.com/people/edans/ 62949c357e429690,https://c1.staticflickr.com/1/764/31219968184_cf7294c955_o.jpg,0.25,0.25,0.75,1.0,973,116,https://www.flickr.com/photos/jlascar/31219968184,https://creativecommons.org/licenses/by/2.0/,Jorge L\303\241scar,https://www.flickr.com/people/jlascar/ 9311a098cfb4b946,https://c1.staticflickr.com/8/7373/26786081873_73a09aab2f_o.jpg,0.25,0.25,0.75,1.0,821,192,https://www.flickr.com/photos/ben_salter/26786081873/,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 38d8d105d5e70c80,https://c1.staticflickr.com/8/7457/27675995271_5b6dc8a928_o.jpg,0.0,0.0,1.0,1.0,422,755,https://www.flickr.com/photos/arbron/27675995271,https://creativecommons.org/licenses/by/2.0/,Jeff Hitchcock,https://www.flickr.com/people/arbron/ a28beac14b9037da,https://c1.staticflickr.com/8/7408/26281652233_6667df70cb_o.jpg,0.333333333333,0.0,1.0,1.0,405,351,https://www.flickr.com/photos/km30192002/26281652233/,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/ fa3aae44c2675e88,https://c1.staticflickr.com/9/8776/28284921904_800c76d8ac_o.jpg,0.496696035242,0.0,0.993392070485,0.75,771,375,https://www.flickr.com/photos/spera-designerschuhe/28284921904,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ 44aa69f642b86628,https://c1.staticflickr.com/8/7413/27678489230_1d967f5b58_o.jpg,0.0,0.0,0.634532374101,1.0,880,549,https://www.flickr.com/photos/45909111@N00/27678489230,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams,https://www.flickr.com/people/45909111@N00/ 6cc289dc7a8fce86,https://c1.staticflickr.com/9/8671/28656397400_d4db68df02_o.jpg,0.501840942563,0.25,1.0,1.0,158,1000,https://www.flickr.com/photos/naql/28656397400,https://creativecommons.org/licenses/by/2.0/,naql,https://www.flickr.com/people/naql/ a92babc0a6436d3b,https://c1.staticflickr.com/8/7582/28982049520_eddc2d650d_o.jpg,0.0,0.25,0.5,1.0,760,655,https://www.flickr.com/photos/ulift/28982049520/in/album-72157672059230641/,https://creativecommons.org/licenses/by/2.0/,WEi WEi,https://www.flickr.com/people/ulift/ 9fbeb797de1e1639,https://c1.staticflickr.com/9/8083/29921495296_991d4559c0_o.jpg,0.42174796748,0.0,0.843495934959,0.75,763,511,https://www.flickr.com/photos/vuhung/29921495296,https://creativecommons.org/licenses/by/2.0/,Nguyen Hung Vu,https://www.flickr.com/people/vuhung/ 16179baa1513c701,https://c1.staticflickr.com/1/722/32761564425_d122c3838d_o.jpg,0.0,0.0,0.75,1.0,95,505,https://flickr.com/95098864@N08/32761564425,https://creativecommons.org/licenses/by/2.0/,S. Rohrlach,https://www.flickr.com/people/95098864@N08/ 5a8d5bc9bf40e832,https://c1.staticflickr.com/6/5692/30199498082_eba90ef2e1_o.jpg,0.0,0.0,0.666666666667,1.0,519,634,https://www.flickr.com/photos/box_repsol/30199498082,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ aa4e1cf9cb6e7801,https://c1.staticflickr.com/9/8183/29036345831_4da7d925c9_o.jpg,0.151376146789,0.25,0.454128440367,1.0,896,840,https://www.flickr.com/photos/ronmacphotos/29036345831/,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 200735f93ea764f2,https://c1.staticflickr.com/8/7582/29431396080_570340a5ef_o.jpg,0.310344827586,0.0,0.931034482759,0.75,309,285,https://www.flickr.com/photos/gails_pictures/29431396080,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 5d53f9bc389e98ad,https://c1.staticflickr.com/1/722/30784991794_6af0ab8176_o.jpg,0.25,0.25,0.75,1.0,265,468,https://www.flickr.com/photos/unirodlibrary/30784991794/,https://creativecommons.org/licenses/by/2.0/,Rod Library,https://www.flickr.com/people/unirodlibrary/ 5b974695c09ad165,https://c1.staticflickr.com/9/8453/29350958465_8426fed375_o.jpg,0.25,0.484655688623,1.0,1.0,991,393,https://www.flickr.com/photos/clairity/29350958465/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ becf3b004177ded6,https://c1.staticflickr.com/8/7565/28346247573_c430ef5720_o.jpg,0.193181818182,0.0,1.0,1.0,986,457,https://www.flickr.com/photos/34905030@N00/28346247573/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ 4f04ca75d7aafc0a,https://c1.staticflickr.com/8/7126/27594041042_ef94e651db_o.jpg,0.25,0.249631811487,1.0,0.748895434462,840,633,https://www.flickr.com/photos/girlguidesofcan/27594041042/,https://creativecommons.org/licenses/by/2.0/,Girl Guides of Canada,https://www.flickr.com/people/girlguidesofcan/ 8764eecf6e898c7f,https://c1.staticflickr.com/8/7393/27564047580_b1667768cf_o.jpg,0.337738619677,0.0,1.0,1.0,484,711,https://www.flickr.com/photos/sybarite48/27564047580,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ c5f5e09f4f5fd41a,https://c1.staticflickr.com/9/8134/28977820041_e39c5c15c4_o.jpg,0.559602649007,0.25,0.83940397351,1.0,404,421,https://flickr.com/7489441@N06/28977820041,https://creativecommons.org/licenses/by/2.0/,Clemens Vasters,https://www.flickr.com/people/clemensv/ 17f3b8a057bc01be,https://c1.staticflickr.com/8/7537/28104131410_e13ab8f9ef_o.jpg,0.0,0.0,1.0,1.0,859,575,https://www.flickr.com/photos/v1ctor/28104131410,https://creativecommons.org/licenses/by/2.0/,Victor,https://www.flickr.com/people/v1ctor/ c10f6e0689efbc1c,https://c1.staticflickr.com/1/258/32241427822_ac7330299e_o.jpg,0.278188180404,0.25,0.834564541213,1.0,888,297,https://www.flickr.com/photos/guldem/32241427822,https://creativecommons.org/licenses/by/2.0/,G\303\274ldem \303\234st\303\274n,https://www.flickr.com/people/guldem/ 0e9bdc3ab80b1a71,https://c1.staticflickr.com/8/7415/27313160706_a2440a83b0_o.jpg,0.5,0.0,1.0,0.75,367,335,https://www.flickr.com/photos/ross_elliott/27313160706,https://creativecommons.org/licenses/by/2.0/,Ross Elliott,https://www.flickr.com/people/ross_elliott/ c17d39b1eba4cc03,https://c1.staticflickr.com/8/7468/27818709730_d10459c415_o.jpg,0.0,0.5,0.75,1.0,669,732,https://www.flickr.com/photos/jdlasica/27818709730,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ ec346009f286ffca,https://c1.staticflickr.com/1/571/30740221514_3c4fa602a0_o.jpg,0.0,0.0,0.5,0.75,120,783,https://www.flickr.com/photos/conchur/30740221514/,https://creativecommons.org/licenses/by/2.0/,Conor Lawless,https://www.flickr.com/people/conchur/ 01fa4be27dd11b5d,https://c1.staticflickr.com/1/268/31600495093_a46c0835d2_o.jpg,0.4375,0.0,1.0,0.75,451,829,https://www.flickr.com/photos/ufv/31600495093/,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ 490df9e021386d29,https://c1.staticflickr.com/6/5800/30150475824_b342db70fa_o.jpg,0.150773195876,0.0,0.452319587629,0.75,405,351,https://flickr.com/37804979@N00/30150475824,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 08fbf75e60a6efb7,https://c1.staticflickr.com/9/8270/29799045164_ab072918cb_o.jpg,0.0,0.0,0.662261380323,1.0,484,666,https://www.flickr.com/photos/sybarite48/29799045164,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ fc583c08026e3d74,https://c1.staticflickr.com/6/5595/30252932446_a7c00f3a97_o.jpg,0.333333333333,0.0,1.0,1.0,881,588,https://www.flickr.com/photos/mobikefed/30252932446,https://creativecommons.org/licenses/by/2.0/,MoBikeFed,https://www.flickr.com/people/mobikefed/ db6c6671a6924eba,https://c1.staticflickr.com/9/8269/30416458805_dc9a3ef437_o.jpg,0.25,0.0,1.0,0.591346153846,407,412,https://www.flickr.com/photos/eltb/30416458805,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 5a6439b10c1f6761,https://c1.staticflickr.com/6/5703/29661528724_1ccb11fae8_o.jpg,0.0,0.25,0.561328125,1.0,320,871,https://flickr.com/86548370@N00/29661528724,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 218e02b6cfa0466e,https://c1.staticflickr.com/1/702/32609631415_d7bf443a2c_o.jpg,0.5,0.25,1.0,1.0,699,217,https://www.flickr.com/photos/renaissancechambara/32609631415/,https://creativecommons.org/licenses/by/2.0/,Ged Carroll,https://www.flickr.com/people/renaissancechambara/ 3f8bf287f20333eb,https://c1.staticflickr.com/9/8895/29333257946_c53911b432_o.jpg,0.0,0.0,0.5,0.75,973,713,https://www.flickr.com/photos/aschaf/29333257946/,https://creativecommons.org/licenses/by/2.0/,Andrea Schaffer,https://www.flickr.com/people/aschaf/ be5543dc68f0b970,https://c1.staticflickr.com/6/5835/30148396554_e2ec6fbf0d_o.jpg,0.441600678733,0.0,0.736001131222,0.75,780,636,https://www.flickr.com/photos/thoseguys119/30148396554,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 87fcc5f70673d3d2,https://c1.staticflickr.com/8/7455/27040942130_44a032d0fd_o.jpg,0.421177266576,0.0,0.842354533153,0.75,699,159,https://www.flickr.com/photos/nat507/27040942130,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/ 99f175132cd1c6e2,https://c1.staticflickr.com/8/7045/27716560671_79806e498e_o.jpg,0.25,0.0,1.0,0.75,934,459,https://www.flickr.com/photos/danielchownet/27716560671,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/ a4f718e554dd18dd,https://c1.staticflickr.com/6/5445/29774026800_5e37689427_o.jpg,0.5,0.25,1.0,1.0,976,95,https://www.flickr.com/photos/wm_archiv/29774026800,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 46a489dcff5471a4,https://c1.staticflickr.com/3/2634/32267074504_a395babafd_o.jpg,0.0,0.0,0.75,0.75,920,590,https://www.flickr.com/photos/83015819@N00/32267074504/,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/ 38c6124f40b8d845,https://c1.staticflickr.com/8/7589/27543292150_7375ef6b66_o.jpg,0.249631811487,0.0,0.748895434462,0.75,896,19,https://www.flickr.com/photos/ministreiodadefesa/27543292150/,https://creativecommons.org/licenses/by/2.0/,Minist\303\251rio da Defesa,https://www.flickr.com/people/ministreiodadefesa/ 6740e1e89b5bbab4,https://c1.staticflickr.com/1/439/32456945576_0d93348b0e_o.jpg,0.25,0.25,0.75,1.0,981,685,https://www.flickr.com/photos/30478819@N08/32456945576,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 54ff02d9dfbf8540,https://c1.staticflickr.com/6/5703/30663546512_038de017f8_o.jpg,0.249079528719,0.0,0.747238586156,0.75,884,370,https://www.flickr.com/photos/reliv/30663546512/,https://creativecommons.org/licenses/by/2.0/,Reliv International,https://www.flickr.com/people/reliv/ 2c9398f44d099e0f,https://c1.staticflickr.com/3/2051/32840993165_29d0cb8a1e_o.jpg,0.0,0.0,1.0,0.75,522,482,http://www.flickr.com/photos/23119666@N03/32840993165/,https://creativecommons.org/licenses/by/2.0/,Mark Bonica,https://www.flickr.com/people/23119666@N03/ 6896a8b78f404dc8,https://c1.staticflickr.com/9/8358/29790317621_d6a35e5136_o.jpg,0.4375,0.25,1.0,1.0,980,75,https://www.flickr.com/photos/kameyama-mie/29790317621,https://creativecommons.org/licenses/by/2.0/,Kasadera,https://www.flickr.com/people/kameyama-mie/ d2d6ae6e0b8a0c31,https://c1.staticflickr.com/6/5600/30243986500_e184ef72fb_o.jpg,0.0,0.0,0.5,0.75,986,601,https://www.flickr.com/photos/blumenbiene/30243986500,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ fccfc3563cd562e1,https://c1.staticflickr.com/9/8645/27729536774_b56a633841_o.jpg,0.25,0.25,0.75,1.0,977,656,https://flickr.com/111347625@N06/27729536774,https://creativecommons.org/licenses/by/2.0/,Heribert Bechen ... bin dann mal weg!,https://www.flickr.com/people/hb1248/ d3a88c50958b1b5f,https://c1.staticflickr.com/9/8746/27853631254_508e610bc1_o.jpg,0.0,0.25,0.5,1.0,977,1000,https://www.flickr.com/photos/celteverett/27853631254,https://creativecommons.org/licenses/by/2.0/,Gregorio Puga Bail\303\263n,https://www.flickr.com/people/celteverett/ 513b3032ed1f388c,https://c1.staticflickr.com/8/7514/27572579621_930aecf52c_o.jpg,0.28125,0.25,0.84375,1.0,114,542,https://www.flickr.com/photos/viewpix69/27572579621/,https://creativecommons.org/licenses/by/2.0/,Torsten Scholz,https://www.flickr.com/people/viewpix69/ 6217866896fbe2b7,https://c1.staticflickr.com/6/5719/30923267621_c221b094fe_o.jpg,0.0,0.0,0.5,0.75,699,867,https://www.flickr.com/photos/mondo79/30923267621/,https://creativecommons.org/licenses/by/2.0/,Mondo79,https://www.flickr.com/people/mondo79/ 21554e755b9706d2,https://c1.staticflickr.com/1/641/32391235981_071803d033_o.jpg,0.0,0.0,0.75,0.529210925645,342,76,https://www.flickr.com/photos/ilri/32391235981,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/ 87a2147620d5e1cb,https://c1.staticflickr.com/6/5603/30536597041_14c0e333ab_o.jpg,0.4375,0.0,1.0,0.75,780,290,https://www.flickr.com/photos/thoseguys119/30536597041/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ b86d604067f50613,https://c1.staticflickr.com/6/5791/30885593836_dda0ff2d59_o.jpg,0.0,0.24882629108,1.0,1.0,490,998,https://www.flickr.com/photos/southbeachcars/30885593836/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ af3736cca01a2d28,https://c1.staticflickr.com/1/636/32603914891_d687da69f1_o.jpg,0.25,0.0,1.0,0.75,318,766,https://www.flickr.com/photos/treegrow/32603914891/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 5adb3d985cf217a9,https://c1.staticflickr.com/3/2183/32995484255_f1c2125a38_o.jpg,0.0,0.25,0.421177266576,1.0,405,875,https://www.flickr.com/photos/n-bphotography/32995484255/,https://creativecommons.org/licenses/by/2.0/,Nicky Boogaard,https://www.flickr.com/people/n-bphotography/ 60566d5680497389,https://c1.staticflickr.com/8/7117/27308045115_c9860d768d_o.jpg,0.5,0.0,1.0,0.75,473,544,https://www.flickr.com/photos/vastateparksstaff/27308045115,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 1cfa5381359bff9f,https://c1.staticflickr.com/6/5669/30198502892_8d507f5277_o.jpg,0.337738619677,0.0,1.0,1.0,422,852,https://www.flickr.com/photos/parktatar/30198502892,https://creativecommons.org/licenses/by/2.0/,\320\237\320\260\321\200\320\272\320\270 \320\242\320\260\321\202\320\260\321\200\321\201\321\202\320\260\320\275\320\260,https://www.flickr.com/people/parktatar/ cd40b0e46c9da574,https://c1.staticflickr.com/8/7705/27405552721_fa059a91db_o.jpg,0.0,0.25,0.75,1.0,662,739,https://www.flickr.com/photos/29233640@N07/27405552721,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ e9ecdf28dc1d5a85,https://c1.staticflickr.com/8/7293/27771548652_1bbed73d9a_o.jpg,0.25,0.25,1.0,0.75,609,192,https://www.flickr.com/photos/66755335@N05/27771548652,https://creativecommons.org/licenses/by/2.0/,Geneva Vanderzeil apairandasparediy.com,https://www.flickr.com/people/66755335@N05/ 821aae58dc96b4b2,https://c1.staticflickr.com/8/7668/26973339655_c7771d9f37_o.jpg,0.44769874477,0.25,0.89539748954,1.0,341,575,http://www.flickr.com/photos/125382597@N08/26973339655/,https://creativecommons.org/licenses/by/2.0/,Roger Hsu,https://www.flickr.com/people/125382597@N08/ 715335d5ddfca1f2,https://c1.staticflickr.com/6/5443/30684352681_e443895cc6_o.jpg,0.0,0.25,0.497426470588,1.0,481,915,https://www.flickr.com/photos/agenciasenado/30684352681,https://creativecommons.org/licenses/by/2.0/,Senado Federal,https://www.flickr.com/people/agenciasenado/ 1be47d60e0156bbb,https://c1.staticflickr.com/6/5828/29885217483_5d5c3b4561_o.jpg,0.25,0.0,1.0,1.0,650,912,https://flickr.com/8558643@N06/29885217483,https://creativecommons.org/licenses/by/2.0/,Christophe Delaere,https://www.flickr.com/people/delaere/ 8724748782cb6c31,https://c1.staticflickr.com/1/505/31480812833_d9a37e0bee_o.jpg,0.0,0.0,0.944554455446,1.0,76,647,https://flickr.com/55893585@N08/31480812833,https://creativecommons.org/licenses/by/2.0/,BLM Nevada,https://www.flickr.com/people/blmnevada/ 2ba52bcf59097dc8,https://c1.staticflickr.com/9/8703/29072678195_c8c916e504_o.jpg,0.0,0.0,0.56338028169,0.75,971,850,https://www.flickr.com/photos/blackwing_de/29072678195,https://creativecommons.org/licenses/by/2.0/,Sebastian Werner,https://www.flickr.com/people/blackwing_de/ 2ed718f6db9785f8,https://c1.staticflickr.com/9/8109/29184695352_02765c0138_o.jpg,0.25,0.0,0.75,0.75,519,843,https://www.flickr.com/photos/box_repsol/29184695352,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 4a251fb6d80b5137,https://c1.staticflickr.com/8/7735/27313853085_2df82462d3_o.jpg,0.439547581903,0.0,1.0,0.75,800,82,https://flickr.com/21461098@N00/27313853085,https://creativecommons.org/licenses/by/2.0/,Owen Allen,https://www.flickr.com/people/owen59/ 3617bfc5d06bc196,https://c1.staticflickr.com/6/5608/29603872360_115b742b20_o.jpg,0.210588633288,0.25,0.631765899865,1.0,885,554,https://www.flickr.com/photos/ankurp/29603872360,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ 143c74a57326fd40,https://c1.staticflickr.com/1/362/31438358143_d5b15f28de_o.jpg,0.333333333333,0.0,1.0,1.0,422,423,https://www.flickr.com/photos/robin-schmitt/31438358143/,https://creativecommons.org/licenses/by/2.0/,Siris,https://www.flickr.com/people/robin-schmitt/ d051e0bd46125123,https://c1.staticflickr.com/6/5748/31131978085_c9153efb9d_o.jpg,0.4375,0.25,1.0,1.0,669,776,https://www.flickr.com/photos/96223380@N02/31131978085,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ 84af93c72781b7f0,https://c1.staticflickr.com/2/1616/26473779220_95c074ef92_o.jpg,0.0,0.443623639191,0.75,1.0,438,782,https://www.flickr.com/photos/kansallisarkisto/26473779220,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/ a52570066ecc61fd,https://c1.staticflickr.com/1/660/31595952701_5eab9952f3_o.jpg,0.0,0.0,0.75,1.0,976,583,https://www.flickr.com/photos/elzey/31595952701,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/ 3e8bf1eee7083f6e,https://c1.staticflickr.com/6/5325/30267534593_e497c0a76a_o.jpg,0.0,0.0,0.599757673667,0.75,631,683,https://www.flickr.com/photos/85546319@N04/30267534593,https://creativecommons.org/licenses/by/2.0/,Robert Sheie,https://www.flickr.com/people/85546319@N04/ f6d5c95ce7908a58,https://c1.staticflickr.com/9/8103/29317853454_b2dec062c2_o.jpg,0.493768328446,0.0,0.987536656891,0.75,561,872,https://www.flickr.com/photos/codnewsroom/29317853454,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ bfb2aaf48d7fc08c,https://c1.staticflickr.com/6/5347/30848584970_9d7dd68247_o.jpg,0.0,0.25,0.5,1.0,979,953,https://www.flickr.com/photos/deaconmacmillan/30848584970/,https://creativecommons.org/licenses/by/2.0/,Deacon MacMillan,https://www.flickr.com/people/deaconmacmillan/ 5528f7330399485f,https://c1.staticflickr.com/6/5821/30665663016_f164e1bbae_o.jpg,0.24882629108,0.0,1.0,1.0,74,212,http://www.flickr.com/photos/cbroders/30665663016/,https://creativecommons.org/licenses/by/2.0/,Counse,https://www.flickr.com/people/cbroders/ 635ea505879178ed,https://c1.staticflickr.com/6/5787/29740591494_abecb27341_o.jpg,0.0,0.354136429608,1.0,1.0,539,923,https://www.flickr.com/photos/22711505@N05/29740591494,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ a8631b077e74f7aa,https://c1.staticflickr.com/9/8521/28560392972_e2f7a70fbd_o.jpg,0.0,0.4375,0.75,1.0,480,486,https://www.flickr.com/photos/jonnymooshoo/28560392972/,https://creativecommons.org/licenses/by/2.0/,Jonathan Leung,https://www.flickr.com/people/jonnymooshoo/ bb03be3702584eeb,https://c1.staticflickr.com/9/8825/28189849211_8747a0ee87_o.jpg,0.0,0.0,0.854757929883,1.0,672,624,https://www.flickr.com/photos/glorycycles/28189849211,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 8090736c8299ab28,https://c1.staticflickr.com/8/7301/27600935412_70c27a16d2_o.jpg,0.25,0.4375,1.0,1.0,980,894,https://www.flickr.com/photos/kitkaphotogirl/27600935412/,https://creativecommons.org/licenses/by/2.0/,Christine Majul,https://www.flickr.com/people/kitkaphotogirl/ 74b13710bcf4f7f3,https://c1.staticflickr.com/8/7271/27059072776_6f5d6d0919_o.jpg,0.503303964758,0.0,1.0,0.75,775,918,https://www.flickr.com/photos/spera-designerschuhe/27059072776,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ ecd3a969dd466349,https://c1.staticflickr.com/8/7423/28019501745_3975453d32_o.jpg,0.25,0.25,1.0,1.0,285,693,https://www.flickr.com/photos/editor/28019501745,https://creativecommons.org/licenses/by/2.0/,Bart Everson,https://www.flickr.com/people/editor/ 2abcab3d77d4767e,https://c1.staticflickr.com/6/5673/30925169246_bcb5ac8949_o.jpg,0.0,0.24882629108,1.0,1.0,443,520,https://www.flickr.com/photos/eltb/30925169246,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 8c975de17f3247d1,https://c1.staticflickr.com/1/712/32281377125_d669c5337a_o.jpg,0.28125,0.0,0.84375,0.75,650,526,https://www.flickr.com/photos/stonehenge-stone-circle/32281377125/,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/ 8d86fae18afef4e0,https://c1.staticflickr.com/6/5834/29905668306_e17a9b35ed_o.jpg,0.238170347003,0.0,1.0,1.0,38,79,https://www.flickr.com/photos/2ndpeter/29905668306,https://creativecommons.org/licenses/by/2.0/,Peter Paplanus,https://www.flickr.com/people/2ndpeter/ 619a9d0eb2acdd82,https://c1.staticflickr.com/9/8079/28742831150_8cd69d4202_o.jpg,0.0,0.0,0.666666666667,1.0,885,843,https://www.flickr.com/photos/zigazou76/28742831150/,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 9ab953cce5c7f879,https://c1.staticflickr.com/3/2872/33227757875_2a76bc808e_o.jpg,0.333333333333,0.0,1.0,1.0,443,367,https://www.flickr.com/photos/dany13/33227757875/,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/ 1c2e9fe8b0b2fdf2,https://c1.staticflickr.com/8/7633/27140101841_c1f8aa3b4d_o.jpg,0.0,0.0,0.666666666667,1.0,58,905,https://www.flickr.com/photos/gregthebusker/27140101841,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/ a414ccf5c51454e0,https://c1.staticflickr.com/8/7609/27446813796_e349a63c2f_o.jpg,0.0,0.0,0.665684830633,1.0,830,866,https://www.flickr.com/photos/fotosagenciabrasil/27446813796,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/ 26aa2e6ee43387e7,https://c1.staticflickr.com/1/378/31616355823_06b59a862a_o.jpg,0.25,0.0,1.0,0.75,913,741,https://www.flickr.com/photos/12463666@N03/31616355823/,https://creativecommons.org/licenses/by/2.0/,Bob M ~,https://www.flickr.com/people/12463666@N03/ 3302a8c24caf20f4,https://c1.staticflickr.com/8/7553/27852122740_a93432645b_o.jpg,0.0,0.0,0.666666666667,1.0,704,548,https://flickr.com/53301297@N00/27852122740,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ dd722682a9f2b9dd,https://c1.staticflickr.com/6/5773/29781416180_6cd73114d5_o.jpg,0.0,0.0,0.5,0.75,437,458,https://www.flickr.com/photos/greggjerdingen/29781416180,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 6afe58efa85756dc,https://c1.staticflickr.com/8/7406/27477875915_19bb21bd54_o.jpg,0.0,0.333333333333,1.0,1.0,929,849,https://www.flickr.com/photos/insatiablemunchies/27477875915,https://creativecommons.org/licenses/by/2.0/,insatiablemunch,https://www.flickr.com/people/insatiablemunchies/ 0ceee9a38409e30c,https://c1.staticflickr.com/1/412/31684872936_8e1df2a992_o.jpg,0.4375,0.0,1.0,0.75,484,712,https://www.flickr.com/photos/16801915@N06/31684872936/,https://creativecommons.org/licenses/by/2.0/,Reading Tom,https://www.flickr.com/people/16801915@N06/ 1df5e1adad21d618,https://c1.staticflickr.com/1/532/32376482310_86efb9eec4_o.jpg,0.25,0.0,0.75,0.75,405,556,https://www.flickr.com/photos/thejointstaff/32376482310,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ 57e62606f02d0251,https://c1.staticflickr.com/8/7307/27798850402_87d7558850_o.jpg,0.496696035242,0.0,0.993392070485,0.75,548,646,https://www.flickr.com/photos/shankaronline/27798850402,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ d0fe8afb55c3c7cd,https://c1.staticflickr.com/9/8107/28396972686_381dae0505_o.jpg,0.0,0.0,1.0,0.75,498,778,https://www.flickr.com/photos/duncanh1/28396972686,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 91d18b353d5b3be2,https://c1.staticflickr.com/4/3935/33250842731_598bbc7d1e_o.jpg,0.0,0.0,0.75,0.75,931,26,https://www.flickr.com/photos/dylan20/33250842731,https://creativecommons.org/licenses/by/2.0/,Dylan Tweney,https://www.flickr.com/people/dylan20/ 21b0803c965f76ef,https://c1.staticflickr.com/6/5667/31229598566_3fca43f16f_o.jpg,0.0,0.25,0.403311258278,1.0,920,977,https://www.flickr.com/photos/crackdog/31229598566,https://creativecommons.org/licenses/by/2.0/,William Creswell,https://www.flickr.com/people/crackdog/ f20783fc38473514,https://c1.staticflickr.com/9/8550/28448778474_c095f2264b_o.jpg,0.248713235294,0.25,0.746139705882,1.0,386,774,https://www.flickr.com/photos/shankaronline/28448778474,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 3d6e530955c60759,https://c1.staticflickr.com/8/7293/26333233883_fb2b616f95_o.jpg,0.0,0.0,0.57765451664,0.75,512,892,https://www.flickr.com/photos/hugo90/26333233883,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 7e5c847bafc4d50c,https://c1.staticflickr.com/6/5557/30353091180_fe0a06de72_o.jpg,0.55183312263,0.25,0.919721871049,1.0,909,529,https://www.flickr.com/photos/flyingsinger/30353091180,https://creativecommons.org/licenses/by/2.0/,Bruce Irving,https://www.flickr.com/people/flyingsinger/ 0aebe24fc257286e,https://c1.staticflickr.com/8/7343/27235728323_4d87753e80_o.jpg,0.0,0.25,0.535877862595,1.0,561,315,https://www.flickr.com/photos/143049688@N08/27235728323,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ 3c970c84b598f2d9,https://c1.staticflickr.com/6/5693/25380221549_fd25f3d570_o.jpg,0.223849372385,0.0,0.671548117155,0.75,780,597,https://www.flickr.com/photos/thoseguys119/25380221549,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c6166621198a3de4,https://c1.staticflickr.com/6/5563/31119538711_0c79469ee9_o.jpg,0.0,0.161983471074,1.0,1.0,986,747,https://www.flickr.com/photos/mauroguanandi/31119538711/,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/ 134bfd93a04b88b2,https://c1.staticflickr.com/8/7284/28111216916_c5cd478e8a_o.jpg,0.333333333333,0.0,1.0,1.0,581,962,https://www.flickr.com/photos/yourmildura/28111216916,https://creativecommons.org/licenses/by/2.0/,Your Mildura,https://www.flickr.com/people/yourmildura/ 4227a6e105cc0588,https://c1.staticflickr.com/6/5659/30998499956_ec5656fd7f_o.jpg,0.46499339498,0.0,1.0,1.0,971,141,https://www.flickr.com/photos/apardavila/30998499956,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 405dd60729a8c18d,https://c1.staticflickr.com/6/5604/31248667090_381a827f4b_o.jpg,0.0,0.0,0.5625,0.75,848,496,http://www.flickr.com/photos/mohit_s/31248667090/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ 0d29832e5da60f5f,https://c1.staticflickr.com/9/8160/29190648723_bcf0356317_o.jpg,0.25,0.0,1.0,1.0,973,181,https://www.flickr.com/photos/jsjgeology/29190648723,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 90ab38bb74020d5a,https://c1.staticflickr.com/9/8072/28451660015_5953f09d2a_o.jpg,0.5,0.0,1.0,0.75,647,141,https://www.flickr.com/photos/tipsfortravellers/28451660015,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 068c5d66662a837a,https://c1.staticflickr.com/8/7330/26495171353_a3fff0f136_o.jpg,0.0,0.25,0.57345971564,1.0,964,773,https://www.flickr.com/photos/lafoodie/26495171353,https://creativecommons.org/licenses/by/2.0/,L.A. Foodie,https://www.flickr.com/people/lafoodie/ e5f15610a22098bb,https://c1.staticflickr.com/9/8407/29490211104_10c2f48229_o.jpg,0.303658536585,0.25,0.910975609756,1.0,672,575,https://www.flickr.com/photos/ophilos/29490211104,https://creativecommons.org/licenses/by/2.0/,Christos Loufopoulos,https://www.flickr.com/people/ophilos/ 4cd90a6459ce9571,https://c1.staticflickr.com/8/7513/29088533881_89782643f3_o.jpg,0.234308131241,0.0,0.702924393723,0.75,719,622,https://www.flickr.com/photos/tdlucas5000/29088533881,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ 4a0bac33f8e81e60,https://c1.staticflickr.com/9/8551/29475088050_cbbd9ea8a2_o.jpg,0.0,0.0,0.669128508124,1.0,407,857,https://www.flickr.com/photos/eltb/29475088050,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ cc283b8f7f46fbf0,https://c1.staticflickr.com/9/8026/29591945975_73a66c762b_o.jpg,0.4375,0.0,1.0,0.75,574,962,https://www.flickr.com/photos/mauroguanandi/29591945975,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/ 70b9b8ae11327472,https://c1.staticflickr.com/9/8138/30013050040_04d3fdd00b_o.jpg,0.0,0.0,1.0,1.0,11,983,https://www.flickr.com/photos/46183897@N00/30013050040,https://creativecommons.org/licenses/by/2.0/,Robert Nunnally,https://www.flickr.com/people/46183897@N00/ 5dd8e133e66ecd3a,https://c1.staticflickr.com/1/477/32384785852_132146bba9_o.jpg,0.0,0.0,0.643394648829,0.75,142,346,https://flickr.com/11076453@N00/32384785852,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/ 4dc360d125c9238c,https://c1.staticflickr.com/8/7516/26892006331_d8fff23f32_o.jpg,0.25,0.0,0.75,0.75,527,840,https://www.flickr.com/photos/johovac/26892006331,https://creativecommons.org/licenses/by/2.0/,Ed S. Johovac,https://www.flickr.com/people/johovac/ 8805b0b20d808c49,https://c1.staticflickr.com/8/7728/27175361700_dd1959dd51_o.jpg,0.5,0.25,1.0,1.0,704,927,https://www.flickr.com/photos/faceme/27175361700,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ 15d27dbdc9eeda7f,https://c1.staticflickr.com/1/704/32389054391_5ac6fee7e7_o.jpg,0.0,0.0,0.671597633136,1.0,469,765,https://www.flickr.com/photos/54144402@N03/32389054391,https://creativecommons.org/licenses/by/2.0/,Bob Dass,https://www.flickr.com/people/54144402@N03/ 448a738f6dcba07e,https://c1.staticflickr.com/8/7755/28840807203_405a538ce8_o.jpg,0.0,0.25,0.5,1.0,563,416,https://www.flickr.com/photos/harshlight/28840807203/,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ e5948d6294eb8ca3,https://c1.staticflickr.com/6/5480/31214754031_7eae5eeede_o.jpg,0.0,0.0,0.5625,0.75,887,676,https://www.flickr.com/photos/davidstanleytravel/31214754031,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/download_images.py ================================================ """Script which downloads dataset images. Usage: python download_images.py --input_file=INPUT_FILE --output_dir=IMAGES_DIR where: INPUT_FILE is input csv file with dataset description, i.e. dev_dataset.csv IMAGES_DIR is output directory where all images should be downloaded Example: # create directory for images mkdir images # download images declared in dev_dataset.csv python download_images.py --input_file=dev_dataset.csv --output_dir=images Dependencies: Python 2.7 or higher. Pillow library: https://python-pillow.org/ """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import csv import os import sys from functools import partial from io import BytesIO import multiprocessing from multiprocessing.dummy import Pool as ThreadPool from PIL import Image try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen def parse_args(): """Parses command line arguments.""" parser = argparse.ArgumentParser(description="Tool to download dataset images.") parser.add_argument("--input_file", required=True, help="Location of dataset.csv") parser.add_argument( "--output_dir", required=True, help="Output path to download images" ) parser.add_argument( "--threads", default=multiprocessing.cpu_count() + 1, help="Number of threads to use", ) args = parser.parse_args() return args.input_file, args.output_dir, int(args.threads) def get_image(row, output_dir): """Downloads the image that corresponds to the given row. Prints a notification if the download fails.""" if not download_image( image_id=row[0], url=row[1], x1=float(row[2]), y1=float(row[3]), x2=float(row[4]), y2=float(row[5]), output_dir=output_dir, ): print("Download failed: " + str(row[0])) def download_image(image_id, url, x1, y1, x2, y2, output_dir): """Downloads one image, crops it, resizes it and saves it locally.""" output_filename = os.path.join(output_dir, image_id + ".png") if os.path.exists(output_filename): # Don't download image if it's already there return True try: # Download image url_file = urlopen(url) if url_file.getcode() != 200: return False image_buffer = url_file.read() # Crop, resize and save image image = Image.open(BytesIO(image_buffer)).convert("RGB") w = image.size[0] h = image.size[1] image = image.crop((int(x1 * w), int(y1 * h), int(x2 * w), int(y2 * h))) image = image.resize((299, 299), resample=Image.ANTIALIAS) image.save(output_filename) except IOError: return False return True def main(): input_filename, output_dir, n_threads = parse_args() if not os.path.isdir(output_dir): print("Output directory {} does not exist".format(output_dir)) sys.exit() with open(input_filename) as input_file: reader = csv.reader(input_file) header_row = next(reader) rows = list(reader) try: row_idx_image_id = header_row.index("ImageId") row_idx_url = header_row.index("URL") row_idx_x1 = header_row.index("x1") row_idx_y1 = header_row.index("y1") row_idx_x2 = header_row.index("x2") row_idx_y2 = header_row.index("y2") except ValueError as e: print("One of the columns was not found in the source file: ", e.message) rows = [ ( row[row_idx_image_id], row[row_idx_url], float(row[row_idx_x1]), float(row[row_idx_y1]), float(row[row_idx_x2]), float(row[row_idx_y2]), ) for row in rows ] if n_threads > 1: pool = ThreadPool(n_threads) partial_get_images = partial(get_image, output_dir=output_dir) for i, _ in enumerate(pool.imap_unordered(partial_get_images, rows), 1): sys.stderr.write("\rDownloaded {0} images".format(i + 1)) pool.close() pool.join() else: failed_to_download = set() for idx in range(len(rows)): row = rows[idx] if not download_image( image_id=row[0], url=row[1], x1=float(row[2]), y1=float(row[3]), x2=float(row[4]), y2=float(row[5]), output_dir=output_dir, ): failed_to_download.add(row[row_idx_image_id]) sys.stdout.write("\rDownloaded {0} images".format(idx + 1)) sys.stdout.flush() print() if failed_to_download: print("\nUnable to download images with the following IDs:") for image_id in failed_to_download: print(image_id) if __name__ == "__main__": main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/final_dataset.csv ================================================ ImageId,URL,x1,y1,x2,y2,TrueLabel,TargetClass,OriginalLandingURL,License,Author,AuthorProfileURL a848d5e9f44eb947,https://c1.staticflickr.com/8/7393/26895431856_1e2779dcb6_o.jpg,0.0,0.0,0.666666666667,1.0,769,794,https://www.flickr.com/photos/galwegians/26895431856/,https://creativecommons.org/licenses/by/2.0/,Galwegians Rugby,https://www.flickr.com/people/galwegians/ a0d9f2c1237155e1,https://c1.staticflickr.com/9/8789/28462362232_7fe7f753f8_o.jpg,0.28125,0.0,0.84375,0.75,518,513,https://www.flickr.com/photos/zongo/28462362232,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 07c4a323c7cd3b0d,https://c1.staticflickr.com/1/757/31973894410_64df44bc7a_o.jpg,0.333333333333,0.0,1.0,1.0,93,246,https://www.flickr.com/photos/vilipix/31973894410,https://creativecommons.org/licenses/by/2.0/,Vilmos Vincze,https://www.flickr.com/people/vilipix/ 2663678749f79635,https://c1.staticflickr.com/8/7515/28259468696_3952fdd372_o.jpg,0.0,0.25,0.416890982503,1.0,564,489,https://www.flickr.com/photos/68704638@N04/28259468696,https://creativecommons.org/licenses/by/2.0/,M Dreibelbis,https://www.flickr.com/people/68704638@N04/ 123d524ff1fabfd8,https://c1.staticflickr.com/8/7441/28097827921_7ba6e2a576_o.jpg,0.234375,0.0,0.703125,0.75,629,601,https://www.flickr.com/photos/viaggioroutard/28097827921,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/ fc2af56905cb8b74,https://c1.staticflickr.com/9/8271/28727141352_9274e5c144_o.jpg,0.0,0.0,0.75,1.0,325,299,https://www.flickr.com/photos/9750464@N02/28727141352,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ c2b607459b431044,https://c1.staticflickr.com/9/8019/29072672630_bbb32eba44_o.jpg,0.0,0.25,0.707894736842,1.0,742,141,https://flickr.com/43714545@N06/29072672630,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/ 93de7000a54a15e2,https://c1.staticflickr.com/9/8015/29914571145_236c06152a_o.jpg,0.0,0.0,0.47170487106,0.75,426,495,https://www.flickr.com/photos/rpavich/29914571145,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ e0e32cf5266cd521,https://c1.staticflickr.com/9/8356/29816580985_e877cbb9b1_o.jpg,0.28125,0.0,0.84375,0.75,672,5,https://www.flickr.com/photos/egizu/29816580985,https://creativecommons.org/licenses/by/2.0/,EGIZU Getxo Euskaldun Elkartea,https://www.flickr.com/people/egizu/ 90f4d1356efe095e,https://c1.staticflickr.com/8/7094/27156072575_4389d3b607_o.jpg,0.0,0.0,0.334029227557,1.0,780,444,https://www.flickr.com/photos/thoseguys119/27156072575,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 26595af120cc7dbc,https://c1.staticflickr.com/9/8645/30041063386_707c5f6956_o.jpg,0.0,0.0,0.75,0.75,840,648,https://www.flickr.com/photos/ipdegirl/30041063386,https://creativecommons.org/licenses/by/2.0/,Jenni C,https://www.flickr.com/people/ipdegirl/ 8cb7ffee680f3df9,https://c1.staticflickr.com/8/7296/26774983631_c2ab16fd43_o.jpg,0.0,0.0,0.923611111111,1.0,141,254,https://www.flickr.com/photos/winnu/26774983631/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/ b0ad7e18aabb5953,https://c1.staticflickr.com/8/7620/27206468570_0ebd756de0_o.jpg,0.431506849315,0.0,0.86301369863,0.75,815,428,https://www.flickr.com/photos/specky4eyes/27206468570/,https://creativecommons.org/licenses/by/2.0/,Tim Dutton,https://www.flickr.com/people/specky4eyes/ ca899ebaaa192e76,https://c1.staticflickr.com/9/8624/27761792824_fe37c758b9_o.jpg,0.0,0.0,0.666666666667,1.0,512,154,https://www.flickr.com/photos/greggjerdingen/27761792824,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 2eb14089b9e0d19e,https://c1.staticflickr.com/1/687/32354291093_4a0db4e6c0_o.jpg,0.0,0.0,0.494868035191,0.75,697,656,https://www.flickr.com/photos/eaglebrook/32354291093/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ 820811a4723b68d3,https://c1.staticflickr.com/9/8867/28587711746_8845af4b5c_o.jpg,0.281690140845,0.25,0.845070422535,1.0,303,750,https://www.flickr.com/photos/treegrow/28587711746/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 028be4c50d6b98d1,https://c1.staticflickr.com/1/299/32620162301_fcaf7fc736_o.jpg,0.25,0.25,0.75,1.0,618,112,https://flickr.com/39272011@N07/32620162301,https://creativecommons.org/licenses/by/2.0/,Secretaria de Agricultura e Abastecimento,https://www.flickr.com/people/agriculturasp/ 447cd53555a4b040,https://c1.staticflickr.com/6/5718/30359674204_72ae426b93_o.jpg,0.25,0.25,0.75,1.0,672,834,https://www.flickr.com/photos/flowizm/30359674204,https://creativecommons.org/licenses/by/2.0/,Flowizm ...,https://www.flickr.com/people/flowizm/ 84709c76bf028cf0,https://c1.staticflickr.com/1/778/31860187474_91516869dd_o.jpg,0.0,0.25,0.739247311828,1.0,209,383,http://www.flickr.com/photos/ocalways/31860187474/,https://creativecommons.org/licenses/by/2.0/,Rain Love AMR,https://www.flickr.com/people/ocalways/ 606e87f1abb2a9dd,https://c1.staticflickr.com/6/5501/30152143390_4f4fa46688_o.jpg,0.0,0.0,0.75,0.75,763,523,https://www.flickr.com/photos/vermazeren/30152143390/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Arend,https://www.flickr.com/people/vermazeren/ ae16623b27665105,https://c1.staticflickr.com/1/476/32566869356_7b217c6d05_o.jpg,0.0,0.25,0.597580645161,1.0,302,508,https://www.flickr.com/photos/gails_pictures/32566869356,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ fe2e27a42f7ddd98,https://c1.staticflickr.com/8/7540/27451055534_f7a81bf51b_o.jpg,0.0,0.0,0.666666666667,1.0,980,265,https://www.flickr.com/photos/7840760@N05/27451055534/,https://creativecommons.org/licenses/by/2.0/,Chris Morriss,https://www.flickr.com/people/7840760@N05/ de0a2707f072777f,https://c1.staticflickr.com/6/5583/30534634774_31264a30bd_o.jpg,0.322436849926,0.0,1.0,1.0,854,525,https://www.flickr.com/photos/13476480@N07/30534634774,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 3209c617316fc78a,https://c1.staticflickr.com/8/7358/28142024586_e04bf4cb59_o.jpg,0.25,0.0,1.0,0.710456942004,672,716,https://www.flickr.com/photos/glorycycles/28142024586,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 16ba4a445ceb0583,https://c1.staticflickr.com/6/5819/30850943682_bb392d5fa6_o.jpg,0.25,0.25,0.75,1.0,986,651,https://www.flickr.com/photos/133415851@N08/30850943682/,https://creativecommons.org/licenses/by/2.0/,Federico Ettlin,https://www.flickr.com/people/ettlin/ 1f9cff65da1c0782,https://c1.staticflickr.com/8/7633/27892513360_9c36dfe2f4_o.jpg,0.0,0.0,1.0,0.662261380323,314,391,https://www.flickr.com/photos/sybarite48/27892513360,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 2e3f4eae14f1a3f6,https://c1.staticflickr.com/1/580/32072671795_ef6891214a_o.jpg,0.25,0.25,0.75,1.0,405,875,https://www.flickr.com/photos/janitors/32072671795,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ aa7d9739723a05d7,https://c1.staticflickr.com/9/8226/29505794630_61a1beca26_o.jpg,0.0,0.502573529412,0.75,1.0,885,133,https://www.flickr.com/photos/34517490@N00/29505794630/,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/ 63e73d5aacf1ba97,https://c1.staticflickr.com/1/666/31261546224_cb5a86c42e_o.jpg,0.254290171607,0.0,1.0,1.0,342,214,http://www.flickr.com/photos/tusnelda/31261546224/,https://creativecommons.org/licenses/by/2.0/,storebukkebruse,https://www.flickr.com/people/tusnelda/ c9b195587a56fe87,https://c1.staticflickr.com/9/8021/27763477813_59ef474d4c_o.jpg,0.0,0.0,0.654970760234,1.0,756,35,https://www.flickr.com/photos/benoit59/27763477813,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/ 5d4d94f48ccd34cd,https://c1.staticflickr.com/6/5042/29408632573_59573f25de_o.jpg,0.0,0.0,0.75,0.5625,441,849,https://www.flickr.com/photos/theuksampler/29408632573,https://creativecommons.org/licenses/by/2.0/,The Sampler,https://www.flickr.com/people/theuksampler/ 3cd91ad17344bb80,https://c1.staticflickr.com/9/8623/28127739832_7ee96f9702_o.jpg,0.5,0.0,1.0,0.75,914,954,https://flickr.com/20534939@N00/28127739832,https://creativecommons.org/licenses/by/2.0/,Michael Dunn,https://www.flickr.com/people/acidhelm/ 96aa4e82e48b9dbe,https://c1.staticflickr.com/6/5345/30839536762_5b7ae7cba0_o.jpg,0.259316770186,0.0,1.0,1.0,835,672,https://www.flickr.com/photos/senterpartiet/30839536762,https://creativecommons.org/licenses/by/2.0/,Senterpartiet (Sp),https://www.flickr.com/people/senterpartiet/ 64a91d1a6d101ccf,https://c1.staticflickr.com/6/5584/30396996684_8984c6a138_o.jpg,0.25,0.25,1.0,1.0,797,286,https://www.flickr.com/photos/sfslim/30396996684,https://creativecommons.org/licenses/by/2.0/,Aaron Muszalski,https://www.flickr.com/people/sfslim/ c5f061dcfb483a11,https://c1.staticflickr.com/8/7631/27625208962_2dc4446862_o.jpg,0.25,0.0,0.75,0.75,848,243,https://www.flickr.com/photos/janitors/27625208962,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 752b25b1ff2ff927,https://c1.staticflickr.com/9/8510/29366748925_48b877ce87_o.jpg,0.0,0.0,0.599757673667,0.75,821,626,https://www.flickr.com/photos/mlevisay/29366748925/,https://creativecommons.org/licenses/by/2.0/,Mark Levisay,https://www.flickr.com/people/mlevisay/ afab65c0134e89b7,https://c1.staticflickr.com/9/8253/28463005493_a1d813d3a8_o.jpg,0.0,0.25,1.0,1.0,986,229,https://www.flickr.com/photos/pussreboots/28463005493/,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/ 09eacfaa5fc9dfee,https://c1.staticflickr.com/1/31/31579543046_8ea0a42f93_o.jpg,0.5,0.0,1.0,0.75,981,596,https://www.flickr.com/photos/jseita/31579543046,https://creativecommons.org/licenses/by/2.0/,Jun Seita,https://www.flickr.com/people/jseita/ 23e57a37718d8c57,https://c1.staticflickr.com/8/7358/27239087290_5e99163ccb_o.jpg,0.4375,0.0,1.0,0.75,920,979,https://www.flickr.com/photos/cogdog/27239087290/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ a0a1afd68b1e5069,https://c1.staticflickr.com/9/8361/27843140003_75d87d3d7f_o.jpg,0.0,0.25,0.501846381093,1.0,979,634,https://www.flickr.com/photos/22711505@N05/27843140003,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 3fb246fdb7bd462f,https://c1.staticflickr.com/8/7357/27032652784_3cd2896842_o.jpg,0.0,0.0,1.0,0.992805755396,909,655,https://www.flickr.com/photos/96223380@N02/27032652784,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ 51cf3b149ea31a6d,https://c1.staticflickr.com/8/7436/27973290836_c8698fdd79_o.jpg,0.4375,0.0,1.0,0.75,583,517,https://www.flickr.com/photos/sharonhahndarlin/27973290836,https://creativecommons.org/licenses/by/2.0/,Sharon Hahn Darlin,https://www.flickr.com/people/sharonhahndarlin/ 22b784a48ff19810,https://c1.staticflickr.com/6/5346/30464903473_64504dc166_o.jpg,0.0,0.25,0.75,1.0,830,93,https://flickr.com/131918865@N03/30464903473,https://creativecommons.org/licenses/by/2.0/,Junts Tiana,https://www.flickr.com/people/juntstiana/ 8a66231bead19adb,https://c1.staticflickr.com/8/7318/27787115320_ab440763f7_o.jpg,0.28125,0.0,0.84375,0.75,133,486,https://www.flickr.com/photos/starr-environmental/27787115320,https://creativecommons.org/licenses/by/2.0/,Forest and Kim Starr,https://www.flickr.com/people/starr-environmental/ 2dfc9cb36e29ca3e,https://c1.staticflickr.com/6/5475/30827648471_23a1a2ab84_o.jpg,0.0,0.25,0.5,1.0,323,856,https://www.flickr.com/photos/futuredu/30827648471,https://creativecommons.org/licenses/by/2.0/,Marcin Polak,https://www.flickr.com/people/futuredu/ 29285c4a579d8c3c,https://c1.staticflickr.com/9/8251/29546986532_aa228f107f_o.jpg,0.0,0.0,0.7484375,1.0,418,48,https://www.flickr.com/photos/xingxiyang/29546986532/,https://creativecommons.org/licenses/by/2.0/,Kiefer,https://www.flickr.com/people/xingxiyang/ cc72394a7ba14370,https://c1.staticflickr.com/9/8435/28937998734_ae4de67018_o.jpg,0.0,0.0,0.69150779896,0.75,310,60,https://www.flickr.com/photos/gails_pictures/28937998734,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ d00961ae337d9e7c,https://c1.staticflickr.com/6/5144/29827652251_bd92970b02_o.jpg,0.25,0.0,1.0,1.0,669,586,https://www.flickr.com/photos/davidstanleytravel/29827652251,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 4bbe8753d01fd75c,https://c1.staticflickr.com/8/7405/27730742260_e9d785aa58_o.jpg,0.0,0.25,0.533917682927,1.0,473,707,https://www.flickr.com/photos/vastateparksstaff/27730742260/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 2297ec9e7f48a2c2,https://c1.staticflickr.com/6/5623/30344158972_e454e4bc90_o.jpg,0.0,0.0,0.51992481203,0.75,780,883,https://www.flickr.com/photos/thoseguys119/30344158972/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ db079b0e7c8aef32,https://c1.staticflickr.com/9/8351/28736007170_872899f67c_o.jpg,0.335787923417,0.0,1.0,1.0,407,642,https://www.flickr.com/photos/donaldjudge/28736007170/,https://creativecommons.org/licenses/by/2.0/,Donald Judge,https://www.flickr.com/people/donaldjudge/ f5e42d715d555958,https://c1.staticflickr.com/1/395/32045778191_0be236296f_o.jpg,0.25,0.0,1.0,0.423913043478,407,257,https://www.flickr.com/photos/eltb/32045778191,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 19323986b4466974,https://c1.staticflickr.com/6/5684/30663092081_33b866d374_o.jpg,0.25,0.441588785047,1.0,1.0,918,41,https://www.flickr.com/photos/norbet/30663092081,https://creativecommons.org/licenses/by/2.0/,norbet1,https://www.flickr.com/people/norbet/ c0a2c53a6cdd31cd,https://c1.staticflickr.com/1/712/31613349033_f6034e2212_o.jpg,0.0,0.0,0.895726495726,1.0,303,273,https://www.flickr.com/photos/gails_pictures/31613349033,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ a7f60594c1d64c66,https://c1.staticflickr.com/8/7330/27131566932_641e0e62cb_o.jpg,0.28125,0.0,0.84375,0.75,866,154,https://www.flickr.com/photos/moresheth/27131566932,https://creativecommons.org/licenses/by/2.0/,Moresheth,https://www.flickr.com/people/moresheth/ fa150ed0ad657e7d,https://c1.staticflickr.com/8/7318/28007131136_39a99af731_o.jpg,0.0,0.25,0.5,1.0,441,768,https://www.flickr.com/photos/praxinoscope/28007131136,https://creativecommons.org/licenses/by/2.0/,David Wagner,https://www.flickr.com/people/praxinoscope/ 1edabd3f528a988f,https://c1.staticflickr.com/8/7313/27365716724_b99c3b56f6_o.jpg,0.0,0.0,0.579761904762,0.75,88,298,https://www.flickr.com/photos/132033298@N04/27365716724,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/ acb0d1c3621f8800,https://c1.staticflickr.com/6/5527/30220699384_abaec38192_o.jpg,0.28125,0.25,0.84375,1.0,940,633,https://www.flickr.com/photos/notionscapital/30220699384,https://creativecommons.org/licenses/by/2.0/,Mike Licht,https://www.flickr.com/people/notionscapital/ bee8a6595e8e29c5,https://c1.staticflickr.com/9/8079/29633024285_ba72f57527_o.jpg,0.25,0.0,1.0,1.0,442,818,https://www.flickr.com/photos/adactio/29633024285,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/ 8a0b82bf3b1490c7,https://c1.staticflickr.com/9/8641/29953213872_24df27b7ca_o.jpg,0.5,0.25,1.0,1.0,976,756,https://www.flickr.com/photos/wm_archiv/29953213872,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 88b3f2bdd279e878,https://c1.staticflickr.com/8/7337/27559388332_13ac32635b_o.jpg,0.4375,0.0,1.0,0.75,309,337,https://www.flickr.com/photos/treegrow/27559388332,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 068ea8518ba9fba2,https://c1.staticflickr.com/8/7021/26217053044_5cf7d7d527_o.jpg,0.0,0.4375,0.75,1.0,539,452,https://www.flickr.com/photos/paytonc/26217053044,https://creativecommons.org/licenses/by/2.0/,Payton Chung,https://www.flickr.com/people/paytonc/ 48e691c7cc9bbabc,https://c1.staticflickr.com/8/7660/26829662442_f0f4dfe06f_o.jpg,0.354271356784,0.0,1.0,0.75,147,473,https://www.flickr.com/photos/forest-and-kim/26829662442,https://creativecommons.org/licenses/by/2.0/,Forest Starr and Kim Starr,https://www.flickr.com/people/forest-and-kim/ 1596fdc1ff65350a,https://c1.staticflickr.com/9/8447/28528442142_3103226194_o.jpg,0.4375,0.0,1.0,0.75,973,879,https://www.flickr.com/photos/amanderson/28528442142,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 868d2dec167026ed,https://c1.staticflickr.com/9/8404/29683573562_970683405c_o.jpg,0.25,0.25,0.75,1.0,909,1000,https://www.flickr.com/photos/fun_flying/29683573562,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/ d48647e2fc361015,https://c1.staticflickr.com/9/8673/30116376876_3457b300cb_o.jpg,0.499263622975,0.0,0.99852724595,0.75,733,493,https://www.flickr.com/photos/southbeachcars/30116376876,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 91dafb69f1245da0,https://c1.staticflickr.com/9/8793/28204602036_31f0efc233_o.jpg,0.0,0.0,0.666666666667,1.0,294,151,https://www.flickr.com/photos/flowcomm/28204602036,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ cb88c0821527cd6d,https://c1.staticflickr.com/8/7404/27558163526_26734d2360_o.jpg,0.0,0.25,0.75,1.0,484,841,https://www.flickr.com/photos/pocius/27558163526,https://creativecommons.org/licenses/by/2.0/,Bryan Pocius,https://www.flickr.com/people/pocius/ 00d7e503d491f54a,https://c1.staticflickr.com/8/7385/27276000761_f29f3a0fc9_o.jpg,0.327407407407,0.0,1.0,1.0,896,561,https://www.flickr.com/photos/8269539@N04/27276000761,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 9e30b2ec04142ebd,https://c1.staticflickr.com/6/5753/31032656762_f4578922c9_o.jpg,0.0,0.0,0.75,1.0,699,417,https://www.flickr.com/photos/gillyberlin/31032656762,https://creativecommons.org/licenses/by/2.0/,GillyBerlin,https://www.flickr.com/people/gillyberlin/ 9dcfedf3cc0862ab,https://c1.staticflickr.com/6/5701/29746322142_9a6c281ba1_o.jpg,0.0,0.0,0.75,1.0,442,391,https://www.flickr.com/photos/pekkatamminen/29746322142,https://creativecommons.org/licenses/by/2.0/,Pekka Tamminen,https://www.flickr.com/people/pekkatamminen/ be4bee6c43e54e47,https://c1.staticflickr.com/6/5466/30859392621_eb785ce742_o.jpg,0.0,0.25,0.501846381093,1.0,407,351,http://www.flickr.com/photos/43547009@N00/30859392621,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/ d4e3b08465971619,https://c1.staticflickr.com/8/7179/26681656780_1e0d19f348_o.jpg,0.438671875,0.0,1.0,0.75,985,235,https://www.flickr.com/photos/winnie_pix/26681656780,https://creativecommons.org/licenses/by/2.0/,Winniepix,https://www.flickr.com/people/winnie_pix/ bafa4667373a1286,https://c1.staticflickr.com/1/538/32078523355_776fc5de80_o.jpg,0.25,0.25,1.0,0.75,407,592,https://www.flickr.com/photos/turyddu/32078523355/,https://creativecommons.org/licenses/by/2.0/,Umberto Rotundo,https://www.flickr.com/people/turyddu/ b510ff28897c3100,https://c1.staticflickr.com/8/7561/28011585260_f72227da85_o.jpg,0.333333333333,0.0,1.0,1.0,570,891,https://flickr.com/53301297@N00/28011585260,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ b981d4224948b206,https://c1.staticflickr.com/9/8273/30254064241_f4b12aeb37_o.jpg,0.330396475771,0.0,0.991189427313,1.0,697,551,https://www.flickr.com/photos/futureshape/30254064241/,https://creativecommons.org/licenses/by/2.0/,Alexander Baxevanis,https://www.flickr.com/people/futureshape/ d20abcd49252d42b,https://c1.staticflickr.com/9/8411/29649239123_148f61352d_o.jpg,0.210588633288,0.0,0.631765899865,0.75,948,231,https://www.flickr.com/photos/sonnnateteria/29649239123,https://creativecommons.org/licenses/by/2.0/,teteria sonnna,https://www.flickr.com/people/sonnnateteria/ ad0270bbe6dafa40,https://c1.staticflickr.com/9/8430/29096467574_af6a21a60d_o.jpg,0.0,0.25,0.75,1.0,663,661,https://www.flickr.com/photos/sparkfun/29096467574,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/ 48a0ac67e7cfc0f9,https://c1.staticflickr.com/9/8256/29235027732_66af649b9c_o.jpg,0.28125,0.25,0.84375,1.0,478,912,https://flickr.com/85278812@N00/29235027732,https://creativecommons.org/licenses/by/2.0/,Robbie Sproule,https://www.flickr.com/people/robbie1/ 24d310963cfd1ff7,https://c1.staticflickr.com/9/8302/27819873934_187700d91b_o.jpg,0.0,0.0,0.75,0.75,771,581,https://www.flickr.com/photos/glorycycles/27819873934,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 3bf44aa16f15d0b0,https://c1.staticflickr.com/9/8513/29030464342_8828b02977_o.jpg,0.503303964758,0.0,1.0,0.75,822,894,https://www.flickr.com/photos/zengame/29030464342,https://creativecommons.org/licenses/by/2.0/,Zengame,https://www.flickr.com/people/zengame/ d676a27058888617,https://c1.staticflickr.com/9/8850/28426831252_5f02775aab_o.jpg,0.0,0.0,0.75,1.0,980,905,https://www.flickr.com/photos/132627961@N05/28426831252,https://creativecommons.org/licenses/by/2.0/,David Koranda,https://www.flickr.com/people/132627961@N05/ e19627a8178cf501,https://c1.staticflickr.com/8/7762/28506125400_90f142e9ef_o.jpg,0.464122137405,0.25,1.0,1.0,151,217,https://www.flickr.com/photos/ruthanddave/28506125400,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 4c873b6a36bdae54,https://c1.staticflickr.com/9/8610/28189876186_3b132ee134_o.jpg,0.511297376093,0.25,1.0,1.0,405,997,https://www.flickr.com/photos/8269539@N04/28189876186,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ b6a242ce42ccd13d,https://c1.staticflickr.com/9/8318/29563297280_6ea6ffce9e_o.jpg,0.332842415317,0.0,0.99852724595,1.0,566,725,https://www.flickr.com/photos/carlwwycoff/29563297280,https://creativecommons.org/licenses/by/2.0/,Carl Wycoff,https://www.flickr.com/people/carlwwycoff/ 03655c6556dbdb4e,https://c1.staticflickr.com/9/8411/29079617804_652e5d37cb_o.jpg,0.0,0.0,0.763406940063,1.0,971,134,https://www.flickr.com/photos/lassennps/29079617804/,https://creativecommons.org/licenses/by/2.0/,LassenNPS,https://www.flickr.com/people/lassennps/ 8dc5dfcb4cc64a6f,https://c1.staticflickr.com/6/5343/30882511132_af87b1237c_o.jpg,0.25,0.25,0.75,1.0,693,772,https://www.flickr.com/photos/30478819@N08/30882511132,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 8f9449e6d3f6a12a,https://c1.staticflickr.com/6/5829/30181872674_4bdb4bc25e_o.jpg,0.28125,0.25,0.84375,1.0,769,469,https://www.flickr.com/photos/stmunchins/30181872674,https://creativecommons.org/licenses/by/2.0/,St Munchin's College,https://www.flickr.com/people/stmunchins/ 30c833ae96a6997f,https://c1.staticflickr.com/1/321/31200560813_e1f17cf06d_o.jpg,0.333333333333,0.0,1.0,1.0,927,486,https://flickr.com/22539273@N00/31200560813,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ ae97448189bb089d,https://c1.staticflickr.com/8/7073/27230835866_5aa719c7e3_o.jpg,0.4375,0.0,1.0,0.75,968,898,https://www.flickr.com/photos/bloggers/27230835866,https://creativecommons.org/licenses/by/2.0/,Reynosa Blogs,https://www.flickr.com/people/bloggers/ 144304f20ba39d97,https://c1.staticflickr.com/6/5619/30846225612_64c015e272_o.jpg,0.28125,0.0,0.84375,0.75,577,509,https://www.flickr.com/photos/127226743@N02/30846225612,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 98ffec0ae4a6d215,https://c1.staticflickr.com/8/7356/27843169051_55fecd86d8_o.jpg,0.339207048458,0.0,1.0,1.0,437,216,https://www.flickr.com/photos/hugo90/27843169051,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 95e4af6b79bd74fc,https://c1.staticflickr.com/6/5615/30108004980_b2951526b8_o.jpg,0.267938931298,0.25,0.803816793893,1.0,971,166,https://www.flickr.com/photos/breveglieri/30108004980,https://creativecommons.org/licenses/by/2.0/,Alexandre Breveglieri,https://www.flickr.com/people/breveglieri/ 00d76e7ef19e08ad,https://c1.staticflickr.com/1/95/31463366221_b90feb65df_o.jpg,0.4375,0.25,1.0,1.0,821,236,https://www.flickr.com/photos/radarsmum67/31463366221/,https://creativecommons.org/licenses/by/2.0/,Radarsmum67,https://www.flickr.com/people/radarsmum67/ 6cce7cbac1683cf2,https://c1.staticflickr.com/9/8644/28776790660_3e811ed570_o.jpg,0.5,0.25,1.0,1.0,955,100,https://www.flickr.com/photos/scotnelson/28776790660,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 17f47a0e3bb96754,https://c1.staticflickr.com/9/8038/29105202850_287ce9570f_o.jpg,0.24882629108,0.0,1.0,1.0,771,598,https://www.flickr.com/photos/wastes/29105202850,https://creativecommons.org/licenses/by/2.0/,Charlotta Wasteson,https://www.flickr.com/people/wastes/ d02d0ae658a628e5,https://c1.staticflickr.com/6/5768/30441129921_5dcdaf7a6c_o.jpg,0.4375,0.0,1.0,0.75,449,775,https://www.flickr.com/photos/59252954@N00/30441129921,https://creativecommons.org/licenses/by/2.0/,leo gonzales,https://www.flickr.com/people/leoglenn_g/ edd4a965a698e866,https://c1.staticflickr.com/1/37/31389116192_4b946f1901_o.jpg,0.0,0.0,0.678571428571,1.0,354,659,https://www.flickr.com/photos/dkeats/31389116192/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 14bcfaf59509b017,https://c1.staticflickr.com/9/8439/29027344026_e43fba7f64_o.jpg,0.25,0.0,0.75,0.75,651,694,https://www.flickr.com/photos/jus10h/29027344026,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 0b13868a3095652f,https://c1.staticflickr.com/8/7778/29916689360_4ce0968e3c_o.jpg,0.0,0.0,1.0,0.75,498,795,http://www.flickr.com/photos/viewpix69/29916689360/,https://creativecommons.org/licenses/by/2.0/,Torsten Scholz,https://www.flickr.com/people/viewpix69/ 33feed2fc4ef971f,https://c1.staticflickr.com/9/8124/29135110804_65e75021d8_o.jpg,0.4375,0.0,1.0,0.75,818,874,https://flickr.com/78593866@N00/29135110804,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ 03d16338f7d34ad6,https://c1.staticflickr.com/2/1710/26141490864_6f6de79a7e_o.jpg,0.0,0.0,0.75,1.0,11,278,https://www.flickr.com/photos/9750464@N02/26141490864,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ 25cef9f76c73f942,https://c1.staticflickr.com/9/8652/28399171265_e8e9650c60_o.jpg,0.249631811487,0.0,0.748895434462,0.75,985,420,https://www.flickr.com/photos/agenciabrasilia/28399171265,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 9264d69f33365511,https://c1.staticflickr.com/8/7668/27023854630_eb60c6362e_o.jpg,0.333333333333,0.0,1.0,1.0,785,900,https://www.flickr.com/photos/cogdog/27023854630,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 017907ab47d2a23b,https://c1.staticflickr.com/9/8676/30554124925_82699306c4_o.jpg,0.4375,0.0,1.0,0.75,835,457,https://www.flickr.com/photos/irekia/30554124925/,https://creativecommons.org/licenses/by/2.0/,Irekia,https://www.flickr.com/people/irekia/ 34a55472d3a3848e,https://c1.staticflickr.com/6/5557/31657826385_4703106576_o.jpg,0.0,0.0,0.5625,0.75,459,643,https://flickr.com/44048553@N03/31657826385,https://creativecommons.org/licenses/by/2.0/,Nacho,https://www.flickr.com/people/gonmi/ 7b066132a678899e,https://c1.staticflickr.com/9/8750/28855883982_ac616a3afe_o.jpg,0.0,0.25,0.5625,1.0,909,10,https://www.flickr.com/photos/wwworks/28855883982,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ 9968d57cfb97183c,https://c1.staticflickr.com/6/5096/29527046893_02ab7d9e36_o.jpg,0.290633608815,0.0,0.871900826446,1.0,484,726,https://www.flickr.com/photos/sybarite48/29527046893/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 3f1b9bd1f998078c,https://c1.staticflickr.com/8/7110/28237263546_b6ed8481ec_o.jpg,0.5,0.25,1.0,1.0,581,127,https://www.flickr.com/photos/unb_agencia/28237263546,https://creativecommons.org/licenses/by/2.0/,Secom UnB,https://www.flickr.com/people/unb_agencia/ bb6eae644b610271,https://c1.staticflickr.com/9/8770/28772005082_8df660284b_o.jpg,0.333333333333,0.0,1.0,1.0,922,927,https://www.flickr.com/photos/andyhay/28772005082,https://creativecommons.org/licenses/by/2.0/,Andy Hay,https://www.flickr.com/people/andyhay/ e61c5de4b79cdd43,https://c1.staticflickr.com/4/3838/32772787800_f01219c220_o.jpg,0.0,0.190243902439,1.0,1.0,826,292,https://flickr.com/37922399@N05/32772787800,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ eb0272648289a1bb,https://c1.staticflickr.com/9/8456/29843300475_049df0d839_o.jpg,0.28125,0.0,0.84375,0.75,625,840,http://www.flickr.com/photos/publiclibrariesnsw/29843300475/,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/ f8f8ac0b8c70545c,https://c1.staticflickr.com/8/7316/26245312523_d7bccfc875_o.jpg,0.25,0.0,1.0,0.75,108,84,https://www.flickr.com/photos/togawanderings/26245312523,https://creativecommons.org/licenses/by/2.0/,Thomas Galvez,https://www.flickr.com/people/togawanderings/ a99f4f1a627add6c,https://c1.staticflickr.com/6/5493/31201584201_c3434dc10c_o.jpg,0.418124006359,0.25,1.0,1.0,309,157,https://www.flickr.com/photos/gails_pictures/31201584201/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 7590e4076ffd211d,https://c1.staticflickr.com/8/7443/27081730733_3d6b808038_o.jpg,0.25,0.0,0.75,0.75,733,526,https://www.flickr.com/photos/yutakaseki/27081730733/,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ 8d7763df68b4fce0,https://c1.staticflickr.com/4/3950/33195104895_cc8726992f_o.jpg,0.0,0.0,0.714503816794,1.0,683,456,https://www.flickr.com/photos/atoach/33195104895,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 021ff13fe44a0165,https://c1.staticflickr.com/9/8230/29208542631_f92d781b82_o.jpg,0.561781609195,0.0,0.936302681992,0.75,719,656,https://www.flickr.com/photos/davideastwell/29208542631/,https://creativecommons.org/licenses/by/2.0/,David Eastwell,https://www.flickr.com/people/davideastwell/ 2dd6c2c48dae1970,https://c1.staticflickr.com/9/8721/27901022944_0228c5126a_o.jpg,0.25,0.0,0.75,0.75,548,425,https://www.flickr.com/photos/126337928@N05/27901022944,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ ab5b0947144beb3e,https://c1.staticflickr.com/9/8814/28267120572_7b41d647f1_o.jpg,0.519869942197,0.0,1.0,0.75,683,460,https://www.flickr.com/photos/13476480@N07/28267120572,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ db61cf12b9c0da9b,https://c1.staticflickr.com/8/7716/26274696824_48ea930581_o.jpg,0.498159057437,0.25,0.996318114875,1.0,321,563,https://www.flickr.com/photos/ilouque/26274696824,https://creativecommons.org/licenses/by/2.0/,ilouque,https://www.flickr.com/people/ilouque/ 49891ab8d826b5e2,https://c1.staticflickr.com/9/8379/29397027366_8d5b965a65_o.jpg,0.0,0.0,0.561328125,0.75,780,919,https://www.flickr.com/photos/thoseguys119/29397027366,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 34a74efa49795808,https://c1.staticflickr.com/9/8680/27753912104_53c03eaf9c_o.jpg,0.28125,0.25,0.84375,1.0,459,348,https://flickr.com/24701549@N07/27753912104,https://creativecommons.org/licenses/by/2.0/,Spudgun67,https://www.flickr.com/people/24701549@N07/ ff83ee5de635fda6,https://c1.staticflickr.com/1/418/31553043064_69329766a9_o.jpg,0.0,0.0,0.5625,0.75,822,417,https://www.flickr.com/photos/davidstanleytravel/31553043064,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ f3cc2fc0b4d59d0b,https://c1.staticflickr.com/8/7437/26933428346_1db8cdf627_o.jpg,0.0,0.0,0.5,0.75,752,637,https://flickr.com/142967625@N05/26933428346,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/ 6f927c97e925114c,https://c1.staticflickr.com/6/5743/30695984876_7954b22e18_o.jpg,0.260918674699,0.25,0.782756024096,1.0,404,767,https://www.flickr.com/photos/usnavy/30695984876,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 14f62659ed234e96,https://c1.staticflickr.com/8/7329/26671886473_e9f9d9a9fa_o.jpg,0.4375,0.25,1.0,1.0,780,130,https://www.flickr.com/photos/thoseguys119/26671886473,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 600321f77c0d6499,https://c1.staticflickr.com/8/7419/27026335933_9113f3b770_o.jpg,0.0,0.25,0.5,1.0,913,307,https://www.flickr.com/photos/davebloggs007/27026335933,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ e4c0df449d63eab4,https://c1.staticflickr.com/6/5834/29906759733_ec6cc2093f_o.jpg,0.0,0.0,0.5,0.75,608,753,https://www.flickr.com/photos/148525563@N02/29906759733/,https://creativecommons.org/licenses/by/2.0/,Paintimpact,https://www.flickr.com/people/148525563@N02/ 2a4185153f0f76fc,https://c1.staticflickr.com/9/8036/28980116746_1c3b6b320e_o.jpg,0.0,0.0,0.666666666667,1.0,662,118,https://www.flickr.com/photos/greggjerdingen/28980116746,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ fc5d1d8333f43c3d,https://c1.staticflickr.com/6/5574/30692208712_8db581a9fb_o.jpg,0.333333333333,0.0,1.0,1.0,629,828,https://www.flickr.com/photos/prayitnophotography/30692208712,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 6ebbac35bc7977ac,https://c1.staticflickr.com/8/7622/27416626222_ffdf90d22a_o.jpg,0.28125,0.0,0.84375,0.75,947,1,https://www.flickr.com/photos/cogdog/27416626222,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ ec28d2d65b5004cf,https://c1.staticflickr.com/1/498/32099970701_132b9382b2_o.jpg,0.331706281834,0.25,0.995118845501,1.0,851,265,https://www.flickr.com/photos/thepeachpeddler/32099970701,https://creativecommons.org/licenses/by/2.0/,thepeachpeddler,https://www.flickr.com/people/thepeachpeddler/ 4e87821bcecd7f66,https://c1.staticflickr.com/8/7329/26840543325_d36e6e71b7_o.jpg,0.421177266576,0.25,0.842354533153,1.0,986,587,https://www.flickr.com/photos/oimax/26840543325,https://creativecommons.org/licenses/by/2.0/,OiMax,https://www.flickr.com/people/oimax/ 134f6ad0a24213b7,https://c1.staticflickr.com/6/5682/31219759181_bffba8b0a2_o.jpg,0.5,0.0,1.0,0.75,405,470,https://www.flickr.com/photos/janitors/31219759181,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 2c2a7bb5f94900d6,https://c1.staticflickr.com/9/8121/29442152215_6ebbaf1149_o.jpg,0.0,0.25,0.5,1.0,231,275,https://www.flickr.com/photos/gotovan/29442152215,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/ 17305ce8e6a2b746,https://c1.staticflickr.com/9/8408/29045253574_7c05d0db84_o.jpg,0.0,0.0,0.5625,0.75,889,776,https://www.flickr.com/photos/msdi/29045253574/,https://creativecommons.org/licenses/by/2.0/,Matt Deegan,https://www.flickr.com/people/msdi/ 38f1ac45dc5481a7,https://c1.staticflickr.com/9/8015/29871385696_91f208cb52_o.jpg,0.578822733424,0.25,1.0,1.0,699,159,https://flickr.com/24215621@N08/29871385696,https://creativecommons.org/licenses/by/2.0/,Meraj Chhaya,https://www.flickr.com/people/merajchhaya/ bedcd9af3d03feab,https://c1.staticflickr.com/1/735/32464237086_90200f8112_o.jpg,0.0,0.0,0.5625,0.75,780,879,https://www.flickr.com/photos/thoseguys119/32464237086,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f1a10831d9706a79,https://c1.staticflickr.com/8/7510/26280667354_e5b09ea702_o.jpg,0.25,0.25,1.0,1.0,976,497,https://www.flickr.com/photos/gunnarsohn/26280667354,https://creativecommons.org/licenses/by/2.0/,gunnarsohn,https://www.flickr.com/people/gunnarsohn/ 17a424aa2a5c3b32,https://c1.staticflickr.com/9/8564/28956784346_be1b84ccc6_o.jpg,0.0,0.0,1.0,0.75,986,779,https://www.flickr.com/photos/gregoryjevyak/28956784346/,https://creativecommons.org/licenses/by/2.0/,Gregory Jevyak,https://www.flickr.com/people/gregoryjevyak/ b5c4852bafd2354e,https://c1.staticflickr.com/9/8690/27852347033_587182503e_o.jpg,0.0,0.0,0.75,0.440443213296,922,9,https://www.flickr.com/photos/21022123@N04/27852347033,https://creativecommons.org/licenses/by/2.0/,Mike Steele,https://www.flickr.com/people/21022123@N04/ 5ba0fbb0af6c7273,https://c1.staticflickr.com/8/7316/26407410074_c50e5be30b_o.jpg,0.0,0.25,0.75,0.75,806,602,https://www.flickr.com/photos/claude_wians/26407410074,https://creativecommons.org/licenses/by/2.0/,Claude Wians,https://www.flickr.com/people/claude_wians/ e0b447f9a4252571,https://c1.staticflickr.com/9/8256/29200615230_0f126b02e9_o.jpg,0.277173913043,0.0,0.83152173913,0.75,132,324,https://www.flickr.com/photos/sonstroem/29200615230,https://creativecommons.org/licenses/by/2.0/,Eric Sonstroem,https://www.flickr.com/people/sonstroem/ b29368067328647a,https://c1.staticflickr.com/9/8034/29193460900_e0b08fdf16_o.jpg,0.346808510638,0.0,0.693617021277,1.0,976,548,https://www.flickr.com/photos/53113704@N03/29193460900/,https://creativecommons.org/licenses/by/2.0/,Traveltipy,https://www.flickr.com/people/53113704@N03/ bee2de7fb160544d,https://c1.staticflickr.com/8/7189/26846345684_de05313350_o.jpg,0.0,0.0,1.0,1.0,78,64,https://www.flickr.com/photos/78428166@N00/26846345684/,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ 66c0d373c70f8015,https://c1.staticflickr.com/9/8254/28974234362_23b95ca707_o.jpg,0.333333333333,0.0,1.0,1.0,508,580,https://www.flickr.com/photos/stevendepolo/28974234362,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 70544e275547b8a1,https://c1.staticflickr.com/8/7096/26957429261_053ec6180d_o.jpg,0.0,0.0,0.75,1.0,479,513,https://www.flickr.com/photos/stephanridgway/26957429261,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/ ee89176569a567e2,https://c1.staticflickr.com/9/8396/29497075110_ef50a01051_o.jpg,0.0,0.0,0.666666666667,1.0,548,174,https://www.flickr.com/photos/shankaronline/29497075110,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ e76f53cdf635a209,https://c1.staticflickr.com/9/8488/29802906881_086ed60ccb_o.jpg,0.250923190547,0.0,0.75276957164,0.75,95,323,https://www.flickr.com/photos/amslerpix/29802906881/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ f2ad45c05e3cf873,https://c1.staticflickr.com/9/8513/29119075055_f0d1381268_o.jpg,0.5,0.0,1.0,0.75,651,428,https://www.flickr.com/photos/pahudson/29119075055,https://creativecommons.org/licenses/by/2.0/,Paul Hudson,https://www.flickr.com/people/pahudson/ e0c61d59f84d37cf,https://c1.staticflickr.com/9/8751/28685123572_6a5f945066_o.jpg,0.267938931298,0.0,0.803816793893,0.75,484,425,https://www.flickr.com/photos/ruthanddave/28685123572,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ bbc6f7a166452914,https://c1.staticflickr.com/6/5549/29442815984_3292570b59_o.jpg,0.46688034188,0.25,0.933760683761,1.0,292,337,https://www.flickr.com/photos/dkeats/29442815984/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 19271184f1f1d751,https://c1.staticflickr.com/4/3786/33387790516_b40cc72f9a_o.jpg,0.0,0.0,0.666666666667,1.0,426,402,https://flickr.com/92599451@N08/33387790516,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 67ccbd8e8345fe8d,https://c1.staticflickr.com/9/8133/28737583983_c87c57c587_o.jpg,0.0,0.0,1.0,1.0,539,776,https://www.flickr.com/photos/arbron/28737583983/,https://creativecommons.org/licenses/by/2.0/,Jeff Hitchcock,https://www.flickr.com/people/arbron/ 2574554ebe47cf10,https://c1.staticflickr.com/9/8876/28750331626_d3fdbc5034_o.jpg,0.0,0.0,0.560452418097,0.75,763,489,https://www.flickr.com/photos/marsupilami92/28750331626,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ 5c08f5c085a4285b,https://c1.staticflickr.com/8/7306/28534172090_a2da903070_o.jpg,0.0,0.0,0.75,0.6,133,908,https://www.flickr.com/photos/83613432@N02/28534172090,https://creativecommons.org/licenses/by/2.0/,Vijay Sonar,https://www.flickr.com/people/83613432@N02/ c388f7293a1da649,https://c1.staticflickr.com/9/8473/28858314990_36cec38ce6_o.jpg,0.25,0.25,0.75,1.0,561,645,https://www.flickr.com/photos/trainor/28858314990/,https://creativecommons.org/licenses/by/2.0/,John Trainor,https://www.flickr.com/people/trainor/ d056bccb5bc3d5ea,https://c1.staticflickr.com/1/491/32544295592_7b0ce66975_o.jpg,0.0,0.0,0.5,0.75,342,119,https://www.flickr.com/photos/30478819@N08/32544295592,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 92cbae0f539f4693,https://c1.staticflickr.com/9/8061/29024020142_e19f01f64d_o.jpg,0.333333333333,0.0,1.0,1.0,638,328,https://flickr.com/73648413@N00/29024020142,https://creativecommons.org/licenses/by/2.0/,Spiky7,https://www.flickr.com/people/73648413@N00/ 57f3ffbed045a293,https://c1.staticflickr.com/9/8311/29353863945_04dcd8f0d0_o.jpg,0.25,0.0,0.75,0.75,920,750,https://www.flickr.com/photos/harshlight/29353863945,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ b1f369e39c125e02,https://c1.staticflickr.com/6/5452/30922153735_8c66b9ab89_o.jpg,0.25,0.0,1.0,0.75,224,22,https://flickr.com/49503166727@N01/30922153735,https://creativecommons.org/licenses/by/2.0/,John Patrick Robichaud,https://www.flickr.com/people/troismarteaux/ b8bf8c3d6cdaecde,https://c1.staticflickr.com/6/5790/30554621990_243d3265ab_o.jpg,0.0,0.25,0.5625,1.0,98,183,https://www.flickr.com/photos/29780474@N02/30554621990,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/ 366f064167c5071c,https://c1.staticflickr.com/8/7739/26795319412_51565c7978_o.jpg,0.28125,0.25,0.84375,1.0,820,518,https://www.flickr.com/photos/wfryer/26795319412,https://creativecommons.org/licenses/by/2.0/,Wesley Fryer,https://www.flickr.com/people/wfryer/ 17a36bd440bba152,https://c1.staticflickr.com/9/8844/27787418394_12d6f8873b_o.jpg,0.0,0.25,0.496908127208,1.0,669,893,https://www.flickr.com/photos/96223380@N02/27787418394,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ 5902bb3969713da0,https://c1.staticflickr.com/1/751/31960401626_ba97b2f19d_o.jpg,0.49294205052,0.0,1.0,0.75,309,268,https://www.flickr.com/photos/42244964@N03/31960401626,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ f4a1349134800b4a,https://c1.staticflickr.com/9/8174/29688629145_fd8fdb33fd_o.jpg,0.0,0.0,0.5,0.75,108,270,https://www.flickr.com/photos/raita/29688629145,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/ 438eeddd57911cdd,https://c1.staticflickr.com/6/5758/29568629304_fac76d6087_o.jpg,0.5,0.25,1.0,1.0,973,649,http://www.flickr.com/photos/gusjer/29568629304/,https://creativecommons.org/licenses/by/2.0/,Gusjer,https://www.flickr.com/people/gusjer/ 9293e446892a5b9a,https://c1.staticflickr.com/9/8737/28873981825_53dbb7b83a_o.jpg,0.25,0.0,0.75,0.75,808,587,https://www.flickr.com/photos/navfac/28873981825/,https://creativecommons.org/licenses/by/2.0/,NAVFAC,https://www.flickr.com/people/navfac/ 4de7adb41321d49c,https://c1.staticflickr.com/6/5739/30178169221_b5d9ecf006_o.jpg,0.0,0.0,0.665684830633,1.0,980,265,https://www.flickr.com/photos/142508741@N02/30178169221,https://creativecommons.org/licenses/by/2.0/,Bethany Ciullo,https://www.flickr.com/people/142508741@N02/ 99ff2bfd4401af43,https://c1.staticflickr.com/6/5778/30519007832_fe570da36f_o.jpg,0.281690140845,0.0,0.845070422535,0.75,969,30,https://www.flickr.com/photos/olgierd/30519007832/,https://creativecommons.org/licenses/by/2.0/,Olgierd Rudak,https://www.flickr.com/people/olgierd/ 586848951395c151,https://c1.staticflickr.com/3/2379/32937325125_0ca9653352_o.jpg,0.0,0.25,0.5,1.0,404,498,https://www.flickr.com/photos/usnavy/32937325125,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ e89964025e14ed16,https://c1.staticflickr.com/6/5513/31444728725_14cfdc0481_o.jpg,0.0,0.333333333333,1.0,1.0,431,553,https://www.flickr.com/photos/viumariners/31444728725/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/ 5cd979f60ad807d1,https://c1.staticflickr.com/9/8394/28824871344_5e89b7f6f9_o.jpg,0.0,0.0,0.666666666667,1.0,512,807,https://www.flickr.com/photos/greggjerdingen/28824871344,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 5e781d29d1d9ec33,https://c1.staticflickr.com/8/7379/27681308100_1ba114ab34_o.jpg,0.0,0.0,1.0,1.0,441,640,https://www.flickr.com/photos/lucianosb/27681308100/,https://creativecommons.org/licenses/by/2.0/,Luciano Santa Br\303\255gida,https://www.flickr.com/people/lucianosb/ 11a00a7e8836eb67,https://c1.staticflickr.com/9/8526/28801804653_c20e74eac0_o.jpg,0.576662143826,0.25,1.0,1.0,625,521,https://www.flickr.com/photos/135302410@N02/28801804653,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/ 14f549f3bfefaa26,https://c1.staticflickr.com/1/514/32041709910_d2159999ff_o.jpg,0.0,0.0,0.666666666667,1.0,848,636,https://www.flickr.com/photos/quinet/32041709910,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ f0f0a9c5001f6a9d,https://c1.staticflickr.com/6/5497/31133802826_db88d6441e_o.jpg,0.0,0.25,0.75,1.0,458,203,http://www.flickr.com/photos/bwgtheatre/31133802826/,https://creativecommons.org/licenses/by/2.0/,Bradley Griffin,https://www.flickr.com/people/bwgtheatre/ ff00170e05a6a38f,https://c1.staticflickr.com/9/8812/28932828096_f2e58dcaee_o.jpg,0.498153618907,0.25,1.0,1.0,407,894,https://www.flickr.com/photos/eltb/28932828096,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 1c13b40577556c76,https://c1.staticflickr.com/6/5518/31210647845_5f0a341647_o.jpg,0.281165311653,0.0,0.843495934959,1.0,896,682,https://www.flickr.com/photos/13476480@N07/31210647845,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c1cfa7a344be6daf,https://c1.staticflickr.com/6/5717/30635734392_81ebd97464_o.jpg,0.28125,0.25,0.84375,1.0,764,995,https://flickr.com/91672006@N00/30635734392,https://creativecommons.org/licenses/by/2.0/,George,https://www.flickr.com/people/jestermx6/ 0416d5920c3b9806,https://c1.staticflickr.com/3/2603/32902484582_f666d66817_o.jpg,0.25,0.0,0.75,0.75,868,33,https://www.flickr.com/photos/76969036@N02/32902484582/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ ad4db0136d8277ec,https://c1.staticflickr.com/9/8853/28851747732_f14ec7ed9f_o.jpg,0.600790513834,0.25,1.0,1.0,98,402,https://www.flickr.com/photos/mypubliclands/28851747732,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 5455592a7d774d3d,https://c1.staticflickr.com/8/7046/27289741452_68e8cfe6f1_o.jpg,0.25,0.25,1.0,1.0,581,891,https://www.flickr.com/photos/stella12/27289741452/,https://creativecommons.org/licenses/by/2.0/,Deb Nystrom,https://www.flickr.com/people/stella12/ 8b2fa75cb3ecc580,https://c1.staticflickr.com/9/8814/28367951616_fe55344bab_o.jpg,0.25,0.0,0.75,0.75,547,829,https://www.flickr.com/photos/arielffs/28367951616/,https://creativecommons.org/licenses/by/2.0/,Ariel Serr\303\243o,https://www.flickr.com/people/arielffs/ 4c94160866a3d277,https://c1.staticflickr.com/8/7582/30308176305_00a3371cd1_o.jpg,0.25,0.25,1.0,1.0,519,514,https://www.flickr.com/photos/glorycycles/30308176305,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 4ed92365fed79447,https://c1.staticflickr.com/1/289/31801486495_0de58c5047_o.jpg,0.5,0.0,1.0,0.75,763,492,https://www.flickr.com/photos/shankaronline/31801486495,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ fd4b703f0fb9ab17,https://c1.staticflickr.com/6/5823/30411394850_8ef41df41c_o.jpg,0.0,0.0,0.666666666667,1.0,450,161,https://www.flickr.com/photos/armyengineersnorfolk/30411394850/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers Norfolk District,https://www.flickr.com/people/armyengineersnorfolk/ 0e8a179c8dc287f2,https://c1.staticflickr.com/1/501/32452931516_89a0e2bc90_o.jpg,0.4375,0.0,1.0,0.75,539,790,https://flickr.com/137698907@N06/32452931516,https://creativecommons.org/licenses/by/2.0/,Alain K.,https://www.flickr.com/people/alainnnn/ e791cc299b503480,https://c1.staticflickr.com/8/7702/27240711726_c60dbfbd49_o.jpg,0.0,0.0,0.75,1.0,875,616,https://www.flickr.com/photos/sea_beach_express/27240711726,https://creativecommons.org/licenses/by/2.0/,Kristain Baty,https://www.flickr.com/people/sea_beach_express/ 9d3c7fb7cb85807c,https://c1.staticflickr.com/6/5512/30142002643_ee002ccf38_o.jpg,0.496696035242,0.25,0.993392070485,1.0,258,188,https://www.flickr.com/photos/aikos/30142002643,https://creativecommons.org/licenses/by/2.0/,"Aiko, Thomas & Juliette+Isaac",https://www.flickr.com/people/aikos/ f66a66c282bc2904,https://c1.staticflickr.com/8/7562/27330548053_a754529490_o.jpg,0.5,0.0,1.0,0.75,719,112,https://www.flickr.com/photos/voyagesetc/27330548053,https://creativecommons.org/licenses/by/2.0/,Voyages etc...,https://www.flickr.com/people/voyagesetc/ 4f9f47f238ee29a5,https://c1.staticflickr.com/4/3797/32550901900_6f7e67f00a_o.jpg,0.0,0.25,0.499263622975,1.0,519,119,https://www.flickr.com/photos/box_repsol/32550901900,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ eeaa4734c75429aa,https://c1.staticflickr.com/8/7492/26882350345_9f107e8e35_o.jpg,0.450630252101,0.25,0.901260504202,1.0,675,129,https://www.flickr.com/photos/johnloo/26882350345,https://creativecommons.org/licenses/by/2.0/,John Loo,https://www.flickr.com/people/johnloo/ 377dfa614f9e4a44,https://c1.staticflickr.com/9/8712/28676597230_f0c94af9f5_o.jpg,0.0,0.0,0.5,0.75,896,646,https://www.flickr.com/photos/elsie/28676597230/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 321d735ada1cc89a,https://c1.staticflickr.com/9/8852/28964824665_e511c35cf7_o.jpg,0.25,0.250923190547,1.0,0.75276957164,407,600,https://www.flickr.com/photos/eltb/28964824665,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 8eb3aebd4c3d03b4,https://c1.staticflickr.com/8/7780/26890242371_03210b59dc_o.jpg,0.0,0.0,0.75,1.0,738,449,https://www.flickr.com/photos/jeepersmedia/26890242371,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 6499b534cc8f94d8,https://c1.staticflickr.com/8/7199/26651969714_4a2e6a967b_o.jpg,0.333333333333,0.0,1.0,1.0,725,91,https://www.flickr.com/photos/shadowgate/26651969714,https://creativecommons.org/licenses/by/2.0/,Shadowgate,https://www.flickr.com/people/shadowgate/ 8abffdf3c1f4c3fe,https://c1.staticflickr.com/8/7423/27573996582_2d7b4926ee_o.jpg,0.452546296296,0.25,1.0,1.0,281,314,https://www.flickr.com/photos/wildreturn/27573996582,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ 8684432e7bfbc535,https://c1.staticflickr.com/6/5595/31341526316_c7b75d2a23_o.jpg,0.5,0.25,1.0,1.0,95,756,https://www.flickr.com/photos/yutakaseki/31341526316,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ 41461b5e0ccdc416,https://c1.staticflickr.com/6/5760/30815853572_038a4856f8_o.jpg,0.0,0.25,0.5,1.0,990,862,https://flickr.com/58827557@N06/30815853572,https://creativecommons.org/licenses/by/2.0/,Clint Budd,https://www.flickr.com/people/58827557@N06/ d552f351dff8db55,https://c1.staticflickr.com/1/618/32475615442_0dc4cc26c5_o.jpg,0.28125,0.25,0.84375,1.0,875,988,https://flickr.com/92627106@N02/32475615442,https://creativecommons.org/licenses/by/2.0/,Alex Swanston's Bus Photos,https://www.flickr.com/people/aswans1234567/ 5bc0e1768f05ec70,https://c1.staticflickr.com/8/7221/26957895830_957e7dfcf3_o.jpg,0.279641185647,0.25,0.838923556942,1.0,979,817,https://www.flickr.com/photos/jared422/26957895830,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/ 6e5258ea94ec0da6,https://c1.staticflickr.com/8/7323/27287712224_12dd1d471a_o.jpg,0.0,0.0,0.662261380323,1.0,4,334,https://www.flickr.com/photos/shankaronline/27287712224,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 0efdda94fe6c721e,https://c1.staticflickr.com/3/2319/32230202894_eb75325bf5_o.jpg,0.5,0.0,1.0,0.75,568,451,https://www.flickr.com/photos/yourbestdigs/32230202894,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 71bd5cbcdfa36f8c,https://c1.staticflickr.com/8/7536/28459810983_7b3a739f07_o.jpg,0.25,0.25,0.75,1.0,437,833,https://www.flickr.com/photos/greggjerdingen/28459810983,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ f68d779351925e3d,https://c1.staticflickr.com/6/5649/30981210032_2a37c26e68_o.jpg,0.5,0.0,1.0,0.75,470,295,https://www.flickr.com/photos/amslerpix/30981210032,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 3304024661dcd36f,https://c1.staticflickr.com/6/5733/29742054314_e20abaee34_o.jpg,0.0,0.0,0.75,0.75,866,487,https://www.flickr.com/photos/michperu/29742054314,https://creativecommons.org/licenses/by/2.0/,Manuel Iglesias,https://www.flickr.com/people/michperu/ 32d34ef25dfcab60,https://c1.staticflickr.com/3/2818/32998233562_e8e69083d3_o.jpg,0.0,0.332842415317,1.0,0.99852724595,870,224,http://flickr.com/photos/95116426@N07/32998233562,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/ 755cad2db75470e8,https://c1.staticflickr.com/9/8748/28749471122_fc30e73ed4_o.jpg,0.0,0.0,1.0,0.918685121107,806,161,https://flickr.com/18206869@N04/28749471122,https://creativecommons.org/licenses/by/2.0/,Terry Gilbert,https://www.flickr.com/people/terrygil999/ 3b2423808e7f0cda,https://c1.staticflickr.com/1/700/31640113891_63f0d685ff_o.jpg,0.5,0.25,1.0,1.0,469,808,https://www.flickr.com/photos/greggjerdingen/31640113891,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 40fa67f6e533a165,https://c1.staticflickr.com/6/5531/31296767702_64a637505a_o.jpg,0.497411242604,0.0,1.0,0.75,144,780,https://www.flickr.com/photos/winnu/31296767702/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/ 4666fb1de28146a4,https://c1.staticflickr.com/1/583/30829582303_a689db9ee8_o.jpg,0.28125,0.0,0.84375,0.75,848,977,https://www.flickr.com/photos/mohit_s/30829582303,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ e869526a63cfc3e1,https://c1.staticflickr.com/9/8306/29689204702_495bd5fe91_o.jpg,0.0,0.25,0.5,1.0,819,782,https://www.flickr.com/photos/abbers13/29689204702/,https://creativecommons.org/licenses/by/2.0/,Abby Gillardi,https://www.flickr.com/people/abbers13/ f63487f987f90319,https://c1.staticflickr.com/1/426/32770801112_feea4890f7_o.jpg,0.5,0.25,1.0,1.0,885,658,https://www.flickr.com/photos/jlascar/32770801112,https://creativecommons.org/licenses/by/2.0/,Jorge L\303\241scar,https://www.flickr.com/people/jlascar/ 5ddf15933fecf87d,https://c1.staticflickr.com/1/601/31790181832_f1664b5a0a_o.jpg,0.25,0.4375,1.0,1.0,667,220,https://www.flickr.com/photos/nano/31790181832,https://creativecommons.org/licenses/by/2.0/,Nano Taboada,https://www.flickr.com/people/nano/ 6e1f4df97b7f31ef,https://c1.staticflickr.com/9/8465/29378948232_23b0cbf7a7_o.jpg,0.5,0.0,1.0,0.75,718,288,https://www.flickr.com/photos/greggjerdingen/29378948232,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 0349edaef07bd804,https://c1.staticflickr.com/6/5832/30317363392_6f408833e2_o.jpg,0.421177266576,0.0,0.842354533153,0.75,522,422,https://www.flickr.com/photos/rdecom/30317363392,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/ d3ca4c92740a9287,https://c1.staticflickr.com/6/5713/30496470730_6d8206183b_o.jpg,0.0,0.0,0.75,0.5,684,365,https://www.flickr.com/photos/29621494@N02/30496470730/,https://creativecommons.org/licenses/by/2.0/,Paula R. Lively,https://www.flickr.com/people/29621494@N02/ 82d659d80b4c3dee,https://c1.staticflickr.com/6/5574/31368541855_f09e45b7e0_o.jpg,0.25,0.25,1.0,1.0,550,34,https://www.flickr.com/photos/103707855@N05/31368541855/,https://creativecommons.org/licenses/by/2.0/,J R,https://www.flickr.com/people/103707855@N05/ e70505caa5782d6d,https://c1.staticflickr.com/8/7565/28983036915_6484d5e35d_o.jpg,0.497411242604,0.25,1.0,1.0,459,948,https://www.flickr.com/photos/discoveroregon/28983036915,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ bef51c7bf48a1ce3,https://c1.staticflickr.com/8/7296/26825150301_d3098368ae_o.jpg,0.5,0.0,1.0,0.75,763,902,https://www.flickr.com/photos/hisgett/26825150301,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 8baec6c6491d00ee,https://c1.staticflickr.com/9/8606/28920694626_1c94c32e6c_o.jpg,0.28125,0.25,0.84375,1.0,477,622,http://www.flickr.com/photos/lauriej/28920694626/,https://creativecommons.org/licenses/by/2.0/,Laura James,https://www.flickr.com/people/lauriej/ 311ffc1b7d3f9eac,https://c1.staticflickr.com/8/7140/26505155423_24468659df_o.jpg,0.0,0.0,0.508928571429,0.75,780,339,https://www.flickr.com/photos/113306963@N05/26505155423,https://creativecommons.org/licenses/by/2.0/,travelmag.com,https://www.flickr.com/people/113306963@N05/ 9829ee285a6775ca,https://c1.staticflickr.com/6/5592/30626812420_b1e7f8f7bd_o.jpg,0.332,0.0,1.0,1.0,940,170,https://flickr.com/142171482@N06/30626812420,https://creativecommons.org/licenses/by/2.0/,Med Coolman,https://www.flickr.com/people/uwlideas/ fe5964afb8b1d97f,https://c1.staticflickr.com/8/7429/27610091791_2df0a0f175_o.jpg,0.25,0.0,1.0,0.75,108,968,https://flickr.com/76738608@N08/27610091791,https://creativecommons.org/licenses/by/2.0/,Christian Gloor,https://www.flickr.com/people/christian_gloor/ d29b2a50389cc1bf,https://c1.staticflickr.com/6/5612/30563379813_9b9fa28793_o.jpg,0.0,0.0,0.666666666667,1.0,209,143,https://www.flickr.com/photos/brian_tomlinson/30563379813,https://creativecommons.org/licenses/by/2.0/,Brian Tomlinson,https://www.flickr.com/people/brian_tomlinson/ feb118a79463b92c,https://c1.staticflickr.com/8/7409/27889221781_0b8f3ba708_o.jpg,0.419028340081,0.25,0.838056680162,1.0,896,612,https://www.flickr.com/photos/hisgett/27889221781/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ cdb921ec7f0ca0bf,https://c1.staticflickr.com/8/7280/26918563512_2148165c4e_o.jpg,0.330871491876,0.0,1.0,1.0,512,240,https://www.flickr.com/photos/hugo90/26918563512,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 2a74d420e819e63a,https://c1.staticflickr.com/6/5347/30574753022_83fc3521e1_o.jpg,0.4375,0.25,1.0,1.0,780,555,https://www.flickr.com/photos/thoseguys119/30574753022,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ eeed39b34d06db49,https://c1.staticflickr.com/1/114/31129373910_5146a70b31_o.jpg,0.0977701543739,0.0,1.0,1.0,407,892,https://flickr.com/98826299@N00/31129373910,https://creativecommons.org/licenses/by/2.0/,Deb Nystrom,https://www.flickr.com/people/stella12/ e64dc418e4347581,https://c1.staticflickr.com/3/2882/33134685245_8f75bb8d0c_o.jpg,0.250923190547,0.25,0.75276957164,1.0,405,774,https://www.flickr.com/photos/barteq24/33134685245/,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/ d3173f530afd7cf1,https://c1.staticflickr.com/6/5145/29542043444_ab9ffe2fc2_o.jpg,0.494444444444,0.0,1.0,0.75,706,235,https://www.flickr.com/photos/tutenkhamunsleeping/29542043444,https://creativecommons.org/licenses/by/2.0/,Steve Jones,https://www.flickr.com/people/tutenkhamunsleeping/ f7efcce46489f5df,https://c1.staticflickr.com/8/7275/26921092445_d5460572da_o.jpg,0.284198113208,0.25,0.852594339623,1.0,293,758,https://www.flickr.com/photos/pokerbrit/26921092445,https://creativecommons.org/licenses/by/2.0/,Steve Wilson - over 8 million views Thanks !!,https://www.flickr.com/people/pokerbrit/ 97e95848008c6e48,https://c1.staticflickr.com/6/5256/29292934334_a6649a6698_o.jpg,0.0,0.0,0.5625,0.75,686,868,https://www.flickr.com/photos/zombieite/29292934334,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ b31309b3aea0b4d8,https://c1.staticflickr.com/1/411/31753373286_eb2a0863ee_o.jpg,0.25,0.25,0.75,1.0,542,686,https://www.flickr.com/photos/quinet/31753373286,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ c7fbd05709d295c4,https://c1.staticflickr.com/1/619/32672839855_3562147962_o.jpg,0.25,0.0,0.75,0.75,821,354,https://www.flickr.com/photos/8269539@N04/32672839855,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ bacaf550b57c54a8,https://c1.staticflickr.com/1/739/31814487031_cfc3d03ae5_o.jpg,0.0,0.0730434782609,1.0,1.0,806,700,https://flickr.com/143135875@N03/31814487031,https://creativecommons.org/licenses/by/2.0/,Save the Dream,https://www.flickr.com/people/143135875@N03/ 9011236561e23d43,https://c1.staticflickr.com/9/8861/28294633891_4a8e5f7653_o.jpg,0.495555555556,0.25,1.0,1.0,405,472,https://www.flickr.com/photos/barteq24/28294633891,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/ 3f25632667c42f4c,https://c1.staticflickr.com/8/7402/26680455234_e0840a02f6_o.jpg,0.0,0.25,0.75,1.0,502,208,https://www.flickr.com/photos/7749076@N07/26680455234/,https://creativecommons.org/licenses/by/2.0/,Jason Campbell,https://www.flickr.com/people/7749076@N07/ a7be100325aa1918,https://c1.staticflickr.com/9/8413/30113636550_9bf6766449_o.jpg,0.0,0.25,0.489416058394,1.0,507,773,https://www.flickr.com/photos/magdalenaroeseler/30113636550,https://creativecommons.org/licenses/by/2.0/,Magdalena Roeseler,https://www.flickr.com/people/magdalenaroeseler/ 806b5f9a24c0a8b2,https://c1.staticflickr.com/8/7658/27425514584_047975d793_o.jpg,0.4375,0.25,1.0,1.0,108,677,https://www.flickr.com/photos/jimg944/27425514584/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 2970b5fe8a8c02ec,https://c1.staticflickr.com/1/180/31511763076_6efa641dda_o.jpg,0.0,0.25,0.5,1.0,438,933,https://www.flickr.com/photos/taxdesign/31511763076/,https://creativecommons.org/licenses/by/2.0/,Danny Tax,https://www.flickr.com/people/taxdesign/ ca5d2b03728816db,https://c1.staticflickr.com/6/5676/22839233878_73e7df7656_o.jpg,0.4375,0.25,1.0,1.0,737,672,https://flickr.com/126953417@N02/22839233878,https://creativecommons.org/licenses/by/2.0/,Philip Terry Graham,https://www.flickr.com/people/philipterrygraham/ e4bdf7d7ff8d3150,https://c1.staticflickr.com/6/5747/30972192330_8c41740711_o.jpg,0.248348017621,0.25,0.745044052863,1.0,706,874,http://www.flickr.com/photos/the_mechanic_in_line/30972192330/,https://creativecommons.org/licenses/by/2.0/,Ignacio Olmedo Godoy,https://www.flickr.com/people/the_mechanic_in_line/ 9b5ae5eb14277ea8,https://c1.staticflickr.com/8/7752/28307651151_2d17204b8d_o.jpg,0.0,0.25,0.5,1.0,147,566,https://www.flickr.com/photos/blachswan/28307651151,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ da08f6663bd5560c,https://c1.staticflickr.com/8/7153/26452071503_745cc6fef3_o.jpg,0.25,0.296147672552,1.0,0.888443017657,539,478,https://www.flickr.com/photos/seattlemunicipalarchives/26452071503,https://creativecommons.org/licenses/by/2.0/,Seattle Municipal Archives,https://www.flickr.com/people/seattlemunicipalarchives/ 6b536636db03368a,https://c1.staticflickr.com/8/7545/27367428633_2596f3be8a_o.jpg,0.484397677794,0.0,0.968795355588,0.75,441,808,https://flickr.com/86063712@N00/27367428633,https://creativecommons.org/licenses/by/2.0/,dirvish,https://www.flickr.com/people/dirvish/ e7427e0bf38005df,https://c1.staticflickr.com/9/8429/28724493290_6ac79c4ca6_o.jpg,0.25,0.25,0.75,1.0,662,775,https://www.flickr.com/photos/greggjerdingen/28724493290/?map=1,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ fad49974eb07371c,https://c1.staticflickr.com/8/7392/27314374504_71336526b3_o.jpg,0.25,0.0,1.0,1.0,522,274,https://www.flickr.com/photos/jeepersmedia/27314374504,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 47619046827f497b,https://c1.staticflickr.com/8/7401/28010170156_3362652e6e_o.jpg,0.25,0.0,0.75,0.75,896,768,https://www.flickr.com/photos/markyharky/28010170156,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ ba5ce414717dcdf4,https://c1.staticflickr.com/9/8809/29551063606_a4a3ddbb1c_o.jpg,0.217975206612,0.25,0.653925619835,1.0,780,136,https://www.flickr.com/photos/thoseguys119/29551063606,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ d7c273e136422d51,https://c1.staticflickr.com/8/7680/26913585804_0ec8d20edb_o.jpg,0.0,0.25,0.5625,1.0,484,696,https://www.flickr.com/photos/quinet/26913585804,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ cc2e9d6cf38bc353,https://c1.staticflickr.com/8/7356/27287752883_44af3c5fdd_o.jpg,0.503303964758,0.25,1.0,1.0,821,887,https://www.flickr.com/photos/shankaronline/27287752883,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 75d8d5c5266243ef,https://c1.staticflickr.com/2/1489/26164565684_1d4f64e383_o.jpg,0.0,0.0,0.535877862595,0.75,404,470,https://www.flickr.com/photos/navcent/26164565684,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/ 655c354a4bb88d84,https://c1.staticflickr.com/9/8067/28759280910_33db0e70c1_o.jpg,0.25,0.25,0.75,1.0,820,691,https://www.flickr.com/photos/janitors/28759280910,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 6e1cf5c882663565,https://c1.staticflickr.com/1/448/32597453005_d8558f8717_o.jpg,0.0,0.25,0.5,1.0,411,496,https://flickr.com/54602205@N00/32597453005,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/ 1dfc1acdb562105b,https://c1.staticflickr.com/9/8139/29237132001_5e28454fa3_o.jpg,0.246162280702,0.25,0.738486842105,1.0,22,166,https://www.flickr.com/photos/usfwsmtnprairie/29237132001/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 5f0cf2c7c1a6f623,https://c1.staticflickr.com/6/5576/31209185091_98718db14c_o.jpg,0.0,0.0,0.75,1.0,526,105,https://www.flickr.com/photos/rainsong/31209185091,https://creativecommons.org/licenses/by/2.0/,Ali - \330\271\331\204\331\212 from Riyadh - \331\205\331\206 \330\247\331\204\330\261\331\212\330\247\330\266,https://www.flickr.com/people/rainsong/ 54e70afd9d5d2bd8,https://c1.staticflickr.com/8/7541/27009353743_b4abeb7276_o.jpg,0.333333333333,0.0,1.0,1.0,24,776,https://www.flickr.com/photos/michalnovota/27009353743,https://creativecommons.org/licenses/by/2.0/,Michal Novota,https://www.flickr.com/people/michalnovota/ d425b4c35b0bffa6,https://c1.staticflickr.com/3/2847/32761085782_a83af860ee_o.jpg,0.0,0.25,0.496696035242,1.0,20,685,https://www.flickr.com/photos/sybarite48/32761085782/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 8ec46b8728b0a0f8,https://c1.staticflickr.com/8/7046/26403140404_9759757020_o.jpg,0.4375,0.0,1.0,0.75,820,634,https://flickr.com/28204245@N00/26403140404,https://creativecommons.org/licenses/by/2.0/,Paul Chan,https://www.flickr.com/people/paulstudio/ 466a2149f63b1949,https://c1.staticflickr.com/6/5470/30033515491_cd82a09340_o.jpg,0.0,0.0,0.5892,0.75,947,607,https://www.flickr.com/photos/vastateparksstaff/30033515491,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 771d639d9ff131bb,https://c1.staticflickr.com/1/498/31746241953_09452eb796_o.jpg,0.0,0.0,0.75,1.0,916,408,https://www.flickr.com/photos/ruthanddave/31746241953/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 10bf22cfe599aee1,https://c1.staticflickr.com/8/7197/27566877611_2ee48e2145_o.jpg,0.28125,0.0,0.84375,0.75,277,991,https://www.flickr.com/photos/evilnickname/27566877611/,https://creativecommons.org/licenses/by/2.0/,William,https://www.flickr.com/people/evilnickname/ 3d80dee908866b85,https://c1.staticflickr.com/6/5822/30804987095_216428b0f2_o.jpg,0.0,0.0,0.567503924647,0.75,12,53,https://www.flickr.com/photos/kjfnjy/30804987095/,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/ 6ccaa665bb65d289,https://c1.staticflickr.com/8/7541/30062492555_0b05cef0d8_o.jpg,0.0,0.0,1.0,1.0,964,58,http://www.flickr.com/photos/visentico/30062492555/,https://creativecommons.org/licenses/by/2.0/,Sento,https://www.flickr.com/people/visentico/ be152f981a1c5d67,https://c1.staticflickr.com/9/8735/28462952096_c853276ddb_o.jpg,0.0,0.399030694669,0.75,1.0,820,432,https://www.flickr.com/photos/rarvesen/28462952096/,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/ 66dabc3fd9ce2e61,https://c1.staticflickr.com/4/3794/33190900506_fedfdec1c5_o.jpg,0.259962406015,0.25,0.779887218045,1.0,780,59,https://www.flickr.com/photos/thoseguys119/33190900506,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 3ce1dba657c636da,https://c1.staticflickr.com/9/8192/29514827695_94faca8008_o.jpg,0.25,0.0,0.75,0.75,699,582,https://www.flickr.com/photos/soso__1991/29514827695/,https://creativecommons.org/licenses/by/2.0/,SALoOM,https://www.flickr.com/people/soso__1991/ dc79ef0b67dc3fd6,https://c1.staticflickr.com/8/7392/26935774985_48d980a590_o.jpg,0.0,0.0,0.5,0.75,413,728,https://www.flickr.com/photos/blumenbiene/26935774985,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ 0bbfab51568d2ce4,https://c1.staticflickr.com/1/449/31031697963_936db8af83_o.jpg,0.0,0.0,0.75,0.694010416667,662,601,https://www.flickr.com/photos/hisgett/31031697963,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 05b325bbeec76da5,https://c1.staticflickr.com/1/713/31671929494_068b02b44d_o.jpg,0.25,0.25,0.75,1.0,832,662,https://flickr.com/50979393@N00/31671929494,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/ 1143966d5d65eea4,https://c1.staticflickr.com/2/1664/26488921110_8817700ea6_o.jpg,0.231711647727,0.0,0.695134943182,0.75,556,195,https://www.flickr.com/photos/kansasscanner/26488921110,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 0141152633bc75ef,https://c1.staticflickr.com/6/5321/31234310632_1d1c57e264_o.jpg,0.0,0.0,0.462110481586,0.75,763,453,https://www.flickr.com/photos/keyslibraries/31234310632,https://creativecommons.org/licenses/by/2.0/,Florida Keys--Public Libraries,https://www.flickr.com/people/keyslibraries/ 2ae7111d7768957e,https://c1.staticflickr.com/8/7346/28024404191_0279c9c85f_o.jpg,0.0,0.0,1.0,1.0,976,227,https://www.flickr.com/photos/church4u2/28024404191,https://creativecommons.org/licenses/by/2.0/,Church Iglesia,https://www.flickr.com/people/church4u2/ 10306582446b961f,https://c1.staticflickr.com/6/5784/30911990046_cfec141bcb_o.jpg,0.28125,0.0,0.84375,0.75,566,711,https://www.flickr.com/photos/railwayofaustralia/30911990046/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/ 07cd1d5ab8276a5f,https://c1.staticflickr.com/8/7380/26869354885_0f6f16a5da_o.jpg,0.0,0.332842415317,1.0,0.99852724595,653,720,https://www.flickr.com/photos/carlwwycoff/26869354885,https://creativecommons.org/licenses/by/2.0/,Carl Wycoff,https://www.flickr.com/people/carlwwycoff/ f516a993bb170b32,https://c1.staticflickr.com/9/8683/28462538762_5f1af9889c_o.jpg,0.500736377025,0.0,1.0,0.75,196,355,https://www.flickr.com/photos/jlarnos/28462538762,https://creativecommons.org/licenses/by/2.0/,Jaro Larnos,https://www.flickr.com/people/jlarnos/ c29d046d9fca4d54,https://c1.staticflickr.com/4/3755/32700569161_88d736320c_o.jpg,0.25,0.249079528719,1.0,0.747238586156,709,737,https://www.flickr.com/photos/davehamster/32700569161,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ e5c54075d9d8927f,https://c1.staticflickr.com/8/7619/26961402502_0361f62ccd_o.jpg,0.25,0.0,1.0,0.5,595,896,https://www.flickr.com/photos/dierkschaefer/26961402502,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/ 1e1385d9e6a4159b,https://c1.staticflickr.com/8/7203/27045271136_e94bee79d5_o.jpg,0.28125,0.25,0.84375,1.0,469,244,https://www.flickr.com/photos/transitomedellin/27045271136,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ 1b8308f5029417d9,https://c1.staticflickr.com/9/8629/28283833636_e29fa29b24_o.jpg,0.25,0.0,0.75,0.75,821,685,https://www.flickr.com/photos/harshlight/28283833636,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ c02fcb7ea4c53795,https://c1.staticflickr.com/8/7660/27519280881_f07dd53c53_o.jpg,0.4375,0.0,1.0,0.75,938,508,https://www.flickr.com/photos/stevendepolo/27519280881,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 6c3deea4e44ab653,https://c1.staticflickr.com/9/8267/30181925371_6961146f5d_o.jpg,0.0,0.0,0.5625,0.75,875,532,https://www.flickr.com/photos/69203347@N03/30181925371,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 8c5c46d627350cb2,https://c1.staticflickr.com/9/8402/29785292081_2b98d09bf4_o.jpg,0.4375,0.25,1.0,1.0,780,59,https://www.flickr.com/photos/thoseguys119/29785292081/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 6cee243f4eb866ee,https://c1.staticflickr.com/6/5836/29954732810_b19a71d3fa_o.jpg,0.316901408451,0.0,0.633802816901,0.75,780,718,https://www.flickr.com/photos/thoseguys119/29954732810,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 4b1c01b84f5167a6,https://c1.staticflickr.com/8/7323/27472130946_e27724f827_o.jpg,0.496696035242,0.0,0.993392070485,0.75,719,501,https://www.flickr.com/photos/30478819@N08/27472130946/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ ddbf1ee557f77c8f,https://c1.staticflickr.com/1/648/32452427125_ac93e260f6_o.jpg,0.0,0.315948275862,0.75,1.0,592,838,https://flickr.com/23563006@N08/32452427125,https://creativecommons.org/licenses/by/2.0/,Phoebe Baker,https://www.flickr.com/people/phoebe_photo/ 540ff3106328fb06,https://c1.staticflickr.com/9/8162/29052256586_9d6ebd8098_o.jpg,0.297202797203,0.25,1.0,1.0,114,385,https://www.flickr.com/photos/gails_pictures/29052256586,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ a92cfbea5e0b75d8,https://c1.staticflickr.com/6/5706/30664782196_58d4b17ba4_o.jpg,0.0,0.0,0.93031358885,1.0,694,746,https://www.flickr.com/photos/presidenciamx/30664782196/,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\303\272blica Mexicana,https://www.flickr.com/people/presidenciamx/ 8e5e859aec5aee1d,https://c1.staticflickr.com/1/520/31912025006_256075bb9b_o.jpg,0.0,0.282131661442,0.75,0.846394984326,569,1,https://flickr.com/16704083@N00/31912025006,https://creativecommons.org/licenses/by/2.0/,Dean Burkholder,https://www.flickr.com/people/sysdmg/ f55b2d3c8a3f6b01,https://c1.staticflickr.com/8/7344/27390905245_783359335b_o.jpg,0.0,0.25,0.5,1.0,512,616,https://www.flickr.com/photos/42220226@N07/27390905245,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ bee1a4859471c925,https://c1.staticflickr.com/8/7747/27755171703_15167aee54_o.jpg,0.2515625,0.0,1.0,1.0,526,722,http://www.flickr.com/photos/57385426@N02/27755171703,https://creativecommons.org/licenses/by/2.0/,Craig Dietrich,https://www.flickr.com/people/craigdietrich/ 5aa5accdf0eef6bd,https://c1.staticflickr.com/6/5347/30600979002_bcf45feae2_o.jpg,0.0,0.25,0.495594713656,1.0,972,761,https://flickr.com/14642507@N08/30600979002,https://creativecommons.org/licenses/by/2.0/,sasastro,https://www.flickr.com/people/sasastro/ 5981c45746185473,https://c1.staticflickr.com/1/666/32012851142_5dfc3765aa_o.jpg,0.284198113208,0.25,0.852594339623,1.0,320,938,https://flickr.com/47602497@N06/32012851142,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/ 6a4b272ba0d04cd4,https://c1.staticflickr.com/1/584/32383568621_69128645a5_o.jpg,0.0,0.25,0.5625,1.0,92,345,https://www.flickr.com/photos/garryknight/32383568621,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ e4e23b2468da6c53,https://c1.staticflickr.com/8/7474/28124398135_4d80b17256_o.jpg,0.438671875,0.0,1.0,0.75,920,707,https://www.flickr.com/photos/summonedbyfells/28124398135,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/ ddb826087156b9b6,https://c1.staticflickr.com/1/457/31635876315_85bd8bed6d_o.jpg,0.25,0.25,0.75,1.0,763,476,https://flickr.com/77742560@N06/31635876315,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 00705d85cfbd90c4,https://c1.staticflickr.com/9/8469/29455407801_5b7cddae68_o.jpg,0.25,0.0,1.0,0.75,518,275,https://www.flickr.com/photos/zouny/29455407801,https://creativecommons.org/licenses/by/2.0/,Johnny Ainsworth,https://www.flickr.com/people/zouny/ 00f01fa61f508f1e,https://c1.staticflickr.com/6/5487/30960566092_00e622b68f_o.jpg,0.0,0.25,0.5625,1.0,8,949,https://flickr.com/7706348@N04/30960566092,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/ f53f31e6fc467034,https://c1.staticflickr.com/4/3948/32761528496_00daa6e9e2_o.jpg,0.421177266576,0.0,0.842354533153,0.75,968,468,https://www.flickr.com/photos/98302443@N00/32761528496,https://creativecommons.org/licenses/by/2.0/,Shalu Sharma,https://www.flickr.com/people/98302443@N00/ 59f2b67aef90b06b,https://c1.staticflickr.com/8/7292/27403707305_cfae38d0da_o.jpg,0.237068965517,0.25,0.711206896552,1.0,459,901,https://www.flickr.com/photos/usacetulsa/27403707305,https://creativecommons.org/licenses/by/2.0/,usacetulsa,https://www.flickr.com/people/usacetulsa/ 9cc6c08128e52e96,https://c1.staticflickr.com/8/7344/27472863954_ee3bc8af5b_o.jpg,0.4375,0.0,1.0,0.75,518,465,https://www.flickr.com/photos/zongo/27472863954,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ f186c52c5b35ac6c,https://c1.staticflickr.com/8/7310/27704230212_7f76767693_o.jpg,0.25,0.25,1.0,1.0,546,688,https://www.flickr.com/photos/livepine/27704230212,https://creativecommons.org/licenses/by/2.0/,Chen Zhao,https://www.flickr.com/people/livepine/ 1480fff946815c2b,https://c1.staticflickr.com/1/414/30721436554_d3b55ff2f6_o.jpg,0.28125,0.0,0.84375,0.75,2,961,https://www.flickr.com/photos/dubster/30721436554/,https://creativecommons.org/licenses/by/2.0/,Dubi Kaufmann,https://www.flickr.com/people/dubster/ 928cc46fc78f9a87,https://c1.staticflickr.com/8/7716/27377479220_cca49fa619_o.jpg,0.0,0.0,0.786858974359,1.0,422,543,https://www.flickr.com/photos/martius/27377479220,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 668ff3359bc32d67,https://c1.staticflickr.com/8/7355/26677194630_3ae87988a5_o.jpg,0.248713235294,0.25,0.746139705882,1.0,831,664,https://www.flickr.com/photos/agenciabrasilia/26677194630,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ a80c957522ae813d,https://c1.staticflickr.com/8/7057/27805938006_0e589fe1dc_o.jpg,0.25,0.0,1.0,1.0,133,795,https://www.flickr.com/photos/forest-and-kim/27805938006,https://creativecommons.org/licenses/by/2.0/,Forest Starr and Kim Starr,https://www.flickr.com/people/forest-and-kim/ b47fbcf7946ff6de,https://c1.staticflickr.com/9/8002/29360869571_df0fd50e6a_o.jpg,0.0,0.0,0.561569688769,1.0,875,969,https://www.flickr.com/photos/9759010@N07/29360869571,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/ 66ea65f5ced3fa48,https://c1.staticflickr.com/9/8891/28275254376_267e9b549d_o.jpg,0.0,0.0,0.665684830633,1.0,896,624,https://www.flickr.com/photos/ronmacphotos/28275254376,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 058c9532549bc07e,https://c1.staticflickr.com/3/2512/33062077246_f2ae477983_o.jpg,0.0,0.0,0.75,1.0,699,916,https://www.flickr.com/photos/marsupilami92/33062077246,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ 479cc33ff3f131b3,https://c1.staticflickr.com/8/7398/28010163216_87055813f3_o.jpg,0.25,0.0,0.75,0.75,896,19,https://www.flickr.com/photos/markyharky/28010163216,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 62eb552e74fcadff,https://c1.staticflickr.com/8/7455/27853584870_21043d2e11_o.jpg,0.0,0.0,0.75,0.75,742,342,https://flickr.com/60944636@N00/27853584870,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/ d3f8ba1305ee626d,https://c1.staticflickr.com/6/5617/29598952700_a2cbc28ac9_o.jpg,0.0,0.25,0.5625,1.0,976,148,https://www.flickr.com/photos/herry/29598952700/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/ 30a0b3835965fb9f,https://c1.staticflickr.com/6/5649/30444954471_9e8f405c71_o.jpg,0.0,0.0,0.683582089552,1.0,706,404,https://flickr.com/115599753@N04/30444954471,https://creativecommons.org/licenses/by/2.0/,Jill Myers,https://www.flickr.com/people/115599753@N04/ 0aa9b1f7dd9440a2,https://c1.staticflickr.com/1/71/31192119930_245209c301_o.jpg,0.5,0.0,1.0,0.75,426,334,https://www.flickr.com/photos/stevendepolo/31192119930,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 662b5a486372b19c,https://c1.staticflickr.com/9/8774/28308493522_7b87c8ccee_o.jpg,0.0,0.25,0.5,1.0,431,759,https://www.flickr.com/photos/usembassyta/28308493522/,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/ e9f4e600b41146f7,https://c1.staticflickr.com/3/2452/31980716974_a06a13b34f_o.jpg,0.0,0.0,0.844112769486,1.0,672,848,https://www.flickr.com/photos/glorycycles/31980716974/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ e9d65dc23635343a,https://c1.staticflickr.com/9/8841/28727389655_ec9fc5d19f_o.jpg,0.5,0.0,1.0,0.75,848,123,https://www.flickr.com/photos/kecko/28727389655,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ 5966f21e36a930f1,https://c1.staticflickr.com/9/8837/28409174192_fe7e1dedd4_o.jpg,0.0,0.0,0.75,1.0,976,741,https://www.flickr.com/photos/sybarite48/28409174192,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ d7ed7c9dd549f558,https://c1.staticflickr.com/9/8149/29082045462_4a90beae6d_o.jpg,0.0,0.0,0.75,1.0,959,907,https://www.flickr.com/photos/eamoncurry/29082045462?rb=1,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/ ad422df43e2a757e,https://c1.staticflickr.com/9/8861/28257585136_d2934c339c_o.jpg,0.217975206612,0.25,0.653925619835,1.0,405,711,https://flickr.com/60911558@N04/28257585136,https://creativecommons.org/licenses/by/2.0/,Ian Gratton,https://www.flickr.com/people/ian_a_gratton/ f0920019f77fc2f8,https://c1.staticflickr.com/9/8335/29188507242_87e9243daa_o.jpg,0.0,0.0,0.720858895706,1.0,563,706,https://www.flickr.com/photos/vaubeh/29188507242,https://creativecommons.org/licenses/by/2.0/,vaubeh,https://www.flickr.com/people/vaubeh/ d226233e9e80c844,https://c1.staticflickr.com/8/7631/28937682791_771143e527_o.jpg,0.25,0.0,1.0,1.0,667,782,https://www.flickr.com/photos/68147320@N02/28937682791,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ 1a64b567079b97d2,https://c1.staticflickr.com/9/8293/29405449772_d232f6df61_o.jpg,0.25,0.25,0.75,1.0,971,741,https://www.flickr.com/photos/fchelaru/29405449772,https://creativecommons.org/licenses/by/2.0/,Florin Chelaru,https://www.flickr.com/people/fchelaru/ bbdd9f5816a28b00,https://c1.staticflickr.com/9/8278/28870727490_de42394844_o.jpg,0.4375,0.25,1.0,1.0,548,923,https://www.flickr.com/photos/marsupilami92/28870727490,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ f52059c9d20cc678,https://c1.staticflickr.com/8/7391/27546716184_6bae6e65b0_o.jpg,0.29114713217,0.0,1.0,0.75,318,249,https://www.flickr.com/photos/marknenadov/27546716184,https://creativecommons.org/licenses/by/2.0/,Mark Nenadov,https://www.flickr.com/people/marknenadov/ e03b970bb8b75246,https://c1.staticflickr.com/1/528/32132337182_54a2d6599d_o.jpg,0.578822733424,0.0,1.0,0.75,650,306,http://www.flickr.com/photos/stonehenge-stone-circle/32132337182/,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/ 5e8f903d4de583a0,https://c1.staticflickr.com/8/7582/27275955744_b5ff977921_o.jpg,0.25,0.0,1.0,0.561328125,955,609,https://www.flickr.com/photos/scotnelson/27275955744,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 1c6e57b8073b895f,https://c1.staticflickr.com/8/7348/26656487363_9c3b699b4a_o.jpg,0.0,0.267938931298,0.75,0.803816793893,611,780,https://www.flickr.com/photos/spreadshirt/26656487363,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/ 3de1a3085d00e681,https://c1.staticflickr.com/6/5577/29998010284_9a298a0132_o.jpg,0.281690140845,0.25,0.845070422535,1.0,89,279,https://flickr.com/30802095@N04/29998010284,https://creativecommons.org/licenses/by/2.0/,Liam Lysaght,https://www.flickr.com/people/30802095@N04/ 89e7fbd80e0de870,https://c1.staticflickr.com/4/3695/32434803614_d25e212bb1_o.jpg,0.0,0.0,0.665684830633,1.0,747,772,https://flickr.com/98147195@N00/32434803614,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ faf5794831de61e5,https://c1.staticflickr.com/8/7793/29424918596_ac59e1e3ca_o.jpg,0.377492877493,0.0,1.0,1.0,820,791,https://www.flickr.com/photos/nslashdot/29424918596,https://creativecommons.org/licenses/by/2.0/,Deeped Niclas & Amanda Strandh,https://www.flickr.com/people/nslashdot/ 27606923c0d7511b,https://c1.staticflickr.com/9/8668/28005323994_80685f4fdc_o.jpg,0.28125,0.25,0.84375,1.0,669,392,https://flickr.com/131810676@N03/28005323994,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/ eaf890cbcfa00655,https://c1.staticflickr.com/8/7281/26498177364_48ddfeb0ea_o.jpg,0.361566018424,0.0,0.602610030706,0.75,780,350,https://www.flickr.com/photos/thoseguys119/26498177364/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ ffde317d066d4b8a,https://c1.staticflickr.com/1/319/32065668671_6cea1925fe_o.jpg,0.0,0.25,0.5,1.0,859,533,https://flickr.com/46884728@N06/32065668671,https://creativecommons.org/licenses/by/2.0/,piet theisohn,https://www.flickr.com/people/piet_theisohn/ 6370342e4e218ed4,https://c1.staticflickr.com/9/8493/29660763405_8c1a3b19af_o.jpg,0.333333333333,0.0,1.0,1.0,719,681,https://www.flickr.com/photos/tobiasbegemann/29660763405/,https://creativecommons.org/licenses/by/2.0/,Tobias Begemann,https://www.flickr.com/people/tobiasbegemann/ 1386bd0426854bf7,https://c1.staticflickr.com/9/8804/28500606361_53fcae57c6_o.jpg,0.2806640625,0.0,0.8419921875,0.75,611,367,https://www.flickr.com/photos/cogdog/28500606361,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ dd6a8febc0c953ef,https://c1.staticflickr.com/9/8492/29384461980_f5c4361d25_o.jpg,0.0,0.0,0.75,0.75,644,45,https://www.flickr.com/photos/78428166@N00/29384461980/,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ c3c7e3994bc34b59,https://c1.staticflickr.com/6/5693/31037061305_fcf63d21f9_o.jpg,0.25,0.0,0.75,0.75,645,316,https://www.flickr.com/photos/wendelinjacober/31037061305,https://creativecommons.org/licenses/by/2.0/,Wendelin Jacober,https://www.flickr.com/people/wendelinjacober/ 05184dda95fbfa63,https://c1.staticflickr.com/9/8779/29389715742_c73901e305_o.jpg,0.0,0.0,0.5,0.75,490,660,https://www.flickr.com/photos/aotaro/29389715742,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/ eb459b9f238f24f3,https://c1.staticflickr.com/8/7690/26437466834_86e332ca28_o.jpg,0.0,0.25,0.5,1.0,512,771,https://www.flickr.com/photos/42220226@N07/26437466834,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 3e0dec78b4d643f6,https://c1.staticflickr.com/6/5265/29236005893_4e27cae1bc_o.jpg,0.0,0.25,0.508928571429,1.0,815,37,https://www.flickr.com/photos/22711505@N05/29236005893,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ f9028cfa6fd4089b,https://c1.staticflickr.com/9/8280/29324823684_49b8e22d46_o.jpg,0.0,0.0,0.7484375,1.0,405,655,https://www.flickr.com/photos/venkatmangudi/29324823684,https://creativecommons.org/licenses/by/2.0/,Venkat Mangudi,https://www.flickr.com/people/venkatmangudi/ 0a0e6bfebdf57cbd,https://c1.staticflickr.com/8/7484/29504634976_4a35098885_o.jpg,0.0,0.0,0.75,0.75,881,533,https://www.flickr.com/photos/kristoferbjorkman/29504634976/,https://creativecommons.org/licenses/by/2.0/,Kristofer Bj\303\266rkman,https://www.flickr.com/people/kristoferbjorkman/ a9fac3c7eb2bd0ef,https://c1.staticflickr.com/6/5622/30356760081_599ff89c2c_o.jpg,0.0,0.0,0.75,0.5625,443,791,https://www.flickr.com/photos/arjanrichter/30356760081,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/ 5e6da7e17856b545,https://c1.staticflickr.com/8/7664/27476595630_95c99aedd8_o.jpg,0.0,0.0,0.75,1.0,744,673,https://www.flickr.com/photos/144110575@N07/27476595630,https://creativecommons.org/licenses/by/2.0/,Jobs For Felons Hub,https://www.flickr.com/people/144110575@N07/ a2f1fb4b89552db1,https://c1.staticflickr.com/9/8703/28779483321_1d3beef2cd_o.jpg,0.25,0.25,0.75,1.0,909,414,https://www.flickr.com/photos/8269539@N04/28779483321/,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 0db0731366fb387e,https://c1.staticflickr.com/8/7379/28035224505_6afb88ee65_o.jpg,0.373566878981,0.0,0.747133757962,0.75,896,737,https://www.flickr.com/photos/hisgett/28035224505,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 2e5009ae2ba70503,https://c1.staticflickr.com/6/5325/30182940780_c05ca5bc5f_o.jpg,0.25,0.28125,1.0,0.84375,973,865,https://www.flickr.com/photos/jsjgeology/30182940780,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1b2562cbabc6ade7,https://c1.staticflickr.com/1/761/31457927273_2785030ed0_o.jpg,0.0,0.0,0.665684830633,1.0,855,390,https://www.flickr.com/photos/usnavalwarcollegeri/31457927273,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/ 97cb978b16f410e7,https://c1.staticflickr.com/8/7582/26964621803_b1338dd888_o.jpg,0.0,0.272727272727,0.75,0.818181818182,813,159,https://www.flickr.com/photos/jurvetson/26964621803,https://creativecommons.org/licenses/by/2.0/,Steve Jurvetson,https://www.flickr.com/people/jurvetson/ 10ce0cba6cb94154,https://c1.staticflickr.com/6/5492/30796308436_aefebd1629_o.jpg,0.0,0.0,0.5892,0.75,151,763,https://www.flickr.com/photos/pandora_6666/30796308436,https://creativecommons.org/licenses/by/2.0/,Jo Naylor,https://www.flickr.com/people/pandora_6666/ 960c2fbb9393dac1,https://c1.staticflickr.com/6/5660/29277821453_750675569a_o.jpg,0.240412445731,0.25,0.721237337192,1.0,699,58,https://www.flickr.com/photos/22711505@N05/29277821453,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 87991155b1d3f344,https://c1.staticflickr.com/1/355/32582244962_6ff83aece5_o.jpg,0.0036036036036,0.0,1.0,1.0,918,632,https://www.flickr.com/photos/norbet/32582244962/,https://creativecommons.org/licenses/by/2.0/,norbet1,https://www.flickr.com/people/norbet/ 6cbe797e65839c6e,https://c1.staticflickr.com/8/7332/27449283081_8b9af7e5aa_o.jpg,0.464122137405,0.0,1.0,0.75,404,584,https://www.flickr.com/photos/usnavy/27449283081,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ d37eee8e62337a23,https://c1.staticflickr.com/9/8872/29683124836_f333f20e19_o.jpg,0.0,0.0,0.75,0.75,438,554,https://www.flickr.com/photos/rapidtravelchai/29683124836,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/ 12872ceb20f95c72,https://c1.staticflickr.com/8/7082/26527521084_59770450e3_o.jpg,0.0,0.0,0.75,0.75,309,208,https://www.flickr.com/photos/orangeaurochs/26527521084,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ de3459da31859a10,https://c1.staticflickr.com/1/458/32544272722_70146bac1f_o.jpg,0.0,0.0,0.666666666667,1.0,386,814,https://www.flickr.com/photos/30478819@N08/32544272722,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 55af4665ba3a5464,https://c1.staticflickr.com/6/5781/30065521570_ecfd7627fc_o.jpg,0.0,0.0,0.838016528926,1.0,11,829,https://www.flickr.com/photos/chrislbaker/30065521570,https://creativecommons.org/licenses/by/2.0/,Chris Baker,https://www.flickr.com/people/chrislbaker/ 9da4b60fa0ce86d7,https://c1.staticflickr.com/9/8490/29526508965_013a16ebcd_o.jpg,0.0,0.0,0.75,1.0,416,846,https://www.flickr.com/photos/bexwalton/29526508965,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/ c93fb8ab4993238d,https://c1.staticflickr.com/9/8215/29266283393_acbcd2d9d8_o.jpg,0.42174796748,0.0,0.843495934959,0.75,405,351,https://flickr.com/76908380@N04/29266283393,https://creativecommons.org/licenses/by/2.0/,Valentin Hintikka,https://www.flickr.com/people/valentinhintikka/ a7e7d3a212e6be4e,https://c1.staticflickr.com/6/5330/30326411121_23a786e9cc_o.jpg,0.486191860465,0.25,0.97238372093,1.0,672,658,https://www.flickr.com/photos/glorycycles/30326411121,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 378e9b86e085c920,https://c1.staticflickr.com/9/8072/30014657986_985483d28c_o.jpg,0.438671875,0.0,1.0,0.75,822,893,https://www.flickr.com/photos/jasoncartwright/30014657986/,https://creativecommons.org/licenses/by/2.0/,Jason Cartwright,https://www.flickr.com/people/jasoncartwright/ d5a031ae7657e09f,https://c1.staticflickr.com/2/1468/26165908343_f5ab5333fe_o.jpg,0.0,0.0,0.666666666667,1.0,519,978,https://www.flickr.com/photos/janitors/26165908343,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ d6a884049122f404,https://c1.staticflickr.com/1/577/31088666023_7e4fbf7aca_o.jpg,0.239718614719,0.0,0.719155844156,0.75,309,284,https://www.flickr.com/photos/42244964@N03/31088666023,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ 5adfbcf6d3430882,https://c1.staticflickr.com/6/5773/30099519660_e53ee695a6_o.jpg,0.281802120141,0.0,1.0,0.75,310,16,http://www.flickr.com/photos/8414198@N04/30099519660,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/ 89ec4c53ebdb5cab,https://c1.staticflickr.com/9/8789/28285530991_9efbed0f14_o.jpg,0.25,0.0,0.75,0.75,53,368,https://flickr.com/14583963@N00/28285530991,https://creativecommons.org/licenses/by/2.0/,David Short,https://www.flickr.com/people/14583963@N00/ 06a02e39de2514d0,https://c1.staticflickr.com/8/7747/26736417344_457c9e15be_o.jpg,0.267938931298,0.0,0.803816793893,0.75,820,844,https://www.flickr.com/photos/jus10h/26736417344,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ aad61bf6c5001828,https://c1.staticflickr.com/6/5663/30091386730_c3b6da8553_o.jpg,0.258620689655,0.0,0.775862068966,0.75,672,568,https://www.flickr.com/photos/glorycycles/30091386730,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 50a3ec38f05cc572,https://c1.staticflickr.com/6/5639/31049619242_67e1418d7f_o.jpg,0.5,0.0,1.0,0.75,820,620,https://www.flickr.com/photos/worldskillsteamuk/31049619242/,https://creativecommons.org/licenses/by/2.0/,WorldSkills UK,https://www.flickr.com/people/worldskillsteamuk/ c1e470254bb87522,https://c1.staticflickr.com/9/8550/29793086206_c58496f1dd_o.jpg,0.0,0.0,0.5,0.75,683,224,https://www.flickr.com/photos/texasbackroads/29793086206/,https://creativecommons.org/licenses/by/2.0/,Nicolas Henderson,https://www.flickr.com/people/texasbackroads/ 3e7f00115428a973,https://c1.staticflickr.com/8/7361/27680525281_01f66ca20c_o.jpg,0.0,0.0,0.561569688769,1.0,490,630,https://www.flickr.com/photos/144110575@N07/27680525281,https://creativecommons.org/licenses/by/2.0/,Jobs For Felons Hub,https://www.flickr.com/people/144110575@N07/ eaf975aa423855a1,https://c1.staticflickr.com/9/8378/29163025530_5302119066_o.jpg,0.0,0.0,0.75,0.75,550,904,https://www.flickr.com/photos/dedrawolff/29163025530,https://creativecommons.org/licenses/by/2.0/,Dedra Wolff,https://www.flickr.com/people/dedrawolff/ 6d0d1adfac75b16e,https://c1.staticflickr.com/9/8430/29142611383_2899a80fb0_o.jpg,0.0,0.25,0.75,0.75,520,373,https://www.flickr.com/photos/quinet/29142611383,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 95286cc8512e2180,https://c1.staticflickr.com/9/8026/29608084645_fe2bebf215_o.jpg,0.0,0.287776898734,0.75,0.863330696203,490,443,https://www.flickr.com/photos/iblee/29608084645,https://creativecommons.org/licenses/by/2.0/,lee leblanc,https://www.flickr.com/people/iblee/ 0c7f0f3c192b45dc,https://c1.staticflickr.com/6/5608/30232593670_71d1459d97_o.jpg,0.332106038292,0.0,0.996318114875,1.0,973,479,https://www.flickr.com/photos/zigazou76/30232593670,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ c4282fd2dc6d3c9b,https://c1.staticflickr.com/6/5800/30843798446_d4453855ed_o.jpg,0.5,0.0,1.0,0.75,349,836,https://flickr.com/22592971@N04/30843798446,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ 60c17d52dc3194fb,https://c1.staticflickr.com/8/7460/26898662073_873911b31d_o.jpg,0.25,0.0,1.0,0.75,980,705,https://www.flickr.com/photos/atoach/26898662073/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 254dcca9acff2944,https://c1.staticflickr.com/9/8123/29793040716_b02302662e_o.jpg,0.4375,0.25,1.0,1.0,875,891,https://www.flickr.com/photos/aswans1234567/29793040716/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston's Bus Photos,https://www.flickr.com/people/aswans1234567/ 83d9fa2207b657ff,https://c1.staticflickr.com/1/697/31482486846_1152d88e79_o.jpg,0.0,0.25,0.5625,1.0,469,834,https://www.flickr.com/photos/davidwilson1949/31482486846,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 721a5dc05dbcb457,https://c1.staticflickr.com/8/7169/26753951864_798f7bce28_o.jpg,0.251353790614,0.0,1.0,0.75,954,784,https://www.flickr.com/photos/scotnelson/26753951864,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ dcd8e769e9be80b6,https://c1.staticflickr.com/9/8311/28854278864_a06268db28_o.jpg,0.248348017621,0.0,0.745044052863,0.75,507,598,https://www.flickr.com/photos/felipe_gabaldon/28854278864,https://creativecommons.org/licenses/by/2.0/,Felipe Gabald\303\263n,https://www.flickr.com/people/felipe_gabaldon/ c2f36b66894e18ad,https://c1.staticflickr.com/8/7359/27592542231_c86cfd8ae6_o.jpg,0.25,0.25,0.75,1.0,896,640,https://www.flickr.com/photos/faceme/27592542231,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ 9292189fd34132d1,https://c1.staticflickr.com/8/7436/27716090366_83abddfa1d_o.jpg,0.256343283582,0.25,0.769029850746,1.0,136,63,https://www.flickr.com/photos/lakeworth/27716090366/,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/ 3bfc1feb105b9a76,https://c1.staticflickr.com/6/5716/30442075022_393df5da81_o.jpg,0.0,0.0,0.812703583062,1.0,973,768,https://www.flickr.com/photos/103060904@N04/30442075022/,https://creativecommons.org/licenses/by/2.0/,Keron Beattie,https://www.flickr.com/people/103060904@N04/ 275d7e67715837b7,https://c1.staticflickr.com/9/8490/29691405946_54bb971f83_o.jpg,0.250923190547,0.25,0.75276957164,1.0,459,23,http://www.flickr.com/photos/eltb/29691405946/,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 199dbc9bb234d3eb,https://c1.staticflickr.com/8/7432/28158924655_0b5768849e_o.jpg,0.249079528719,0.0,0.747238586156,0.75,209,754,https://flickr.com/142677604@N03/28158924655,https://creativecommons.org/licenses/by/2.0/,Kraken Fireball,https://www.flickr.com/people/142677604@N03/ e316f5f573aff0a5,https://c1.staticflickr.com/9/8413/29234173482_7441f18d0d_o.jpg,0.5,0.25,1.0,1.0,543,681,https://www.flickr.com/photos/codnewsroom/29234173482,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 4c32a77c2d627ecb,https://c1.staticflickr.com/6/5645/30163303454_e77254858e_o.jpg,0.25,0.267410714286,1.0,1.0,673,891,https://www.flickr.com/photos/publicresourceorg/30163303454,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/ 255e80bf87d12516,https://c1.staticflickr.com/6/5523/30514087241_81c4b0121e_o.jpg,0.0,0.25,0.580683624801,1.0,405,16,https://www.flickr.com/photos/ajmexico/30514087241,https://creativecommons.org/licenses/by/2.0/,ajmexico,https://www.flickr.com/people/ajmexico/ 8f4761a71ad5944e,https://c1.staticflickr.com/8/7654/27067231945_3629889212_o.jpg,0.438671875,0.0,1.0,0.75,950,191,https://www.flickr.com/photos/cogdog/27067231945,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 2fdcbe02ab1d6757,https://c1.staticflickr.com/6/5747/30186936901_26343dd544_o.jpg,0.5,0.0,1.0,0.75,403,844,https://flickr.com/49969498@N02/30186936901,https://creativecommons.org/licenses/by/2.0/,Robert Bell,https://www.flickr.com/people/roberttbell/ 816c7632b8c85491,https://c1.staticflickr.com/6/5267/30086067086_bedfd5643b_o.jpg,0.4375,0.25,1.0,1.0,955,43,https://www.flickr.com/photos/scotnelson/30086067086,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 0dcb2c94e60b4efe,https://c1.staticflickr.com/9/8811/28903297116_49a3ac1d2b_o.jpg,0.0,0.0,0.666666666667,1.0,519,555,https://www.flickr.com/photos/box_repsol/28903297116,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ c8cec867a6ec0faa,https://c1.staticflickr.com/9/8044/29084271660_ba3a0cc4a0_o.jpg,0.0,0.0,1.0,0.739130434783,437,384,https://www.flickr.com/photos/autohistorian/29084271660,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 6aea134a3ad33f38,https://c1.staticflickr.com/1/508/32673017136_b4fd325b21_o.jpg,0.0,0.0,0.75,1.0,24,247,https://www.flickr.com/photos/rusty_clark/32673017136,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ a14e6629fc56396c,https://c1.staticflickr.com/9/8426/28855117446_8d63056456_o.jpg,0.25,0.25,1.0,1.0,655,757,https://www.flickr.com/photos/moto_club4ag/28855117446,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ 74ae9e8039013987,https://c1.staticflickr.com/4/3865/33406350172_138f88725b_o.jpg,0.25,0.25,1.0,1.0,536,83,http://www.flickr.com/photos/glorycycles/33406350172/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ c9481b9782bb4f1a,https://c1.staticflickr.com/8/7411/27175924830_e3510898ec_o.jpg,0.0,0.0,0.666666666667,1.0,484,292,https://www.flickr.com/photos/glenbowman/27175924830,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 15f6730523be0c03,https://c1.staticflickr.com/9/8341/28845710984_d431f27657_o.jpg,0.0,0.0,0.5625,0.75,946,151,https://www.flickr.com/photos/aroberts/28845710984,https://creativecommons.org/licenses/by/2.0/,Andy Roberts,https://www.flickr.com/people/aroberts/ a46c7d8be28259ea,https://c1.staticflickr.com/9/8639/30353834141_bfa750c339_o.jpg,0.0,0.0,0.419028340081,0.75,780,597,https://www.flickr.com/photos/thoseguys119/30353834141,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ cf022c285011f91f,https://c1.staticflickr.com/9/8462/28962430723_4b0836d320_o.jpg,0.280226209048,0.25,0.840678627145,1.0,662,873,https://www.flickr.com/photos/andreboeni/28962430723,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 833deae6bc79f83e,https://c1.staticflickr.com/9/8508/29327163371_cedc7d85a4_o.jpg,0.0,0.0,0.666666666667,1.0,519,203,https://www.flickr.com/photos/box_repsol/29327163371,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 477d9f66cdd55002,https://c1.staticflickr.com/1/355/32906104026_a41fba0844_o.jpg,0.25,0.4375,1.0,1.0,577,399,http://www.flickr.com/photos/143957286@N05/32906104026,https://creativecommons.org/licenses/by/2.0/,whitehart1882,https://www.flickr.com/people/143957286@N05/ 3c4ae74a9c09cecd,https://c1.staticflickr.com/9/8711/28257777633_85810b6daf_o.jpg,0.0,0.0,0.561328125,0.75,113,805,https://www.flickr.com/photos/adactio/28257777633,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/ 53b3bac60b5e7754,https://c1.staticflickr.com/6/5585/30287486864_9c1ebf987f_o.jpg,0.4375,0.25,1.0,1.0,739,888,https://www.flickr.com/photos/carlos_verza/30287486864/,https://creativecommons.org/licenses/by/2.0/,carlos verza,https://www.flickr.com/people/carlos_verza/ f27a10945fe9ff4b,https://c1.staticflickr.com/9/8554/28791518124_0540d45510_o.jpg,0.0,0.0,0.562330623306,1.0,979,953,https://www.flickr.com/photos/bohemiannie/28791518124,https://creativecommons.org/licenses/by/2.0/,annie!,https://www.flickr.com/people/bohemiannie/ b634eee16b27b342,https://c1.staticflickr.com/8/7764/27408178181_0b35b270e4_o.jpg,0.281690140845,0.0,0.845070422535,0.75,985,903,https://www.flickr.com/photos/aryehalex/27408178181/,https://creativecommons.org/licenses/by/2.0/,Aryeh Alex,https://www.flickr.com/people/aryehalex/ f56250efb71d6668,https://c1.staticflickr.com/8/7632/28005357512_7c94aa61a5_o.jpg,0.578822733424,0.0,1.0,0.75,918,590,https://www.flickr.com/photos/bagogames/28005357512,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/ 471028ef37186e19,https://c1.staticflickr.com/8/7502/28339825641_94dc8ce544_o.jpg,0.0,0.0,0.75,0.629552980132,844,903,https://www.flickr.com/photos/jared422/28339825641,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/ 3d387e72f39bb706,https://c1.staticflickr.com/8/7376/27235102896_0f2338fbda_o.jpg,0.4375,0.25,1.0,1.0,117,985,https://www.flickr.com/photos/blmoregon/27235102896,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 2f01c6eed500462f,https://c1.staticflickr.com/9/8051/29221385303_00211f4a67_o.jpg,0.25,0.493045387994,1.0,0.986090775988,683,599,https://www.flickr.com/photos/the-o/29221385303,https://creativecommons.org/licenses/by/2.0/,David Ohmer,https://www.flickr.com/people/the-o/ 36281d3fff2e7d9a,https://c1.staticflickr.com/1/300/31252849673_140d779413_o.jpg,0.0,0.0,0.75,0.75,760,730,https://www.flickr.com/photos/nicokaiser/31252849673,https://creativecommons.org/licenses/by/2.0/,Nico Kaiser,https://www.flickr.com/people/nicokaiser/ 69572f4a9707dba0,https://c1.staticflickr.com/1/727/32432691826_7766fc5dd3_o.jpg,0.25,0.0,1.0,0.75,156,377,https://flickr.com/49503029034@N01/32432691826,https://creativecommons.org/licenses/by/2.0/,Heather Kennedy,https://www.flickr.com/people/moria/ 8115faf7544a531a,https://c1.staticflickr.com/8/7537/30284413195_e944457ca4_o.jpg,0.0,0.25,0.75,1.0,519,5,https://www.flickr.com/photos/glorycycles/30284413195,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 54c3454fe2ac6f83,https://c1.staticflickr.com/9/8201/29025023036_78634f8ece_o.jpg,0.268922018349,0.25,0.806766055046,1.0,553,37,https://www.flickr.com/photos/bethscupham/29025023036/,https://creativecommons.org/licenses/by/2.0/,Beth Scupham,https://www.flickr.com/people/bethscupham/ c333e21afd582d54,https://c1.staticflickr.com/6/5326/30786915200_0781f2022c_o.jpg,0.210588633288,0.0,0.631765899865,0.75,947,37,https://www.flickr.com/photos/mauroguanandi/30786915200,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/ 718ef5a99da31acb,https://c1.staticflickr.com/8/7756/26891636440_10c6df03f7_o.jpg,0.2806640625,0.25,0.8419921875,1.0,979,337,https://www.flickr.com/photos/upsticksngo/26891636440,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew,https://www.flickr.com/people/upsticksngo/ b94ad9852c9ade1f,https://c1.staticflickr.com/6/5454/31283029186_991f22e9a3_o.jpg,0.5,0.25,1.0,1.0,327,449,https://www.flickr.com/photos/52450054@N04/31283029186/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 195be0058b857e50,https://c1.staticflickr.com/9/8143/29363298444_58043566c4_o.jpg,0.336764705882,0.0,1.0,1.0,694,870,https://flickr.com/8598276@N07/29363298444,https://creativecommons.org/licenses/by/2.0/,St. George's School,https://www.flickr.com/people/stgeorgesschool/ 443fc3547c981e16,https://c1.staticflickr.com/6/5494/30374133503_74cd143048_o.jpg,0.234642857143,0.0,0.703928571429,0.75,980,542,https://www.flickr.com/photos/hamed/30374133503/,https://creativecommons.org/licenses/by/2.0/,Hamed Saber,https://www.flickr.com/people/hamed/ 63fa27eea73b1428,https://c1.staticflickr.com/9/8120/29744690920_0be1e735d5_o.jpg,0.248713235294,0.25,0.746139705882,1.0,896,860,https://flickr.com/34153108@N06/29744690920,https://creativecommons.org/licenses/by/2.0/,Gerard van der Schaaf,https://www.flickr.com/people/34153108@N06/ 7431d69f14edc70b,https://c1.staticflickr.com/9/8676/30036004390_9e1c281003_o.jpg,0.5,0.0,1.0,0.75,519,318,https://www.flickr.com/photos/box_repsol/30036004390,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ b437185a095f923e,https://c1.staticflickr.com/8/7745/26268247083_89bc1c9376_o.jpg,0.25,0.0,1.0,0.75,389,797,http://www.flickr.com/photos/mondo79/26268247083/,https://creativecommons.org/licenses/by/2.0/,Mondo79,https://www.flickr.com/people/mondo79/ 9b5e40255d8797f1,https://c1.staticflickr.com/6/5770/30511768833_b709f4c4b4_o.jpg,0.281690140845,0.0,0.845070422535,0.75,806,969,https://www.flickr.com/photos/arturtula/30511768833/,https://creativecommons.org/licenses/by/2.0/,Artur (RUS) Potosi,https://www.flickr.com/people/arturtula/ e0bd8812818082e2,https://c1.staticflickr.com/1/641/32012204564_ce07d12148_o.jpg,0.25,0.25,0.75,1.0,490,334,https://www.flickr.com/photos/tinto/32012204564,https://creativecommons.org/licenses/by/2.0/,J\303\266rg Schubert,https://www.flickr.com/people/tinto/ a629afa881a5e414,https://c1.staticflickr.com/8/7496/26514326923_a8cc4330c5_o.jpg,0.0,0.25,0.433127572016,1.0,566,861,https://www.flickr.com/photos/jsjgeology/26514326923,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 7fd59ac546707787,https://c1.staticflickr.com/9/8553/30106308216_bf23b64807_o.jpg,0.0,0.0,0.663235294118,1.0,507,330,https://flickr.com/23119666@N03/30106308216,https://creativecommons.org/licenses/by/2.0/,Mark Bonica,https://www.flickr.com/people/23119666@N03/ adab202e9cd5fcd2,https://c1.staticflickr.com/8/7245/27849545201_8605375a8f_o.jpg,0.4375,0.25,1.0,1.0,522,323,https://www.flickr.com/photos/jeepersmedia/27849545201,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 36ad1ff75147f53e,https://c1.staticflickr.com/9/8767/28168989340_b507d4cfee_o.jpg,0.0,0.0,0.666666666667,1.0,484,847,https://www.flickr.com/photos/tipsfortravellers/28168989340,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ f670c8e22100e14c,https://c1.staticflickr.com/9/8142/27937702403_44d332ce62_o.jpg,0.5,0.25,1.0,1.0,971,398,https://www.flickr.com/photos/davebloggs007/27937702403,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 4d49b986a4350ef0,https://c1.staticflickr.com/8/7469/27918323190_18d5ec65a2_o.jpg,0.210588633288,0.25,0.631765899865,1.0,980,582,https://www.flickr.com/photos/mypubliclands/27918323190/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 1f2bc0bf9093a0b1,https://c1.staticflickr.com/9/8791/27796081224_689be02144_o.jpg,0.0,0.0,0.5,0.75,431,462,https://www.flickr.com/photos/usembassyta/27796081224,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/ d485616379a48d20,https://c1.staticflickr.com/6/5809/29950974770_eb4839cd26_o.jpg,0.28125,0.0,0.84375,0.75,756,407,https://www.flickr.com/photos/yutakaseki/29950974770,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ 1d4bdc8fb076c989,https://c1.staticflickr.com/1/745/32424019766_26c3e81cbd_o.jpg,0.210588633288,0.0,0.631765899865,0.75,405,976,https://flickr.com/99041966@N06/32424019766,https://creativecommons.org/licenses/by/2.0/,Nicky Boogaard,https://www.flickr.com/people/n-bphotography/ b0e0d37759ce4e3a,https://c1.staticflickr.com/6/5801/30823966840_6808acd0cf_o.jpg,0.0,0.0,0.666666666667,1.0,948,435,https://flickr.com/79183573@N08/30823966840,https://creativecommons.org/licenses/by/2.0/,Phil Fiddes,https://www.flickr.com/people/philjose1878/ 69d411b3b5646afa,https://c1.staticflickr.com/8/7250/27225791300_574668b3c6_o.jpg,0.25,0.0,0.75,0.75,582,817,https://www.flickr.com/photos/greggjerdingen/27225791300,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 3ef7d0c5bcbad151,https://c1.staticflickr.com/8/7158/26931819995_04ce080985_o.jpg,0.211382113821,0.25,0.634146341463,1.0,976,832,https://www.flickr.com/photos/discoveroregon/26931819995,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 78d07449cbdd0074,https://c1.staticflickr.com/8/7566/30238377541_2606775bf7_o.jpg,0.318926974665,0.0,1.0,1.0,310,121,https://www.flickr.com/photos/mypubliclands/30238377541/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 7434d610814cdc56,https://c1.staticflickr.com/9/8768/30027974105_25d980db49_o.jpg,0.0,0.0,0.666666666667,1.0,982,624,https://www.flickr.com/photos/apardavila/30027974105/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ c2758960b6f9a899,https://c1.staticflickr.com/8/7299/27557323161_cdbb0428f9_o.jpg,0.493694362018,0.0,1.0,0.75,321,983,https://www.flickr.com/photos/postmanpetecoluk/27557323161/,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ f2f9fa9d862e11ea,https://c1.staticflickr.com/6/5581/31179065985_9692ca8a07_o.jpg,0.28125,0.0,0.84375,0.75,875,511,https://www.flickr.com/photos/pics-by-mpd/31179065985/,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/ c0e76750c6c1708a,https://c1.staticflickr.com/1/304/30734131803_2f17172200_o.jpg,0.0,0.25,0.497426470588,1.0,867,269,https://www.flickr.com/photos/n28307/30734131803,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ 1f71b268ab9b2894,https://c1.staticflickr.com/8/7051/27040061026_5fdfac5efc_o.jpg,0.25,0.25,0.75,1.0,706,378,https://www.flickr.com/photos/jsjgeology/27040061026,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 8a8bd3339833db47,https://c1.staticflickr.com/1/465/32381679615_b7d40e28ff_o.jpg,0.333333333333,0.0,1.0,1.0,604,982,http://www.flickr.com/photos/uk-in-japan/32381679615/,https://creativecommons.org/licenses/by/2.0/,UK in Japan- FCO,https://www.flickr.com/people/uk-in-japan/ 2c68c6ae26e649e7,https://c1.staticflickr.com/6/5524/30148391854_e778ec51e4_o.jpg,0.46754636234,0.25,0.935092724679,1.0,780,948,https://www.flickr.com/photos/thoseguys119/30148391854,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 1f0afdb18a9beb88,https://c1.staticflickr.com/6/5694/25312227679_f5e17a236d_o.jpg,0.28125,0.0,0.84375,0.75,566,466,https://www.flickr.com/photos/railwayofaustralia/25312227679/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/ 422e130b8c40bd9e,https://c1.staticflickr.com/6/5614/31271046960_3566e36498_o.jpg,0.0,0.0,1.0,0.838016528926,348,492,https://www.flickr.com/photos/usfwsmtnprairie/31271046960,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 9f29c0d42a8cfd16,https://c1.staticflickr.com/6/5342/30859918751_30df2c2c14_o.jpg,0.28125,0.25,0.84375,1.0,566,828,https://www.flickr.com/photos/railwayofaustralia/30859918751/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/ 921f74b7d1313db3,https://c1.staticflickr.com/9/8257/28649632904_51833e69bf_o.jpg,0.469650986343,0.25,1.0,1.0,718,405,https://www.flickr.com/photos/hugo90/28649632904,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 1c8d37176aa05ac9,https://c1.staticflickr.com/8/7228/27898265472_0cb216e047_o.jpg,0.0,0.25,0.5625,1.0,481,710,https://www.flickr.com/photos/jeepersmedia/27898265472,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ ca21a4384daebdf4,https://c1.staticflickr.com/6/5604/30719903711_ae4de4f230_o.jpg,0.28125,0.25,0.84375,1.0,826,468,http://www.flickr.com/photos/dimsis/30719903711/,https://creativecommons.org/licenses/by/2.0/,Dimitris Siskopoulos,https://www.flickr.com/people/dimsis/ 2bc556455337129b,https://c1.staticflickr.com/8/7604/26486988663_7bfc5106ef_o.jpg,0.263565891473,0.0,1.0,1.0,702,166,https://flickr.com/126288307@N05/26486988663,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ a9874ddc69c3773e,https://c1.staticflickr.com/8/7198/26987568032_b68efd8a13_o.jpg,0.0,0.0,0.75,0.528409090909,532,619,https://www.flickr.com/photos/51764518@N02/26987568032,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ b8621c85dda872e2,https://c1.staticflickr.com/1/336/31261893400_885da93f70_o.jpg,0.0,0.429527559055,0.75,1.0,437,949,https://www.flickr.com/photos/autohistorian/31261893400,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 9f8c1aee800f7a3d,https://c1.staticflickr.com/8/7379/28173753565_e1701800d0_o.jpg,0.496696035242,0.25,0.993392070485,1.0,314,118,https://www.flickr.com/photos/sybarite48/28173753565,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 8b21457ca3ccb595,https://c1.staticflickr.com/9/8394/29088859210_3aeff38284_o.jpg,0.5,0.0,1.0,0.75,539,520,https://www.flickr.com/photos/vahemart/29088859210,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ c36a95d6daba263c,https://c1.staticflickr.com/6/5713/30718687756_4e3d64e6b6_o.jpg,0.227320675105,0.0,0.681962025316,0.75,355,270,https://www.flickr.com/photos/47652574@N06/30718687756,https://creativecommons.org/licenses/by/2.0/,Tee Cee,https://www.flickr.com/people/tcee35mm/ 3cbba40aacbbcc80,https://c1.staticflickr.com/8/7340/27012431294_5a3cbd7421_o.jpg,0.0,0.0,0.497426470588,0.75,739,603,https://www.flickr.com/photos/danieltoschlaeger/27012431294/,https://creativecommons.org/licenses/by/2.0/,tlwmdbt,https://www.flickr.com/people/danieltoschlaeger/ d4ae0b51e0c5c161,https://c1.staticflickr.com/6/5512/30966022700_f4d9e92aa6_o.jpg,0.5,0.25,1.0,1.0,405,976,https://www.flickr.com/photos/janitors/30966022700,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ bd31d635ef978b3f,https://c1.staticflickr.com/1/537/31851713681_26d83da8ec_o.jpg,0.468616262482,0.25,0.937232524964,1.0,511,224,https://www.flickr.com/photos/tdlucas5000/31851713681,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ 0a0a409aad6e704f,https://c1.staticflickr.com/8/7229/27335443414_799fb9bc4d_o.jpg,0.25,0.0,1.0,1.0,885,37,https://www.flickr.com/photos/43547009@N00/27335443414,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/ fa3cafcaab477f21,https://c1.staticflickr.com/6/5821/31372026075_c75c0b2767_o.jpg,0.25,0.0,1.0,1.0,848,907,https://www.flickr.com/photos/mohit_s/31372026075/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ f6449244abe058a0,https://c1.staticflickr.com/8/7435/27965959886_70048ee073_o.jpg,0.198848684211,0.0,0.596546052632,0.75,920,549,https://www.flickr.com/photos/jeepersmedia/27965959886,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ a36f7818a29ccb92,https://c1.staticflickr.com/9/8350/29366884170_ecc4e82d29_o.jpg,0.376029654036,0.25,1.0,1.0,310,465,https://www.flickr.com/photos/gails_pictures/29366884170/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 6c7e3ceeb5ee2b59,https://c1.staticflickr.com/6/5833/30016507454_1e30207a70_o.jpg,0.37517831669,0.0,1.0,1.0,820,496,https://www.flickr.com/photos/jus10h/30016507454,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 7b0258c3be58e0c9,https://c1.staticflickr.com/9/8344/29150254141_6d57b624e0_o.jpg,0.333333333333,0.0,1.0,1.0,405,830,https://www.flickr.com/photos/markyharky/29150254141/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 572d3b5dc638583a,https://c1.staticflickr.com/6/5833/30346042186_6f168f6405_o.jpg,0.210588633288,0.0,0.631765899865,0.75,706,177,https://www.flickr.com/photos/abhinavnfr/30346042186,https://creativecommons.org/licenses/by/2.0/,Abhinav Phangcho Choudhury,https://www.flickr.com/people/abhinavnfr/ e74a151f4b86e6a3,https://c1.staticflickr.com/9/8530/29328450450_ac84d2d6a9_o.jpg,0.0,0.25,0.75,1.0,777,552,https://www.flickr.com/photos/wwworks/29328450450,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ d21d3b084d0c8691,https://c1.staticflickr.com/6/5684/30382778405_e8383ccb5b_o.jpg,0.249631811487,0.25,0.748895434462,1.0,940,956,https://flickr.com/97760755@N08/30382778405,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/ c1ebefdf4c0143e4,https://c1.staticflickr.com/6/5815/30057647913_2c770d06aa_o.jpg,0.358944954128,0.25,0.598241590214,1.0,780,673,https://www.flickr.com/photos/thoseguys119/30057647913,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 79a6c5c8b04a7108,https://c1.staticflickr.com/9/8873/28679282790_9b58dd9cd3_o.jpg,0.0,0.0,0.501846381093,0.75,407,607,https://www.flickr.com/photos/eltb/28679282790,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 0c467ffdbf86e92f,https://c1.staticflickr.com/1/395/31874535112_0a01e6d045_o.jpg,0.0,0.0,0.547453703704,0.75,920,908,https://www.flickr.com/photos/79157069@N03/31874535112,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ 6001cc9decf254ff,https://c1.staticflickr.com/8/7353/27869081216_a2819336d7_o.jpg,0.128161888702,0.0,1.0,1.0,806,247,https://www.flickr.com/photos/minoritenplatz8/27869081216,https://creativecommons.org/licenses/by/2.0/,"Bundesministerium f\303\274r Europa, Integration und \303\204u\303\237eres",https://www.flickr.com/people/minoritenplatz8/ 67e6bb4051982f03,https://c1.staticflickr.com/9/8075/29786875025_c4a83652b3_o.jpg,0.326939291737,0.0,0.980817875211,0.75,310,314,https://www.flickr.com/photos/gails_pictures/29786875025,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 5821b43dd6cffda0,https://c1.staticflickr.com/1/445/31497636784_3824fcf78d_o.jpg,0.5,0.0,1.0,0.75,979,504,https://www.flickr.com/photos/n28307/31497636784,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ 7ec38ae39a88c314,https://c1.staticflickr.com/9/8462/28749920950_4e2871e85f_o.jpg,0.248713235294,0.0,0.746139705882,0.75,820,617,https://www.flickr.com/photos/agenciabrasilia/28749920950/,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 319c19cfcec52407,https://c1.staticflickr.com/9/8598/28550253931_fa47bd9afe_o.jpg,0.0,0.0,0.666666666667,1.0,512,462,https://www.flickr.com/photos/daveseven/28550253931,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ d9c84f1fccfe314b,https://c1.staticflickr.com/3/2015/32924183885_f45877f864_o.jpg,0.5,0.25,1.0,1.0,885,590,https://flickr.com/8721758@N06/32924183885,https://creativecommons.org/licenses/by/2.0/,Jorge L\303\241scar,https://www.flickr.com/people/jlascar/ 7ccadb841d5cd61d,https://c1.staticflickr.com/1/627/32454573732_bb3a05d8cd_o.jpg,0.25,0.25,0.75,1.0,484,349,https://www.flickr.com/photos/renaud-camus/32454573732/,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/ c3304e13b7bda3c7,https://c1.staticflickr.com/9/8562/30417068616_2b77df34e1_o.jpg,0.0,0.25,0.604132901135,1.0,309,38,https://www.flickr.com/photos/gails_pictures/30417068616,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ df38456297fa9c94,https://c1.staticflickr.com/9/8041/29084106261_060381d8ce_o.jpg,0.25,0.0,1.0,1.0,472,749,https://www.flickr.com/photos/quinet/29084106261,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ efbc9cd5580d04d8,https://c1.staticflickr.com/1/578/32517088401_12d30505d9_o.jpg,0.0,0.25,0.596618357488,1.0,923,603,https://www.flickr.com/photos/garysoup/32517088401,https://creativecommons.org/licenses/by/2.0/,Gary Stevens,https://www.flickr.com/people/garysoup/ 7e32da515522cc2a,https://c1.staticflickr.com/6/5760/29865043584_6b74119851_o.jpg,0.25,0.0,0.75,0.75,518,937,https://www.flickr.com/photos/tim_uk/29865043584,https://creativecommons.org/licenses/by/2.0/,Tim Sheerman-Chase,https://www.flickr.com/people/tim_uk/ b4817b7ed2ef5cab,https://c1.staticflickr.com/9/8850/28261460800_1e12f57ef2_o.jpg,0.0,0.25,0.5,1.0,971,469,https://www.flickr.com/photos/permork/28261460800,https://creativecommons.org/licenses/by/2.0/,Per Mork,https://www.flickr.com/people/permork/ 1481fdedc84f8d7e,https://c1.staticflickr.com/9/8576/28234788343_60063730eb_o.jpg,0.333333333333,0.0,1.0,1.0,820,572,https://www.flickr.com/photos/dwhartwig/28234788343,https://creativecommons.org/licenses/by/2.0/,Daniel Hartwig,https://www.flickr.com/people/dwhartwig/ 91ec6ccae8627bc4,https://c1.staticflickr.com/9/8169/29089000754_e5d0f6008e_o.jpg,0.0,0.0,1.0,1.0,929,428,https://www.flickr.com/photos/danielchownet/29089000754,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/ 6584e4d1e88fc504,https://c1.staticflickr.com/6/5755/30658637601_cddb02ddc5_o.jpg,0.258620689655,0.25,0.775862068966,1.0,982,666,https://www.flickr.com/photos/apardavila/30658637601,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 7775e606614f7109,https://c1.staticflickr.com/9/8504/29366880940_1a0467e53e_o.jpg,0.356605351171,0.0,1.0,0.75,310,363,https://www.flickr.com/photos/gails_pictures/29366880940/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 796c06b3b3e71a2f,https://c1.staticflickr.com/9/8735/27961750923_8c274875e4_o.jpg,0.0,0.0,0.75,0.75,973,779,https://flickr.com/45846171@N04/27961750923,https://creativecommons.org/licenses/by/2.0/,Andy Arthur,https://www.flickr.com/people/andyarthur/ d5a032736124091e,https://c1.staticflickr.com/9/8562/29450157824_76e058afb1_o.jpg,0.0,0.25,0.475899280576,1.0,407,903,https://www.flickr.com/photos/eltb/29450157824,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 67cbc4909c6dc1fe,https://c1.staticflickr.com/9/8405/29870388090_24011a5222_o.jpg,0.25,0.0,1.0,0.57765451664,820,17,https://www.flickr.com/photos/jus10h/29870388090,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 0cf1006fa5ba76f7,https://c1.staticflickr.com/8/7386/27477466395_80a1f2101b_o.jpg,0.4375,0.0,1.0,0.75,763,238,https://www.flickr.com/photos/112024099@N03/27477466395,https://creativecommons.org/licenses/by/2.0/,chomjong,https://www.flickr.com/people/112024099@N03/ 311676a00c8893c4,https://c1.staticflickr.com/8/7292/27908420186_702bf9b39e_o.jpg,0.333333333333,0.0,1.0,1.0,548,425,https://www.flickr.com/photos/rhemkes/27908420186,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 8044dd26fc14de39,https://c1.staticflickr.com/1/591/32315868536_c066a758e2_o.jpg,0.276510067114,0.0,0.829530201342,1.0,769,796,https://flickr.com/44124373758@N01/32315868536,https://creativecommons.org/licenses/by/2.0/,Oisin Hurley,https://www.flickr.com/people/oisinhurley/ 6f9955e55ef99f16,https://c1.staticflickr.com/6/5556/30610774366_1b34f7c58e_o.jpg,0.0,0.25,0.535877862595,1.0,133,72,https://www.flickr.com/photos/usfwsmtnprairie/30610774366,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 7f727c0b0ddfbd0e,https://c1.staticflickr.com/8/7503/29521464522_745013e728_o.jpg,0.479437229437,0.25,0.958874458874,1.0,760,748,https://flickr.com/25797459@N06/29521464522,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/ 08da2f33c958a2c5,https://c1.staticflickr.com/6/5347/31186865752_0d9a0e86ab_o.jpg,0.438430311231,0.0,1.0,1.0,147,86,https://www.flickr.com/photos/blachswan/31186865752,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ 216a352028b5a9ad,https://c1.staticflickr.com/8/7717/27406290326_ebea89f4cf_o.jpg,0.252730109204,0.0,1.0,1.0,19,104,https://www.flickr.com/photos/usfwsmidwest/27406290326,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 3724813a3c8c96ad,https://c1.staticflickr.com/8/7190/27485755226_4e89c38736_o.jpg,0.5,0.0,1.0,0.75,309,534,https://www.flickr.com/photos/nikkvalentine/27485755226,https://creativecommons.org/licenses/by/2.0/,The Manic Macrographer,https://www.flickr.com/people/nikkvalentine/ 33d792783c22d45f,https://c1.staticflickr.com/9/8390/29014863480_f5a0d8533a_o.jpg,0.0,0.0,0.561328125,0.75,324,879,http://www.flickr.com/photos/74542540@N00/29014863480,https://creativecommons.org/licenses/by/2.0/,Amit Patel,https://www.flickr.com/people/amitp/ 793f1ee90bb62f34,https://c1.staticflickr.com/9/8383/29241391666_7762c465ec_o.jpg,0.28882725832,0.25,0.86648177496,1.0,459,592,https://www.flickr.com/photos/r00s/29241391666/,https://creativecommons.org/licenses/by/2.0/,Ro\315\254\315\254\315\240\315\240\315\241\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240s\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240a\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240 Menkman,https://www.flickr.com/people/r00s/ 759a0a1ab6c15443,https://c1.staticflickr.com/8/7755/28099404020_077b11543d_o.jpg,0.0,0.25,0.5,1.0,443,751,https://www.flickr.com/photos/harshlight/28099404020/,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ 4371a4d28a882323,https://c1.staticflickr.com/6/5628/30441063612_2203d5d631_o.jpg,0.25,0.25,1.0,1.0,907,479,https://www.flickr.com/photos/stevendepolo/30441063612,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 9c2a53372d1eff74,https://c1.staticflickr.com/9/8577/28465403076_43a4c79cd2_o.jpg,0.46104815864,0.0,0.92209631728,0.75,404,428,https://www.flickr.com/photos/usnavy/28465403076,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 8f19026252749e5b,https://c1.staticflickr.com/1/722/33093497875_8a8b854e0b_o.jpg,0.248348017621,0.0,0.745044052863,0.75,672,577,https://www.flickr.com/photos/glorycycles/33093497875,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ cc683067d2d52fe8,https://c1.staticflickr.com/6/5560/30616770974_87f1b8efd9_o.jpg,0.468844984802,0.25,1.0,1.0,699,805,https://www.flickr.com/photos/grassrootsgroundswell/30616770974/,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/ b7ed9c42b29598ce,https://c1.staticflickr.com/9/8606/29314683256_920269b591_o.jpg,0.0,0.0,0.75,0.75,918,949,https://www.flickr.com/photos/alexschweigert/29314683256,https://creativecommons.org/licenses/by/2.0/,Alex Schweigert,https://www.flickr.com/people/alexschweigert/ 6fe7ce8ebc8f22b7,https://c1.staticflickr.com/9/8623/28418338381_cf3cef89b1_o.jpg,0.491228070175,0.0,0.982456140351,0.75,977,556,https://www.flickr.com/photos/lizadaly/28418338381,https://creativecommons.org/licenses/by/2.0/,Liza,https://www.flickr.com/people/lizadaly/ c5e0b9edb1fa5190,https://c1.staticflickr.com/1/256/32391565520_a37fa9143c_o.jpg,0.333333333333,0.0,1.0,1.0,689,865,https://www.flickr.com/photos/futureshape/32391565520,https://creativecommons.org/licenses/by/2.0/,Alexander Baxevanis,https://www.flickr.com/people/futureshape/ cfe1a78b6cc154be,https://c1.staticflickr.com/8/7741/26977413172_164c62c313_o.jpg,0.0,0.0,0.83498349835,1.0,602,593,https://www.flickr.com/photos/140473922@N07/26977413172/,https://creativecommons.org/licenses/by/2.0/,malnasfalu,https://www.flickr.com/people/140473922@N07/ 6a51a6a0bd7dc284,https://c1.staticflickr.com/1/589/31654285074_4f1a1396a5_o.jpg,0.5,0.0,1.0,0.75,91,650,https://www.flickr.com/photos/30478819@N08/31654285074,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ d0326f9a31c4300f,https://c1.staticflickr.com/3/2497/32651155722_69025acc65_o.jpg,0.0,0.25,0.5,1.0,617,793,https://www.flickr.com/photos/noaamarinedebris/32651155722/,https://creativecommons.org/licenses/by/2.0/,NOAA Marine Debris Program,https://www.flickr.com/people/noaamarinedebris/ da85153cbce214e9,https://c1.staticflickr.com/6/5609/31109641991_a170505603_o.jpg,0.0,0.0,0.75,1.0,524,627,https://www.flickr.com/photos/mig/31109641991,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/ d55fda7e2688fe42,https://c1.staticflickr.com/8/7752/28427051610_8eb6fcb315_o.jpg,0.0,0.0,0.5,0.75,470,610,https://www.flickr.com/photos/brindle95/28427051610,https://creativecommons.org/licenses/by/2.0/,Apollo,https://www.flickr.com/people/brindle95/ 89bbfa0990f087e8,https://c1.staticflickr.com/6/5730/30582869850_01f2763dfa_o.jpg,0.0,0.4375,0.75,1.0,650,635,https://www.flickr.com/photos/gruenemann/30582869850/,https://creativecommons.org/licenses/by/2.0/,John W. Schulze,https://www.flickr.com/people/gruenemann/ b38fa0e5497c3ab9,https://c1.staticflickr.com/8/7627/27132552874_359ee26d18_o.jpg,0.0,0.0,1.0,1.0,669,754,https://www.flickr.com/photos/serdal/27132552874,https://creativecommons.org/licenses/by/2.0/,Abdulla Al Muhairi,https://www.flickr.com/people/serdal/ 59fe491c8d238f91,https://c1.staticflickr.com/8/7658/26759941810_8e35916b7c_o.jpg,0.28125,0.0,0.84375,0.75,405,843,https://www.flickr.com/photos/u07ch/26759941810,https://creativecommons.org/licenses/by/2.0/,Chris Hoare,https://www.flickr.com/people/u07ch/ ed95f24243c8fb92,https://c1.staticflickr.com/6/5329/30852149700_3c1eb60f62_o.jpg,0.408653846154,0.0,1.0,0.75,471,817,https://www.flickr.com/photos/pyride/30852149700/,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/ 373ae7b6f09b3273,https://c1.staticflickr.com/8/7548/28128328046_4452c1a4da_o.jpg,0.0,0.0,0.579761904762,0.75,787,769,https://www.flickr.com/photos/archivesnz/28128328046,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/ 70495b91befea093,https://c1.staticflickr.com/8/7668/27889938681_431b8a7552_o.jpg,0.25,0.25,0.75,1.0,309,545,https://www.flickr.com/photos/42244964@N03/27889938681,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ 8f08f1f32cca10a5,https://c1.staticflickr.com/1/349/31057978814_0edf8d1d5d_o.jpg,0.25,0.0,1.0,1.0,875,969,https://www.flickr.com/photos/69203347@N03/31057978814,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 5f3702bf2b5c5941,https://c1.staticflickr.com/8/7113/27282503636_32b7c42a14_o.jpg,0.0,0.0,0.5625,0.75,518,816,https://www.flickr.com/photos/investmenttotal/27282503636,https://creativecommons.org/licenses/by/2.0/,InvestmentTotal.com,https://www.flickr.com/people/investmenttotal/ 0fd701f03891ad1e,https://c1.staticflickr.com/8/7495/27791382936_7acdeefab9_o.jpg,0.25,0.0,1.0,0.556376360809,532,710,https://www.flickr.com/photos/51764518@N02/27791382936,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 9c55ed67f01b4bab,https://c1.staticflickr.com/9/8847/28932719496_bb180fac8e_o.jpg,0.0,0.0,0.75,0.5,777,801,https://www.flickr.com/photos/wwworks/28932719496,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ 6cabb8f2ed6a5e48,https://c1.staticflickr.com/8/7215/27535842545_6ecd490e05_o.jpg,0.0,0.230198019802,0.75,0.690594059406,895,791,https://www.flickr.com/photos/lge/27535842545,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 0d99fc710c916c53,https://c1.staticflickr.com/8/7667/26960112102_d5b4713fdc_o.jpg,0.0,0.25,0.75,1.0,418,890,https://www.flickr.com/photos/cydcor/26960112102,https://creativecommons.org/licenses/by/2.0/,Cydcor,https://www.flickr.com/people/cydcor/ 7d8aea537ebbd610,https://c1.staticflickr.com/9/8018/28998694956_53fd3b1c6f_o.jpg,0.5,0.25,1.0,1.0,702,329,https://www.flickr.com/photos/david_a_l/28998694956/,https://creativecommons.org/licenses/by/2.0/,David \303\201lvarez L\303\263pez,https://www.flickr.com/people/david_a_l/ 7191ed980d370988,https://c1.staticflickr.com/8/7572/29457133980_c26b00fbe5_o.jpg,0.25,0.25,0.75,1.0,415,599,https://www.flickr.com/photos/mujitra/29457133980,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/ ce250c5f6c6c925c,https://c1.staticflickr.com/6/5756/30458339032_a7da4229f2_o.jpg,0.0,0.0,1.0,1.0,518,592,https://www.flickr.com/photos/watty_rugby/30458339032/,https://creativecommons.org/licenses/by/2.0/,Steve Watkins,https://www.flickr.com/people/watty_rugby/ c98bb0c38792f9a5,https://c1.staticflickr.com/8/7789/27466002676_65f0081a69_o.jpg,0.438430311231,0.0,1.0,1.0,392,9,https://www.flickr.com/photos/lwpkommunikacio/27466002676,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ c7ea406b501e47cb,https://c1.staticflickr.com/6/5805/29381340434_1be1714322_o.jpg,0.0,0.0,0.5625,0.75,975,329,https://www.flickr.com/photos/jsjgeology/29381340434,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 0804141fc80a512b,https://c1.staticflickr.com/6/5532/31429066966_431fa0dbb0_o.jpg,0.498159057437,0.0,0.996318114875,0.75,752,790,https://www.flickr.com/photos/davehamster/31429066966,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 71522fb58f7879ee,https://c1.staticflickr.com/8/7649/27087307515_c79c6e9b15_o.jpg,0.560479041916,0.0,1.0,1.0,629,526,https://www.flickr.com/photos/glynlowe/27087307515,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ 820e369be4f64c37,https://c1.staticflickr.com/9/8078/29061269866_2508d72a24_o.jpg,0.333333333333,0.0,1.0,1.0,477,121,https://www.flickr.com/photos/elsie/29061269866/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 20c7fdb3317a5432,https://c1.staticflickr.com/8/7104/27718687611_0255d32a65_o.jpg,0.0,0.0,0.75,1.0,866,804,https://www.flickr.com/photos/jeepersmedia/27718687611,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 6a20e5e1e6a570c5,https://c1.staticflickr.com/9/8076/29408860532_04acb42ecd_o.jpg,0.333333333333,0.0,1.0,1.0,699,643,https://www.flickr.com/photos/nanpalmero/29408860532,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/ 8282eeec6fd402db,https://c1.staticflickr.com/9/8383/29262994366_e639cc4093_o.jpg,0.25,0.28125,1.0,0.84375,955,342,https://www.flickr.com/photos/scotnelson/29262994366,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 3c73661be26c374d,https://c1.staticflickr.com/2/1692/26686963731_4c7b05505d_o.jpg,0.243449781659,0.25,0.730349344978,1.0,977,121,https://www.flickr.com/photos/13476480@N07/26686963731,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 2b095b23f25c7333,https://c1.staticflickr.com/6/5487/22762078788_47c4b4437c_o.jpg,0.25,0.25,1.0,1.0,970,679,https://flickr.com/77315663@N00/22762078788,https://creativecommons.org/licenses/by/2.0/,Farther Along,https://www.flickr.com/people/jcbrandon/ 55cb5a6e876a9fef,https://c1.staticflickr.com/1/656/32071453581_44d1d559c2_o.jpg,0.279641185647,0.25,0.838923556942,1.0,309,934,https://www.flickr.com/photos/gails_pictures/32071453581,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 0a90c071f4658ec0,https://c1.staticflickr.com/6/5465/30332288814_32c01f9dde_o.jpg,0.439547581903,0.0,1.0,0.75,662,922,https://www.flickr.com/photos/andreboeni/30332288814,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 11181569176d4648,https://c1.staticflickr.com/6/5557/30880263980_baf0aecb34_o.jpg,0.46499339498,0.0,1.0,1.0,735,975,https://www.flickr.com/photos/hisgett/30880263980,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ b0c2fd91d40d7c35,https://c1.staticflickr.com/6/5723/30242987100_1d78f024ee_o.jpg,0.25,0.25,0.75,1.0,976,569,https://www.flickr.com/photos/jsorbie/30242987100,https://creativecommons.org/licenses/by/2.0/,Jim Sorbie,https://www.flickr.com/people/jsorbie/ 094629f317cb3add,https://c1.staticflickr.com/4/3796/32974694701_9d7d70f691_o.jpg,0.25,0.277173913043,1.0,0.83152173913,418,778,https://www.flickr.com/photos/linvoyage/32974694701/,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ 85d23545982b7f8c,https://c1.staticflickr.com/9/8391/29075134512_71a18865f5_o.jpg,0.25,0.0,1.0,1.0,889,13,https://www.flickr.com/photos/fdecomite/29075134512/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 956869d69ffc83eb,https://c1.staticflickr.com/8/7347/27356657122_70ce604f1b_o.jpg,0.0,0.0,0.745709828393,1.0,806,645,https://www.flickr.com/photos/publicresourceorg/27356657122/,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/ 5f4b4946bdfe2ad4,https://c1.staticflickr.com/9/8361/29445464890_95280f1e96_o.jpg,0.0,0.25,0.5625,1.0,910,549,https://www.flickr.com/photos/orsorama/29445464890/,https://creativecommons.org/licenses/by/2.0/,Franco Dal Molin,https://www.flickr.com/people/orsorama/ 50ebcb625858518c,https://c1.staticflickr.com/6/5505/30700149596_e65533128e_o.jpg,0.249079528719,0.0,0.747238586156,0.75,752,839,https://www.flickr.com/photos/davehamster/30700149596,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 651e466339f928c7,https://c1.staticflickr.com/8/7452/26745627380_eb1760bfb9_o.jpg,0.0,0.0,0.421177266576,0.75,138,679,https://www.flickr.com/photos/barrigoni/26745627380/,https://creativecommons.org/licenses/by/2.0/,HarmonyonPlanetEarth,https://www.flickr.com/people/barrigoni/ adb7ebb0c1aa25d1,https://c1.staticflickr.com/8/7510/28105009625_aaa5c7241c_o.jpg,0.334315169367,0.0,1.0,1.0,618,762,https://www.flickr.com/photos/gobiernodechile/28105009625,https://creativecommons.org/licenses/by/2.0/,Gobierno de Chile,https://www.flickr.com/people/gobiernodechile/ a217a3348fc1ca33,https://c1.staticflickr.com/8/7579/26987845346_84621f3d11_o.jpg,0.4375,0.25,1.0,1.0,47,106,https://www.flickr.com/photos/60740813@N04/26987845346,https://creativecommons.org/licenses/by/2.0/,Michele Lamberti,https://www.flickr.com/people/60740813@N04/ 5395c37718514504,https://c1.staticflickr.com/2/1675/26755595865_59cfb0feec_o.jpg,0.5,0.0,1.0,0.75,15,751,https://www.flickr.com/photos/briangratwicke/26755595865/,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ 8b7694b4d97d4cf5,https://c1.staticflickr.com/1/326/31479470461_0fdb6de0f7_o.jpg,0.31592039801,0.0,0.94776119403,0.75,760,156,https://www.flickr.com/photos/51764518@N02/31479470461,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 7bbe4f3334281c71,https://c1.staticflickr.com/6/5724/30246774161_fabe5f3601_o.jpg,0.5,0.0,1.0,0.75,519,772,https://www.flickr.com/photos/box_repsol/30246774161,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ f4333fecb75d5fb2,https://c1.staticflickr.com/9/8317/29003795082_9be4a6d04f_o.jpg,0.0,0.0,1.0,0.75,708,758,https://www.flickr.com/photos/bazzadarambler/29003795082,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 90e15e3b757438c5,https://c1.staticflickr.com/6/5599/30417754741_84e904e967_o.jpg,0.28125,0.25,0.84375,1.0,699,546,https://www.flickr.com/photos/kudumomo/30417754741/,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/ cfbc3c4a20c315da,https://c1.staticflickr.com/8/7410/27314989426_565dd559ee_o.jpg,0.0,0.0,0.666666666667,1.0,968,473,https://www.flickr.com/photos/barnimages/27314989426,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ 7a668babde838176,https://c1.staticflickr.com/6/5600/29885485184_ce182a163b_o.jpg,0.0,0.282225237449,1.0,0.846675712347,407,814,https://www.flickr.com/photos/eltb/29885485184,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 825ee445b97d2a6f,https://c1.staticflickr.com/8/7365/26272351023_f0a69afd4a_o.jpg,0.25,0.0,0.75,0.75,826,266,https://www.flickr.com/photos/daveynin/26272351023,https://creativecommons.org/licenses/by/2.0/,daveynin,https://www.flickr.com/people/daveynin/ 07125eb61aa541e9,https://c1.staticflickr.com/8/7631/28586505570_e8eb50f6b8_o.jpg,0.502573529412,0.25,1.0,1.0,437,776,https://www.flickr.com/photos/rich701/28586505570,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/ 8ef712565196f839,https://c1.staticflickr.com/1/624/31031634973_5b3036450f_o.jpg,0.381557377049,0.0,1.0,0.75,662,272,https://www.flickr.com/photos/hisgett/31031634973,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 4313065196ceb86a,https://c1.staticflickr.com/8/7666/27433211566_58b7944c90_o.jpg,0.262273413897,0.0,0.786820241692,0.75,780,919,https://www.flickr.com/photos/thoseguys119/27433211566/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 2d9db6275b0e91e1,https://c1.staticflickr.com/9/8831/28433055282_95e08f83e1_o.jpg,0.499263622975,0.0,0.99852724595,0.75,404,523,https://www.flickr.com/photos/usnavy/28433055282,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 6f324b5bb67f51b1,https://c1.staticflickr.com/8/7433/27821048570_3893d31206_o.jpg,0.0,0.0,0.75,1.0,923,819,https://www.flickr.com/photos/yto/27821048570,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/ 0c45a270a6eb9937,https://c1.staticflickr.com/9/8115/29398964756_a216da0724_o.jpg,0.211668928087,0.25,0.635006784261,1.0,539,176,https://www.flickr.com/photos/eltb/29398964756,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ b4039b92b796fd0b,https://c1.staticflickr.com/2/1591/26490880130_670d10231e_o.jpg,0.452546296296,0.0,1.0,0.75,438,169,https://www.flickr.com/photos/kansallisarkisto/26490880130,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/ e513379076125e2c,https://c1.staticflickr.com/8/7471/27822092586_8c43d66994_o.jpg,0.4375,0.25,1.0,1.0,977,770,https://www.flickr.com/photos/bwgtheatre/27822092586,https://creativecommons.org/licenses/by/2.0/,Bradley Griffin,https://www.flickr.com/people/bwgtheatre/ 0304bb981b51f764,https://c1.staticflickr.com/8/7676/27020459980_9f749618ba_o.jpg,0.475453172205,0.0,1.0,0.75,780,845,https://www.flickr.com/photos/thoseguys119/27020459980,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 8a84b78e0ed727f1,https://c1.staticflickr.com/8/7330/28063207555_ef08081098_o.jpg,0.333333333333,0.0,1.0,1.0,480,483,https://www.flickr.com/photos/karen_roe/28063207555,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ ae87647541e29397,https://c1.staticflickr.com/9/8279/29190916386_010b8ac106_o.jpg,0.299878836834,0.0,0.899636510501,0.75,336,356,https://www.flickr.com/photos/peter-trimming/29190916386,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/ ed1bee886ef25504,https://c1.staticflickr.com/9/8868/28063123923_0a27d7f55d_o.jpg,0.0,0.25,0.5,1.0,512,868,https://www.flickr.com/photos/daveseven/28063123923,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ a227fdb9d07c04df,https://c1.staticflickr.com/9/8874/28139783251_c5de8da770_o.jpg,0.258164852255,0.0,1.0,1.0,581,737,https://www.flickr.com/photos/sporst/28139783251,https://creativecommons.org/licenses/by/2.0/,sporst,https://www.flickr.com/people/sporst/ b53073dd1e357be6,https://c1.staticflickr.com/1/607/32558218935_2e52afd6f2_o.jpg,0.25,0.0,1.0,0.75,641,462,https://www.flickr.com/photos/ruthanddave/32558218935,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 433093ec597a8810,https://c1.staticflickr.com/1/781/32163987625_9c26f048ff_o.jpg,0.0,0.0,1.0,0.565217391304,888,713,https://www.flickr.com/photos/eltb/32163987625,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ eb2910f7acc95c57,https://c1.staticflickr.com/9/8543/28574787014_93b71fcf4a_o.jpg,0.25,0.0,0.75,0.75,577,896,https://www.flickr.com/photos/virtualpainter/28574787014,https://creativecommons.org/licenses/by/2.0/,Taka Umemura,https://www.flickr.com/people/virtualpainter/ 3be49614088e63dc,https://c1.staticflickr.com/8/7377/26835732401_9c12ace971_o.jpg,0.0,0.25,0.5625,1.0,934,151,https://www.flickr.com/photos/jeepersmedia/26835732401,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ f99a3c016a7fa202,https://c1.staticflickr.com/8/7730/29296388745_7755996646_o.jpg,0.0,0.25,0.5625,1.0,437,177,https://www.flickr.com/photos/sebilden/29296388745/,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/ 60a3850b34c4c0fe,https://c1.staticflickr.com/8/7279/27212291713_cd85fbc77a_o.jpg,0.249631811487,0.25,0.748895434462,1.0,896,391,https://www.flickr.com/photos/621crw/27212291713,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/ d007442615d580c7,https://c1.staticflickr.com/2/1504/26703054011_6fe7ddc835_o.jpg,0.273846153846,0.0,1.0,1.0,437,458,https://www.flickr.com/photos/darioalvarez/26703054011,https://creativecommons.org/licenses/by/2.0/,Dario Alvarez,https://www.flickr.com/people/darioalvarez/ f8f90b6a2ff3a5ca,https://c1.staticflickr.com/9/8258/29440143700_51967ac0fc_o.jpg,0.25,0.0,1.0,0.75,672,452,https://www.flickr.com/photos/glorycycles/29440143700,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ ee375f7e73e3b84f,https://c1.staticflickr.com/8/7422/28007703456_ae82c2b756_o.jpg,0.4375,0.25,1.0,1.0,599,869,https://www.flickr.com/photos/jordanklein/28007703456/,https://creativecommons.org/licenses/by/2.0/,Jordan Klein,https://www.flickr.com/people/jordanklein/ c857d3f49a6d9c11,https://c1.staticflickr.com/9/8273/30298912162_449559cbff_o.jpg,0.0,0.0,0.5,0.75,556,987,https://www.flickr.com/photos/grahammitchellphotography/30298912162/,https://creativecommons.org/licenses/by/2.0/,Graham Mitchell,https://www.flickr.com/people/grahammitchellphotography/ 1d9f64da62574f30,https://c1.staticflickr.com/9/8889/28297719030_7f933dac1f_o.jpg,0.0,0.0,0.75,1.0,325,766,https://www.flickr.com/photos/130942787@N03/28297719030,https://creativecommons.org/licenses/by/2.0/,Guy Elen,https://www.flickr.com/people/130942787@N03/ b0b583c3294c3ad2,https://c1.staticflickr.com/8/7113/26819420020_231176d14d_o.jpg,0.28125,0.25,0.84375,1.0,418,892,https://www.flickr.com/photos/39993437@N04/26819420020,https://creativecommons.org/licenses/by/2.0/,Jamil Razzaq,https://www.flickr.com/people/39993437@N04/ 9f5cb2c8f2d0b24e,https://c1.staticflickr.com/8/7738/27943924966_9b451d7bdf_o.jpg,0.28125,0.0,0.84375,0.75,820,631,https://www.flickr.com/photos/30677915@N02/27943924966,https://creativecommons.org/licenses/by/2.0/,guy hurst,https://www.flickr.com/people/30677915@N02/ d540cec965053bf6,https://c1.staticflickr.com/8/7469/29532291920_0a1019984d_o.jpg,0.45393858478,0.0,1.0,1.0,963,759,https://www.flickr.com/photos/jsjgeology/29532291920,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ fb9a4a41888c8579,https://c1.staticflickr.com/9/8299/28119126890_e76c980d62_o.jpg,0.333333333333,0.0,1.0,1.0,818,658,https://www.flickr.com/photos/greggjerdingen/28119126890,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 843f9eff05e7fbcc,https://c1.staticflickr.com/3/2836/32790048955_3d3f723197_o.jpg,0.0,0.0,0.662261380323,1.0,672,812,https://www.flickr.com/photos/glorycycles/32790048955,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 6d4119c703062fef,https://c1.staticflickr.com/8/7298/28027403425_8e3b49679c_o.jpg,0.5,0.0,1.0,0.75,252,36,https://www.flickr.com/photos/pasa/28027403425,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 57b8ec98c0c88a16,https://c1.staticflickr.com/8/7027/26734228484_c93025b4ca_o.jpg,0.28125,0.25,0.84375,1.0,780,683,https://www.flickr.com/photos/119034083@N02/26734228484,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/ c3f9ddf6b5ade520,https://c1.staticflickr.com/9/8386/29728121721_2e0c8a36c9_o.jpg,0.0,0.0,0.666666666667,1.0,461,998,https://www.flickr.com/photos/newsoresund/29728121721,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/ ca2a43e512b5c510,https://c1.staticflickr.com/9/8179/29321681252_071d9135a4_o.jpg,0.0,0.0,0.775834658188,1.0,577,919,https://www.flickr.com/photos/jared422/29321681252,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/ 0a98c90a9ffababd,https://c1.staticflickr.com/9/8450/29284081335_8ec6b855f4_o.jpg,0.0,0.0,0.75,1.0,98,819,https://www.flickr.com/photos/9750464@N02/29284081335/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ b47665eea2b4f9ed,https://c1.staticflickr.com/8/7334/27028278075_8847aff92e_o.jpg,0.496696035242,0.25,0.993392070485,1.0,124,883,https://www.flickr.com/photos/whitefield_d/27028278075,https://creativecommons.org/licenses/by/2.0/,whity,https://www.flickr.com/people/whitefield_d/ 2e1107bf5d4ca7c4,https://c1.staticflickr.com/8/7362/27383002910_372db89546_o.jpg,0.0,0.0,0.666666666667,1.0,806,463,https://www.flickr.com/photos/darrencole/27383002910/,https://creativecommons.org/licenses/by/2.0/,Darren765,https://www.flickr.com/people/darrencole/ c798689965793b41,https://c1.staticflickr.com/9/8316/28419798014_8b6002ed9d_o.jpg,0.28125,0.25,0.84375,1.0,718,870,https://www.flickr.com/photos/hugo90/28419798014,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 2284c0096329463d,https://c1.staticflickr.com/1/360/31478354833_9a810029d9_o.jpg,0.5,0.0,1.0,0.75,240,379,https://www.flickr.com/photos/33712891@N04/31478354833,https://creativecommons.org/licenses/by/2.0/,tracydonald,https://www.flickr.com/people/tracydonald/ 9efa722b7b18ecab,https://c1.staticflickr.com/3/2581/32070491794_86376aa5c5_o.jpg,0.25,0.25,0.75,1.0,519,446,https://www.flickr.com/photos/box_repsol/32070491794,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 183fe3f472c4ffec,https://c1.staticflickr.com/8/7318/27290695103_bae3c5a14f_o.jpg,0.250923190547,0.25,0.75276957164,1.0,407,766,https://www.flickr.com/photos/eltb/27290695103,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 417670ae481c9ac3,https://c1.staticflickr.com/9/8337/29863557746_1475feebbc_o.jpg,0.0,0.0,0.421177266576,0.75,669,439,https://www.flickr.com/photos/ankurp/29863557746,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ f3f2347fd7ec8112,https://c1.staticflickr.com/8/7394/27522569541_ac2ee7f2db_o.jpg,0.0,0.0,0.5625,0.75,405,532,https://www.flickr.com/photos/shankaronline/27522569541,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ f3de3a9ff54c7ed5,https://c1.staticflickr.com/6/5441/31015208816_ca68d5492d_o.jpg,0.0,0.0,0.388166449935,0.75,889,89,https://flickr.com/38986305@N06/31015208816,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/ da0ad49443639c49,https://c1.staticflickr.com/6/5555/30437546563_45d097e374_o.jpg,0.0,0.25,0.475215517241,1.0,820,436,https://www.flickr.com/photos/jus10h/30437546563,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ cf8f44a7362cad8e,https://c1.staticflickr.com/6/5731/29806477191_1f35b3120a_o.jpg,0.210588633288,0.25,0.631765899865,1.0,669,601,https://www.flickr.com/photos/ankurp/29806477191,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ e186330fb9c14ec5,https://c1.staticflickr.com/8/7081/27293862200_9435280b38_o.jpg,0.0,0.330871491876,1.0,1.0,407,805,https://www.flickr.com/photos/eltb/27293862200,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 7d772f64ec0c0ec8,https://c1.staticflickr.com/6/5046/29990359851_4efb303572_o.jpg,0.234308131241,0.0,0.702924393723,0.75,556,565,https://www.flickr.com/photos/kansasscanner/29990359851,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 07d7cec77e33a6ba,https://c1.staticflickr.com/6/5710/29862839724_86f5f4c22e_o.jpg,0.253152818991,0.25,0.759458456973,1.0,699,667,https://www.flickr.com/photos/bikashdas/29862839724/,https://creativecommons.org/licenses/by/2.0/,Bikash Das,https://www.flickr.com/people/bikashdas/ ac1435ed348ce988,https://c1.staticflickr.com/9/8607/28337101075_84dce7efee_o.jpg,0.0,0.0,0.75,1.0,975,413,https://www.flickr.com/photos/jsjgeology/28337101075/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 2a259cef3dd194ff,https://c1.staticflickr.com/9/8276/28904784613_eab8cda5e7_o.jpg,0.0,0.25,0.5625,1.0,769,119,https://www.flickr.com/photos/stmunchins/28904784613,https://creativecommons.org/licenses/by/2.0/,St Munchin's College,https://www.flickr.com/people/stmunchins/ 34eff871384c98b7,https://c1.staticflickr.com/8/7285/27676432146_3a9899fb3f_o.jpg,0.248348017621,0.0,0.745044052863,0.75,16,440,https://www.flickr.com/photos/usfwsmidwest/27676432146,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ eaa398ee21a7935a,https://c1.staticflickr.com/3/2217/32464357950_68d26683e9_o.jpg,0.333333333333,0.0,1.0,1.0,116,170,https://www.flickr.com/photos/silkebaron/32464357950,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ ea7f67790d0d1acb,https://c1.staticflickr.com/6/5752/31355012995_65342e278b_o.jpg,0.42174796748,0.25,0.843495934959,1.0,699,713,https://www.flickr.com/photos/franganillo/31355012995,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo,https://www.flickr.com/people/franganillo/ bd81b18fc7aeb622,https://c1.staticflickr.com/8/7522/26715765294_87b57acff7_o.jpg,0.305872756933,0.0,0.917618270799,0.75,776,205,https://www.flickr.com/photos/simanta_ongong/26715765294/,https://creativecommons.org/licenses/by/2.0/,simanta ongong,https://www.flickr.com/people/simanta_ongong/ 3a6e060b4e4e5679,https://c1.staticflickr.com/6/5738/30630040172_cd95d2379b_o.jpg,0.547685834502,0.25,1.0,1.0,982,383,https://www.flickr.com/photos/apardavila/30630040172,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 3671d4e197b45d67,https://c1.staticflickr.com/8/7431/27122090570_37ee609034_o.jpg,0.499263622975,0.0,0.99852724595,0.75,822,500,https://www.flickr.com/photos/nlny/27122090570/,https://creativecommons.org/licenses/by/2.0/,Harrie van Veen,https://www.flickr.com/people/nlny/ c6dc73dd474bd5ef,https://c1.staticflickr.com/9/8679/28253668176_505c1f2058_o.jpg,0.499263622975,0.0,0.99852724595,0.75,499,697,https://www.flickr.com/photos/agenciabrasilia/28253668176,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 228fdb06c678fbae,https://c1.staticflickr.com/8/7063/27869156366_bd427fb4d6_o.jpg,0.333333333333,0.0,1.0,1.0,484,507,https://flickr.com/27538469@N06/27869156366,https://creativecommons.org/licenses/by/2.0/,Colin Gregory,https://www.flickr.com/people/27538469@N06/ ae3a195359c4c198,https://c1.staticflickr.com/1/296/32288947381_dcda20718d_o.jpg,0.0,0.0,0.7484375,1.0,461,483,https://flickr.com/29350288@N06/32288947381,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/ d9ed3c9314e21f56,https://c1.staticflickr.com/9/8461/29183477620_9f3fc3dd83_o.jpg,0.0,0.0,0.662261380323,1.0,484,288,https://www.flickr.com/photos/sybarite48/29183477620,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ b1eea5e72b0bb211,https://c1.staticflickr.com/1/562/32702359576_7b0b8151be_o.jpg,0.0,0.0,0.75,1.0,908,515,https://flickr.com/76396789@N00/32702359576,https://creativecommons.org/licenses/by/2.0/,Tjeerd Wiersma,https://www.flickr.com/people/tjeerd/ b98022eec66378e7,https://c1.staticflickr.com/1/642/31294291983_2bcacc72b0_o.jpg,0.333333333333,0.0,1.0,1.0,760,210,https://flickr.com/116451027@N08/31294291983,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ c0acc56a3abd9256,https://c1.staticflickr.com/8/7409/27819557475_2e66cdf64e_o.jpg,0.0,0.0,0.317273795535,0.75,815,588,http://www.flickr.com/photos/7332125@N04/27819557475,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 579c364d849e4700,https://c1.staticflickr.com/9/8023/28593597514_7a1880f0fe_o.jpg,0.0,0.0,0.666666666667,1.0,651,211,https://www.flickr.com/photos/jus10h/28593597514,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ dfc055abdd389f72,https://c1.staticflickr.com/9/8212/29866116716_8d8686b7ae_o.jpg,0.25,0.28125,1.0,0.84375,459,551,https://www.flickr.com/photos/atoach/29866116716,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ e2a618de2db3ec0c,https://c1.staticflickr.com/9/8399/29408962884_d38742c7dc_o.jpg,0.333333333333,0.0,1.0,1.0,561,642,https://www.flickr.com/photos/smaedli/29408962884,https://creativecommons.org/licenses/by/2.0/,Chad Kainz,https://www.flickr.com/people/smaedli/ 7488970f310fa53f,https://c1.staticflickr.com/8/7192/27399620762_47397920ba_o.jpg,0.0,0.0,0.666666666667,1.0,512,147,https://www.flickr.com/photos/greggjerdingen/27399620762,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 12f9b8aa9d59fd53,https://c1.staticflickr.com/8/7398/27742799606_6703b9c23a_o.jpg,0.5,0.0,1.0,0.75,100,96,https://www.flickr.com/photos/happymillerman/27742799606,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ 9a65078827dee0dc,https://c1.staticflickr.com/1/701/32996049780_873f83d898_o.jpg,0.333333333333,0.0,1.0,1.0,33,635,https://www.flickr.com/photos/briangratwicke/32996049780,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ f26453821e0889ee,https://c1.staticflickr.com/1/717/31979238692_0fbc2ba4d9_o.jpg,0.28125,0.25,0.84375,1.0,635,590,https://flickr.com/59595815@N03/31979238692,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/ 40967df5367606fd,https://c1.staticflickr.com/1/257/31719840804_c9626a2bbd_o.jpg,0.25,0.299738219895,1.0,1.0,747,853,https://flickr.com/56292751@N03/31719840804,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/ a3d0800a98d5da65,https://c1.staticflickr.com/9/8169/28453843191_8e24541875_o.jpg,0.0,0.0,0.663235294118,1.0,615,210,https://www.flickr.com/photos/toomore/28453843191,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/ 903e6d1d34d4c358,https://c1.staticflickr.com/9/8243/29487212981_13dc50542c_o.jpg,0.0,0.25,0.561328125,1.0,961,213,https://www.flickr.com/photos/jwynia/29487212981,https://creativecommons.org/licenses/by/2.0/,J Wynia,https://www.flickr.com/people/jwynia/ 1672d505b98747a4,https://c1.staticflickr.com/6/5786/31141677486_06c9dcdc92_o.jpg,0.0,0.0,0.75,1.0,875,449,https://flickr.com/36548767@N08/31141677486,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/ 7ccfc54dc777e951,https://c1.staticflickr.com/9/8103/28981734635_d03a9a14fc_o.jpg,0.25,0.25,1.0,1.0,980,597,https://www.flickr.com/photos/beglen/28981734635,https://creativecommons.org/licenses/by/2.0/,"David, Bergin, Emmett and Elliott",https://www.flickr.com/people/beglen/ 32fbd27a06cf3e01,https://c1.staticflickr.com/6/5546/30388150293_3135126e54_o.jpg,0.25,0.0,1.0,1.0,763,205,https://www.flickr.com/photos/brighton/30388150293,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ c5ba7deed4f0a13e,https://c1.staticflickr.com/8/7187/27501492822_fda4a5f205_o.jpg,0.333333333333,0.0,1.0,1.0,485,298,https://www.flickr.com/photos/10459174@N03/27501492822/in/pool-1507265@N24/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/ 723f8c75452c186a,https://c1.staticflickr.com/6/5772/30454132455_9b455d662e_o.jpg,0.5,0.0,1.0,0.75,822,791,http://www.flickr.com/photos/132646954@N02/30454132455,https://creativecommons.org/licenses/by/2.0/,dronepicr,https://www.flickr.com/people/132646954@N02/ fcd0a20ee7d5351e,https://c1.staticflickr.com/6/5623/29712252233_d248f6b25b_o.jpg,0.25,0.0,1.0,0.75,617,932,https://flickr.com/49503166727@N01/29712252233,https://creativecommons.org/licenses/by/2.0/,John Patrick Robichaud,https://www.flickr.com/people/troismarteaux/ c60691ff7d33ea2e,https://c1.staticflickr.com/9/8747/28148066654_3f63362d78_o.jpg,0.25,0.0,0.75,0.75,820,660,https://www.flickr.com/photos/thecomeupshow/28148066654/,https://creativecommons.org/licenses/by/2.0/,The Come Up Show,https://www.flickr.com/people/thecomeupshow/ 2e5af1c8c6f07204,https://c1.staticflickr.com/9/8223/29382916804_24ddfaa4ef_o.jpg,0.0,0.25,0.5,1.0,471,451,https://www.flickr.com/photos/dakone2k/29382916804,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/ ca9b59b1a1cf6fcd,https://c1.staticflickr.com/6/5610/31682033341_ccdd5ca983_o.jpg,0.5,0.0,1.0,0.75,857,676,https://www.flickr.com/photos/quinet/31682033341,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 388eedf525c989cb,https://c1.staticflickr.com/8/7553/27056674005_1a4e1598a3_o.jpg,0.5,0.25,1.0,1.0,346,747,https://www.flickr.com/photos/slapers/27056674005,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ bf6b194ab9471379,https://c1.staticflickr.com/9/8563/28536781261_a5c95ccd30_o.jpg,0.25,0.0,1.0,1.0,437,783,https://www.flickr.com/photos/65843623@N02/28536781261,https://creativecommons.org/licenses/by/2.0/,Alberto from Spain,https://www.flickr.com/people/65843623@N02/ f4adc2d2443bfeba,https://c1.staticflickr.com/9/8233/29903332911_947e38648c_o.jpg,0.5,0.0,1.0,0.75,548,432,https://www.flickr.com/photos/rhemkes/29903332911/,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 68178f59e9e1f79a,https://c1.staticflickr.com/9/8381/29363643586_b3ae1b12c7_o.jpg,0.481981981982,0.25,1.0,1.0,718,668,https://www.flickr.com/photos/cogdog/29363643586,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 32b0ed2459c6b80d,https://c1.staticflickr.com/9/8259/28956116063_cd94a1af36_o.jpg,0.0,0.273978685613,0.75,1.0,318,380,https://www.flickr.com/photos/gails_pictures/28956116063,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 41660e685b1f78e7,https://c1.staticflickr.com/8/7476/28114501400_3fbdc63282_o.jpg,0.249079528719,0.25,0.747238586156,1.0,320,247,https://www.flickr.com/photos/remcclean/28114501400,https://creativecommons.org/licenses/by/2.0/,remcclean,https://www.flickr.com/people/remcclean/ 7afb8841dfbeb94b,https://c1.staticflickr.com/1/274/31695969154_4581cebbb7_o.jpg,0.0,0.0,0.777070063694,1.0,306,47,https://www.flickr.com/photos/gails_pictures/31695969154,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 428e143b941e7a4b,https://c1.staticflickr.com/1/744/32093478881_38752b8640_o.jpg,0.48007518797,0.0,1.0,0.75,794,860,http://www.flickr.com/photos/governortomwolf/32093478881/,https://creativecommons.org/licenses/by/2.0/,Governor Tom Wolf,https://www.flickr.com/people/governortomwolf/ ab3c9183c5c6896d,https://c1.staticflickr.com/8/7148/26287121754_8b0f5602f0_o.jpg,0.4375,0.0,1.0,0.75,717,644,https://www.flickr.com/photos/andreboeni/26287121754/,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 8a0af86d3d6be11f,https://c1.staticflickr.com/8/7323/27730962321_d344e9f29a_o.jpg,0.25,0.46493902439,1.0,1.0,842,784,https://flickr.com/45021273@N08/27730962321,https://creativecommons.org/licenses/by/2.0/,Laurel L. Russwurm,https://www.flickr.com/people/laurelrusswurm/ 137625f78bc4ac8f,https://c1.staticflickr.com/6/5680/31220213495_772755cb5d_o.jpg,0.5,0.25,1.0,1.0,490,418,https://www.flickr.com/photos/nanagyei/31220213495/,https://creativecommons.org/licenses/by/2.0/,Nana B Agyei,https://www.flickr.com/people/nanagyei/ 137d815d415a92c2,https://c1.staticflickr.com/9/8420/29534382042_89e903e09f_o.jpg,0.5,0.25,1.0,1.0,99,702,https://www.flickr.com/photos/dfaulder/29534382042/,https://creativecommons.org/licenses/by/2.0/,dfaulder,https://www.flickr.com/people/dfaulder/ 39215655c9a7178e,https://c1.staticflickr.com/1/611/31057981644_1d87486bf7_o.jpg,0.0,0.0,0.75,1.0,875,587,https://www.flickr.com/photos/69203347@N03/31057981644,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 9cb79497fa6c9351,https://c1.staticflickr.com/6/5543/29908346812_be7f055913_o.jpg,0.5,0.0,1.0,0.75,561,292,https://www.flickr.com/photos/116153846@N06/29908346812,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ 7a4d67a64275c208,https://c1.staticflickr.com/6/5746/30776706951_0061c6bc86_o.jpg,0.28125,0.25,0.84375,1.0,875,334,https://www.flickr.com/photos/69203347@N03/30776706951,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 4c8c4ce3649460bd,https://c1.staticflickr.com/9/8339/29751409851_2b3a25033d_o.jpg,0.495555555556,0.25,1.0,1.0,312,388,https://www.flickr.com/photos/52450054@N04/29751409851,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ f9877ce2f6a0b7d3,https://c1.staticflickr.com/8/7333/27814069652_a77657eb50_o.jpg,0.0,0.32917888563,1.0,0.987536656891,524,907,https://www.flickr.com/photos/135431875@N04/27814069652,https://creativecommons.org/licenses/by/2.0/,jackcast2015,https://www.flickr.com/people/135431875@N04/ 14bce548cd76a4d6,https://c1.staticflickr.com/9/8469/29532442732_3e6fc149e8_o.jpg,0.5,0.25,1.0,1.0,152,261,https://www.flickr.com/photos/gammaman/29532442732,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/ f17c25897f023ad5,https://c1.staticflickr.com/9/8507/28880478772_3e5e634b04_o.jpg,0.25,0.0,0.75,0.75,288,232,https://flickr.com/33200530@N04/28880478772,https://creativecommons.org/licenses/by/2.0/,CucombreLibre,https://www.flickr.com/people/33200530@N04/ 2f2e2576ed658403,https://c1.staticflickr.com/8/7554/27831864621_28c5c66736_o.jpg,0.4375,0.0,1.0,0.75,9,660,https://www.flickr.com/photos/rikkis_refuge/27831864621/,https://creativecommons.org/licenses/by/2.0/,Rikki's Refuge,https://www.flickr.com/people/rikkis_refuge/ 917781a809f1d51b,https://c1.staticflickr.com/9/8141/28868278293_69d9d5a6da_o.jpg,0.0,0.0,0.5,0.75,327,68,https://www.flickr.com/photos/52450054@N04/28868278293/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 4425d41fa54572ae,https://c1.staticflickr.com/9/8427/28167655294_a1803ec339_o.jpg,0.0,0.25,0.75,1.0,793,391,https://www.flickr.com/photos/caguard/28167655294,https://creativecommons.org/licenses/by/2.0/,California National Guard,https://www.flickr.com/people/caguard/ 3790af8e5c68f21f,https://c1.staticflickr.com/9/8138/30302307675_fe3ee4b8f9_o.jpg,0.0,0.0,0.561569688769,1.0,976,607,https://flickr.com/10787737@N02/30302307675,https://creativecommons.org/licenses/by/2.0/,osseous,https://www.flickr.com/people/osseous/ b8b2b05fa9d16762,https://c1.staticflickr.com/8/7094/26830110882_df58bdfdd3_o.jpg,0.0879310344828,0.0,1.0,1.0,986,601,https://www.flickr.com/photos/loarie/26830110882,https://creativecommons.org/licenses/by/2.0/,Don Loarie,https://www.flickr.com/people/loarie/ 55476c763e53e913,https://c1.staticflickr.com/8/7135/27922051546_48454255a4_o.jpg,0.242198838897,0.0,0.726596516691,0.75,706,770,https://www.flickr.com/photos/45909111@N00/27922051546,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams,https://www.flickr.com/people/45909111@N00/ 1cfde8428f13e78c,https://c1.staticflickr.com/1/671/32412061321_f1ed5457f2_o.jpg,0.25,0.0,1.0,1.0,547,850,https://flickr.com/89246112@N00/32412061321,https://creativecommons.org/licenses/by/2.0/,Bart,https://www.flickr.com/people/89246112@N00/ 691d3672ba0d151c,https://c1.staticflickr.com/8/7295/26690394084_f6ded2bacf_o.jpg,0.25,0.25,0.75,1.0,518,413,https://www.flickr.com/photos/n28307/26690394084,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ cb2a0eba9d8cc244,https://c1.staticflickr.com/1/467/31220351953_849b44a9f1_o.jpg,0.4375,0.25,1.0,1.0,108,468,https://www.flickr.com/photos/jimg944/31220351953/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 6109d54137b44d32,https://c1.staticflickr.com/9/8399/28975290324_c983753a34_o.jpg,0.281690140845,0.25,0.845070422535,1.0,909,654,https://www.flickr.com/photos/28169156@N03/28975290324,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/ 2faf3ea634f1c11c,https://c1.staticflickr.com/9/8884/28346841561_2968e83d8a_o.jpg,0.332842415317,0.0,0.99852724595,1.0,986,104,https://www.flickr.com/photos/cogdog/28346841561,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ fef650b151701e0e,https://c1.staticflickr.com/8/7234/27399250871_8523057d82_o.jpg,0.0,0.289880952381,0.75,0.869642857143,133,115,https://www.flickr.com/photos/taylar/27399250871,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ e00ce23c7b316857,https://c1.staticflickr.com/6/5792/30184294373_56d9e6d434_o.jpg,0.0,0.0,0.75,1.0,98,155,https://flickr.com/33879687@N05/30184294373,https://creativecommons.org/licenses/by/2.0/,. .,https://www.flickr.com/people/1051980/ fa61b6c9d4988957,https://c1.staticflickr.com/8/7547/27312188780_12eae5c4ec_o.jpg,0.250923190547,0.25,0.75276957164,1.0,821,704,https://www.flickr.com/photos/franklinc55/27312188780,https://creativecommons.org/licenses/by/2.0/,Franklin Campbell,https://www.flickr.com/people/franklinc55/ 7ac7efc575318d7d,https://c1.staticflickr.com/8/7550/26757572961_0aee11e3fd_o.jpg,0.480130057803,0.0,0.960260115607,0.75,822,605,https://www.flickr.com/photos/13476480@N07/26757572961,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 3a18c30e8585b650,https://c1.staticflickr.com/1/335/32548487906_42712204fd_o.jpg,0.0,0.25,0.607317073171,1.0,524,970,https://flickr.com/135431875@N04/32548487906,https://creativecommons.org/licenses/by/2.0/,jackcast2015,https://www.flickr.com/people/135431875@N04/ 23f66121cee4fb69,https://c1.staticflickr.com/8/7385/26988871512_3251f5691a_o.jpg,0.0,0.0,0.5625,0.75,980,565,https://www.flickr.com/photos/ilri/26988871512,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/ a1bbd2e79e9b9ed3,https://c1.staticflickr.com/9/8351/29206927770_3ee5c1f4d6_o.jpg,0.29465849387,0.25,1.0,1.0,325,51,https://www.flickr.com/photos/gails_pictures/29206927770/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ d27438a87d39b36d,https://c1.staticflickr.com/9/8474/29143268935_66ba12e2fc_o.jpg,0.25,0.400242326333,1.0,1.0,418,492,https://www.flickr.com/photos/pavdw/29143268935,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/ 421f9c734a44a065,https://c1.staticflickr.com/1/453/32406031495_82e4c2fb5f_o.jpg,0.25,0.490510948905,1.0,0.98102189781,742,526,https://flickr.com/29570076@N06/32406031495,https://creativecommons.org/licenses/by/2.0/,Yale Law Library,https://www.flickr.com/people/yalelawlibrary/ 817de357d9405774,https://c1.staticflickr.com/9/8860/28576589462_b8044dfe3d_o.jpg,0.210588633288,0.0,0.631765899865,0.75,441,715,https://www.flickr.com/photos/erikkristensen/28576589462/,https://creativecommons.org/licenses/by/2.0/,Erik Cleves Kristensen,https://www.flickr.com/people/erikkristensen/ a52bcf11da0326c2,https://c1.staticflickr.com/9/8837/28615619571_33abb3c596_o.jpg,0.302264808362,0.25,1.0,1.0,320,428,https://www.flickr.com/photos/gails_pictures/28615619571?rb=1,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ fa5f85e11dd99d17,https://c1.staticflickr.com/8/7253/26662097833_6464809e1e_o.jpg,0.4375,0.0,1.0,0.75,294,51,https://www.flickr.com/photos/amanderson/26662097833/,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 50c629ef55774091,https://c1.staticflickr.com/6/5109/29548881943_1d3f7e5c33_o.jpg,0.495594713656,0.0,0.991189427313,0.75,561,791,https://www.flickr.com/photos/barrydahl/29548881943/,https://creativecommons.org/licenses/by/2.0/,Barry Dahl,https://www.flickr.com/people/barrydahl/ ca47311ad359e8f2,https://c1.staticflickr.com/1/577/32495245012_36cdfb55b7_o.jpg,0.0,0.0,0.666666666667,1.0,324,83,https://www.flickr.com/photos/usfwsmidwest/32495245012,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ cbb3ca9e9f433811,https://c1.staticflickr.com/9/8159/28769959655_ef4c8f548b_o.jpg,0.0,0.0,0.5,0.75,405,587,https://www.flickr.com/photos/ronmacphotos/28769959655,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 882a5858f009a6ee,https://c1.staticflickr.com/9/8136/30386732686_24a35e3be4_o.jpg,0.4375,0.0,1.0,0.75,872,965,https://www.flickr.com/photos/slapers/30386732686,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 86dfeb7312773b5d,https://c1.staticflickr.com/8/7552/26270924594_2122f7969e_o.jpg,0.503303964758,0.0,1.0,0.75,643,942,https://www.flickr.com/photos/amslerpix/26270924594/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 37adf37ecb5e5fce,https://c1.staticflickr.com/9/8419/29447125535_fbd62255f9_o.jpg,0.251849112426,0.0,0.755547337278,0.75,985,126,https://www.flickr.com/photos/dominicspics/29447125535/,https://creativecommons.org/licenses/by/2.0/,Dominic Alves,https://www.flickr.com/people/dominicspics/ a600298956469f9f,https://c1.staticflickr.com/8/7386/27577591321_d298ed04d5_o.jpg,0.5,0.25,1.0,1.0,706,630,https://www.flickr.com/photos/126337928@N05/27577591321/,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ bc0daf048b619a2b,https://c1.staticflickr.com/1/721/31594508410_286d30e768_o.jpg,0.333333333333,0.0,1.0,1.0,718,675,https://flickr.com/124442726@N06/31594508410,https://creativecommons.org/licenses/by/2.0/,Truck Hardware,https://www.flickr.com/people/truckhardware/ 40028a513882a923,https://c1.staticflickr.com/6/5720/30036006370_1478c56dcb_o.jpg,0.5,0.0,1.0,0.75,519,425,https://www.flickr.com/photos/box_repsol/30036006370,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 36a213638a700215,https://c1.staticflickr.com/9/8729/27887557974_5d30629219_o.jpg,0.25,0.0,0.75,0.75,699,590,https://www.flickr.com/photos/raita/27887557974,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/ fde3b2adfe9c5b64,https://c1.staticflickr.com/9/8143/28410300184_da6d2c874b_o.jpg,0.215753424658,0.0,0.647260273973,0.75,760,190,https://www.flickr.com/photos/mdpettitt/28410300184,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/ 45d7dd8920bbc306,https://c1.staticflickr.com/9/8658/28753347835_4e6fd879b6_o.jpg,0.25,0.25,0.75,1.0,133,196,https://www.flickr.com/photos/walterpro/28753347835,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ f36acec36484bd2b,https://c1.staticflickr.com/8/7418/27823039141_132ce81401_o.jpg,0.28125,0.25,0.84375,1.0,583,906,https://www.flickr.com/photos/shankaronline/27823039141/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 4595c561ddece482,https://c1.staticflickr.com/6/5807/31108785395_c8974bc085_o.jpg,0.415322580645,0.0,0.83064516129,0.75,629,645,https://www.flickr.com/photos/prayitnophotography/31108785395,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 6b4a921e14c00eb6,https://c1.staticflickr.com/6/5139/29854449210_49d4834c4a_o.jpg,0.5,0.0,1.0,0.75,561,837,https://flickr.com/100379608@N08/29854449210,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/ 403ed8d0bd52e635,https://c1.staticflickr.com/1/595/32662656931_9bf258e736_o.jpg,0.5,0.25,1.0,1.0,8,652,https://flickr.com/99604640@N00/32662656931,https://creativecommons.org/licenses/by/2.0/,Ilya Yakubovich,https://www.flickr.com/people/yakubovich/ 1b465950df77627d,https://c1.staticflickr.com/6/5293/29916688155_52d6c6f51b_o.jpg,0.578822733424,0.0,1.0,0.75,418,814,https://www.flickr.com/photos/pavdw/29916688155,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/ a04c9b37bb551245,https://c1.staticflickr.com/8/7683/26561798614_df37c4acd6_o.jpg,0.333333333333,0.0,1.0,1.0,458,940,https://www.flickr.com/photos/romanboed/26561798614,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/ f0211f1f1c8ca37b,https://c1.staticflickr.com/8/7387/27352570472_059fbe3763_o.jpg,0.25,0.0,0.75,0.75,548,50,https://www.flickr.com/photos/rhemkes/27352570472,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 7b029514afd6c6c7,https://c1.staticflickr.com/8/7189/27026523461_5f7c63778a_o.jpg,0.0,0.0,0.75,0.75,540,410,https://www.flickr.com/photos/home_of_chaos/27026523461,https://creativecommons.org/licenses/by/2.0/,thierry ehrmann,https://www.flickr.com/people/home_of_chaos/ b93bd310c51d873f,https://c1.staticflickr.com/8/7484/28010641131_a80fab4b7c_o.jpg,0.5,0.0,1.0,0.75,731,710,https://www.flickr.com/photos/elsie/28010641131,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ f9176d709b39bb17,https://c1.staticflickr.com/1/520/31429235570_b9ccdd3976_o.jpg,0.25,0.0,0.75,0.75,407,988,https://www.flickr.com/photos/shankaronline/31429235570,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ d49b767f40f78ff3,https://c1.staticflickr.com/1/561/31728841953_ea588f7cf5_o.jpg,0.0,0.0,0.5625,0.75,780,931,https://www.flickr.com/photos/thoseguys119/31728841953,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ dbd9031659bd49cb,https://c1.staticflickr.com/9/8471/29260542504_8e26cd4ed5_o.jpg,0.0,0.25,0.75,1.0,582,391,https://www.flickr.com/photos/moto_club4ag/29260542504/,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ 15a5dc74059f1e41,https://c1.staticflickr.com/6/5618/30624692935_f577a0e7c4_o.jpg,0.4375,0.0,1.0,0.75,780,391,https://www.flickr.com/photos/thoseguys119/30624692935,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 8ba9a02fbab6aa8a,https://c1.staticflickr.com/9/8738/29073986172_dd9c6d2011_o.jpg,0.248348017621,0.0,0.745044052863,0.75,980,718,https://www.flickr.com/photos/132870281@N02/29073986172,https://creativecommons.org/licenses/by/2.0/,alexis dupuis,https://www.flickr.com/people/132870281@N02/ b17213667cb4bf0c,https://c1.staticflickr.com/6/5710/30483643802_e64ac894c5_o.jpg,0.0,0.25,0.5,1.0,868,83,https://www.flickr.com/photos/76969036@N02/30483643802,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 0a002669d7bdc690,https://c1.staticflickr.com/8/7084/26716288432_71c372e5cb_o.jpg,0.5,0.25,1.0,1.0,519,513,https://www.flickr.com/photos/box_repsol/26716288432,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ b9b01d201a3a2c8d,https://c1.staticflickr.com/1/381/31058132884_363b0183cb_o.jpg,0.0,0.0,0.75,1.0,875,263,https://www.flickr.com/photos/69203347@N03/31058132884,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ df4ad15dc252a8db,https://c1.staticflickr.com/6/5585/29848121941_28bfc875b7_o.jpg,0.281165311653,0.0,0.843495934959,1.0,980,789,https://www.flickr.com/photos/itravelnz/29848121941/,https://creativecommons.org/licenses/by/2.0/,itravelNZ\302\256 - New Zealand in your pocket\342\204\242,https://www.flickr.com/people/itravelnz/ 57330c1a8e20616e,https://c1.staticflickr.com/8/7797/27620429334_9396b70e17_o.jpg,0.4375,0.0,1.0,0.75,763,203,https://www.flickr.com/photos/112024099@N03/27620429334,https://creativecommons.org/licenses/by/2.0/,chomjong,https://www.flickr.com/people/112024099@N03/ 828b40df1e3937e0,https://c1.staticflickr.com/9/8300/29170935613_4854323658_o.jpg,0.0,0.25,0.5,1.0,909,645,https://www.flickr.com/photos/fun_flying/29170935613,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/ c453bd91493bd022,https://c1.staticflickr.com/1/764/31905300696_effc8c8feb_o.jpg,0.0,0.0,0.666666666667,1.0,512,631,https://www.flickr.com/photos/42220226@N07/31905300696,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ b68ef7a9a72eb0e4,https://c1.staticflickr.com/1/562/30958089704_ebff9798c5_o.jpg,0.0,0.0,0.67551369863,0.75,304,528,https://www.flickr.com/photos/33398884@N03/30958089704/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 0cb76df6941f0375,https://c1.staticflickr.com/9/8700/28416430300_cf1e6456da_o.jpg,0.244897959184,0.0,1.0,1.0,318,124,https://www.flickr.com/photos/gails_pictures/28416430300/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 3b9abecfb8ac2c2c,https://c1.staticflickr.com/6/5680/29930820805_a78abc78e6_o.jpg,0.24213836478,0.0,1.0,1.0,561,855,https://www.flickr.com/photos/dirkhansen/29930820805,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/ bca7fa00d4446fbe,https://c1.staticflickr.com/6/5597/31443844785_76305c2d14_o.jpg,0.5,0.25,1.0,1.0,561,741,https://www.flickr.com/photos/codnewsroom/31443844785/,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ fc401415837270be,https://c1.staticflickr.com/9/8808/28180843881_ef03d589b2_o.jpg,0.333333333333,0.0,1.0,1.0,374,956,https://www.flickr.com/photos/ivyfield/28180843881,https://creativecommons.org/licenses/by/2.0/,Yutaka Tsutano,https://www.flickr.com/people/ivyfield/ a8a8c84378c8f2fa,https://c1.staticflickr.com/9/8276/28343695574_e11c16663d_o.jpg,0.0,0.0,0.643394648829,0.75,314,621,https://www.flickr.com/photos/orangeaurochs/28343695574/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ 363952704be794fc,https://c1.staticflickr.com/9/8224/29739646571_7e0f58944a_o.jpg,0.25,0.0,1.0,0.75,309,478,https://www.flickr.com/photos/treegrow/29739646571,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 20ec63305a2e1821,https://c1.staticflickr.com/6/5337/30379166585_5db26d69aa_o.jpg,0.270252324037,0.0,0.810756972112,1.0,820,942,https://www.flickr.com/photos/peterhess/30379166585,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/ 9f9cce2592904f22,https://c1.staticflickr.com/9/8280/29820900685_b60ea3a774_o.jpg,0.0,0.0,0.75,0.75,986,962,https://www.flickr.com/photos/atoach/29820900685,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 64cabd20539131ff,https://c1.staticflickr.com/9/8424/29505212301_6403f4f2e4_o.jpg,0.56106505102,0.0,0.935108418367,0.75,780,352,https://www.flickr.com/photos/thoseguys119/29505212301,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c664a99912ef23a4,https://c1.staticflickr.com/1/462/32207905181_7b70eac967_o.jpg,0.0,0.0,0.666666666667,1.0,854,377,https://www.flickr.com/photos/13476480@N07/32207905181,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 81e9ef687578c9fb,https://c1.staticflickr.com/9/8521/29831864285_1dcb9ab81f_o.jpg,0.317068106312,0.25,0.951204318937,1.0,309,540,http://www.flickr.com/photos/35142635@N05/29831864285/,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ dd00c7e6d61a55d3,https://c1.staticflickr.com/8/7712/26409219564_ac8b2980da_o.jpg,0.499263622975,0.25,0.99852724595,1.0,820,211,https://www.flickr.com/photos/usmarshals/26409219564,https://creativecommons.org/licenses/by/2.0/,Office of Public Affairs,https://www.flickr.com/people/usmarshals/ 5ac56d8491faf69c,https://c1.staticflickr.com/6/5703/22847393558_c58089d50d_o.jpg,0.25,0.25,0.75,1.0,719,478,https://www.flickr.com/photos/dalecruse/22847393558/,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/ c89c5c0021098951,https://c1.staticflickr.com/9/8719/27969390944_1b4b87c0f2_o.jpg,0.2806640625,0.25,0.8419921875,1.0,422,479,https://www.flickr.com/photos/maxime-b/27969390944/,https://creativecommons.org/licenses/by/2.0/,Maxime B,https://www.flickr.com/people/maxime-b/ f47fc3732465de83,https://c1.staticflickr.com/3/2943/32076298194_ef3966dab5_o.jpg,0.333333333333,0.0,1.0,1.0,765,732,https://www.flickr.com/photos/big-ashb/32076298194,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/ 50db8c31bb4a4eec,https://c1.staticflickr.com/9/8195/28533281404_fa34230a83_o.jpg,0.25,0.28125,1.0,0.84375,985,701,https://www.flickr.com/photos/usfwsmtnprairie/28533281404,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 244633b53f8cbef5,https://c1.staticflickr.com/8/7525/26603745364_ac970a1b11_o.jpg,0.2806640625,0.0,0.8419921875,0.75,875,284,https://www.flickr.com/photos/dariuspinkston/26603745364,https://creativecommons.org/licenses/by/2.0/,Darius Pinkston,https://www.flickr.com/people/dariuspinkston/ 21c79fad9b01ac68,https://c1.staticflickr.com/9/8471/29367417270_fc801e8063_o.jpg,0.0,0.0,0.599757673667,0.75,295,863,https://www.flickr.com/photos/10459174@N03/29367417270,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/ e2cb61a9e4485409,https://c1.staticflickr.com/6/5577/29978271993_1a8025fb1e_o.jpg,0.5,0.0,1.0,0.75,763,844,https://flickr.com/36704648@N02/29978271993,https://creativecommons.org/licenses/by/2.0/,Ubud Writers & Readers Festival,https://www.flickr.com/people/ubudwritersfest/ 85c285af98ab8168,https://c1.staticflickr.com/6/5714/30506593650_f2be9d1df2_o.jpg,0.0,0.0,1.0,1.0,973,537,https://www.flickr.com/photos/charithmania/30506593650,https://creativecommons.org/licenses/by/2.0/,Charith Gunarathna,https://www.flickr.com/people/charithmania/ e150314705ec99a4,https://c1.staticflickr.com/9/8581/28872407634_9d3344982e_o.jpg,0.0,0.25,0.497426470588,1.0,54,653,https://www.flickr.com/photos/93467196@N02/28872407634/,https://creativecommons.org/licenses/by/2.0/,Frost Museum,https://www.flickr.com/people/93467196@N02/ a4bce66eb95418aa,https://c1.staticflickr.com/9/8732/27688278394_ffd07306cf_o.jpg,0.0,0.0,0.830592105263,1.0,393,817,https://www.flickr.com/photos/noaaphotolib/27688278394/,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ e76f4a4a05e77e20,https://c1.staticflickr.com/1/466/30957552583_2184d3c7b3_o.jpg,0.5,0.25,1.0,1.0,831,646,https://www.flickr.com/photos/dfid/30957552583,https://creativecommons.org/licenses/by/2.0/,DFID - UK Department for International Development,https://www.flickr.com/people/dfid/ 42e193ecfc2e3441,https://c1.staticflickr.com/9/8544/28856563790_1a25355065_o.jpg,0.28125,0.0,0.84375,0.75,971,600,https://www.flickr.com/photos/29638108@N06/28856563790/,https://creativecommons.org/licenses/by/2.0/,Jennifer C.,https://www.flickr.com/people/29638108@N06/ 9b1ab3c04cd2b27a,https://c1.staticflickr.com/8/7597/28569602895_0326b29234_o.jpg,0.43661971831,0.25,1.0,1.0,526,758,https://flickr.com/64552256@N08/28569602895,https://creativecommons.org/licenses/by/2.0/,Dage - Looking For Europe,https://www.flickr.com/people/64552256@N08/ 3368343d0ddce5db,https://c1.staticflickr.com/9/8204/29776380022_0799cf1f9d_o.jpg,0.328402366864,0.0,1.0,1.0,320,161,https://www.flickr.com/photos/gaby1/29776380022/,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 313ceb183e6238d8,https://c1.staticflickr.com/6/5696/29657839680_772fc9e40c_o.jpg,0.296147672552,0.25,0.888443017657,1.0,976,388,https://www.flickr.com/photos/22711505@N05/29657839680,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 9e4d03d077a5b514,https://c1.staticflickr.com/6/5585/30507117015_49b7a2e295_o.jpg,0.5,0.25,1.0,1.0,913,130,https://www.flickr.com/photos/erikstarck/30507117015/,https://creativecommons.org/licenses/by/2.0/,Erik Starck,https://www.flickr.com/people/erikstarck/ 96970834c771040a,https://c1.staticflickr.com/1/265/31268902733_2e72721c48_o.jpg,0.0,0.25,0.582802547771,1.0,498,795,https://www.flickr.com/photos/torontohistory/31268902733,https://creativecommons.org/licenses/by/2.0/,Toronto History,https://www.flickr.com/people/torontohistory/ 355014caf5f2c2e0,https://c1.staticflickr.com/8/7414/27623246112_d4204dbc91_o.jpg,0.5,0.25,1.0,1.0,896,717,https://www.flickr.com/photos/7armyjmtc/27623246112,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 9244be3c4be9f73c,https://c1.staticflickr.com/8/7564/27568772651_4dd389119f_o.jpg,0.28125,0.25,0.84375,1.0,896,574,https://www.flickr.com/photos/28169156@N03/27568772651,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/ 8550de628994fdf7,https://c1.staticflickr.com/8/7054/27014642882_2971712694_o.jpg,0.0,0.48275862069,0.75,1.0,558,893,https://www.flickr.com/photos/113306963@N05/27014642882,https://creativecommons.org/licenses/by/2.0/,travelmag.com,https://www.flickr.com/people/113306963@N05/ f61623b1362bec02,https://c1.staticflickr.com/1/317/31936317472_8cb3aa45e1_o.jpg,0.333333333333,0.0,1.0,1.0,23,300,https://www.flickr.com/photos/paxson_woelber/31936317472/,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/ 87551e658af4abfd,https://c1.staticflickr.com/9/8080/29514225756_7062712d91_o.jpg,0.249631811487,0.0,0.748895434462,0.75,466,92,https://www.flickr.com/photos/usmarshals/29514225756,https://creativecommons.org/licenses/by/2.0/,Office of Public Affairs,https://www.flickr.com/people/usmarshals/ a4de0f834e585cb7,https://c1.staticflickr.com/8/7451/27927864891_ef43413c2d_o.jpg,0.0,0.0,0.611581920904,1.0,789,869,https://www.flickr.com/photos/peterscherub/27927864891,https://creativecommons.org/licenses/by/2.0/,judy dean,https://www.flickr.com/people/peterscherub/ a79e31315f8dfb99,https://c1.staticflickr.com/9/8048/29469839615_2be181acf5_o.jpg,0.0,0.0,0.666666666667,1.0,548,288,https://www.flickr.com/photos/rhemkes/29469839615,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ d84fb33e3a6212ca,https://c1.staticflickr.com/9/8034/29736819671_9cf0fc2077_o.jpg,0.0,0.496301775148,0.75,1.0,459,762,https://www.flickr.com/photos/atoach/29736819671,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ c7b729498c8fc7ae,https://c1.staticflickr.com/1/669/32050027072_03d657abdf_o.jpg,0.25,0.0,0.75,0.75,4,334,https://www.flickr.com/photos/146401137@N06/32050027072,https://creativecommons.org/licenses/by/2.0/,Jin Kemoole,https://www.flickr.com/people/146401137@N06/ d56010e1feabc7c4,https://c1.staticflickr.com/1/551/31061670453_2da4e7a7e8_o.jpg,0.333333333333,0.0,1.0,1.0,719,797,https://www.flickr.com/photos/danielchodusov/31061670453/,https://creativecommons.org/licenses/by/2.0/,Daniel Chodusov,https://www.flickr.com/people/danielchodusov/ e8b762491b4655d4,https://c1.staticflickr.com/9/8094/29011785896_4bf67b3d00_o.jpg,0.0,0.0354609929078,1.0,1.0,986,707,https://www.flickr.com/photos/35142635@N05/29011785896,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ d1427d0f270bd4df,https://c1.staticflickr.com/6/5599/31715077946_448f61f085_o.jpg,0.292127071823,0.0,0.87638121547,1.0,544,304,https://www.flickr.com/photos/51764518@N02/31715077946,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 822227e38f029c4f,https://c1.staticflickr.com/9/8187/29408968022_c4191393bd_o.jpg,0.0,0.0,0.666666666667,1.0,819,928,https://www.flickr.com/photos/nanpalmero/29408968022/,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/ cdeb5d6d390441b8,https://c1.staticflickr.com/9/8290/28907705042_c5bdc5b73e_o.jpg,0.0,0.251849112426,0.75,0.755547337278,407,824,https://www.flickr.com/photos/eltb/28907705042,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ ddaa8a00596ca5a0,https://c1.staticflickr.com/9/8286/28608540933_97d5a13f99_o.jpg,0.5,0.0,1.0,0.75,405,998,https://www.flickr.com/photos/markyharky/28608540933/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 1d56331cc332d8c0,https://c1.staticflickr.com/6/5035/30070809681_58637f77e0_o.jpg,0.0,0.25,0.452314165498,1.0,752,873,https://flickr.com/84991107@N08/30070809681,https://creativecommons.org/licenses/by/2.0/,lmankram7,https://www.flickr.com/people/lmankram7/ 1b47c0f04142e2e1,https://c1.staticflickr.com/8/7314/26729384311_0a5a9bd00e_o.jpg,0.4375,0.0,1.0,0.75,336,174,https://www.flickr.com/photos/tahini/26729384311,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank,https://www.flickr.com/people/tahini/ 820de8657297cdef,https://c1.staticflickr.com/8/7134/27479111995_3d4e8d05d8_o.jpg,0.0,0.25,0.5,1.0,348,429,https://www.flickr.com/photos/137837832@N07/27479111995,https://creativecommons.org/licenses/by/2.0/,Mark Holloway,https://www.flickr.com/people/137837832@N07/ 8f79430fd8fa0266,https://c1.staticflickr.com/6/5124/29753916150_acbf6eabb6_o.jpg,0.25,0.0,1.0,0.558411214953,407,1000,https://www.flickr.com/photos/eltb/29753916150,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 0ffa4e0eef72f7ed,https://c1.staticflickr.com/8/7541/30027975025_d1813cd422_o.jpg,0.0,0.0,0.666666666667,1.0,982,538,https://www.flickr.com/photos/apardavila/30027975025/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 6581cedbb54131d1,https://c1.staticflickr.com/9/8084/29162188826_96b949b64c_o.jpg,0.0,0.0,0.75,1.0,604,364,https://www.flickr.com/photos/127226743@N02/29162188826,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 013a793e570ce867,https://c1.staticflickr.com/9/8415/30230835226_869c38a5db_o.jpg,0.0,0.0,0.654970760234,1.0,114,174,https://www.flickr.com/photos/mypubliclands/30230835226,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 167502396f459582,https://c1.staticflickr.com/6/5522/30406722161_36f4cfdf1b_o.jpg,0.28125,0.0,0.84375,0.75,346,861,https://www.flickr.com/photos/heleenmeijer/30406722161/,https://creativecommons.org/licenses/by/2.0/,Helena,https://www.flickr.com/people/heleenmeijer/ b9f1fb7576442a86,https://c1.staticflickr.com/1/514/32106645611_04e8d874cb_o.jpg,0.275735294118,0.0,0.827205882353,0.75,321,943,https://flickr.com/47602497@N06/32106645611,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/ 1b8fa35bda34ea7e,https://c1.staticflickr.com/8/7034/26946866475_f2240fae57_o.jpg,0.0,0.0,0.5625,0.75,815,515,https://www.flickr.com/photos/brisbanecitycouncil/26946866475,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/ db3ce966322fd79c,https://c1.staticflickr.com/2/1694/26481174770_9ac2c7df0f_o.jpg,0.333333333333,0.0,1.0,1.0,820,875,https://www.flickr.com/photos/sansebastian2016/26481174770,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/ eaae60306488ad99,https://c1.staticflickr.com/6/5623/22772543648_700b0f0963_o.jpg,0.28125,0.0,0.84375,0.75,532,957,https://www.flickr.com/photos/rainsong/22772543648,https://creativecommons.org/licenses/by/2.0/,Ali - \330\271\331\204\331\212 from Riyadh - \331\205\331\206 \330\247\331\204\330\261\331\212\330\247\330\266,https://www.flickr.com/people/rainsong/ 1eb05e3710140666,https://c1.staticflickr.com/8/7253/27617862902_e302d03b77_o.jpg,0.0,0.0,0.965794768612,1.0,761,94,https://www.flickr.com/photos/lge/27617862902,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 4023051e19fd71fb,https://c1.staticflickr.com/1/633/31676057536_42fb312118_o.jpg,0.5,0.25,1.0,1.0,820,201,https://www.flickr.com/photos/stevendepolo/31676057536/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ ea2b0f67bfe3dbf0,https://c1.staticflickr.com/8/7347/26678552450_6916692f58_o.jpg,0.0912220309811,0.0,1.0,1.0,309,326,https://www.flickr.com/photos/gails_pictures/26678552450,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 0076988fe4283df7,https://c1.staticflickr.com/8/7271/27075113073_4d5606ee7d_o.jpg,0.0,0.0,0.714503816794,1.0,613,314,https://www.flickr.com/photos/13476480@N07/27075113073,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 0cd36caf25713a59,https://c1.staticflickr.com/9/8828/29789512266_e9e38132ce_o.jpg,0.415322580645,0.25,0.83064516129,1.0,963,437,https://www.flickr.com/photos/jsjgeology/29789512266,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e30a9ae501e9c1e9,https://c1.staticflickr.com/9/8235/29200277835_b2a5bb8e93_o.jpg,0.25,0.328205128205,1.0,1.0,343,670,https://flickr.com/7660730@N08/29200277835,https://creativecommons.org/licenses/by/2.0/,Jeremy Sutcliffe,https://www.flickr.com/people/jmts/ e10a19df1718e464,https://c1.staticflickr.com/9/8019/29004734360_a4a8f5957d_o.jpg,0.331069609508,0.0,0.993208828523,0.75,309,369,https://www.flickr.com/photos/gails_pictures/29004734360,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 9f340eca7b32bd1e,https://c1.staticflickr.com/9/8564/28678452345_baa5d09167_o.jpg,0.25,0.25,0.75,1.0,821,402,https://www.flickr.com/photos/kecko/28678452345/,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ bedc314a6098a667,https://c1.staticflickr.com/8/7606/26754568921_07e07e417f_o.jpg,0.236593059937,0.0,1.0,1.0,821,751,https://www.flickr.com/photos/trolleway/26754568921,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/ 2d760d56d41046d5,https://c1.staticflickr.com/8/7123/27846361561_fe1de683ea_o.jpg,0.0,0.0,0.666666666667,1.0,848,59,https://www.flickr.com/photos/137837832@N07/27846361561,https://creativecommons.org/licenses/by/2.0/,Mark Holloway,https://www.flickr.com/people/137837832@N07/ 482cc9f4f6898b37,https://c1.staticflickr.com/8/7771/29831714195_cbb9b42197_o.jpg,0.151414309484,0.0,1.0,1.0,305,755,https://www.flickr.com/photos/35142635@N05/29831714195,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 498e2bd959cefdb6,https://c1.staticflickr.com/8/7648/27099636454_b62f1bbec5_o.jpg,0.0,0.5,0.75,1.0,808,555,https://www.flickr.com/photos/rdecom/27099636454,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/ 78c489239b3b97ea,https://c1.staticflickr.com/9/8421/29395607952_1a27464152_o.jpg,0.4375,0.25,1.0,1.0,780,757,https://www.flickr.com/photos/thoseguys119/29395607952,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 4bed2cc145dfea94,https://c1.staticflickr.com/9/8557/29728891655_9141e77de2_o.jpg,0.25,0.0,1.0,1.0,780,145,https://www.flickr.com/photos/thoseguys119/29728891655,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 0e75ebd66b9ab3cc,https://c1.staticflickr.com/9/8204/28870800040_9fa77a14f9_o.jpg,0.336764705882,0.0,1.0,1.0,550,573,https://www.flickr.com/photos/axiomnews/28870800040/,https://creativecommons.org/licenses/by/2.0/,Axiom News,https://www.flickr.com/people/axiomnews/ 018cc1cfeddd84a7,https://c1.staticflickr.com/8/7048/27061327025_d1ef3c0071_o.jpg,0.0,0.0,1.0,1.0,519,983,https://www.flickr.com/photos/bao_tri_nguyen/27061327025/,https://creativecommons.org/licenses/by/2.0/,Tri Nguyen,https://www.flickr.com/people/bao_tri_nguyen/ c4e9b4bac5ba89a9,https://c1.staticflickr.com/9/8590/28316917511_24a63eab37_o.jpg,0.4375,0.25,1.0,1.0,975,471,https://www.flickr.com/photos/jsjgeology/28316917511,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ a177ea4e820c080c,https://c1.staticflickr.com/8/7443/27620181772_4fcdc35cf7_o.jpg,0.0,0.0,0.75,0.636439267887,854,206,https://www.flickr.com/photos/13476480@N07/27620181772,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 39f8a0fffbdf4450,https://c1.staticflickr.com/1/394/31896006996_7b4da78572_o.jpg,0.0,0.25,0.75,0.75,595,871,http://www.flickr.com/photos/quinet/31896006996/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 6fe367bf2215c662,https://c1.staticflickr.com/9/8105/28463800794_0bc6580ac0_o.jpg,0.47170487106,0.0,0.94340974212,0.75,702,296,https://www.flickr.com/photos/texaus1/28463800794/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ d337053fd1047a75,https://c1.staticflickr.com/6/5682/30689358025_609d4c8db4_o.jpg,0.237949640288,0.25,0.713848920863,1.0,848,816,https://www.flickr.com/photos/13476480@N07/30689358025,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 6877d693e8b1356f,https://c1.staticflickr.com/9/8317/27986413424_eb87392b47_o.jpg,0.0,0.0,0.752351097179,1.0,327,129,https://www.flickr.com/photos/amantedar/27986413424,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/ 896a90c7a8041e68,https://c1.staticflickr.com/8/7647/28047675151_db80835e9e_o.jpg,0.0,0.25,0.5,1.0,618,556,https://www.flickr.com/photos/lwpkommunikacio/28047675151,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ aa99394c991d34e8,https://c1.staticflickr.com/6/5561/30387187074_3091a5598b_o.jpg,0.0,0.0,0.75,1.0,40,785,https://www.flickr.com/photos/rickmccharles/30387187074/,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/ 017264a3fee3338d,https://c1.staticflickr.com/6/5752/30149118614_26b2cdfe14_o.jpg,0.25,0.5,1.0,1.0,709,334,https://www.flickr.com/photos/dalbera/30149118614,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 57ee1c2a47ec9810,https://c1.staticflickr.com/6/5538/30620105904_43042912b7_o.jpg,0.2103515625,0.0,0.6310546875,0.75,441,536,https://www.flickr.com/photos/47514124@N02/30620105904/,https://creativecommons.org/licenses/by/2.0/,Geoffrey Franklin,https://www.flickr.com/people/47514124@N02/ 57112103cafb4b9c,https://c1.staticflickr.com/6/5529/30662759775_354ca49bdd_o.jpg,0.25,0.0,0.75,0.75,459,348,https://www.flickr.com/photos/quinet/30662759775,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 1af56f58bba8b780,https://c1.staticflickr.com/1/38/31402990651_a0e95e966c_o.jpg,0.0,0.0977701543739,1.0,1.0,533,711,https://www.flickr.com/photos/amanderson/31402990651,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 0895a84a23103126,https://c1.staticflickr.com/9/8376/29330744781_91fc7bf6f8_o.jpg,0.333333333333,0.0,1.0,1.0,921,223,https://www.flickr.com/photos/pasa/29330744781,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 7e41c1f7754c7ea1,https://c1.staticflickr.com/9/8714/28068905594_3bbfb32995_o.jpg,0.334315169367,0.0,1.0,1.0,561,295,https://www.flickr.com/photos/delaneyr/28068905594,https://creativecommons.org/licenses/by/2.0/,Broderick Delaney,https://www.flickr.com/people/delaneyr/ 0aad339cdee8eb02,https://c1.staticflickr.com/1/546/32677326065_ddb1f9a55d_o.jpg,0.350800582242,0.0,1.0,1.0,780,247,https://www.flickr.com/photos/thoseguys119/32677326065/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f0efbfe27d160b35,https://c1.staticflickr.com/9/8878/29550416891_4e7103dee8_o.jpg,0.25,0.25,0.75,1.0,418,94,https://www.flickr.com/photos/dalecruse/29550416891/,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/ d3f8b8cd2158b58c,https://c1.staticflickr.com/8/7704/27356224312_75759d39f3_o.jpg,0.0,0.0,0.666666666667,1.0,694,957,https://www.flickr.com/photos/tsengphotos/27356224312,https://creativecommons.org/licenses/by/2.0/,Tony Tseng,https://www.flickr.com/people/tsengphotos/ 4de2f401074f5bda,https://c1.staticflickr.com/8/7308/27198730136_f03b4fb6a9_o.jpg,0.28125,0.0,0.84375,0.75,539,821,https://www.flickr.com/photos/jared422/27198730136,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/ ae2a1a76a4be80a8,https://c1.staticflickr.com/8/7286/26678238524_ee9bb89719_o.jpg,0.25,0.274729520866,1.0,0.824188562597,980,796,https://www.flickr.com/photos/watershedpost/26678238524,https://creativecommons.org/licenses/by/2.0/,Watershed Post,https://www.flickr.com/people/watershedpost/ 89008ea71dc270a1,https://c1.staticflickr.com/1/712/32096288421_5afc8b8481_o.jpg,0.25,0.0,0.75,0.75,971,345,https://www.flickr.com/photos/davebloggs007/32096288421,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ b7d3e5ed7f10cd0d,https://c1.staticflickr.com/6/5483/9183278262_1dec2bf080_o.jpg,0.249631811487,0.25,0.748895434462,1.0,924,855,https://www.flickr.com/photos/dominicspics/9183278262,https://creativecommons.org/licenses/by/2.0/,Dominic Alves,https://www.flickr.com/people/dominicspics/ 5c1da62255db7885,https://c1.staticflickr.com/9/8659/28169240330_aa42c2a5cd_o.jpg,0.4375,0.0,1.0,0.75,534,489,https://www.flickr.com/photos/alicebyday/28169240330,https://creativecommons.org/licenses/by/2.0/,Alicebyday,https://www.flickr.com/people/alicebyday/ edf5ad695c6994ad,https://c1.staticflickr.com/8/7257/27442022315_4e519a97bf_o.jpg,0.0,0.25,0.5625,1.0,706,376,https://www.flickr.com/photos/haxpett/27442022315,https://creativecommons.org/licenses/by/2.0/,Axel Pettersson,https://www.flickr.com/people/haxpett/ b61ce2c89c305ac8,https://c1.staticflickr.com/6/5750/31051203470_e23a0f3ef1_o.jpg,0.5,0.25,1.0,1.0,891,490,https://www.flickr.com/photos/112772881@N02/31051203470/,https://creativecommons.org/licenses/by/2.0/,alias keiner,https://www.flickr.com/people/112772881@N02/ d101fb088eb63d06,https://c1.staticflickr.com/8/7251/27971960346_3936b41f8b_o.jpg,0.245255474453,0.0,0.735766423358,0.75,672,515,https://www.flickr.com/photos/glorycycles/27971960346,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 808eaddcee3cd75a,https://c1.staticflickr.com/6/5516/30362716513_2df436eeb7_o.jpg,0.5,0.0,1.0,0.75,920,238,https://www.flickr.com/photos/shankaronline/30362716513,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 386d9dd66fa70471,https://c1.staticflickr.com/9/8718/28273272850_2a737410ed_o.jpg,0.322931785196,0.0,0.968795355588,1.0,635,440,https://www.flickr.com/photos/13476480@N07/28273272850/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ a50d88e152c16df0,https://c1.staticflickr.com/9/8326/29798149236_f7438bab0d_o.jpg,0.5,0.25,1.0,1.0,364,477,https://www.flickr.com/photos/wildreturn/29798149236,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ c17e418fda3eb851,https://c1.staticflickr.com/9/8629/28316700954_a7a8f713b8_o.jpg,0.0,0.0,0.666666666667,1.0,519,263,https://www.flickr.com/photos/box_repsol/28316700954,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 444f8d24af346341,https://c1.staticflickr.com/8/7767/26562695813_d188e7772d_o.jpg,0.0,0.0,0.666666666667,1.0,404,134,https://www.flickr.com/photos/navcent/26562695813/,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/ fbdde8cbc678bea7,https://c1.staticflickr.com/8/7327/26400437683_cf15440b52_o.jpg,0.4375,0.25,1.0,1.0,934,83,https://www.flickr.com/photos/yama2k/26400437683/,https://creativecommons.org/licenses/by/2.0/,Takahiro Yamagiwa,https://www.flickr.com/people/yama2k/ 20ffc3569c6896f5,https://c1.staticflickr.com/8/7428/27503782662_cd78baf1f3_o.jpg,0.0,0.0,0.5,0.75,437,241,https://www.flickr.com/photos/nielsautos/27503782662,https://creativecommons.org/licenses/by/2.0/,Niels de Wit,https://www.flickr.com/people/nielsautos/ bf571602729dc613,https://c1.staticflickr.com/9/8227/29601881771_a7f0b8109d_o.jpg,0.2783203125,0.25,0.8349609375,1.0,23,975,https://www.flickr.com/photos/asianu/29601881771/,https://creativecommons.org/licenses/by/2.0/,ASIM CHAUDHURI,https://www.flickr.com/people/asianu/ a792bc6e572778a8,https://c1.staticflickr.com/9/8360/28946901502_1d9b6ec649_o.jpg,0.516304347826,0.0,1.0,0.75,662,673,https://www.flickr.com/photos/autohistorian/28946901502,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ bb2c1ff4a6069852,https://c1.staticflickr.com/1/581/31576432532_80ba7de622_o.jpg,0.0,0.0,0.75,0.5,777,810,https://www.flickr.com/photos/eebeephoto/31576432532/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/ 90b3e0d9d97d8844,https://c1.staticflickr.com/8/7369/27056673845_5ce2cdec00_o.jpg,0.25,0.25,0.75,1.0,826,93,https://www.flickr.com/photos/slapers/27056673845,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 9ec0f6e152204b39,https://c1.staticflickr.com/1/744/31015725594_838e57a023_o.jpg,0.0,0.25,0.5625,1.0,55,313,https://flickr.com/150203126@N07/31015725594,https://creativecommons.org/licenses/by/2.0/,Bradley Allf,https://www.flickr.com/people/150203126@N07/ a40673e9a382e09d,https://c1.staticflickr.com/9/8639/27924700174_9aac3c6d53_o.jpg,0.32332761578,0.25,1.0,1.0,309,430,https://www.flickr.com/photos/gails_pictures/27924700174/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 2413f3c22fc92bc7,https://c1.staticflickr.com/1/604/32006794135_2f5f077b38_o.jpg,0.5,0.25,1.0,1.0,948,616,https://flickr.com/13497267@N04/32006794135,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ c1eac623a995e2c4,https://c1.staticflickr.com/1/716/31183502483_f0623e8249_o.jpg,0.0,0.25,0.421177266576,1.0,971,364,https://www.flickr.com/photos/stefans02/31183502483,https://creativecommons.org/licenses/by/2.0/,Stefans02,https://www.flickr.com/people/stefans02/ 983ccc0f449e5f09,https://c1.staticflickr.com/6/5822/29283288084_a19bb7f529_o.jpg,0.0,0.0,0.421177266576,0.75,820,234,https://www.flickr.com/photos/timmccune/29283288084,https://creativecommons.org/licenses/by/2.0/,Tim McCune,https://www.flickr.com/people/timmccune/ 18d6afdfc6887cb4,https://c1.staticflickr.com/2/1629/26730207146_44f8a1a628_o.jpg,0.332842415317,0.0,0.99852724595,1.0,33,110,https://www.flickr.com/photos/briangratwicke/26730207146/,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ bade827d486116fd,https://c1.staticflickr.com/1/757/31488607526_b9ecb49387_o.jpg,0.248348017621,0.25,0.745044052863,1.0,771,525,https://www.flickr.com/photos/spera-designerschuhe/31488607526,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ 7f4cb4f73265df7e,https://c1.staticflickr.com/8/7463/29771425545_1456b155a2_o.jpg,0.284198113208,0.25,0.852594339623,1.0,769,100,https://www.flickr.com/photos/oisinhurley/29771425545,https://creativecommons.org/licenses/by/2.0/,Oisin Hurley,https://www.flickr.com/people/oisinhurley/ 860c38fe1a182825,https://c1.staticflickr.com/9/8381/29230613555_0201b998e3_o.jpg,0.250923190547,0.25,0.75276957164,1.0,706,634,https://flickr.com/24415554@N04/29230613555,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/ f62f390eb1097576,https://c1.staticflickr.com/9/8289/27793036264_90104f60db_o.jpg,0.25,0.431603773585,1.0,1.0,515,379,https://www.flickr.com/photos/91591049@N00/27793036264,https://creativecommons.org/licenses/by/2.0/,SenseiAlan,https://www.flickr.com/people/91591049@N00/ bd8dbdd64864e34c,https://c1.staticflickr.com/8/7558/28036849252_253ccb6d32_o.jpg,0.25,0.0,0.75,0.75,558,889,https://www.flickr.com/photos/vitofun/28036849252,https://creativecommons.org/licenses/by/2.0/,Vito Fun,https://www.flickr.com/people/vitofun/ 79cd07520e74e76d,https://c1.staticflickr.com/8/7786/28092294381_4de850d6dd_o.jpg,0.439547581903,0.0,1.0,0.75,127,770,https://www.flickr.com/photos/noaaphotolib/28092294381/,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ c061f55f54313fba,https://c1.staticflickr.com/6/5584/30804093225_2812ffa8bc_o.jpg,0.0,0.0,1.0,1.0,923,407,https://www.flickr.com/photos/yto/30804093225,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/ 33664ff3dbea3612,https://c1.staticflickr.com/8/7728/27118293775_9ab658d4e8_o.jpg,0.0,0.25,0.75,1.0,702,515,https://www.flickr.com/photos/91425144@N04/27118293775,https://creativecommons.org/licenses/by/2.0/,Arran Bee,https://www.flickr.com/people/91425144@N04/ 5a5de7f4eeed4924,https://c1.staticflickr.com/1/611/31551581321_a5913cb571_o.jpg,0.25,0.0,1.0,0.5625,804,520,https://www.flickr.com/photos/oregondot/31551581321,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/ f7613103a3f7f606,https://c1.staticflickr.com/6/5747/31389715356_b543f50fd5_o.jpg,0.491827637444,0.25,1.0,1.0,490,360,https://www.flickr.com/photos/stevensnodgrass/31389715356,https://creativecommons.org/licenses/by/2.0/,Steve Snodgrass,https://www.flickr.com/people/stevensnodgrass/ 67fcf5cf43220ffe,https://c1.staticflickr.com/1/564/31572047642_0722d49085_o.jpg,0.4375,0.0,1.0,0.75,328,536,https://flickr.com/149503105@N07/31572047642,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ 91e1eac1507098b3,https://c1.staticflickr.com/1/726/31957749302_1d2465a829_o.jpg,0.4375,0.0,1.0,0.75,780,367,https://www.flickr.com/photos/thoseguys119/31957749302,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c8ae4d4f0eebd02f,https://c1.staticflickr.com/8/7101/26790907006_717cc0b174_o.jpg,0.0,0.0,0.666666666667,1.0,610,724,https://flickr.com/87096660@N06/26790907006,https://creativecommons.org/licenses/by/2.0/,P_Gigs,https://www.flickr.com/people/ispecialize/ f5ac8056354f85ba,https://c1.staticflickr.com/9/8064/28047914584_33745a3e9a_o.jpg,0.25,0.25,0.75,1.0,982,192,https://www.flickr.com/photos/mindahaas/28047914584,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ 492cb6e65ab265ea,https://c1.staticflickr.com/9/8841/28243296200_7984f5db24_o.jpg,0.25,0.25,0.75,1.0,320,139,https://www.flickr.com/photos/j_w_c/28243296200,https://creativecommons.org/licenses/by/2.0/,James,https://www.flickr.com/people/j_w_c/ 9cc5ced4df55a800,https://c1.staticflickr.com/9/8135/29837591205_cfd89d98ac_o.jpg,0.0,0.0,0.75,0.610749185668,431,687,https://www.flickr.com/photos/ftmeade/29837591205,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/ 71a293490570c3ec,https://c1.staticflickr.com/6/5627/30076998724_9cc0b85baa_o.jpg,0.5,0.0,1.0,0.75,948,729,https://flickr.com/127338544@N06/30076998724,https://creativecommons.org/licenses/by/2.0/,Sarah Ward,https://www.flickr.com/people/127338544@N06/ 587e62c63503db38,https://c1.staticflickr.com/8/7196/26892084982_605da83241_o.jpg,0.218793103448,0.25,0.656379310345,1.0,459,891,https://www.flickr.com/photos/26126239@N02/26892084982/,https://creativecommons.org/licenses/by/2.0/,University of Exeter,https://www.flickr.com/people/26126239@N02/ 0a098aba2e583b34,https://c1.staticflickr.com/6/5466/30386990384_354093f5ac_o.jpg,0.114520958084,0.25,0.343562874251,1.0,780,239,https://www.flickr.com/photos/thoseguys119/30386990384,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 3a61c40078214cf4,https://c1.staticflickr.com/9/8370/29707719271_78a1e4cd17_o.jpg,0.0,0.0,0.666666666667,1.0,704,676,https://www.flickr.com/photos/janitors/29707719271,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 3c99b1263f54b352,https://c1.staticflickr.com/9/8110/28995276032_52cc83fe9f_o.jpg,0.0,0.0,0.5625,0.75,704,342,https://www.flickr.com/photos/safelibraries/28995276032/,https://creativecommons.org/licenses/by/2.0/,Dan Kleinman,https://www.flickr.com/people/safelibraries/ cb3255cbe604c3de,https://c1.staticflickr.com/9/8538/30161780776_9645afc06e_o.jpg,0.4375,0.25,1.0,1.0,975,179,https://www.flickr.com/photos/jsjgeology/30161780776,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e2c30f2538205422,https://c1.staticflickr.com/8/7247/26579812220_d2490c0c89_o.jpg,0.0,0.25,0.5625,1.0,518,908,https://www.flickr.com/photos/southbeachcars/26579812220,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 4663fe34ae048d1b,https://c1.staticflickr.com/8/7679/27156362451_b9cc999972_o.jpg,0.0,0.0,0.498159057437,0.75,752,695,https://www.flickr.com/photos/davehamster/27156362451,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 50179d5916b65cd4,https://c1.staticflickr.com/6/5628/30662821010_35b4277386_o.jpg,0.0,0.25,0.435350756534,1.0,806,809,https://flickr.com/144153098@N08/30662821010,https://creativecommons.org/licenses/by/2.0/,Le Radiophare,https://www.flickr.com/people/leradiophare/ ef3050e7c9b439fa,https://c1.staticflickr.com/9/8839/28081572673_d41c681d4e_o.jpg,0.0,0.25,0.5625,1.0,635,31,https://www.flickr.com/photos/ilri/28081572673,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/ cc383892d1ec2550,https://c1.staticflickr.com/9/8837/28755601556_d5a89618be_o.jpg,0.145242070117,0.0,1.0,1.0,305,357,https://www.flickr.com/photos/92252798@N07/28755601556,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/ 3a8e99ff844d3b93,https://c1.staticflickr.com/9/8058/28241035750_8fef9dbbc1_o.jpg,0.0,0.25,0.472779369628,1.0,975,9,https://www.flickr.com/photos/jsjgeology/28241035750,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 4edf13a4ef204868,https://c1.staticflickr.com/9/8276/29640058063_41568b79e5_o.jpg,0.0,0.25,0.75,1.0,672,298,https://www.flickr.com/photos/glorycycles/29640058063,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ b20e2e980f4ded49,https://c1.staticflickr.com/9/8878/29696500461_ed71cdb872_o.jpg,0.4375,0.0,1.0,0.75,459,348,https://www.flickr.com/photos/kirbyurner/29696500461,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/ 15d1a6d2bc5b9cef,https://c1.staticflickr.com/9/8806/29518966205_2eabd57cff_o.jpg,0.0,0.0,0.75,1.0,822,883,https://www.flickr.com/photos/linsinchen/29518966205,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/ c7cf0370caf2cb0e,https://c1.staticflickr.com/8/7546/28020258155_46b588fdd4_o.jpg,0.25,0.0,1.0,1.0,641,268,https://www.flickr.com/photos/akras/28020258155,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/ 1f9e0ef9d3b1ac2b,https://c1.staticflickr.com/1/30/31606235256_e2b036160d_o.jpg,0.0,0.4375,0.75,1.0,920,577,http://www.flickr.com/photos/25955895@N03/31606235256,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 5fe8f9580d3a92d1,https://c1.staticflickr.com/8/7212/26749856630_2a680babcb_o.jpg,0.0,0.25,0.5,1.0,625,449,https://www.flickr.com/photos/kjarrett/26749856630,https://creativecommons.org/licenses/by/2.0/,Kevin Jarrett,https://www.flickr.com/people/kjarrett/ 60472060bd7a30c4,https://c1.staticflickr.com/6/5126/29849597982_92213dfe31_o.jpg,0.25,0.0,1.0,0.617213114754,22,209,https://www.flickr.com/photos/patrick_k59/29849597982,https://creativecommons.org/licenses/by/2.0/,patrickkavanagh,https://www.flickr.com/people/patrick_k59/ 30dc1c9a22aeb20a,https://c1.staticflickr.com/2/1610/26164518923_f1f71c342b_o.jpg,0.0,0.0,0.666666666667,1.0,512,274,https://flickr.com/42220226@N07/26164518923,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ f3076fa8db5ac4d7,https://c1.staticflickr.com/9/8415/30148719842_4e381285a0_o.jpg,0.459355828221,0.25,1.0,1.0,875,481,https://www.flickr.com/photos/76969036@N02/30148719842,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ a2db81f0c82be581,https://c1.staticflickr.com/9/8207/29284999816_8baac27b37_o.jpg,0.0,0.25,0.740574506284,1.0,309,927,https://www.flickr.com/photos/gails_pictures/29284999816,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 699a852d085ca5a2,https://c1.staticflickr.com/1/548/32061567272_ab043c0503_o.jpg,0.322931785196,0.0,0.968795355588,1.0,889,894,https://www.flickr.com/photos/jlcernadas/32061567272,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ 974fa34c5ac33e70,https://c1.staticflickr.com/9/8805/28708213072_338ca2320d_o.jpg,0.0,0.0,0.5,0.75,874,421,https://www.flickr.com/photos/amslerpix/28708213072/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 9699e28c9bed2d39,https://c1.staticflickr.com/9/8190/28739849060_8d4ff6a25c_o.jpg,0.0,0.25,0.75,1.0,896,445,https://www.flickr.com/photos/peter_curb/28739849060/,https://creativecommons.org/licenses/by/2.0/,Peter,https://www.flickr.com/people/peter_curb/ b814dc2396a679dd,https://c1.staticflickr.com/9/8405/29272639984_2fd9a98e43_o.jpg,0.281690140845,0.0,0.845070422535,0.75,407,935,https://www.flickr.com/photos/eltb/29272639984,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 993357c62f7de85b,https://c1.staticflickr.com/9/8450/28727991476_c070a72cf1_o.jpg,0.0,0.0,1.0,1.0,756,685,https://www.flickr.com/photos/esoastronomy/28727991476,https://creativecommons.org/licenses/by/2.0/,European Southern Observatory,https://www.flickr.com/people/esoastronomy/ 80cd50b1e702b621,https://c1.staticflickr.com/9/8227/29247894293_83648fbb12_o.jpg,0.25,0.0,1.0,0.75,546,117,http://www.flickr.com/photos/46183897@N00/29247894293,https://creativecommons.org/licenses/by/2.0/,Robert Nunnally,https://www.flickr.com/people/46183897@N00/ 42c0f0241873ee1d,https://c1.staticflickr.com/8/7445/27514841904_7783724a27_o.jpg,0.0,0.0,0.5,0.75,980,535,https://www.flickr.com/photos/mypubliclands/27514841904,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ b543d4954953b16a,https://c1.staticflickr.com/8/7515/28308262656_e41d2334ec_o.jpg,0.0,0.0,0.755102040816,1.0,310,372,https://www.flickr.com/photos/ndrwfgg/28308262656,https://creativecommons.org/licenses/by/2.0/,Andy / Andrew Fogg,https://www.flickr.com/people/ndrwfgg/ de48a5455e28628e,https://c1.staticflickr.com/9/8535/29916229871_2c5b9d85ef_o.jpg,0.287776898734,0.0,0.863330696203,0.75,982,673,https://www.flickr.com/photos/apardavila/29916229871,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 4920e46c49ffdb9c,https://c1.staticflickr.com/1/444/32388653222_d0766057c8_o.jpg,0.249079528719,0.0,0.747238586156,0.75,818,586,https://www.flickr.com/photos/davehamster/32388653222,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ a5b6c7bf4769f8bf,https://c1.staticflickr.com/8/7460/26753107264_3c573836f1_o.jpg,0.281719532554,0.25,0.845158597663,1.0,830,480,http://www.flickr.com/photos/89246112@N00/26753107264/,https://creativecommons.org/licenses/by/2.0/,Bart,https://www.flickr.com/people/89246112@N00/ 84e91c0b8ca02f79,https://c1.staticflickr.com/8/7181/27595589222_51d4625a89_o.jpg,0.0,0.0,0.5,0.75,405,556,https://www.flickr.com/photos/alessandroambrosetti/27595589222,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ cb74d5e88350a868,https://c1.staticflickr.com/1/747/31619979270_8c6eca179b_o.jpg,0.5,0.0,1.0,0.75,974,301,https://flickr.com/39136124@N00/31619979270,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble,https://www.flickr.com/people/pauljill/ fa03989e0fdf318d,https://c1.staticflickr.com/9/8166/28498558833_7fc44c5b8f_o.jpg,0.0,0.0,0.732612055641,1.0,145,374,https://www.flickr.com/photos/taylar/28498558833,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ 66b16a73ba956714,https://c1.staticflickr.com/9/8019/29468620820_9512109548_o.jpg,0.0,0.25,0.611745513866,1.0,672,513,https://www.flickr.com/photos/swampa/29468620820,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/ a4b6546fb71feac3,https://c1.staticflickr.com/9/8047/28584347493_60666a8804_o.jpg,0.421177266576,0.0,0.842354533153,0.75,973,743,https://www.flickr.com/photos/dfmagazine/28584347493,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/ 8b2f06597a576599,https://c1.staticflickr.com/8/7354/27926128126_136600fd2d_o.jpg,0.0,0.333333333333,1.0,1.0,793,749,https://www.flickr.com/photos/thenationalguard/27926128126,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ 24a5d6665c96748b,https://c1.staticflickr.com/8/7325/27243958956_a7ac3bba90_o.jpg,0.0,0.0,0.311337209302,0.75,780,645,https://www.flickr.com/photos/thoseguys119/27243958956/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 456d48d1abe6bc4c,https://c1.staticflickr.com/6/5652/30738756730_903be37c23_o.jpg,0.299878836834,0.0,0.899636510501,0.75,19,844,https://www.flickr.com/photos/hisgett/30738756730/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 9b6eaca58e1f3a16,https://c1.staticflickr.com/1/699/32119264241_a1625122c0_o.jpg,0.0,0.0,0.666666666667,1.0,991,969,https://www.flickr.com/photos/eduardorobles/32119264241,https://creativecommons.org/licenses/by/2.0/,Eduardo Robles Pacheco,https://www.flickr.com/people/eduardorobles/ 56af3b3dd9fe53ac,https://c1.staticflickr.com/6/5779/30870590735_b02a1b445f_o.jpg,0.25,0.0,0.75,0.75,718,870,https://www.flickr.com/photos/greggjerdingen/30870590735,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 0e14cb874a3f01a3,https://c1.staticflickr.com/6/5739/30340839054_da3bd3fc70_o.jpg,0.0,0.0,0.5,0.75,320,748,https://www.flickr.com/photos/ansk/30340839054,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/ 0b18419f3e2e0d50,https://c1.staticflickr.com/8/7533/27128071800_ed6c02bf38_o.jpg,0.0,0.0,1.0,0.961061946903,24,491,https://www.flickr.com/photos/sarahvain/27128071800,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/ c7eecfae937150e9,https://c1.staticflickr.com/8/7462/28118769880_288044e953_o.jpg,0.25578358209,0.0,0.767350746269,0.75,309,805,https://www.flickr.com/photos/78428166@N00/28118769880,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ 478cdebaecbbd037,https://c1.staticflickr.com/6/5789/30219046794_7a4db4c19b_o.jpg,0.25,0.0,0.75,0.75,971,563,https://www.flickr.com/photos/paxson_woelber/30219046794,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/ 7fdecd6565739802,https://c1.staticflickr.com/1/172/31528681765_ed90ff0abe_o.jpg,0.0,0.0,0.75,1.0,979,499,https://www.flickr.com/photos/theocrazzolara/31528681765/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ d980e0c9dcf5c8a8,https://c1.staticflickr.com/8/7288/27642490216_87d32ce8ef_o.jpg,0.25,0.313049209139,1.0,0.939147627417,918,631,https://www.flickr.com/photos/24858199@N00/27642490216,https://creativecommons.org/licenses/by/2.0/,John Greenfield,https://www.flickr.com/people/24858199@N00/ 090b7b3d7dac83e3,https://c1.staticflickr.com/1/702/32644867925_4e1c3a9952_o.jpg,0.333333333333,0.0,1.0,1.0,519,474,https://www.flickr.com/photos/box_repsol/32644867925,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 301c9231c8ce38da,https://c1.staticflickr.com/1/373/31831624096_e71629713e_o.jpg,0.5,0.0,1.0,0.75,422,574,https://flickr.com/136477533@N06/31831624096,https://creativecommons.org/licenses/by/2.0/,Thijs Paanakker,https://www.flickr.com/people/136477533@N06/ b2298ca549255350,https://c1.staticflickr.com/9/8808/28690231300_56cd784755_o.jpg,0.0,0.25,0.5,1.0,753,865,https://www.flickr.com/photos/squashdev/28690231300,https://creativecommons.org/licenses/by/2.0/,England Squash Masters,https://www.flickr.com/people/squashdev/ 314d8558e1ad7629,https://c1.staticflickr.com/6/5625/30622316002_8f1d6916f2_o.jpg,0.0,0.25,0.5,1.0,980,781,https://www.flickr.com/photos/wendelinjacober/30622316002,https://creativecommons.org/licenses/by/2.0/,Wendelin Jacober,https://www.flickr.com/people/wendelinjacober/ f48144ca8eba49c5,https://c1.staticflickr.com/8/7463/27378999693_fcc701c720_o.jpg,0.25,0.0,1.0,0.75,810,900,https://www.flickr.com/photos/yto/27378999693,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/ 0b4024b4e357a6ae,https://c1.staticflickr.com/9/8393/28773345601_d4d5d04377_o.jpg,0.0,0.25,0.37166454892,1.0,815,37,https://www.flickr.com/photos/watts_photos/28773345601,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ 6bf3f30e46f2343f,https://c1.staticflickr.com/9/8419/28939386972_cc3d1f3ae6_o.jpg,0.25,0.254054054054,1.0,1.0,310,357,https://www.flickr.com/photos/35142635@N05/28939386972,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ d3b18a4a0b1d8f42,https://c1.staticflickr.com/8/7574/30111407271_d9a4724741_o.jpg,0.0,0.0,0.5625,0.75,975,725,https://www.flickr.com/photos/jsjgeology/30111407271,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ c444433540e3dc27,https://c1.staticflickr.com/9/8409/29675626831_bb6bf7561e_o.jpg,0.0,0.0,0.7484375,1.0,507,598,https://www.flickr.com/photos/zongo/29675626831,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 35bba255621535c8,https://c1.staticflickr.com/8/7698/28226013051_945289ecab_o.jpg,0.0,0.25,0.535877862595,1.0,393,950,https://www.flickr.com/photos/noaaphotolib/28226013051,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 1c8729adb36efba6,https://c1.staticflickr.com/8/7393/27633423065_ed969d7401_o.jpg,0.0,0.0,0.75,0.5625,736,549,https://www.flickr.com/photos/sebilden/27633423065,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/ 24027338ca7f0173,https://c1.staticflickr.com/3/2815/33039658636_1d8b6cd98f_o.jpg,0.0,0.174055829228,1.0,1.0,437,427,http://www.flickr.com/photos/31411679@N08/33039658636,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ e2f6b6de4686029c,https://c1.staticflickr.com/9/8658/28769298372_3b197ae635_o.jpg,0.0,0.0,1.0,1.0,443,860,https://www.flickr.com/photos/respres/28769298372,https://creativecommons.org/licenses/by/2.0/,Jeff Turner,https://www.flickr.com/people/respres/ e256e71e1d750b15,https://c1.staticflickr.com/9/8230/30101273355_fd9aa73baf_o.jpg,0.0,0.0,1.0,0.664212076583,672,424,https://www.flickr.com/photos/91396027@N00/30101273355,https://creativecommons.org/licenses/by/2.0/,Adam Loving,https://www.flickr.com/people/91396027@N00/ 850ce1f6ebda8a9e,https://c1.staticflickr.com/6/5343/31386427245_5ee5fef9e9_o.jpg,0.333333333333,0.0,1.0,1.0,304,399,https://www.flickr.com/photos/christian_gloor/31386427245/,https://creativecommons.org/licenses/by/2.0/,Christian Gloor,https://www.flickr.com/people/christian_gloor/ 43a776491bca6133,https://c1.staticflickr.com/9/8727/30032687381_063f55d273_o.jpg,0.0,0.333333333333,1.0,1.0,142,908,https://www.flickr.com/photos/steve_childs/30032687381/,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/ ef49e733ecfcd9f5,https://c1.staticflickr.com/6/5775/30275979302_6d9be20aa1_o.jpg,0.0,0.0,0.499263622975,0.75,618,950,https://www.flickr.com/photos/gobiernodechile/30275979302,https://creativecommons.org/licenses/by/2.0/,Gobierno de Chile,https://www.flickr.com/people/gobiernodechile/ ac27124605fc0092,https://c1.staticflickr.com/6/5672/30007414364_96eea525e9_o.jpg,0.0,0.25,0.5,1.0,960,2,https://www.flickr.com/photos/o_0/30007414364,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 44ede47181b3ed7c,https://c1.staticflickr.com/9/8086/28859174645_1481eb3ea0_o.jpg,0.25,0.281690140845,1.0,0.845070422535,407,675,https://www.flickr.com/photos/eltb/28859174645,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ e071f6c084846cd4,https://c1.staticflickr.com/8/7620/27892527821_7d43768fca_o.jpg,0.0,0.0,0.558411214953,0.75,780,145,https://www.flickr.com/photos/thoseguys119/27892527821,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 79b2687072279913,https://c1.staticflickr.com/1/743/32906588345_49bfe10a2d_o.jpg,0.0,0.25,0.5625,1.0,975,577,https://www.flickr.com/photos/krossbow/32906588345,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/ f8ad9213b005e85a,https://c1.staticflickr.com/8/7055/27203858751_43b296b1f2_o.jpg,0.25,0.0,1.0,0.67667238422,925,530,https://www.flickr.com/photos/10413717@N08/27203858751,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer,https://www.flickr.com/people/10413717@N08/ 1e222e7ec0de2723,https://c1.staticflickr.com/1/574/31934206825_7c314e41bb_o.jpg,0.28125,0.25,0.84375,1.0,802,276,https://www.flickr.com/photos/kudumomo/31934206825/,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/ 586bb9f8e35e9353,https://c1.staticflickr.com/9/8580/28033037860_47967e40a8_o.jpg,0.0,0.0,0.5,0.75,913,400,https://www.flickr.com/photos/davebloggs007/28033037860,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ a452f6aa4e59e58e,https://c1.staticflickr.com/6/5610/25306466099_5638195afa_o.jpg,0.25,0.0,1.0,0.75,672,682,https://www.flickr.com/photos/minnellium/25306466099/,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/ 702562cd530638f8,https://c1.staticflickr.com/6/5656/31149706722_1e36740569_o.jpg,0.0,0.25,0.75,1.0,908,508,https://www.flickr.com/photos/g4gti/31149706722/,https://creativecommons.org/licenses/by/2.0/,Ryohei Noda,https://www.flickr.com/people/g4gti/ 513c332da1871c47,https://c1.staticflickr.com/9/8819/28350586342_2392784308_o.jpg,0.336764705882,0.0,1.0,1.0,876,803,https://www.flickr.com/photos/governordanmalloy/28350586342,https://creativecommons.org/licenses/by/2.0/,Dannel Malloy,https://www.flickr.com/people/governordanmalloy/ 2bc9a45814b19194,https://c1.staticflickr.com/9/8459/28565031922_dff800cd1d_o.jpg,0.25,0.0,1.0,1.0,874,913,https://www.flickr.com/photos/bignosedk/28565031922/,https://creativecommons.org/licenses/by/2.0/,bignosedk,https://www.flickr.com/people/bignosedk/ c790f093bea813b3,https://c1.staticflickr.com/6/5519/29852540954_68245f647e_o.jpg,0.0,0.0,0.666666666667,1.0,519,693,https://www.flickr.com/photos/box_repsol/29852540954,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 35fab6b3e9625b3b,https://c1.staticflickr.com/6/5660/30341720985_6609d6a563_o.jpg,0.0,0.254464285714,0.75,0.763392857143,141,508,https://www.flickr.com/photos/dkeats/30341720985,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 50ff6daab1f960a7,https://c1.staticflickr.com/1/370/32296250730_ca16ff04a5_o.jpg,0.0,0.211956521739,0.75,0.635869565217,407,792,https://www.flickr.com/photos/eltb/32296250730,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 9ecbb09e58020f68,https://c1.staticflickr.com/9/8800/28371455781_7dcfffb783_o.jpg,0.210588633288,0.25,0.631765899865,1.0,920,118,https://www.flickr.com/photos/rsanajong/28371455781,https://creativecommons.org/licenses/by/2.0/,Ruth San,https://www.flickr.com/people/rsanajong/ a6ecd871a2ac0a64,https://c1.staticflickr.com/1/369/32400476881_85e1e8eb7c_o.jpg,0.357452966715,0.0,1.0,1.0,662,557,http://www.flickr.com/photos/31411679@N08/32400476881,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ e57db09222f91915,https://c1.staticflickr.com/8/7354/27277335942_0cff74599b_o.jpg,0.232244318182,0.0,0.696732954545,0.75,896,646,https://www.flickr.com/photos/usnavy/27277335942,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 6380b4206e5c5f58,https://c1.staticflickr.com/8/7473/26943688420_d5bb6ca753_o.jpg,0.25,0.0,1.0,0.75,441,531,https://www.flickr.com/photos/vernieman/26943688420,https://creativecommons.org/licenses/by/2.0/,Vernon Chan,https://www.flickr.com/people/vernieman/ 37c329eff6e5207a,https://c1.staticflickr.com/1/369/31707653936_f51f5ac9ce_o.jpg,0.0,0.0,0.75,1.0,459,991,https://www.flickr.com/photos/londonmatt/31707653936,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ cac9934731b00e4d,https://c1.staticflickr.com/9/8462/28585735914_864bf98603_o.jpg,0.0,0.0,0.666666666667,1.0,353,667,https://www.flickr.com/photos/flowcomm/28585735914,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 2138d27d3732a137,https://c1.staticflickr.com/9/8333/29333401096_471bcc1ca5_o.jpg,0.0,0.0,0.666666666667,1.0,973,754,https://www.flickr.com/photos/aschaf/29333401096/,https://creativecommons.org/licenses/by/2.0/,Andrea Schaffer,https://www.flickr.com/people/aschaf/ a48a756d26a49564,https://c1.staticflickr.com/8/7437/26643195393_2b06a59f33_o.jpg,0.237068965517,0.25,0.711206896552,1.0,13,363,https://www.flickr.com/photos/132295270@N07/26643195393,https://creativecommons.org/licenses/by/2.0/,Renee,https://www.flickr.com/people/132295270@N07/ 3fd9abe4e245e424,https://c1.staticflickr.com/9/8209/29528303331_95cb896952_o.jpg,0.0,0.0,0.5,0.75,561,654,https://www.flickr.com/photos/tabor-roeder/29528303331/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Phil Roeder,https://www.flickr.com/people/tabor-roeder/ 51855296d7f8f5ea,https://c1.staticflickr.com/8/7442/26902931295_49b58d7791_o.jpg,0.4375,0.25,1.0,1.0,934,538,https://www.flickr.com/photos/jeepersmedia/26902931295,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 6d6292e293401c10,https://c1.staticflickr.com/9/8355/28711694875_13de26ba1c_o.jpg,0.25,0.0,0.75,0.75,470,805,https://www.flickr.com/photos/brindle95/28711694875,https://creativecommons.org/licenses/by/2.0/,Apollo,https://www.flickr.com/people/brindle95/ 63016bdc53cccc9d,https://c1.staticflickr.com/9/8272/29576248996_c367d9da50_o.jpg,0.0,0.25,0.56338028169,1.0,303,999,https://www.flickr.com/photos/treegrow/29576248996/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ f83ffca92b5f8c95,https://c1.staticflickr.com/8/7505/29890674496_b88e7e93d5_o.jpg,0.489195230999,0.25,1.0,1.0,874,456,https://www.flickr.com/photos/34517490@N00/29890674496,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/ b09c68115edf03ab,https://c1.staticflickr.com/6/5581/30110282886_639d279080_o.jpg,0.0178890876565,0.0,1.0,1.0,113,320,https://www.flickr.com/photos/jsjgeology/30110282886,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 3b382708d0733e54,https://c1.staticflickr.com/8/7745/27233830482_449ab6898b_o.jpg,0.0,0.25,0.5,1.0,972,991,https://www.flickr.com/photos/wrongwalker/27233830482,https://creativecommons.org/licenses/by/2.0/,Thierry Figini,https://www.flickr.com/people/wrongwalker/ 601ccb5940cc7215,https://c1.staticflickr.com/8/7665/28405826375_43c7f0dcd6_o.jpg,0.0,0.0,1.0,0.477556109726,569,65,https://www.flickr.com/photos/ninara/28405826375,https://creativecommons.org/licenses/by/2.0/,Ninara,https://www.flickr.com/people/ninara/ a1a1aa76e52e6146,https://c1.staticflickr.com/1/654/31703609554_e54c2e0659_o.jpg,0.25,0.0,0.75,0.75,739,785,https://www.flickr.com/photos/blumenbiene/31703609554,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ 84cbd5ee8222c0b0,https://c1.staticflickr.com/9/8663/28185639141_68215b670b_o.jpg,0.357452966715,0.0,1.0,1.0,611,109,https://www.flickr.com/photos/dfmagazine/28185639141,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/ 1f4521cc50e70452,https://c1.staticflickr.com/6/5643/29952653663_9a85cec071_o.jpg,0.529739776952,0.25,0.882899628253,1.0,919,730,https://flickr.com/53051055@N07/29952653663,https://creativecommons.org/licenses/by/2.0/,Susan Babbitt,https://www.flickr.com/people/scavenger49/ 7ae84861ec06c528,https://c1.staticflickr.com/9/8212/29724578442_3dbfa852a9_o.jpg,0.0,0.0,0.75,0.53506097561,990,301,https://www.flickr.com/photos/biodivlibrary/29724578442,https://creativecommons.org/licenses/by/2.0/,Biodiversity Heritage Library,https://www.flickr.com/people/biodivlibrary/ f882f00523dfda0f,https://c1.staticflickr.com/6/5801/30976571960_a064e65e50_o.jpg,0.496696035242,0.0,0.993392070485,0.75,520,763,https://www.flickr.com/photos/applesnpearsau/30976571960,https://creativecommons.org/licenses/by/2.0/,Apple and Pear Australia Ltd,https://www.flickr.com/people/applesnpearsau/ b025d96ff865c96f,https://c1.staticflickr.com/1/485/31826152322_6b2360e544_o.jpg,0.31724137931,0.25,1.0,1.0,113,78,https://www.flickr.com/photos/jsjgeology/31826152322,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1fef5453f2d061bc,https://c1.staticflickr.com/9/8204/29142476984_3c67566539_o.jpg,0.0,0.25,0.496696035242,1.0,989,775,https://www.flickr.com/photos/76827729@N08/29142476984,https://creativecommons.org/licenses/by/2.0/,Sabrina Setaro,https://www.flickr.com/people/76827729@N08/ da79145690db51bc,https://c1.staticflickr.com/9/8438/27951673283_d37ef53404_o.jpg,0.0,0.28125,0.75,0.84375,558,538,https://www.flickr.com/photos/taymazvalley/27951673283,https://creativecommons.org/licenses/by/2.0/,Taymaz Valley,https://www.flickr.com/people/taymazvalley/ 55c261cd082aeb95,https://c1.staticflickr.com/8/7454/28204321376_28afcdda95_o.jpg,0.0,0.25,0.5,1.0,294,30,https://www.flickr.com/photos/flowcomm/28204321376/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 4bf8cd3abf9e5ccc,https://c1.staticflickr.com/8/7650/26807437962_5064fddec4_o.jpg,0.0,0.25,0.75,1.0,25,121,http://www.flickr.com/32870650@N08/26807437962/,https://creativecommons.org/licenses/by/2.0/,Dana Moos,https://www.flickr.com/people/dana_moos/ 8dbdeaeffbf4c042,https://c1.staticflickr.com/9/8174/29018402341_82b41c0f7e_o.jpg,0.25,0.0,0.75,0.75,548,472,https://www.flickr.com/photos/seraveenl/29018402341,https://creativecommons.org/licenses/by/2.0/,Stefan Geertsen,https://www.flickr.com/people/seraveenl/ 9768c69fffb461ac,https://c1.staticflickr.com/6/5347/30797279450_8cf9f4c36d_o.jpg,0.0,0.0,0.67667238422,0.75,569,504,https://www.flickr.com/photos/ringkong/30797279450,https://creativecommons.org/licenses/by/2.0/,typexnick,https://www.flickr.com/people/ringkong/ 1c172450001e25e9,https://c1.staticflickr.com/9/8731/28901422065_0af04781cb_o.jpg,0.45,0.25,0.9,1.0,405,101,https://www.flickr.com/photos/erussell1984/28901422065,https://creativecommons.org/licenses/by/2.0/,airbus777,https://www.flickr.com/people/erussell1984/ 8d7377adce26710e,https://c1.staticflickr.com/6/5564/30567232200_2278364509_o.jpg,0.25,0.25,0.75,1.0,34,619,https://www.flickr.com/photos/usfws_pacificsw/30567232200,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ 15cc30a72f8f9e95,https://c1.staticflickr.com/9/8069/29100729892_1d1452aae7_o.jpg,0.5,0.0,1.0,0.75,986,813,https://www.flickr.com/photos/100652816@N08/29100729892/,https://creativecommons.org/licenses/by/2.0/,Alfred Schierholz,https://www.flickr.com/people/100652816@N08/ 9e3ad056e72813ff,https://c1.staticflickr.com/8/7703/29099383912_356d4e1940_o.jpg,0.0,0.0,0.75,1.0,868,241,https://www.flickr.com/photos/jeepersmedia/29099383912,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ d5c663521de9a11f,https://c1.staticflickr.com/8/7666/26655397080_293bc369d7_o.jpg,0.28125,0.0,0.84375,0.75,926,793,https://www.flickr.com/photos/68147320@N02/26655397080,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ 5f9b54e586f0e8b0,https://c1.staticflickr.com/6/5517/30465252920_82f971a112_o.jpg,0.541960507757,0.0,1.0,0.75,973,557,https://www.flickr.com/photos/jsjgeology/30465252920,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 406a9b7ec03568d3,https://c1.staticflickr.com/6/5597/31713039236_424546452b_o.jpg,0.25,0.0,0.75,0.75,459,861,https://flickr.com/32370233@N05/31713039236,https://creativecommons.org/licenses/by/2.0/,Public Information Office,https://www.flickr.com/people/mariettaga/ e4205784a0a89159,https://c1.staticflickr.com/8/7352/26956176851_f883d7d620_o.jpg,0.269908116386,0.0,0.809724349158,0.75,473,539,https://www.flickr.com/photos/aasenhistorie/26956176851,https://creativecommons.org/licenses/by/2.0/,\303\205sen Museum og Historielag,https://www.flickr.com/people/aasenhistorie/ bf67145fe4f58b5a,https://c1.staticflickr.com/8/7537/26205679123_aa3b00b7c3_o.jpg,0.0,0.25,0.5,1.0,519,935,https://www.flickr.com/photos/box_repsol/26205679123,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 2c452d5ca61428a6,https://c1.staticflickr.com/6/5768/30573796340_b1a8aff843_o.jpg,0.503303964758,0.0,1.0,0.75,889,339,https://www.flickr.com/photos/sybarite48/30573796340/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ c7693ad33075a40e,https://c1.staticflickr.com/9/8189/29131482421_9809bbb869_o.jpg,0.45,0.25,0.9,1.0,810,513,https://flickr.com/25977089@N00/29131482421,https://creativecommons.org/licenses/by/2.0/,goblinbox_(queen_of_ad_hoc_bento),https://www.flickr.com/people/goblinbox/ 31a2c1b6d289e197,https://c1.staticflickr.com/9/8412/29978803786_73dc2196d7_o.jpg,0.0372340425532,0.0,1.0,1.0,487,897,https://www.flickr.com/photos/grotonschool/29978803786/,https://creativecommons.org/licenses/by/2.0/,Groton School,https://www.flickr.com/people/grotonschool/ aa6cf27c89580217,https://c1.staticflickr.com/8/7667/28246134286_653c8d1012_o.jpg,0.4375,0.25,1.0,1.0,407,918,https://www.flickr.com/photos/phelyan/28246134286,https://creativecommons.org/licenses/by/2.0/,Phelyan Sanjoin,https://www.flickr.com/people/phelyan/ 3c416fd66e2f7fa3,https://c1.staticflickr.com/9/8610/29844330543_6fb83c391b_o.jpg,0.155052264808,0.25,0.465156794425,1.0,896,713,https://www.flickr.com/photos/8782469@N05/29844330543/,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/ 6744ffc05e787e5f,https://c1.staticflickr.com/8/7721/26961749056_942da88dc7_o.jpg,0.4375,0.25,1.0,1.0,780,531,https://www.flickr.com/photos/thoseguys119/26961749056,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 865e2437e57a4a3b,https://c1.staticflickr.com/9/8612/28292578761_b771fed902_o.jpg,0.0,0.0,0.5,0.75,33,949,https://www.flickr.com/photos/briangratwicke/28292578761,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ ad7376c3bf2159dd,https://c1.staticflickr.com/9/8313/29678534671_f307c1c700_o.jpg,0.5,0.25,1.0,1.0,672,447,https://www.flickr.com/photos/swampa/29678534671/,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/ 5f2138e8a283fea8,https://c1.staticflickr.com/1/477/31600432432_908a5fa3db_o.jpg,0.460183767228,0.25,1.0,1.0,321,844,https://www.flickr.com/photos/gails_pictures/31600432432,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 7cdd3b329012d4f5,https://c1.staticflickr.com/9/8651/27857043203_b547c5101e_o.jpg,0.4375,0.25,1.0,1.0,756,508,https://www.flickr.com/photos/fdecomite/27857043203/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 9a3cf1e30d5a2c50,https://c1.staticflickr.com/6/5564/30235658854_66ecec4677_o.jpg,0.25,0.25,0.75,1.0,558,552,https://www.flickr.com/photos/zmescience/30235658854,https://creativecommons.org/licenses/by/2.0/,ZME Science,https://www.flickr.com/people/zmescience/ ca615289147a0fea,https://c1.staticflickr.com/6/5738/30870713791_e75fa2e4b2_o.jpg,0.28125,0.0,0.84375,0.75,411,158,https://flickr.com/91008793@N00/30870713791,https://creativecommons.org/licenses/by/2.0/,bobistraveling,https://www.flickr.com/people/bobistraveling/ d31e27a79c9ed146,https://c1.staticflickr.com/2/1519/26748865155_a937cfbfd2_o.jpg,0.4375,0.25,1.0,1.0,356,754,https://www.flickr.com/photos/edenpictures/26748865155,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ 465d3fd1c9e40b45,https://c1.staticflickr.com/2/1637/26671635232_8f1d6766ed_o.jpg,0.228169014085,0.0,0.684507042254,0.75,986,448,https://www.flickr.com/photos/pussreboots/26671635232/,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/ f2cd349192790cd5,https://c1.staticflickr.com/1/636/32119299370_8a28939abc_o.jpg,0.497426470588,0.25,0.994852941176,1.0,429,228,https://www.flickr.com/photos/agenciabrasilia/32119299370,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ e8be80e51ed52dbe,https://c1.staticflickr.com/8/7582/28225932891_968bbedd11_o.jpg,0.4375,0.0,1.0,0.75,3,438,https://www.flickr.com/photos/noaaphotolib/28225932891,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ bc4dbe4e478c89db,https://c1.staticflickr.com/9/8554/30299873792_e208ffa403_o.jpg,0.5,0.0,1.0,0.75,426,785,https://www.flickr.com/photos/60712129@N06/30299873792,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/ b5e1c723122c11c6,https://c1.staticflickr.com/9/8444/28251086673_2062bc2d4c_o.jpg,0.400242326333,0.25,1.0,1.0,23,385,https://www.flickr.com/photos/andymorffew/28251086673,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ 1e534d2ed2e757aa,https://c1.staticflickr.com/9/8395/29728167275_d144a0f52a_o.jpg,0.454002808989,0.0,0.908005617978,0.75,972,347,https://www.flickr.com/photos/134832191@N08/29728167275,https://creativecommons.org/licenses/by/2.0/,Martyn Fletcher,https://www.flickr.com/people/134832191@N08/ 04d25653548c8051,https://c1.staticflickr.com/8/7622/27388905943_cc9bd70303_o.jpg,0.0,0.0,0.503698224852,0.75,146,729,https://www.flickr.com/photos/noaaphotolib/27388905943,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 288def49c353a9df,https://c1.staticflickr.com/6/5481/30728325851_e46bbbe12e_o.jpg,0.0,0.282131661442,0.75,0.846394984326,407,317,https://www.flickr.com/photos/eltb/30728325851,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 8f18f5567522fca6,https://c1.staticflickr.com/8/7115/27083767095_b36c3683bc_o.jpg,0.25,0.25,0.75,1.0,782,705,https://www.flickr.com/photos/deniwlp84/27083767095,https://creativecommons.org/licenses/by/2.0/,Deni Williams,https://www.flickr.com/people/deniwlp84/ 3cac40ae81852a71,https://c1.staticflickr.com/2/1714/26149641464_806a44e2fb_o.jpg,0.48275862069,0.25,1.0,1.0,22,288,https://www.flickr.com/photos/lakeworth/26149641464,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/ 509c3200ab099636,https://c1.staticflickr.com/4/3872/33169330906_ae041604ce_o.jpg,0.0,0.0,0.666666666667,1.0,820,790,https://www.flickr.com/photos/alterna2/33169330906/,https://creativecommons.org/licenses/by/2.0/,Alterna2 http://www.alterna2.com,https://www.flickr.com/people/alterna2/ 516301f7fd74072e,https://c1.staticflickr.com/9/8594/28580872186_0a9da916ae_o.jpg,0.0,0.503303964758,0.75,1.0,885,537,https://www.flickr.com/photos/50732955@N00/28580872186,https://creativecommons.org/licenses/by/2.0/,Timmy_L,https://www.flickr.com/people/50732955@N00/ 337f39a809b1b1fc,https://c1.staticflickr.com/6/5622/31270916172_17b03fabaa_o.jpg,0.281165311653,0.0,0.843495934959,1.0,976,891,https://www.flickr.com/photos/65047661@N00/31270916172/,https://creativecommons.org/licenses/by/2.0/,Jim Lukach,https://www.flickr.com/people/65047661@N00/ 74e1abc1f6e851d7,https://c1.staticflickr.com/6/5340/30946508495_dcf4741c01_o.jpg,0.25,0.25,0.75,1.0,407,728,https://www.flickr.com/photos/eltb/30946508495,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 027597d81677f3df,https://c1.staticflickr.com/6/5606/30376373476_fb384215bd_o.jpg,0.25,0.25,0.75,1.0,980,164,https://www.flickr.com/photos/syshook/30376373476/,https://creativecommons.org/licenses/by/2.0/,Rajib Ghosh,https://www.flickr.com/people/syshook/ da1d564874342922,https://c1.staticflickr.com/8/7125/27747864171_c41b5e38ac_o.jpg,0.0,0.25,0.5625,1.0,980,404,https://www.flickr.com/photos/vastateparksstaff/27747864171,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 1c3ca5fb97b4110c,https://c1.staticflickr.com/8/7616/26866707503_0fc1f58d06_o.jpg,0.0,0.25,0.5,1.0,48,339,https://www.flickr.com/photos/st33vo/26866707503,https://creativecommons.org/licenses/by/2.0/,Steven Straiton,https://www.flickr.com/people/st33vo/ fd8a654bc379d914,https://c1.staticflickr.com/8/7449/27611217962_c0bb90a758_o.jpg,0.25,0.0,1.0,0.613970588235,86,440,https://www.flickr.com/photos/mark-gunn/27611217962,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ bf2af62b02f9ddfd,https://c1.staticflickr.com/6/5804/30313378913_865af584f4_o.jpg,0.0,0.0,0.5625,0.75,973,894,https://www.flickr.com/photos/jsjgeology/30313378913,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 025ae742a23721f4,https://c1.staticflickr.com/8/7296/26741324344_d156b5d759_o.jpg,0.0,0.233045622688,1.0,0.699136868064,762,638,https://www.flickr.com/photos/wolfvision_vsolution/26741324344/,https://creativecommons.org/licenses/by/2.0/,WolfVision GmbH,https://www.flickr.com/people/wolfvision_vsolution/ b231bf3c03da13bd,https://c1.staticflickr.com/8/7107/26574373433_9663ec9802_o.jpg,0.0,0.25,0.5625,1.0,388,866,https://www.flickr.com/photos/sedoglia/26574373433,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/ c5efec11992a91bb,https://c1.staticflickr.com/1/383/31708885771_38deb355c2_o.jpg,0.0,0.281690140845,0.75,0.845070422535,887,531,https://www.flickr.com/photos/southbeachcars/31708885771,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 5e725eba3bdf1806,https://c1.staticflickr.com/6/5836/31200238952_e09f1846cd_o.jpg,0.28125,0.0,0.84375,0.75,566,392,https://www.flickr.com/photos/davidwilson1949/31200238952/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 383f271f5d7b37f2,https://c1.staticflickr.com/8/7256/27745693316_dd0211201b_o.jpg,0.457373271889,0.0,1.0,0.75,821,948,https://www.flickr.com/photos/jsjgeology/27745693316,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 191381f06ea859a9,https://c1.staticflickr.com/9/8510/28651484113_41de53b6ca_o.jpg,0.0,0.0,0.666666666667,1.0,431,399,https://www.flickr.com/photos/yourbestdigs/28651484113,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 5141b9902efff940,https://c1.staticflickr.com/6/5540/29300374824_39fec2e4e7_o.jpg,0.25,0.25,0.75,1.0,832,907,https://www.flickr.com/photos/147489968@N06/29300374824,https://creativecommons.org/licenses/by/2.0/,Paintzen,https://www.flickr.com/people/147489968@N06/ c3309015d35f07f4,https://c1.staticflickr.com/1/485/31914455941_f3e3999c81_o.jpg,0.28125,0.0,0.84375,0.75,477,845,https://www.flickr.com/photos/garryknight/31914455941/,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ 48c2bd4448c4d311,https://c1.staticflickr.com/9/8644/28529303080_eb29197164_o.jpg,0.4375,0.0,1.0,0.75,706,837,https://www.flickr.com/photos/26531284@N02/28529303080,https://creativecommons.org/licenses/by/2.0/,rickpilot_2000,https://www.flickr.com/people/26531284@N02/ d80fd1dcbd8db378,https://c1.staticflickr.com/6/5694/30060457803_e5e58350b8_o.jpg,0.0,0.0,0.421177266576,0.75,600,715,https://flickr.com/148662629@N08/30060457803,https://creativecommons.org/licenses/by/2.0/,Dirk Pons,https://www.flickr.com/people/148662629@N08/ 41860112864b472c,https://c1.staticflickr.com/6/5710/30560392956_6f69243a67_o.jpg,0.28125,0.0,0.84375,0.75,484,442,https://flickr.com/10787737@N02/30560392956,https://creativecommons.org/licenses/by/2.0/,osseous,https://www.flickr.com/people/osseous/ bd2eada9f7d33abe,https://c1.staticflickr.com/6/5092/29980647155_f3f4cd7dfb_o.jpg,0.28125,0.0,0.84375,0.75,880,54,https://www.flickr.com/photos/31029865@N06/29980647155,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/ a729a4aae8a61a28,https://c1.staticflickr.com/9/8844/28399603156_472c934408_o.jpg,0.0,0.0,0.75,1.0,133,83,https://www.flickr.com/photos/nature80020/28399603156,https://creativecommons.org/licenses/by/2.0/,nature80020,https://www.flickr.com/people/nature80020/ fc912e8f19f4e1c9,https://c1.staticflickr.com/9/8794/27746131383_94be5fff1c_o.jpg,0.25,0.0,1.0,0.5625,320,158,https://flickr.com/27305106@N06/27746131383,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 7c8d13796ad37aba,https://c1.staticflickr.com/9/8406/28257602312_6671dfcbca_o.jpg,0.25,0.25,0.75,1.0,769,716,https://www.flickr.com/photos/petenowakowski/28257602312/,https://creativecommons.org/licenses/by/2.0/,Pete Nowakowski,https://www.flickr.com/people/petenowakowski/ 8a8ea770e3966f60,https://c1.staticflickr.com/8/7192/26526998484_8e5aa14e0f_o.jpg,0.0,0.25,0.531155015198,1.0,348,165,https://www.flickr.com/photos/usfwsmidwest/26526998484,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ f54aeb5092ed5267,https://c1.staticflickr.com/6/5559/30378835014_3d27f6341c_o.jpg,0.0,0.25,0.421177266576,1.0,147,643,https://flickr.com/40883175@N06/30378835014,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ 3b7f9186008ed0f5,https://c1.staticflickr.com/9/8313/29431761591_406a1172fd_o.jpg,0.0,0.0,1.0,1.0,672,883,https://www.flickr.com/photos/glorycycles/29431761591,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 56f5af432db2761c,https://c1.staticflickr.com/9/8639/28940478726_693be453a0_o.jpg,0.0,0.0,0.5625,0.75,976,43,https://www.flickr.com/photos/71267357@N06/28940478726/,https://creativecommons.org/licenses/by/2.0/,Transformer18,https://www.flickr.com/people/71267357@N06/ e165dcbeb553716f,https://c1.staticflickr.com/8/7337/27599335060_84a0aa3cdf_o.jpg,0.0,0.0,0.75,0.599757673667,2,727,https://www.flickr.com/photos/pratikpower/27599335060,https://creativecommons.org/licenses/by/2.0/,Pratik Kadam,https://www.flickr.com/people/pratikpower/ dcacd2cb3a4a708b,https://c1.staticflickr.com/6/5512/31080312132_1b46dea7c6_o.jpg,0.0,0.0,0.5625,0.75,875,105,https://www.flickr.com/photos/9759010@N07/31080312132,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/ d4ba1959112ec401,https://c1.staticflickr.com/1/406/32074830360_a12aa034f1_o.jpg,0.4375,0.0,1.0,0.75,437,740,https://flickr.com/64583732@N04/32074830360,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 1301ae213e18a95b,https://c1.staticflickr.com/8/7690/27056668605_ecd1c27d43_o.jpg,0.25,0.0,0.75,0.75,980,16,https://www.flickr.com/photos/slapers/27056668605,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 16ac239e2cdce2bf,https://c1.staticflickr.com/9/8845/28527655182_cdfd3c94f2_o.jpg,0.28125,0.25,0.84375,1.0,647,396,https://www.flickr.com/photos/amanderson/28527655182,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 1a9d934c5f1e9b30,https://c1.staticflickr.com/1/504/31529749781_6dd859448e_o.jpg,0.0,0.0,0.496696035242,0.75,706,988,http://www.flickr.com/photos/28101583@N07/31529749781/,https://creativecommons.org/licenses/by/2.0/,Drew Jacksich,https://www.flickr.com/people/28101583@N07/ c33dd1625990debd,https://c1.staticflickr.com/6/5520/31018061101_85096c72f6_o.jpg,0.0,0.0527240773286,1.0,1.0,449,831,https://www.flickr.com/photos/youngshanahan/31018061101/,https://creativecommons.org/licenses/by/2.0/,young shanahan,https://www.flickr.com/people/youngshanahan/ b81f94d7dead3f87,https://c1.staticflickr.com/8/7499/26855432905_e744ebb7f5_o.jpg,0.333333333333,0.0,1.0,1.0,548,558,https://www.flickr.com/photos/rhemkes/26855432905,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 7443b3a00aa62632,https://c1.staticflickr.com/8/7032/26494098444_24b70a5383_o.jpg,0.0,0.25,0.75,1.0,822,392,https://www.flickr.com/photos/jbrocker_photos/26494098444,https://creativecommons.org/licenses/by/2.0/,Jacqueline Brocker,https://www.flickr.com/people/jbrocker_photos/ a5aec9ae6f69aba3,https://c1.staticflickr.com/6/5524/29954452823_73c786e715_o.jpg,0.4375,0.0,1.0,0.75,780,57,https://www.flickr.com/photos/thoseguys119/29954452823/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ b45d46b94dc1a5df,https://c1.staticflickr.com/6/5805/30822705541_40dbe9513b_o.jpg,0.0746527777778,0.0,1.0,1.0,499,180,https://flickr.com/72649499@N02/30822705541,https://creativecommons.org/licenses/by/2.0/,Visit El Paso,https://www.flickr.com/people/visitelpaso/ 2272adb7416960d5,https://c1.staticflickr.com/8/7534/26872628225_4471526f36_o.jpg,0.497426470588,0.0,0.994852941176,0.75,108,262,https://www.flickr.com/photos/78139009@N03/26872628225,https://creativecommons.org/licenses/by/2.0/,allen,https://www.flickr.com/people/78139009@N03/ 064d418830204240,https://c1.staticflickr.com/4/3880/33156746752_793f2a569f_o.jpg,0.25,0.25,1.0,1.0,938,349,https://flickr.com/55229469@N07/33156746752,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ e597fa21734e89c4,https://c1.staticflickr.com/1/385/32041156043_d4251a6b81_o.jpg,0.25,0.0,1.0,0.606331168831,341,933,https://www.flickr.com/photos/ligthelm/32041156043/,https://creativecommons.org/licenses/by/2.0/,Rick Ligthelm,https://www.flickr.com/people/ligthelm/ 04856d7577af3f01,https://c1.staticflickr.com/2/1648/26727066606_203a95181d_o.jpg,0.333333333333,0.0,1.0,1.0,885,876,https://www.flickr.com/photos/flynn_nrg/26727066606/,https://creativecommons.org/licenses/by/2.0/,Miguel Mendez,https://www.flickr.com/people/flynn_nrg/ e49f7cebc3a971c5,https://c1.staticflickr.com/8/7204/26792027900_cf40e07f3d_o.jpg,0.0,0.0,0.912068965517,1.0,322,729,https://www.flickr.com/photos/33398884@N03/26792027900,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 1615a2ff9a08f98a,https://c1.staticflickr.com/6/5758/30007956914_7ef7260174_o.jpg,0.25,0.28125,1.0,0.84375,311,452,https://www.flickr.com/photos/christian_gloor/30007956914,https://creativecommons.org/licenses/by/2.0/,Christian Gloor,https://www.flickr.com/people/christian_gloor/ aade251caeefb72e,https://c1.staticflickr.com/9/8111/29016174660_863b4a37d0_o.jpg,0.0,0.0,0.75,0.5,443,348,https://www.flickr.com/photos/xiquinho/29016174660/,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/ 18e650e2f3fd0b8b,https://c1.staticflickr.com/9/8600/30031776975_74db42fea2_o.jpg,0.333333333333,0.0,1.0,1.0,760,95,https://www.flickr.com/photos/southbeachcars/30031776975,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 47c2d25662fb97e9,https://c1.staticflickr.com/8/7420/27075113093_fa73ff5880_o.jpg,0.340175953079,0.0,1.0,1.0,613,50,https://www.flickr.com/photos/13476480@N07/27075113093,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ cc6a261a775718b0,https://c1.staticflickr.com/8/7450/26624729103_131cb6c3d5_o.jpg,0.25,0.25,0.75,1.0,820,572,https://www.flickr.com/photos/usaghumphreys/26624729103,https://creativecommons.org/licenses/by/2.0/,USAG- Humphreys,https://www.flickr.com/people/usaghumphreys/ 71fd9b6568c3554f,https://c1.staticflickr.com/9/8168/29604585675_06c8ed512a_o.jpg,0.0,0.0,0.75,0.5,975,542,https://www.flickr.com/photos/125945909@N05/29604585675,https://creativecommons.org/licenses/by/2.0/,Min Zhou,https://www.flickr.com/people/125945909@N05/ b24df552253c097e,https://c1.staticflickr.com/8/7363/28038705582_10da3c32d0_o.jpg,0.0,0.0,0.5,0.75,327,548,https://www.flickr.com/photos/52450054@N04/28038705582/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ a7111498662cb869,https://c1.staticflickr.com/9/8387/27906192913_f5f455d46f_o.jpg,0.0,0.0,0.666666666667,1.0,820,164,https://www.flickr.com/photos/weeklydig/27906192913,https://creativecommons.org/licenses/by/2.0/,digboston,https://www.flickr.com/people/weeklydig/ 52a4c99c9b9a25ba,https://c1.staticflickr.com/1/440/32844287786_5faab3c7d1_o.jpg,0.0,0.25,0.421177266576,1.0,980,896,https://www.flickr.com/photos/blmoregon/32844287786,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 7e5a9f165fd5b3b5,https://c1.staticflickr.com/6/5766/29886866174_4082a96154_o.jpg,0.0,0.25,0.5625,1.0,875,242,https://www.flickr.com/photos/didbygraham/29886866174,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ bd88d3d7ea607cd7,https://c1.staticflickr.com/8/7494/27315069980_b5baaff788_o.jpg,0.0,0.25,0.5625,1.0,693,836,https://www.flickr.com/photos/stevendepolo/27315069980,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 303678f2e5c4f96b,https://c1.staticflickr.com/8/7757/27525692380_d7fb9ec430_o.jpg,0.324035234899,0.25,0.972105704698,1.0,788,71,https://www.flickr.com/photos/mypubliclands/27525692380,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 4190c29443e0b16a,https://c1.staticflickr.com/9/8306/28449853004_eff6a2aa67_o.jpg,0.266552511416,0.0,0.799657534247,0.75,672,312,https://www.flickr.com/photos/glorycycles/28449853004,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 79b273f7a55ecd69,https://c1.staticflickr.com/9/8641/30177005205_4a92846888_o.jpg,0.0,0.0,0.5,0.75,278,435,https://www.flickr.com/photos/philjose1878/30177005205,https://creativecommons.org/licenses/by/2.0/,Phil Fiddes,https://www.flickr.com/people/philjose1878/ 456f0845b4eae10c,https://c1.staticflickr.com/6/5568/30764193980_91b597907f_o.jpg,0.0,0.28125,0.75,0.84375,973,945,https://www.flickr.com/photos/rob-young/30764193980/,https://creativecommons.org/licenses/by/2.0/,Rob Young,https://www.flickr.com/people/rob-young/ c91a1530bd7f65cd,https://c1.staticflickr.com/9/8680/28494149881_5459d5a224_o.jpg,0.0,0.0,0.645728643216,0.75,459,914,https://www.flickr.com/photos/nat507/28494149881,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/ 6473f306f208411b,https://c1.staticflickr.com/9/8636/28216529995_8b68e21206_o.jpg,0.0,0.0,1.0,0.666666666667,967,414,https://www.flickr.com/photos/aloha75/28216529995,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/ fd752ff9c44ec7f2,https://c1.staticflickr.com/1/396/32576373656_7fcf6c5ee4_o.jpg,0.0,0.0,1.0,0.666666666667,431,228,https://www.flickr.com/photos/viumariners/32576373656/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/ 5cbd5dfd1cf9a8b3,https://c1.staticflickr.com/9/8547/29716169792_62153d091b_o.jpg,0.28125,0.25,0.84375,1.0,874,599,https://flickr.com/8147927@N08/29716169792,https://creativecommons.org/licenses/by/2.0/,Thanate Tan,https://www.flickr.com/people/thanate_tan/ f8694b0fdee5c9b2,https://c1.staticflickr.com/8/7079/27303909801_f9b1fbec46_o.jpg,0.0,0.30421686747,1.0,1.0,842,402,https://www.flickr.com/photos/spreadshirt/27303909801,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/ 5a6e51d54fc077c9,https://c1.staticflickr.com/6/5615/31156090932_1c48c16b3c_o.jpg,0.333333333333,0.0,1.0,1.0,986,26,https://www.flickr.com/photos/clairity/31156090932/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 823e94312d145344,https://c1.staticflickr.com/9/8643/28552213905_24d30ccfe0_o.jpg,0.28125,0.25,0.84375,1.0,669,854,https://www.flickr.com/photos/davidstanleytravel/28552213905,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 7599a033ce87b3b8,https://c1.staticflickr.com/6/5797/30418778714_3e0fc8a3bc_o.jpg,0.25,0.25,1.0,1.0,826,691,https://flickr.com/60517117@N00/30418778714,https://creativecommons.org/licenses/by/2.0/,Steve Terrell,https://www.flickr.com/people/robotclaw/ 0a7cda4e191e093d,https://c1.staticflickr.com/9/8867/28763165515_7a6e15df40_o.jpg,0.25,0.25,0.75,1.0,519,485,https://www.flickr.com/photos/janitors/28763165515,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 33fb6db0ec2dca80,https://c1.staticflickr.com/9/8813/28929004556_c8a1fb977d_o.jpg,0.0,0.0,1.0,1.0,323,32,https://www.flickr.com/photos/134015204@N02/28929004556?rb=1,https://creativecommons.org/licenses/by/2.0/,rippchenmitkraut66,https://www.flickr.com/people/rippchenmitkraut66/ 2510c86e125f01f7,https://c1.staticflickr.com/9/8206/29956416505_8881d0bea1_o.jpg,0.0,0.0,0.5625,0.75,593,842,https://www.flickr.com/photos/tslac/29956416505,https://creativecommons.org/licenses/by/2.0/,Texas State Library and Archives Commission,https://www.flickr.com/people/tslac/ 166f4368c4e92941,https://c1.staticflickr.com/8/7004/27671252943_ce29dfec3f_o.jpg,0.0,0.5,0.75,1.0,975,529,https://www.flickr.com/photos/mnuernberger/27671252943,https://creativecommons.org/licenses/by/2.0/,Marco N\303\274rnberger,https://www.flickr.com/people/mnuernberger/ e2f9d18e5de96894,https://c1.staticflickr.com/6/5606/30419566604_e448265b23_o.jpg,0.0,0.25,0.421177266576,1.0,980,184,https://flickr.com/148985558@N06/30419566604,https://creativecommons.org/licenses/by/2.0/,paztravels,https://www.flickr.com/people/paztravels/ 3ea12524f19ef9cc,https://c1.staticflickr.com/8/7764/28451777986_059ff4bed5_o.jpg,0.0,0.25,0.75,1.0,871,350,https://www.flickr.com/photos/59722994@N00/28451777986,https://creativecommons.org/licenses/by/2.0/,Motohiko Tokuriki,https://www.flickr.com/people/tokuriki/ 05e63d92d031a2b3,https://c1.staticflickr.com/9/8250/29624581192_089ec373c6_o.jpg,0.0,0.0,0.496696035242,0.75,980,469,https://www.flickr.com/photos/ashchand/29624581192,https://creativecommons.org/licenses/by/2.0/,Ashwin Chandrasekaran,https://www.flickr.com/people/ashchand/ f427620358c6c92d,https://c1.staticflickr.com/6/5490/31175708731_2a40e8fa6d_o.jpg,0.25,0.25,0.75,1.0,629,712,https://www.flickr.com/photos/prayitnophotography/31175708731,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 8edded180488d8b8,https://c1.staticflickr.com/4/3902/32749566386_08b4f75af5_o.jpg,0.0,0.0,0.662261380323,1.0,672,493,https://www.flickr.com/photos/glorycycles/32749566386,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ b8a5b4a95d3a3930,https://c1.staticflickr.com/9/8715/28081795322_15141991a0_o.jpg,0.0,0.0,0.75,0.75,979,171,https://www.flickr.com/photos/aidanmorgan/28081795322,https://creativecommons.org/licenses/by/2.0/,John Morgan,https://www.flickr.com/people/aidanmorgan/ 7f05a54a4194d722,https://c1.staticflickr.com/8/7323/27251873060_4c1d4b1f20_o.jpg,0.0,0.0,0.666666666667,1.0,40,830,https://www.flickr.com/photos/60199688@N08/27251873060/,https://creativecommons.org/licenses/by/2.0/,erikccooper,https://www.flickr.com/people/60199688@N08/ 78ba24181566aa76,https://c1.staticflickr.com/8/7762/27471775396_9e919e3994_o.jpg,0.252777777778,0.25,0.758333333333,1.0,78,692,https://www.flickr.com/photos/23660854@N07/27471775396,https://creativecommons.org/licenses/by/2.0/,Marshal Hedin,https://www.flickr.com/people/23660854@N07/ 6de9c760f9fca002,https://c1.staticflickr.com/6/5809/22842003478_e48fe425de_o.jpg,0.25,0.0,1.0,0.75,324,492,https://www.flickr.com/photos/sheila_sund/22842003478,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/ d8df9e8f8d619629,https://c1.staticflickr.com/9/8324/29784397852_09e66e8ba3_o.jpg,0.421177266576,0.25,0.842354533153,1.0,669,302,https://www.flickr.com/photos/ankurp/29784397852,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ 8dc3b28f3f2d6e41,https://c1.staticflickr.com/6/5687/30563604874_22212000a9_o.jpg,0.28125,0.25,0.84375,1.0,875,235,https://www.flickr.com/photos/wltmauc/30563604874,https://creativecommons.org/licenses/by/2.0/,Aubrey Morandarte,https://www.flickr.com/people/wltmauc/ 0be40127f05d09b8,https://c1.staticflickr.com/1/711/32602187995_a71eab3a82_o.jpg,0.0,0.281690140845,0.75,0.845070422535,558,433,https://www.flickr.com/photos/aukirk/32602187995,https://creativecommons.org/licenses/by/2.0/,Austin Kirk,https://www.flickr.com/people/aukirk/ 24387363af940d26,https://c1.staticflickr.com/1/436/31615723060_613795710b_o.jpg,0.243095930233,0.25,0.729287790698,1.0,980,731,https://www.flickr.com/photos/nicholas_t/31615723060,https://creativecommons.org/licenses/by/2.0/,Nicholas A. Tonelli,https://www.flickr.com/people/nicholas_t/ 913534c70379b170,https://c1.staticflickr.com/6/5772/31091704592_5737bdc892_o.jpg,0.0,0.25,0.5,1.0,39,685,https://www.flickr.com/photos/silkebaron/31091704592,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ 1bba4ef457be4add,https://c1.staticflickr.com/9/8150/28640089846_bf0bb330dd_o.jpg,0.25,0.263416815742,1.0,1.0,22,459,https://www.flickr.com/photos/hisgett/28640089846/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ f0b5fb31d0b21f1a,https://c1.staticflickr.com/9/8736/28135692231_153a09231e_o.jpg,0.0,0.25,0.75,0.75,304,950,https://www.flickr.com/photos/chaz_pics/28135692231/,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 5a0a62f0950f1a7c,https://c1.staticflickr.com/9/8218/29657949522_df9f31d7b5_o.jpg,0.55625,0.25,1.0,1.0,405,976,https://www.flickr.com/photos/hisgett/29657949522/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 2b1e1f0029bac0e6,https://c1.staticflickr.com/6/5490/30748432912_d20a98a2e8_o.jpg,0.28125,0.0,0.84375,0.75,875,718,https://www.flickr.com/photos/69203347@N03/30748432912,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ d46ebcc62af2acb9,https://c1.staticflickr.com/8/7683/28587713576_9abff046fa_o.jpg,0.438671875,0.0,1.0,0.75,303,89,https://www.flickr.com/photos/treegrow/28587713576/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 5194d217d92d4766,https://c1.staticflickr.com/6/5754/31001495165_f10911b6db_o.jpg,0.0,0.0,0.75,0.75,938,108,https://www.flickr.com/photos/lablasco/31001495165/,https://creativecommons.org/licenses/by/2.0/,Lablascovegmenu,https://www.flickr.com/people/lablasco/ 5623513a685f8768,https://c1.staticflickr.com/8/7538/26706714732_4dd5db5530_o.jpg,0.5,0.25,1.0,1.0,348,409,https://www.flickr.com/photos/kpaulus/26706714732,https://creativecommons.org/licenses/by/2.0/,Kristine Paulus,https://www.flickr.com/people/kpaulus/ 79851972b121cbbb,https://c1.staticflickr.com/9/8364/29372683066_1f4972f555_o.jpg,0.0,0.25,0.5,1.0,792,624,https://www.flickr.com/photos/polycart/29372683066,https://creativecommons.org/licenses/by/2.0/,Polycart,https://www.flickr.com/people/polycart/ bb4d99cb6d0fa407,https://c1.staticflickr.com/6/5477/30440351076_a76e025830_o.jpg,0.158823529412,0.25,0.476470588235,1.0,896,492,https://www.flickr.com/photos/8782469@N05/30440351076,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/ f448f3de61f8984b,https://c1.staticflickr.com/9/8305/29770886371_50cbd67376_o.jpg,0.25,0.0,1.0,1.0,986,994,https://www.flickr.com/photos/louisvilleusace/29770886371,https://creativecommons.org/licenses/by/2.0/,LouisvilleUSACE,https://www.flickr.com/people/louisvilleusace/ 4a43182fa48efb7b,https://c1.staticflickr.com/2/1692/26760229095_97ae025c92_o.jpg,0.0,0.0,0.666666666667,1.0,806,778,https://www.flickr.com/photos/jamesboyes/26760229095,https://creativecommons.org/licenses/by/2.0/,James Boyes,https://www.flickr.com/people/jamesboyes/ 7b5bb3821e924e98,https://c1.staticflickr.com/8/7290/27062590492_9deaa9a986_o.jpg,0.0,0.0,0.260106382979,0.75,780,750,https://www.flickr.com/photos/thoseguys119/27062590492,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 0b66e14b69c8d27c,https://c1.staticflickr.com/9/8550/29796420193_bd585838a6_o.jpg,0.0,0.0,0.666666666667,1.0,979,911,https://www.flickr.com/photos/za-photos/29796420193/,https://creativecommons.org/licenses/by/2.0/,Jolene Thompson,https://www.flickr.com/people/za-photos/ 3fd4e857267ea420,https://c1.staticflickr.com/8/7668/27164513270_6b3335bd17_o.jpg,0.0,0.0,0.801292407108,1.0,278,206,https://www.flickr.com/photos/x1brett/27164513270,https://creativecommons.org/licenses/by/2.0/,brett jordan,https://www.flickr.com/people/x1brett/ 7718bb25eee9c53b,https://c1.staticflickr.com/1/517/31708975603_dc3144215c_o.jpg,0.4375,0.0,1.0,0.75,920,256,https://www.flickr.com/photos/rubenholthuijsen/31708975603/,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen,https://www.flickr.com/people/rubenholthuijsen/ 5f22e9e4a74037e4,https://c1.staticflickr.com/1/272/32613292486_60295cc144_o.jpg,0.0,0.25,0.5625,1.0,469,472,https://www.flickr.com/photos/27665395@N05/32613292486,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ c638b72e6ce89197,https://c1.staticflickr.com/9/8729/28279072642_28eb614c5d_o.jpg,0.25,0.25,0.75,1.0,976,52,https://www.flickr.com/photos/o_0/28279072642,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ f68a12cb3aa6a4d0,https://c1.staticflickr.com/8/7775/26907330006_e4a35b75e8_o.jpg,0.0,0.288370253165,0.75,0.865110759494,671,351,https://www.flickr.com/photos/autohistorian/26907330006,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 3aa1b2978bded6a7,https://c1.staticflickr.com/9/8146/29818027015_467741f105_o.jpg,0.28125,0.25,0.84375,1.0,986,521,https://www.flickr.com/photos/104342908@N08/29818027015/,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/ ef1dc595bac111ff,https://c1.staticflickr.com/9/8406/29078738015_7b408ea619_o.jpg,0.281690140845,0.25,0.845070422535,1.0,303,825,https://www.flickr.com/photos/treegrow/29078738015,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ dbc0d5aaf91e0c64,https://c1.staticflickr.com/6/5606/31008852875_6ae0ec6dc7_o.jpg,0.5,0.0,1.0,0.75,973,599,https://www.flickr.com/photos/visitelpaso/31008852875/,https://creativecommons.org/licenses/by/2.0/,Visit El Paso,https://www.flickr.com/people/visitelpaso/ 026e6fc090ca1e0b,https://c1.staticflickr.com/9/8309/29264595430_fba4d7f333_o.jpg,0.686697782964,0.0,1.0,0.75,780,512,https://www.flickr.com/photos/thoseguys119/29264595430,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ d173abdca8d08e00,https://c1.staticflickr.com/9/8534/29200329383_1b7e226913_o.jpg,0.5,0.25,1.0,1.0,611,473,https://www.flickr.com/photos/yourbestdigs/29200329383,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 8f6cf070856bd7fd,https://c1.staticflickr.com/9/8716/28386662866_1544cfdac6_o.jpg,0.28125,0.25,0.84375,1.0,875,657,https://www.flickr.com/photos/didbygraham/28386662866,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 7c0b2866ef0111dd,https://c1.staticflickr.com/9/8627/28583418351_ce244c8e22_o.jpg,0.0,0.373762376238,0.75,1.0,561,868,https://www.flickr.com/photos/93558439@N05/28583418351,https://creativecommons.org/licenses/by/2.0/,Thomson20192,https://www.flickr.com/people/93558439@N05/ d9c4a9500e3d8a1f,https://c1.staticflickr.com/9/8866/28517613676_29a4c9c2b8_o.jpg,0.0,0.0,1.0,0.75,975,757,https://www.flickr.com/photos/jsjgeology/28517613676,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 9d43792b9cdefba9,https://c1.staticflickr.com/9/8441/28707482333_923e0a3972_o.jpg,0.438430311231,0.0,1.0,1.0,145,557,https://www.flickr.com/photos/blachswan/28707482333/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ 14f438bee9415e72,https://c1.staticflickr.com/9/8699/27675685924_a8345b9c38_o.jpg,0.0,0.5,0.75,1.0,563,529,https://www.flickr.com/photos/22711505@N05/27675685924,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 49882677346dd240,https://c1.staticflickr.com/9/8746/29581944051_82b0f49f83_o.jpg,0.174055829228,0.0,1.0,1.0,507,227,https://www.flickr.com/photos/7412up/29581944051,https://creativecommons.org/licenses/by/2.0/,Willy DURCZOK,https://www.flickr.com/people/7412up/ 8f02e12af18cd746,https://c1.staticflickr.com/9/8275/30047996471_4bbea54036_o.jpg,0.0,0.0,0.75,0.423337856174,650,500,https://www.flickr.com/photos/ben_salter/30047996471,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 572b040f23142076,https://c1.staticflickr.com/8/7559/27007892725_18f57823c3_o.jpg,0.0,0.0,0.5,0.75,782,835,https://www.flickr.com/photos/mwlguide/27007892725,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/ 51b0114ef80b939c,https://c1.staticflickr.com/9/8701/29004111174_3361a7f5fe_o.jpg,0.0,0.25,0.75,1.0,204,168,https://www.flickr.com/photos/55229469@N07/29004111174,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ b324159c2ca6d42c,https://c1.staticflickr.com/9/8022/29664260621_9bc4b9cde0_o.jpg,0.0,0.0,0.902229845626,1.0,115,768,https://www.flickr.com/photos/132326394@N07/29664260621/,https://creativecommons.org/licenses/by/2.0/,Stephan,https://www.flickr.com/people/132326394@N07/ 24f4e16bde01097f,https://c1.staticflickr.com/9/8272/28809310943_d466679ab4_o.jpg,0.0,0.25,0.603155339806,1.0,982,784,https://www.flickr.com/photos/dok1/28809310943,https://creativecommons.org/licenses/by/2.0/,Don O'Brien,https://www.flickr.com/people/dok1/ ee5329d0690f640a,https://c1.staticflickr.com/8/7311/27284976195_ca37bd4b11_o.jpg,0.0,0.25,0.75,1.0,9,104,https://www.flickr.com/photos/28457235@N04/27284976195/,https://creativecommons.org/licenses/by/2.0/,buecker,https://www.flickr.com/people/28457235@N04/ 5bd18fcd1ee84013,https://c1.staticflickr.com/6/5609/31656687831_fc021bec7b_o.jpg,0.28125,0.0,0.84375,0.75,556,72,https://www.flickr.com/photos/27665395@N05/31656687831,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ c0a4e548b5cbd6e1,https://c1.staticflickr.com/1/611/31614904655_d543a34242_o.jpg,0.276497695853,0.0,1.0,1.0,821,751,https://flickr.com/38986305@N06/31614904655,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/ c93988167288033f,https://c1.staticflickr.com/9/8460/28246028704_fec9717a5a_o.jpg,0.0,0.0,0.5,0.75,982,840,https://www.flickr.com/photos/mindahaas/28246028704/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ 951bce0c4f695dc1,https://c1.staticflickr.com/6/5071/30118811365_e360845f73_o.jpg,0.0,0.0,0.489416058394,0.75,780,488,https://www.flickr.com/photos/thoseguys119/30118811365,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 7c4b8ad60f369c61,https://c1.staticflickr.com/9/8679/29999251375_b8c42f3c01_o.jpg,0.0,0.25,0.582802547771,1.0,982,656,https://www.flickr.com/photos/apardavila/29999251375,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ e85a1abe87f1efef,https://c1.staticflickr.com/8/7326/28030562162_fab7bcb3f9_o.jpg,0.28125,0.25,0.84375,1.0,85,486,https://www.flickr.com/photos/guldem/28030562162,https://creativecommons.org/licenses/by/2.0/,G\303\274ldem \303\234st\303\274n,https://www.flickr.com/people/guldem/ a4e53a643cbd27a3,https://c1.staticflickr.com/1/291/32013237824_0987df33b6_o.jpg,0.25,0.0,1.0,1.0,418,193,http://www.flickr.com/photos/31424626@N05/32013237824,https://creativecommons.org/licenses/by/2.0/,Pulencio,https://www.flickr.com/people/pulencio/ 29596c93e9d20f40,https://c1.staticflickr.com/9/8768/29998682832_0521c6b6ae_o.jpg,0.246522693997,0.0,0.739568081991,0.75,561,721,https://flickr.com/41431665@N07/29998682832,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 3c0ce2f15437d6c9,https://c1.staticflickr.com/8/7352/26796257841_a90a5aa6ac_o.jpg,0.25,0.0,0.75,0.75,820,612,https://www.flickr.com/photos/jus10h/26796257841,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 7bf4d177631cf983,https://c1.staticflickr.com/9/8182/28538329426_a497d4e708_o.jpg,0.502717391304,0.0,0.837862318841,0.75,459,614,https://www.flickr.com/photos/22711505@N05/28538329426,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ e711ce39b5009cf4,https://c1.staticflickr.com/9/8058/29568056736_9e3da92729_o.jpg,0.423337856174,0.0,0.846675712347,0.75,392,308,https://www.flickr.com/photos/piawaugh/29568056736,https://creativecommons.org/licenses/by/2.0/,Pia Waugh,https://www.flickr.com/people/piawaugh/ 2b57b90a06780ecf,https://c1.staticflickr.com/8/7538/29654217532_65a85d9c27_o.jpg,0.0,0.498153618907,0.75,1.0,498,257,https://www.flickr.com/photos/eltb/29654217532,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 46e99e55efdb3083,https://c1.staticflickr.com/9/8321/29562817746_1f7eaee38a_o.jpg,0.0,0.25,0.531155015198,1.0,887,2,https://www.flickr.com/photos/29233640@N07/29562817746,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ f5eb74676e173342,https://c1.staticflickr.com/9/8112/29617355311_7cd599a5f6_o.jpg,0.443623639191,0.25,1.0,1.0,719,773,https://www.flickr.com/photos/pleia2/29617355311,https://creativecommons.org/licenses/by/2.0/,Elizabeth K. Joseph,https://www.flickr.com/people/pleia2/ ef70097e4f402ac3,https://c1.staticflickr.com/9/8083/29752159901_e17f85b1ce_o.jpg,0.0,0.25,0.5,1.0,566,359,https://www.flickr.com/photos/mypubliclands/29752159901,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 988eb07ca03b06cc,https://c1.staticflickr.com/8/7189/27204192715_a6943be9b0_o.jpg,0.0,0.0,0.666666666667,1.0,780,123,https://www.flickr.com/photos/zionfiction/27204192715,https://creativecommons.org/licenses/by/2.0/,r. nial bradshaw,https://www.flickr.com/people/zionfiction/ dc521698f8d5d546,https://c1.staticflickr.com/1/697/32525816761_0bf08c3a6f_o.jpg,0.0,0.25,0.5,1.0,324,850,https://www.flickr.com/photos/usfwsmidwest/32525816761,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ ce2facd2fb6d0cbe,https://c1.staticflickr.com/9/8396/29014536013_b1f475ea94_o.jpg,0.25,0.25,1.0,1.0,305,606,https://www.flickr.com/photos/50066720@N03/29014536013/,https://creativecommons.org/licenses/by/2.0/,Beckie,https://www.flickr.com/people/50066720@N03/ f35e452f8f9b7634,https://c1.staticflickr.com/9/8736/29911442362_33e4f77cba_o.jpg,0.0,0.0,0.599757673667,0.75,459,22,https://www.flickr.com/photos/larry1732/29911442362,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ 0cb2a9ff095c5860,https://c1.staticflickr.com/6/5473/30527611383_9ac469c186_o.jpg,0.28125,0.0,0.84375,0.75,986,199,https://www.flickr.com/photos/rusty_clark/30527611383/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ fc4e917f0f1837f6,https://c1.staticflickr.com/8/7220/27180681395_9846dc50a6_o.jpg,0.248713235294,0.0,0.746139705882,0.75,404,867,https://www.flickr.com/photos/rpavich/27180681395,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ a845c7f368219a16,https://c1.staticflickr.com/9/8477/28887424350_99cbc4f819_o.jpg,0.0,0.4375,0.75,1.0,674,934,https://www.flickr.com/photos/knightbaron/28887424350,https://creativecommons.org/licenses/by/2.0/,KniBaron,https://www.flickr.com/people/knightbaron/ b9ab42ddbc891f7f,https://c1.staticflickr.com/9/8857/28630284570_f0b18f7830_o.jpg,0.333333333333,0.0,1.0,1.0,548,977,https://www.flickr.com/photos/92854252@N04/28630284570/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ 4e214d74a13e7eae,https://c1.staticflickr.com/6/5514/29964707093_4069dc0406_o.jpg,0.334315169367,0.0,1.0,1.0,682,809,https://www.flickr.com/photos/143842337@N03/29964707093/,https://creativecommons.org/licenses/by/2.0/,ThoroughlyReviewed,https://www.flickr.com/people/143842337@N03/ c9bc0f6afe6a7397,https://c1.staticflickr.com/1/310/31843640285_6e6419cab7_o.jpg,0.0,0.0,1.0,1.0,921,525,https://flickr.com/53301297@N00/31843640285,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 983d11a0ab98007a,https://c1.staticflickr.com/1/404/31566868002_74ed92d09f_o.jpg,0.333333333333,0.0,1.0,1.0,820,473,https://www.flickr.com/photos/stevendepolo/31566868002,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ c22a761ff780a7f0,https://c1.staticflickr.com/9/8759/28310969426_0b21dbb63b_o.jpg,0.0,0.0,0.5,0.75,519,572,https://www.flickr.com/photos/box_repsol/28310969426,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 98a6f4ca43bc13d8,https://c1.staticflickr.com/1/267/32373055602_7ed2c91657_o.jpg,0.284741144414,0.0,0.854223433243,1.0,982,256,https://www.flickr.com/photos/22711505@N05/32373055602,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ f215eddb3c35e1c8,https://c1.staticflickr.com/1/412/31746318483_f3374e67f5_o.jpg,0.267938931298,0.25,0.803816793893,1.0,971,121,https://www.flickr.com/photos/ruthanddave/31746318483,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ ae474c518dd0dcdd,https://c1.staticflickr.com/6/5448/29903549963_376cce3e8b_o.jpg,0.400242326333,0.25,1.0,1.0,310,392,https://www.flickr.com/photos/theocrazzolara/29903549963/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ 8cbd9f1413c5b039,https://c1.staticflickr.com/9/8034/29093793354_e84e286e23_o.jpg,0.578822733424,0.25,1.0,1.0,950,128,https://www.flickr.com/photos/danielmee/29093793354,https://creativecommons.org/licenses/by/2.0/,Daniel Mee,https://www.flickr.com/people/danielmee/ dd1b335e88e70f22,https://c1.staticflickr.com/8/7391/27537501975_370bb62227_o.jpg,0.0,0.0,0.666666666667,1.0,422,677,https://www.flickr.com/photos/26126239@N02/27537501975,https://creativecommons.org/licenses/by/2.0/,University of Exeter,https://www.flickr.com/people/26126239@N02/ a7e0d42195468ac5,https://c1.staticflickr.com/6/5616/29787279544_52c0555219_o.jpg,0.0,0.0,0.659824046921,1.0,563,335,http://www.flickr.com/photos/photatojonez/29787279544/,https://creativecommons.org/licenses/by/2.0/,Alexander Day,https://www.flickr.com/people/photatojonez/ 5179dc051c3bfe3a,https://c1.staticflickr.com/8/7639/27610972275_4d282976fb_o.jpg,0.0,0.0,0.45,0.75,407,591,https://www.flickr.com/photos/eltb/27610972275/,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 93efb4997382472c,https://c1.staticflickr.com/9/8294/27944274244_3b3e9a10d8_o.jpg,0.0,0.0,1.0,0.666666666667,438,452,https://www.flickr.com/photos/65047661@N00/27944274244/,https://creativecommons.org/licenses/by/2.0/,Jim Lukach,https://www.flickr.com/people/65047661@N00/ 87fc376a83ebd215,https://c1.staticflickr.com/8/7360/26964787593_0f9162686b_o.jpg,0.4375,0.0,1.0,0.75,563,250,https://www.flickr.com/photos/pamelav/26964787593/,https://creativecommons.org/licenses/by/2.0/,Pamela V White,https://www.flickr.com/people/pamelav/ 4500f4b29dc9f203,https://c1.staticflickr.com/9/8557/30330380866_4a764893d4_o.jpg,0.25,0.25,0.75,1.0,830,283,https://www.flickr.com/photos/albertlugosi/30330380866,https://creativecommons.org/licenses/by/2.0/,Albert Lugosi,https://www.flickr.com/people/albertlugosi/ 06669fa0ad76ffea,https://c1.staticflickr.com/1/481/31138282364_b51d629652_o.jpg,0.257672155689,0.0,0.773016467066,0.75,704,546,https://www.flickr.com/photos/thomasleuthard/31138282364,https://creativecommons.org/licenses/by/2.0/,Thomas Leuthard,https://www.flickr.com/people/thomasleuthard/ dda50547c2ac694c,https://c1.staticflickr.com/9/8327/29862585196_4841911fb1_o.jpg,0.578822733424,0.0,1.0,0.75,669,677,https://www.flickr.com/photos/ankurp/29862585196,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ a68e035407c80913,https://c1.staticflickr.com/6/5666/30775836001_f9005f424d_o.jpg,0.249631811487,0.25,0.748895434462,1.0,868,673,https://www.flickr.com/photos/76969036@N02/30775836001,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 4a20523c00280ebd,https://c1.staticflickr.com/8/7417/27116983063_e1a6a9fde4_o.jpg,0.285496183206,0.0,1.0,1.0,404,613,https://www.flickr.com/photos/usnavy/27116983063,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ e124ddb2933ce3ee,https://c1.staticflickr.com/9/8117/28691120934_a08d2237c3_o.jpg,0.0,0.0,1.0,0.799676898223,983,737,https://www.flickr.com/photos/slgc/28691120934/,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ e9dc79b4d9a5c072,https://c1.staticflickr.com/6/5783/30558121892_8bf40d1285_o.jpg,0.221875,0.0,0.665625,0.75,896,339,https://www.flickr.com/photos/hisgett/30558121892,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ c871806d605af637,https://c1.staticflickr.com/9/8668/28210661206_7b5ef3d50a_o.jpg,0.25,0.25,0.75,1.0,909,767,https://www.flickr.com/photos/fun_flying/28210661206,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/ 1cacc4349406aec3,https://c1.staticflickr.com/9/8726/28598627761_4926bb04be_o.jpg,0.0,0.0,1.0,0.663235294118,644,891,https://flickr.com/13589279@N05/28598627761,https://creativecommons.org/licenses/by/2.0/,Mike Ball,https://www.flickr.com/people/massmarrier/ d43da544939a9bfe,https://c1.staticflickr.com/8/7388/27808730486_eb4117376f_o.jpg,0.229343220339,0.25,0.688029661017,1.0,896,118,https://www.flickr.com/photos/8269539@N04/27808730486,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ c96a5e1a54678fb7,https://c1.staticflickr.com/8/7041/27645775162_9999ebb2a4_o.jpg,0.25,0.25,0.75,1.0,673,656,https://www.flickr.com/photos/o_0/27645775162/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 18ba2b80fe7712bc,https://c1.staticflickr.com/9/8461/29005856964_ffa218e727_o.jpg,0.163739669421,0.0,0.491219008264,1.0,719,663,https://www.flickr.com/photos/132033298@N04/29005856964,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/ 87491fb1d2363b4d,https://c1.staticflickr.com/9/8559/29377748600_5085d378ed_o.jpg,0.0,0.0,0.666666666667,1.0,561,845,https://www.flickr.com/photos/jill_carlson/29377748600/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ b10b8b771ce0e658,https://c1.staticflickr.com/9/8425/29589785976_89dd2b1462_o.jpg,0.218793103448,0.0,0.656379310345,0.75,437,987,https://www.flickr.com/photos/autohistorian/29589785976,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 27e0d2d2a445edb5,https://c1.staticflickr.com/6/5668/29806336344_b0a2176d5d_o.jpg,0.0,0.0,0.75,1.0,980,871,https://www.flickr.com/photos/blodgett-esq/29806336344/,https://creativecommons.org/licenses/by/2.0/,blodgett esq.,https://www.flickr.com/people/blodgett-esq/ d5a5ea0cfb74713d,https://c1.staticflickr.com/8/7438/27056675635_29414ca085_o.jpg,0.0,0.25,0.5,1.0,349,414,https://www.flickr.com/photos/slapers/27056675635,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 12f5d4d63fd333bb,https://c1.staticflickr.com/9/8554/29650813575_2405152648_o.jpg,0.0,0.0,0.561328125,0.75,336,892,https://www.flickr.com/photos/j_benson/29650813575/,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/ 43a8ba622aeb8907,https://c1.staticflickr.com/6/5620/31453990606_3ecb88a22e_o.jpg,0.25,0.25,0.75,1.0,490,846,https://www.flickr.com/photos/143850343@N06/31453990606/,https://creativecommons.org/licenses/by/2.0/,Sam-H-A,https://www.flickr.com/people/143850343@N06/ 4d2279fbb77d5cf4,https://c1.staticflickr.com/6/5759/29467876023_f2853f0f22_o.jpg,0.498159057437,0.0,0.996318114875,0.75,324,464,http://www.flickr.com/photos/usfwsmtnprairie/29467876023/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ d5086d482ee5a6bf,https://c1.staticflickr.com/4/3945/33200171726_d957ed78b5_o.jpg,0.5,0.0,1.0,0.75,98,183,https://www.flickr.com/photos/am1974/33200171726/,https://creativecommons.org/licenses/by/2.0/,Artur Malinowski,https://www.flickr.com/people/am1974/ 689896ca3c110e0f,https://c1.staticflickr.com/9/8525/29413123402_9a615ff9d2_o.jpg,0.25,0.25,0.75,1.0,820,670,https://www.flickr.com/photos/22257051@N07/29413123402,https://creativecommons.org/licenses/by/2.0/,The Come Up Show,https://www.flickr.com/people/thecomeupshow/ d4d04d53302a46b2,https://c1.staticflickr.com/9/8887/28506001620_2b07ee4987_o.jpg,0.25,0.0,1.0,1.0,964,708,https://www.flickr.com/photos/ruthanddave/28506001620,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 53bf4804c98a319a,https://c1.staticflickr.com/1/255/31828933411_9c77475315_o.jpg,0.25,0.0,0.75,0.75,501,412,https://www.flickr.com/photos/mypubliclands/31828933411/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ dfa69d4bbbe98947,https://c1.staticflickr.com/8/7557/26595435894_4b8ea322df_o.jpg,0.5,0.0,1.0,0.75,820,913,https://www.flickr.com/photos/strelka/26595435894/,https://creativecommons.org/licenses/by/2.0/,"Strelka Institute for Media, Architecture and Design",https://www.flickr.com/people/strelka/ 0c09c08b079105b3,https://c1.staticflickr.com/6/5618/30525103314_a70fe3b6b3_o.jpg,0.0,0.0,0.75,0.75,498,277,https://flickr.com/53301297@N00/30525103314,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 443e7fabb15790e2,https://c1.staticflickr.com/9/8007/29250761402_9fe25d93dc_o.jpg,0.0,0.0,0.5625,0.75,991,275,https://www.flickr.com/photos/zongo/29250761402/,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 7baabcc2b65fd7b7,https://c1.staticflickr.com/1/736/32900675130_e8bbc5dcc2_o.jpg,0.28125,0.25,0.84375,1.0,672,711,https://www.flickr.com/photos/glorycycles/32900675130/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ ef7b9df82183a037,https://c1.staticflickr.com/1/688/31497001456_f311722ae1_o.jpg,0.5,0.0,1.0,0.75,820,448,https://www.flickr.com/photos/thejointstaff/31497001456,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ de0316f73303fade,https://c1.staticflickr.com/1/316/32388284962_f7c41eb398_o.jpg,0.210588633288,0.25,0.631765899865,1.0,498,988,https://flickr.com/25034321@N05/32388284962,https://creativecommons.org/licenses/by/2.0/,Ninian Reid,https://www.flickr.com/people/ninian_reid/ ca397965e52fff65,https://c1.staticflickr.com/9/8673/28346652132_b5ac4ba0c9_o.jpg,0.333333333333,0.0,1.0,1.0,484,456,https://www.flickr.com/photos/tipsfortravellers/28346652132,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 0cde76c81018cc8a,https://c1.staticflickr.com/8/7452/27738941746_ea054acda9_o.jpg,0.25,0.25,0.75,1.0,472,779,https://www.flickr.com/photos/historicbremen/27738941746,https://creativecommons.org/licenses/by/2.0/,Historic Bremen,https://www.flickr.com/people/historicbremen/ 3417481b4e7b29c8,https://c1.staticflickr.com/8/7412/27785214572_dbede9aedd_o.jpg,0.0,0.25,0.540644171779,1.0,131,221,https://www.flickr.com/photos/7326810@N08/27785214572,https://creativecommons.org/licenses/by/2.0/,Jean,https://www.flickr.com/people/7326810@N08/ 3d633d0d16ce6adf,https://c1.staticflickr.com/6/5542/31207825101_98cef7e28f_o.jpg,0.0,0.0,0.5,0.75,868,717,https://www.flickr.com/photos/76969036@N02/31207825101/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 740ac1818ddd2348,https://c1.staticflickr.com/9/8134/29141921473_72e41ce8c3_o.jpg,0.0,0.0,0.5,0.75,405,803,https://www.flickr.com/photos/markyharky/29141921473,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ a5d637656f4a402c,https://c1.staticflickr.com/9/8208/28855665554_4605649b37_o.jpg,0.25,0.0,1.0,0.56338028169,318,197,https://www.flickr.com/photos/treegrow/28855665554,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 8cdf83a40ca622f6,https://c1.staticflickr.com/9/8688/27961256813_d07491f87d_o.jpg,0.0,0.25,0.75,1.0,545,425,https://www.flickr.com/photos/discoveroregon/27961256813,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 57f37f94f35eeb62,https://c1.staticflickr.com/9/8063/29238226802_5b612af290_o.jpg,0.25,0.309729064039,1.0,0.929187192118,579,614,https://www.flickr.com/photos/virtualevangelical/29238226802,https://creativecommons.org/licenses/by/2.0/,Evangelical Resident,https://www.flickr.com/people/virtualevangelical/ c9d0f609d73c3bf8,https://c1.staticflickr.com/8/7512/26874346542_8ae0c4d6c1_o.jpg,0.0,0.0,0.5,0.75,781,842,https://www.flickr.com/photos/glynlowe/26874346542,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ aba052815b5f1a17,https://c1.staticflickr.com/9/8764/28710173280_ce0dc92a48_o.jpg,0.5,0.0,1.0,0.75,820,879,https://www.flickr.com/photos/strelka/28710173280,https://creativecommons.org/licenses/by/2.0/,"Strelka Institute for Media, Architecture and Design",https://www.flickr.com/people/strelka/ 890b26283b4a858c,https://c1.staticflickr.com/8/7701/26844058190_90ba77e647_o.jpg,0.0,0.0,1.0,0.75,459,733,https://www.flickr.com/photos/24701549@N07/26844058190,https://creativecommons.org/licenses/by/2.0/,Spudgun67,https://www.flickr.com/people/24701549@N07/ 844b5a20a81b2881,https://c1.staticflickr.com/9/8519/28890651640_02dfab407b_o.jpg,0.25,0.25,1.0,1.0,832,806,https://www.flickr.com/photos/danielguenther/28890651640,https://creativecommons.org/licenses/by/2.0/,Daniel G\303\274nther,https://www.flickr.com/people/danielguenther/ 28236da104ddeace,https://c1.staticflickr.com/6/5634/30535509572_f40049c872_o.jpg,0.0,0.25,0.599757673667,1.0,709,537,https://flickr.com/15802578@N00/30535509572,https://creativecommons.org/licenses/by/2.0/,Billie Grace Ward,https://www.flickr.com/people/wwward0/ 7f84a1fe9c7d2ae8,https://c1.staticflickr.com/9/8194/28071424683_a8912a7b6c_o.jpg,0.0,0.0,0.547453703704,0.75,476,591,https://www.flickr.com/photos/29233640@N07/28071424683,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ 9d396037f03bddf2,https://c1.staticflickr.com/3/2407/32640699590_c3c3e934a8_o.jpg,0.437669376694,0.0,1.0,1.0,518,47,http://www.flickr.com/photos/143272442@N02/32640699590/,https://creativecommons.org/licenses/by/2.0/,Construction Sites Berlin,https://www.flickr.com/people/143272442@N02/ 3ab4a736681fc8a9,https://c1.staticflickr.com/6/5513/30942759646_16b442608a_o.jpg,0.0,0.25,0.5,1.0,763,939,https://www.flickr.com/photos/39551170@N02/30942759646/,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/ 017493c1cddc040c,https://c1.staticflickr.com/8/7507/27604565336_6ca7588675_o.jpg,0.438671875,0.25,1.0,1.0,309,378,https://www.flickr.com/photos/treegrow/27604565336/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ c2c9e2236b83f70e,https://c1.staticflickr.com/6/5681/30404602451_bfd8c45a9c_o.jpg,0.0,0.0,0.5,0.75,947,804,https://flickr.com/38315261@N00/30404602451,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 453841c49a5bff89,https://c1.staticflickr.com/6/5706/30302309300_7be19c61cc_o.jpg,0.25,0.0,0.75,0.75,405,627,https://www.flickr.com/photos/ajmexico/30302309300,https://creativecommons.org/licenses/by/2.0/,ajmexico,https://www.flickr.com/people/ajmexico/ c779b0c309843dfa,https://c1.staticflickr.com/3/2310/32064915793_b9711fc6fc_o.jpg,0.0,0.0,0.665684830633,1.0,820,795,https://www.flickr.com/photos/26126239@N02/32064915793/,https://creativecommons.org/licenses/by/2.0/,University of Exeter,https://www.flickr.com/people/26126239@N02/ 39efdad3eeaf6fb8,https://c1.staticflickr.com/9/8582/29272491315_9f71ca38e6_o.jpg,0.0,0.25,0.75,1.0,743,477,https://www.flickr.com/photos/rocketboom/29272491315/,https://creativecommons.org/licenses/by/2.0/,SupportPDX,https://www.flickr.com/people/rocketboom/ 2ed100c942fe2248,https://c1.staticflickr.com/8/7284/27257527010_a6a8e17b5b_o.jpg,0.528969957082,0.25,1.0,1.0,604,90,https://www.flickr.com/photos/13476480@N07/27257527010,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ d26f130d5a268561,https://c1.staticflickr.com/6/5523/31037422572_8fa7754e07_o.jpg,0.0,0.0,1.0,0.75,973,886,https://www.flickr.com/photos/jsjgeology/31037422572,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ ff756131d3d9147a,https://c1.staticflickr.com/8/7643/26266186204_9ec36f92b3_o.jpg,0.0,0.0,0.561328125,0.75,518,916,https://www.flickr.com/photos/southbeachcars/26266186204,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 17f53e22052ac67c,https://c1.staticflickr.com/9/8102/29111683795_304e1c3c8b_o.jpg,0.25,0.0,1.0,0.75,986,899,https://www.flickr.com/photos/mig/29111683795/,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/ 67d78d51e2bc102b,https://c1.staticflickr.com/9/8804/27707452174_96f0a4ae7d_o.jpg,0.4375,0.25,1.0,1.0,501,898,https://www.flickr.com/photos/woodhead/27707452174,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/ 7503a5e845fe6d07,https://c1.staticflickr.com/3/2250/32671579282_15d92f153e_o.jpg,0.25,0.4375,1.0,1.0,885,399,https://www.flickr.com/photos/143957286@N05/32671579282,https://creativecommons.org/licenses/by/2.0/,whitehart1882,https://www.flickr.com/people/143957286@N05/ 6464ad4ab696bb37,https://c1.staticflickr.com/8/7754/26923036940_fb945952e3_o.jpg,0.286277602524,0.25,0.858832807571,1.0,499,497,https://www.flickr.com/photos/r00s/26923036940,https://creativecommons.org/licenses/by/2.0/,Ro\315\254\315\254\315\240\315\240\315\241\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240s\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240a\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240 Menkman,https://www.flickr.com/people/r00s/ 0a124a5df3a82bef,https://c1.staticflickr.com/9/8187/29948376721_cf0e6f2f46_o.jpg,0.578822733424,0.0,1.0,0.75,761,529,http://www.flickr.com/photos/10787737@N02/29948376721,https://creativecommons.org/licenses/by/2.0/,osseous,https://www.flickr.com/people/osseous/ 0753e78ac4f70e23,https://c1.staticflickr.com/1/773/31492219294_68f9fa100b_o.jpg,0.0,0.0,0.5625,0.75,459,237,https://www.flickr.com/photos/alper/31492219294,https://creativecommons.org/licenses/by/2.0/,Alper \303\207u\304\237un,https://www.flickr.com/people/alper/ 626c9d5889b7d80a,https://c1.staticflickr.com/6/5619/30581230662_a9c76311d5_o.jpg,0.4375,0.0,1.0,0.75,608,772,https://flickr.com/30095562@N07/30581230662,https://creativecommons.org/licenses/by/2.0/,John Kwasnik,https://www.flickr.com/people/kwaspix/ 05fab9918f05816d,https://c1.staticflickr.com/9/8571/28680878580_6328252f79_o.jpg,0.25,0.25,0.75,1.0,95,383,https://flickr.com/49048066@N06/28680878580,https://creativecommons.org/licenses/by/2.0/,Ben Cappellacci,https://www.flickr.com/people/cappellacci/ 2e3a1a1c440751e1,https://c1.staticflickr.com/8/7320/26339862564_4351c0a692_o.jpg,0.333333333333,0.0,1.0,1.0,405,463,https://www.flickr.com/photos/km30192002/26339862564/,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/ a4d9f51a15d63047,https://c1.staticflickr.com/9/8576/28542048560_5b03b26494_o.jpg,0.0,0.28125,0.75,0.84375,709,231,https://www.flickr.com/photos/igcameron/28542048560,https://creativecommons.org/licenses/by/2.0/,Iain Cameron,https://www.flickr.com/people/igcameron/ b13bcb7c709c2ddd,https://c1.staticflickr.com/8/7530/27212290393_143ec85902_o.jpg,0.332842415317,0.0,0.99852724595,1.0,896,773,https://www.flickr.com/photos/621crw/27212290393/,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/ f74d64067624d5bb,https://c1.staticflickr.com/8/7306/27296283963_dc2fe99540_o.jpg,0.0,0.0,0.75,0.379820051414,309,519,https://www.flickr.com/photos/jsjgeology/27296283963,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 055ec88618acdd58,https://c1.staticflickr.com/1/548/31407189214_697f508033_o.jpg,0.0,0.0,0.495594713656,0.75,317,766,https://www.flickr.com/photos/aotaro/31407189214/,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/ cf7467de061473b6,https://c1.staticflickr.com/6/5657/30718191926_5f42889592_o.jpg,0.421177266576,0.0,0.842354533153,0.75,377,198,https://www.flickr.com/photos/lwpkommunikacio/30718191926,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 9c858a860598df4c,https://c1.staticflickr.com/9/8513/29146876133_b8cbb04c92_o.jpg,0.5,0.0,1.0,0.75,437,745,https://www.flickr.com/photos/8782469@N05/29146876133,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/ 5c5fc3d9b7efea58,https://c1.staticflickr.com/6/5478/30459045624_3ce3b52357_o.jpg,0.333333333333,0.0,1.0,1.0,763,265,https://www.flickr.com/photos/schaerer/30459045624/,https://creativecommons.org/licenses/by/2.0/,Walter Sch\303\244rer,https://www.flickr.com/people/schaerer/ 1516c3ab0faeafd9,https://c1.staticflickr.com/8/7326/27533046715_1394b5bc6b_o.jpg,0.0,0.306985294118,0.75,0.920955882353,864,772,https://flickr.com/56846157@N00/27533046715,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/ 3118557a12e2bd94,https://c1.staticflickr.com/9/8389/29115169316_dafc478c46_o.jpg,0.0,0.25,0.561328125,1.0,323,145,https://www.flickr.com/photos/tamakisono/29115169316/,https://creativecommons.org/licenses/by/2.0/,Tamaki Sono,https://www.flickr.com/people/tamakisono/ a6cca368f8e25813,https://c1.staticflickr.com/8/7562/27130656106_5ec4c0ede3_o.jpg,0.486342042755,0.25,0.810570071259,1.0,821,626,https://www.flickr.com/photos/jsjgeology/27130656106,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ f0132a818478b833,https://c1.staticflickr.com/9/8494/29666625972_88506f3a3e_o.jpg,0.0,0.4375,0.75,1.0,336,570,https://www.flickr.com/photos/kirbyurner/29666625972,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/ 926c676a37c8d8ca,https://c1.staticflickr.com/6/5661/25292904139_f7c2e0f1b9_o.jpg,0.480130057803,0.0,0.960260115607,0.75,975,138,https://www.flickr.com/photos/jsjgeology/25292904139,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d1b6dac7fb52ad5d,https://c1.staticflickr.com/8/7389/27083479310_f98e9c0576_o.jpg,0.28125,0.25,0.84375,1.0,19,409,https://www.flickr.com/photos/9750464@N02/27083479310/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ fc686275c3bc0f3b,https://c1.staticflickr.com/9/8098/29126916735_35b0374261_o.jpg,0.486547085202,0.25,1.0,1.0,547,451,https://www.flickr.com/photos/100739735@N06/29126916735,https://creativecommons.org/licenses/by/2.0/,interestedbystandr,https://www.flickr.com/people/100739735@N06/ e1b42783d8a2dbf8,https://c1.staticflickr.com/9/8751/28302703740_95ea3b0b62_o.jpg,0.4375,0.0,1.0,0.75,908,731,https://www.flickr.com/photos/infrogmation/28302703740/,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/ 633fae7955650839,https://c1.staticflickr.com/6/5509/30424624871_c06338a730_o.jpg,0.499263622975,0.25,0.99852724595,1.0,888,609,https://www.flickr.com/photos/sejmrp/30424624871,https://creativecommons.org/licenses/by/2.0/,Sejm RP,https://www.flickr.com/people/sejmrp/ bada76e1ab67db63,https://c1.staticflickr.com/6/5542/29875060053_7e7b3623a6_o.jpg,0.0,0.25,0.5,1.0,128,387,https://www.flickr.com/photos/erikstarck/29875060053/,https://creativecommons.org/licenses/by/2.0/,Erik Starck,https://www.flickr.com/people/erikstarck/ ef6c65ef4f5a3c56,https://c1.staticflickr.com/9/8373/29079548625_8cf25e9493_o.jpg,0.421177266576,0.0,0.842354533153,0.75,984,862,https://www.flickr.com/photos/20940650@N07/29079548625/,https://creativecommons.org/licenses/by/2.0/,Geoffrey Rhodes,https://www.flickr.com/people/20940650@N07/ 7831e44f93fe1cbf,https://c1.staticflickr.com/8/7305/27300069633_32166c7d5f_o.jpg,0.256726457399,0.25,0.770179372197,1.0,896,60,https://www.flickr.com/photos/13476480@N07/27300069633,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 6b1332a380406e89,https://c1.staticflickr.com/9/8502/28061592184_06543fbc7c_o.jpg,0.0,0.0,0.666666666667,1.0,706,439,https://www.flickr.com/photos/kecko/28061592184,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ 4686fea497a61d5c,https://c1.staticflickr.com/9/8199/28782720594_60612b74a9_o.jpg,0.5,0.25,1.0,1.0,792,620,https://www.flickr.com/photos/polycart/28782720594,https://creativecommons.org/licenses/by/2.0/,Polycart,https://www.flickr.com/people/polycart/ 448a2fb878795f1d,https://c1.staticflickr.com/9/8475/29142060953_5dbe9820d5_o.jpg,0.0,0.0,0.630794701987,0.75,75,492,https://www.flickr.com/photos/gails_pictures/29142060953,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 4461c08e0e8ccad3,https://c1.staticflickr.com/6/5656/30272310723_13dbcba3b3_o.jpg,0.0,0.25,0.5625,1.0,780,680,https://www.flickr.com/photos/thoseguys119/30272310723,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 34f7e556b2e503ff,https://c1.staticflickr.com/9/8693/29522683966_6a50b8c7fa_o.jpg,0.0,0.25,0.75,1.0,931,137,https://www.flickr.com/photos/sixteenmilesofstring/29522683966,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/ 5f68620e03d4a9f6,https://c1.staticflickr.com/6/5806/29977292885_6f49cac547_o.jpg,0.371487603306,0.0,1.0,0.75,973,395,https://flickr.com/75735834@N06/29977292885,https://creativecommons.org/licenses/by/2.0/,Feroze Omardeen,https://www.flickr.com/people/sucriertt/ 347407d25c526f99,https://c1.staticflickr.com/9/8286/29403773790_642354d373_o.jpg,0.0,0.0,0.75,1.0,481,581,https://flickr.com/39160147@N03/29403773790,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 0ac190e8667c3b55,https://c1.staticflickr.com/1/306/31693050754_b02c812664_o.jpg,0.0,0.0,0.75,1.0,672,578,https://flickr.com/48968648@N05/31693050754,https://creativecommons.org/licenses/by/2.0/,Carl,https://www.flickr.com/people/c4s9/ c5dfe8bb702a0e3a,https://c1.staticflickr.com/9/8295/28549716853_25e6db8c9d_o.jpg,0.25,0.25,1.0,1.0,142,294,https://www.flickr.com/photos/16502322@N03/28549716853,https://creativecommons.org/licenses/by/2.0/,fishhawk,https://www.flickr.com/people/16502322@N03/ 2140e9cfa6ca42c3,https://c1.staticflickr.com/1/347/32458889151_9aeff8c991_o.jpg,0.254054054054,0.25,1.0,1.0,848,340,https://www.flickr.com/photos/13476480@N07/32458889151,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ b92c426bcdf4e43d,https://c1.staticflickr.com/6/5531/30516404614_f9bd18f172_o.jpg,0.25,0.0,0.75,0.75,309,759,https://www.flickr.com/photos/ansk/30516404614,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/ 7ced78d6f882f2cf,https://c1.staticflickr.com/6/5551/30783981132_8507f11e6d_o.jpg,0.5,0.25,1.0,1.0,558,538,https://www.flickr.com/photos/30478819@N08/30783981132,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ b6881a126290ecd9,https://c1.staticflickr.com/8/7463/28124051314_39f3ba78d1_o.jpg,0.4375,0.0,1.0,0.75,512,151,https://www.flickr.com/photos/daveseven/28124051314,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ ecdd4ee9d7ffc01d,https://c1.staticflickr.com/6/5461/31172403132_0b7f980a4a_o.jpg,0.0,0.25,0.5,1.0,321,159,http://www.flickr.com/photos/146401137@N06/31172403132/,https://creativecommons.org/licenses/by/2.0/,Jin Kemoole,https://www.flickr.com/people/146401137@N06/ 100e0fa0e08f801f,https://c1.staticflickr.com/8/7412/27789216060_a7f864c818_o.jpg,0.0,0.0,0.75,1.0,758,804,https://www.flickr.com/photos/mountainash/27789216060/,https://creativecommons.org/licenses/by/2.0/,Mountain/ \\Ash,https://www.flickr.com/people/mountainash/ d4381dfea17fcfa1,https://c1.staticflickr.com/9/8554/30272108682_199587655a_o.jpg,0.0,0.0,0.5,0.75,976,812,https://www.flickr.com/photos/thomasjhannigan/30272108682,https://creativecommons.org/licenses/by/2.0/,Tom Hannigan,https://www.flickr.com/people/thomasjhannigan/ 7b9c901d0f735717,https://c1.staticflickr.com/8/7629/27603236993_c76b0c841d_o.jpg,0.25,0.0,1.0,0.715608465608,426,628,https://www.flickr.com/photos/markittleman/27603236993,https://creativecommons.org/licenses/by/2.0/,Mark Ittleman,https://www.flickr.com/people/markittleman/ 40687cd08d42055c,https://c1.staticflickr.com/6/5455/25387649349_7a4824030a_o.jpg,0.5,0.25,1.0,1.0,971,825,https://www.flickr.com/photos/breveglieri/25387649349/,https://creativecommons.org/licenses/by/2.0/,Alexandre Breveglieri,https://www.flickr.com/people/breveglieri/ 45f89ca0408c28b7,https://c1.staticflickr.com/1/468/32732032475_57b3f226c7_o.jpg,0.457373271889,0.0,1.0,0.75,889,222,https://www.flickr.com/photos/victorianorivero/32732032475/,https://creativecommons.org/licenses/by/2.0/,Jose Losada - Fotograf\303\255a,https://www.flickr.com/people/victorianorivero/ bba21ec1c7d742be,https://c1.staticflickr.com/8/7783/26687499083_3040d602a7_o.jpg,0.28125,0.25,0.84375,1.0,625,285,https://www.flickr.com/photos/tslac/26687499083,https://creativecommons.org/licenses/by/2.0/,Texas State Library and Archives Commission,https://www.flickr.com/people/tslac/ 84fd99e0b9520145,https://c1.staticflickr.com/9/8127/29213827684_abd1503ae2_o.jpg,0.5,0.25,1.0,1.0,920,894,https://www.flickr.com/photos/blmalaska/29213827684,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Alaska,https://www.flickr.com/people/blmalaska/ fbd293de35f2feb3,https://c1.staticflickr.com/9/8021/29130998146_d0ec63c0b8_o.jpg,0.197411003236,0.0,1.0,1.0,818,231,https://www.flickr.com/photos/autohistorian/29130998146,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 759e53c9e3f518f8,https://c1.staticflickr.com/6/5756/30631471366_68ac56dc6e_o.jpg,0.0,0.0,0.75,0.5,777,510,https://flickr.com/81179422@N03/30631471366,https://creativecommons.org/licenses/by/2.0/,Delegaci\303\263n de Cultura Ayuntamiento de C\303\263rdoba,https://www.flickr.com/people/palacio_orive/ 59d001ec50ebdf4d,https://c1.staticflickr.com/8/7644/27336864141_5e93f948a6_o.jpg,0.0,0.0,0.75,1.0,78,444,https://www.flickr.com/photos/treegrow/27336864141/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 5d93f75020b4f99b,https://c1.staticflickr.com/9/8843/28334811186_962a5302ed_o.jpg,0.5,0.0,1.0,0.75,699,632,https://www.flickr.com/photos/bexwalton/28334811186,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/ b314f385c6c7f89b,https://c1.staticflickr.com/9/8394/28069888523_f5de909c33_o.jpg,0.309309309309,0.0,1.0,1.0,512,277,https://www.flickr.com/photos/greggjerdingen/28069888523,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 9048d5541b108214,https://c1.staticflickr.com/8/7052/27573583621_1462efb9b8_o.jpg,0.0,0.25,0.710456942004,1.0,611,631,https://www.flickr.com/photos/moritzbarcelona/27573583621,https://creativecommons.org/licenses/by/2.0/,Moritz Barcelona,https://www.flickr.com/people/moritzbarcelona/ 405799ea564a8b39,https://c1.staticflickr.com/9/8278/28594471526_ab0aea3d54_o.jpg,0.4375,0.0,1.0,0.75,920,759,https://www.flickr.com/photos/londonmatt/28594471526,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 8898ae162ae23c6d,https://c1.staticflickr.com/6/5751/30092190744_3d2c47d2ec_o.jpg,0.333333333333,0.0,1.0,1.0,950,128,https://www.flickr.com/photos/stevendepolo/30092190744/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 1a399682019bbe29,https://c1.staticflickr.com/1/543/32505258375_4fa0b0dc6f_o.jpg,0.0,0.216,1.0,1.0,653,407,https://flickr.com/93563885@N07/32505258375,https://creativecommons.org/licenses/by/2.0/,Katie Morgan,https://www.flickr.com/people/fergyfamily/ 913ad6048e841a46,https://c1.staticflickr.com/1/437/31763931435_569b376bd2_o.jpg,0.25,0.0,0.75,0.75,320,115,https://www.flickr.com/photos/gails_pictures/31763931435,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 1f529d5c65918c03,https://c1.staticflickr.com/9/8491/29456056695_2cdb7c5fa7_o.jpg,0.23585243553,0.0,0.70755730659,0.75,821,781,https://www.flickr.com/photos/robdammers/29456056695,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ f79eed22bf1037a8,https://c1.staticflickr.com/6/5591/29972927364_4e8c99c051_o.jpg,0.0,0.25,0.5,1.0,647,970,https://flickr.com/22539273@N00/29972927364,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 580b4d2a2666195e,https://c1.staticflickr.com/6/5582/30641320684_38d716f2ba_o.jpg,0.0,0.0,0.75,1.0,976,147,https://www.flickr.com/photos/gillyberlin/30641320684,https://creativecommons.org/licenses/by/2.0/,GillyBerlin,https://www.flickr.com/people/gillyberlin/ cfbd849c1d1b753b,https://c1.staticflickr.com/8/7763/28842755226_dd03c6c536_o.jpg,0.499263622975,0.25,0.99852724595,1.0,981,98,https://www.flickr.com/photos/respres/28842755226,https://creativecommons.org/licenses/by/2.0/,Jeff Turner,https://www.flickr.com/people/respres/ a6775224519b8428,https://c1.staticflickr.com/8/7308/28190918831_78b87d36ee_o.jpg,0.28125,0.25,0.84375,1.0,570,426,https://www.flickr.com/photos/27665395@N05/28190918831,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 91ac92c2fe317aa0,https://c1.staticflickr.com/1/451/31465651143_aa49f535ee_o.jpg,0.25,0.0,0.75,0.75,581,604,https://www.flickr.com/photos/55229469@N07/31465651143,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ 037152a42a3d1e8c,https://c1.staticflickr.com/9/8499/28070026824_854ac0ae45_o.jpg,0.333333333333,0.0,1.0,1.0,627,730,https://www.flickr.com/photos/130075348@N08/28070026824/,https://creativecommons.org/licenses/by/2.0/,Rokok Indonesia,https://www.flickr.com/people/130075348@N08/ 2fb53afe7ff66d5f,https://c1.staticflickr.com/1/777/31727059532_c65033b8a1_o.jpg,0.0,0.25,0.5625,1.0,979,847,https://www.flickr.com/photos/bigyahu/31727059532/,https://creativecommons.org/licenses/by/2.0/,alan jones,https://www.flickr.com/people/bigyahu/ cf473f838f4887d3,https://c1.staticflickr.com/9/8502/29133260452_e926b6a9a2_o.jpg,0.0,0.5,0.75,1.0,309,731,https://www.flickr.com/photos/nikkvalentine/29133260452,https://creativecommons.org/licenses/by/2.0/,The Manic Macrographer,https://www.flickr.com/people/nikkvalentine/ 39fee27ace569b18,https://c1.staticflickr.com/1/759/32239443161_87aa162d08_o.jpg,0.25,0.25,0.75,1.0,699,214,https://www.flickr.com/photos/33200530@N04/32239443161,https://creativecommons.org/licenses/by/2.0/,CucombreLibre,https://www.flickr.com/people/33200530@N04/ f62087fb9791b8dd,https://c1.staticflickr.com/9/8453/28990629474_0be470c9f2_o.jpg,0.24882629108,0.0,1.0,1.0,537,373,https://www.flickr.com/photos/garryknight/28990629474,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ e2dbc0a9bbc95aed,https://c1.staticflickr.com/9/8780/28367169592_3fce2df3d9_o.jpg,0.280226209048,0.0,0.840678627145,0.75,986,253,https://www.flickr.com/photos/34517490@N00/28367169592,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/ b43cfbab3695d213,https://c1.staticflickr.com/9/8519/29262472894_580d0ac88d_o.jpg,0.25,0.0,1.0,0.421177266576,669,124,https://www.flickr.com/photos/ankurp/29262472894,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ 8a7af2232c2d26cc,https://c1.staticflickr.com/6/5795/29663048944_c02e81cf30_o.jpg,0.248713235294,0.0,0.746139705882,0.75,405,151,https://www.flickr.com/photos/n28307/29663048944/,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ e9829512f54cd635,https://c1.staticflickr.com/8/7667/28857805962_3ea7a8b73a_o.jpg,0.5,0.0,1.0,0.75,909,579,https://www.flickr.com/photos/elsie/28857805962,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ f768195642b13968,https://c1.staticflickr.com/9/8581/28329386945_ba5c420fa2_o.jpg,0.0,0.25,0.5,1.0,739,855,https://www.flickr.com/photos/blumenbiene/28329386945,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ 67f778e2fefacbd8,https://c1.staticflickr.com/9/8406/29404881920_ffcfe21bc1_o.jpg,0.478487614081,0.0,1.0,1.0,815,331,https://www.flickr.com/photos/yamahawatercraft/29404881920/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/ f91a2d49f4d6f9a2,https://c1.staticflickr.com/6/5496/30228515753_76e15a280c_o.jpg,0.332106038292,0.0,0.996318114875,1.0,753,653,https://www.flickr.com/photos/eaglebrook/30228515753/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ c2cc91d7ba25e28a,https://c1.staticflickr.com/6/5458/30999587760_6c067bc21f_o.jpg,0.0,0.24213836478,1.0,1.0,828,17,https://www.flickr.com/photos/enneafive/30999587760,https://creativecommons.org/licenses/by/2.0/,Johan Neven,https://www.flickr.com/people/enneafive/ 12531e9ee03613d3,https://c1.staticflickr.com/1/359/31792912914_79c490e92d_o.jpg,0.4,0.0,1.0,1.0,291,467,https://www.flickr.com/photos/gsloan/31792912914,https://creativecommons.org/licenses/by/2.0/,gsloan,https://www.flickr.com/people/gsloan/ 3c0f5ed4f28e6212,https://c1.staticflickr.com/2/1504/26772116805_353041727b_o.jpg,0.25,0.0,0.75,0.75,669,173,https://www.flickr.com/photos/subherwal/26772116805,https://creativecommons.org/licenses/by/2.0/,subherwal,https://www.flickr.com/people/subherwal/ 27b18726bc432c1d,https://c1.staticflickr.com/1/399/31462815523_ab78b4e4e5_o.jpg,0.248348017621,0.25,0.745044052863,1.0,348,130,https://www.flickr.com/photos/usfwsmtnprairie/31462815523,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 8b6f584e407696a6,https://c1.staticflickr.com/8/7749/29640290475_4d30452f18_o.jpg,0.25,0.0,0.75,0.75,896,768,https://www.flickr.com/photos/markyharky/29640290475,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 9ce5331116cc9cb3,https://c1.staticflickr.com/6/5764/29922947073_b29a3ce3fe_o.jpg,0.0,0.25,0.75,1.0,981,432,https://www.flickr.com/photos/upsticksngo/29922947073,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew,https://www.flickr.com/people/upsticksngo/ 3a8315f3ae8d1363,https://c1.staticflickr.com/1/328/30920568024_32c731b16c_o.jpg,0.0,0.0,0.75,1.0,818,632,https://flickr.com/27665395@N05/30920568024,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ cb1404889f313767,https://c1.staticflickr.com/9/8199/29991744525_27ae4c9e33_o.jpg,0.332842415317,0.0,0.99852724595,1.0,820,429,https://www.flickr.com/photos/presidenciamx/29991744525,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\303\272blica Mexicana,https://www.flickr.com/people/presidenciamx/ 52d821a200a98dff,https://c1.staticflickr.com/8/7650/27729434644_a2220a823c_o.jpg,0.513100436681,0.25,1.0,1.0,778,520,https://www.flickr.com/photos/51764518@N02/27729434644,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 35eeb6f318a262f2,https://c1.staticflickr.com/9/8896/28531140285_f00aee518d_o.jpg,0.25,0.0,0.75,0.75,699,757,https://www.flickr.com/photos/tekgator/28531140285,https://creativecommons.org/licenses/by/2.0/,tekgator,https://www.flickr.com/people/tekgator/ fe00f11d340ee724,https://c1.staticflickr.com/6/5830/30067794852_dbcd1c2868_o.jpg,0.25,0.0,1.0,1.0,320,782,https://www.flickr.com/photos/treegrow/30067794852,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ cd5e9cd9e77b00d3,https://c1.staticflickr.com/6/5346/30491356892_0a789b5fc5_o.jpg,0.0,0.0,0.5625,0.75,955,523,https://www.flickr.com/photos/scotnelson/30491356892,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ b81e7b2bd2324839,https://c1.staticflickr.com/6/5330/30700502256_85115eb646_o.jpg,0.0,0.0,0.498159057437,0.75,752,951,https://www.flickr.com/photos/davehamster/30700502256,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ a6cc984eb9f224e9,https://c1.staticflickr.com/4/3671/33169767981_d2c0c8bd47_o.jpg,0.25,0.0,0.75,0.75,998,341,https://flickr.com/74747209@N05/33169767981,https://creativecommons.org/licenses/by/2.0/,David Lochlin,https://www.flickr.com/people/dlochlin/ f7eb7acd6fd319cf,https://c1.staticflickr.com/1/767/31803625456_d57721c077_o.jpg,0.0,0.0,0.674229452055,0.75,582,691,https://www.flickr.com/photos/hisgett/31803625456,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 9913bf444efddf01,https://c1.staticflickr.com/8/7010/26831242473_d3118ee1b6_o.jpg,0.0,0.25,0.5625,1.0,310,894,https://www.flickr.com/photos/swallowtailgardenseeds/26831242473,https://creativecommons.org/licenses/by/2.0/,Swallowtail Garden Seeds,https://www.flickr.com/people/swallowtailgardenseeds/ a6444423de78e204,https://c1.staticflickr.com/9/8833/28210662766_5111540a65_o.jpg,0.25,0.0,0.75,0.75,909,516,https://www.flickr.com/photos/fun_flying/28210662766,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/ 4ec091f3c8be00cf,https://c1.staticflickr.com/8/7200/26935330125_5bfb02c79f_o.jpg,0.0,0.0,0.666666666667,1.0,309,673,https://www.flickr.com/photos/dhruvaraj/26935330125,https://creativecommons.org/licenses/by/2.0/,Dhruvaraj S,https://www.flickr.com/people/dhruvaraj/ 9319b63e7c57e9d0,https://c1.staticflickr.com/6/5696/30458008266_ae94a0ce76_o.jpg,0.5,0.25,1.0,1.0,982,988,https://flickr.com/109289138@N06/30458008266,https://creativecommons.org/licenses/by/2.0/,Joburg Cricket Club,https://www.flickr.com/people/joburgcricketclub/ 01dadd6b781ef538,https://c1.staticflickr.com/9/8521/28369844141_41a017a9e3_o.jpg,0.0,0.25,0.5,1.0,702,698,https://www.flickr.com/photos/texaus1/28369844141/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ a51e82e5aab08fcd,https://c1.staticflickr.com/6/5481/29594227874_02b0391aac_o.jpg,0.28125,0.0,0.84375,0.75,975,166,https://www.flickr.com/photos/jsjgeology/29594227874,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ c58ebfa367444280,https://c1.staticflickr.com/9/8269/30409149395_11819433c0_o.jpg,0.0,0.0,0.510804769001,0.75,735,790,https://www.flickr.com/photos/zongo/30409149395,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 1c111256a89401c8,https://c1.staticflickr.com/1/223/31382314782_13ae7da8fa_o.jpg,0.0,0.0,0.985663082437,1.0,854,197,https://www.flickr.com/photos/13476480@N07/31382314782/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 5e6d42c4437d3ac7,https://c1.staticflickr.com/9/8551/29640334353_65e5a85ba3_o.jpg,0.0,0.25,0.5,1.0,561,775,https://www.flickr.com/photos/116153846@N06/29640334353/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ 38426929a2c14bc3,https://c1.staticflickr.com/8/7365/27597422241_3f8bfacd5c_o.jpg,0.25,0.0,0.75,0.75,618,132,https://www.flickr.com/photos/ucdaviscoe/27597422241,https://creativecommons.org/licenses/by/2.0/,UC Davis College of Engineering,https://www.flickr.com/people/ucdaviscoe/ 397aa21ee684462f,https://c1.staticflickr.com/8/7738/26741751471_c0a65d9bd7_o.jpg,0.438671875,0.0,1.0,0.75,16,273,https://www.flickr.com/photos/j_benson/26741751471,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/ 43576696015d1cbf,https://c1.staticflickr.com/8/7374/27600935212_9e72834da4_o.jpg,0.0,0.0,0.75,0.5625,980,404,https://www.flickr.com/photos/kitkaphotogirl/27600935212,https://creativecommons.org/licenses/by/2.0/,Christine Majul,https://www.flickr.com/people/kitkaphotogirl/ 8f64cebadc25455f,https://c1.staticflickr.com/8/7255/26967955113_8140440e8f_o.jpg,0.281165311653,0.0,0.843495934959,1.0,42,114,https://www.flickr.com/photos/ddebold/26967955113,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ 92f332fa278a6388,https://c1.staticflickr.com/3/2465/32760092592_a34aeb2b16_o.jpg,0.0,0.0,0.618442622951,0.75,526,737,http://www.flickr.com/photos/107922203@N04/32760092592,https://creativecommons.org/licenses/by/2.0/,Simon Matzinger,https://www.flickr.com/people/simonmatzinger/ 2fb1551d1372b52b,https://c1.staticflickr.com/9/8443/28525221002_3d17f1374e_o.jpg,0.333333333333,0.0,1.0,1.0,980,20,https://www.flickr.com/photos/trocaire/28525221002,https://creativecommons.org/licenses/by/2.0/,Trocaire,https://www.flickr.com/people/trocaire/ fd29deb77ba26d26,https://c1.staticflickr.com/9/8353/28762987602_487f07575e_o.jpg,0.5,0.0,1.0,0.75,418,943,https://www.flickr.com/photos/_bundjugend/28762987602,https://creativecommons.org/licenses/by/2.0/,BUNDjugend,https://www.flickr.com/people/_bundjugend/ ae404fb6a6b27926,https://c1.staticflickr.com/8/7342/27033999202_fb59c78264_o.jpg,0.25,0.0,0.75,0.75,976,571,https://www.flickr.com/photos/14320857@N08/27033999202,https://creativecommons.org/licenses/by/2.0/,WIL,https://www.flickr.com/people/14320857@N08/ 6145928c022a5422,https://c1.staticflickr.com/8/7347/27748925642_697198a625_o.jpg,0.332842415317,0.0,0.99852724595,1.0,490,673,https://www.flickr.com/photos/cogdog/27748925642,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ c540dd1411d7fd01,https://c1.staticflickr.com/9/8808/30066479845_893a1e591d_o.jpg,0.333333333333,0.0,1.0,1.0,976,626,https://www.flickr.com/photos/wm_archiv/30066479845/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 6d2661af090cf782,https://c1.staticflickr.com/9/8633/28062798963_58f746d4d8_o.jpg,0.25,0.25,0.75,1.0,821,576,https://www.flickr.com/photos/kecko/28062798963,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ 71bad4ce88086431,https://c1.staticflickr.com/8/7214/26927690554_4f0ab7c6b3_o.jpg,0.0,0.460183767228,0.75,1.0,688,504,https://www.flickr.com/photos/brighton/26927690554,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ 431f6f8fbf02b996,https://c1.staticflickr.com/8/7455/27440050530_949bc5ff44_o.jpg,0.171913202934,0.0,0.515739608802,0.75,780,483,https://www.flickr.com/photos/thoseguys119/27440050530,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 106c5156d1143156,https://c1.staticflickr.com/9/8801/28721998643_6356f151b4_o.jpg,0.0,0.0,0.75,1.0,723,409,https://www.flickr.com/photos/robbie1/28721998643,https://creativecommons.org/licenses/by/2.0/,Robbie Sproule,https://www.flickr.com/people/robbie1/ 9a59aaa777ee1b98,https://c1.staticflickr.com/8/7485/15588561527_8118699fbf_o.jpg,0.25,0.25,1.0,1.0,664,728,https://www.flickr.com/photos/zedzap/15588561527,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/ e26ba475f6961b39,https://c1.staticflickr.com/1/317/31569075924_108f8051e7_o.jpg,0.0,0.25,0.5,1.0,451,985,https://www.flickr.com/photos/ufv/31569075924,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ 98bfd09ce2172b6e,https://c1.staticflickr.com/6/5833/29911712004_fa33d19f65_o.jpg,0.0,0.25,0.417452830189,1.0,982,785,https://www.flickr.com/photos/armymaterielcommand/29911712004/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/ c70321a38f020f99,https://c1.staticflickr.com/6/5780/30465465662_6664674d27_o.jpg,0.0,0.0,0.497426470588,0.75,867,497,https://www.flickr.com/photos/agenciabrasilia/30465465662,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 8e3421784da0fbaf,https://c1.staticflickr.com/8/7575/29135241811_efb4d94f77_o.jpg,0.5,0.0,1.0,0.75,971,66,https://www.flickr.com/photos/davebloggs007/29135241811/,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 3d0c6846e0a3d6e1,https://c1.staticflickr.com/9/8230/29297635434_d28e43c0e4_o.jpg,0.25,0.25,1.0,1.0,459,568,https://www.flickr.com/photos/discoveroregon/29297635434,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 4e18b3e96197d170,https://c1.staticflickr.com/6/5830/30665270806_04f91a7201_o.jpg,0.0,0.0,1.0,1.0,309,134,https://www.flickr.com/photos/treegrow/30665270806,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ ea9570d503e060c1,https://c1.staticflickr.com/8/7376/26880926690_db328dc76a_o.jpg,0.295833333333,0.0,0.8875,1.0,986,593,https://www.flickr.com/photos/ninara/26880926690,https://creativecommons.org/licenses/by/2.0/,Ninara,https://www.flickr.com/people/ninara/ ffb1aec98aa4d1cd,https://c1.staticflickr.com/9/8107/29215629650_27532b5cf9_o.jpg,0.25,0.25,1.0,1.0,329,924,https://www.flickr.com/photos/92252798@N07/29215629650/,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/ 5cfd318873773c4b,https://c1.staticflickr.com/9/8561/28950384811_c3f60d6751_o.jpg,0.0,0.25,0.75,1.0,922,511,https://flickr.com/64648244@N04/28950384811,https://creativecommons.org/licenses/by/2.0/,Ulf K,https://www.flickr.com/people/ulfk/ 9dcc08c54da327fa,https://c1.staticflickr.com/9/8346/29690905046_8fee69992b_o.jpg,0.250923190547,0.25,0.75276957164,1.0,979,813,https://flickr.com/134273297@N06/29690905046,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/134273297@N06/ b333adaf19a62659,https://c1.staticflickr.com/9/8728/28282854521_354a0a9df9_o.jpg,0.256744604317,0.0,1.0,0.75,884,710,https://www.flickr.com/photos/jmh-pics/28282854521,https://creativecommons.org/licenses/by/2.0/,Jan Mark Holzer,https://www.flickr.com/people/jmh-pics/ 9be422211168e7d4,https://c1.staticflickr.com/1/334/32034447996_b78bae04ea_o.jpg,0.3176910299,0.0,0.953073089701,0.75,311,372,https://www.flickr.com/photos/gails_pictures/32034447996,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ d459517d03b214d6,https://c1.staticflickr.com/9/8179/28900305403_a45c1cec38_o.jpg,0.0,0.25,0.5,1.0,820,693,http://www.flickr.com/photos/thecomeupshow/28900305403/,https://creativecommons.org/licenses/by/2.0/,The Come Up Show,https://www.flickr.com/people/thecomeupshow/ 4f21a9a591ac85a0,https://c1.staticflickr.com/1/562/32737938522_d581c633d3_o.jpg,0.0,0.0,1.0,0.681073025335,305,59,https://flickr.com/52450054@N04/32737938522,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 196eeedde559e5a9,https://c1.staticflickr.com/9/8029/30048123755_16e083967f_o.jpg,0.473457675753,0.0,0.946915351506,0.75,664,511,https://www.flickr.com/photos/eltb/30048123755,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ cfc9a0804ec5ed84,https://c1.staticflickr.com/8/7486/27054375586_d56389a0fc_o.jpg,0.25,0.25,0.75,1.0,618,700,https://www.flickr.com/photos/irekia/27054375586,https://creativecommons.org/licenses/by/2.0/,Irekia,https://www.flickr.com/people/irekia/ 1d9fadf8adf77ded,https://c1.staticflickr.com/9/8593/28573319500_8d84f02c2a_o.jpg,0.202873563218,0.0,0.608620689655,1.0,971,167,https://www.flickr.com/photos/stephanridgway/28573319500,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/ 32a854a741fbfbfc,https://c1.staticflickr.com/8/7244/27797436316_4f61006002_o.jpg,0.0,0.0,0.5,0.75,342,81,https://www.flickr.com/photos/ilri/27797436316,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/ cbe850d9e2c516bd,https://c1.staticflickr.com/8/7146/26343921814_24637b69b4_o.jpg,0.0,0.5,0.75,1.0,366,113,https://www.flickr.com/photos/quinet/26343921814,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 396eaf2e38bf48db,https://c1.staticflickr.com/9/8168/29045293124_a21a483be0_o.jpg,0.228169014085,0.25,0.684507042254,1.0,438,932,https://www.flickr.com/photos/abukij/29045293124/,https://creativecommons.org/licenses/by/2.0/,Paolo Gamba,https://www.flickr.com/people/abukij/ 859119120eebb266,https://c1.staticflickr.com/1/361/32285005580_5c4043827f_o.jpg,0.25,0.25,0.75,1.0,971,72,https://www.flickr.com/photos/kecko/32285005580,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ 0628d3695a7cf701,https://c1.staticflickr.com/1/631/30965046424_87c51a2eca_o.jpg,0.21087398374,0.25,0.63262195122,1.0,830,983,https://www.flickr.com/photos/dalecruse/30965046424,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/ d1557838138ec727,https://c1.staticflickr.com/9/8853/28975077616_b975e7df0f_o.jpg,0.25,0.25,0.75,1.0,405,463,https://www.flickr.com/photos/markyharky/28975077616,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ e5c7f7a376f59e2a,https://c1.staticflickr.com/9/8159/29693555372_af1b2c0227_o.jpg,0.502573529412,0.25,1.0,1.0,971,62,https://www.flickr.com/photos/paxson_woelber/29693555372,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/ 825725877162f89d,https://c1.staticflickr.com/1/753/32111215196_70017b97ea_o.jpg,0.0,0.0,1.0,0.75,779,946,https://www.flickr.com/photos/mwichary/32111215196,https://creativecommons.org/licenses/by/2.0/,Marcin Wichary,https://www.flickr.com/people/mwichary/ 2db18c479272c66c,https://c1.staticflickr.com/8/7511/27802920906_146e7e96a9_o.jpg,0.235515021459,0.25,0.706545064378,1.0,404,672,https://www.flickr.com/photos/usnavy/27802920906,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 6439d652cd021c27,https://c1.staticflickr.com/8/7053/26533041183_7ccdac4e8e_o.jpg,0.4375,0.25,1.0,1.0,976,706,https://www.flickr.com/photos/yourmildura/26533041183,https://creativecommons.org/licenses/by/2.0/,Your Mildura,https://www.flickr.com/people/yourmildura/ d330fefbebf1068f,https://c1.staticflickr.com/9/8387/28933064066_afe81d8075_o.jpg,0.0,0.10102739726,1.0,1.0,986,817,https://flickr.com/28435100@N00/28933064066,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ 46bef326fcdb59a0,https://c1.staticflickr.com/9/8269/30118421771_4f43841857_o.jpg,0.25,0.0,1.0,0.5,973,746,https://www.flickr.com/photos/bruvva/30118421771,https://creativecommons.org/licenses/by/2.0/,Steve Austin,https://www.flickr.com/people/bruvva/ 8309ff762c508515,https://c1.staticflickr.com/8/7399/27863065696_eb3ac24d8b_o.jpg,0.0,0.0,0.5625,0.75,763,47,https://www.flickr.com/photos/juggernautco/27863065696,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ 4c9fe7037e6e6c32,https://c1.staticflickr.com/8/7787/28442420405_07fa40529c_o.jpg,0.5,0.0,1.0,0.75,556,809,https://flickr.com/29621494@N02/28442420405,https://creativecommons.org/licenses/by/2.0/,Paula R. Lively,https://www.flickr.com/people/29621494@N02/ 92bbb63704533ce7,https://c1.staticflickr.com/9/8224/29276583444_7731e6e305_o.jpg,0.5,0.25,1.0,1.0,561,892,https://www.flickr.com/photos/jill_carlson/29276583444,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ d7ecbb95fd4f3772,https://c1.staticflickr.com/8/7522/26620373054_3c6f38cc8e_o.jpg,0.0,0.0,0.75,1.0,920,837,https://www.flickr.com/photos/10413717@N08/26620373054,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer,https://www.flickr.com/people/10413717@N08/ 362127c4888cd6cd,https://c1.staticflickr.com/6/5510/31003951476_180840de52_o.jpg,0.387030995106,0.0,1.0,0.75,68,199,https://www.flickr.com/photos/rarvesen/31003951476,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/ d69a37a0fbe81871,https://c1.staticflickr.com/6/5532/30770208461_1d3271a4e2_o.jpg,0.25,0.0,1.0,0.75,209,810,https://www.flickr.com/photos/28998778@N00/30770208461,https://creativecommons.org/licenses/by/2.0/,Shari,https://www.flickr.com/people/28998778@N00/ 55758f66817463ab,https://c1.staticflickr.com/1/392/31374523740_f449208392_o.jpg,0.311985172982,0.25,0.935955518946,1.0,321,921,https://flickr.com/43272765@N04/31374523740,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ f80973d29150401c,https://c1.staticflickr.com/6/5235/29924633621_bf7ae46973_o.jpg,0.25,0.25,0.75,1.0,587,564,https://www.flickr.com/photos/13476480@N07/29924633621,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ d4e286fa9f1c81f2,https://c1.staticflickr.com/8/7451/27838107670_f38ea4e5da_o.jpg,0.0,0.0,0.75,0.75,314,510,https://www.flickr.com/photos/mpclemens/27838107670,https://creativecommons.org/licenses/by/2.0/,mpclemens,https://www.flickr.com/people/mpclemens/ 6bbed601a751fcac,https://c1.staticflickr.com/8/7721/29672247364_557aecbda7_o.jpg,0.497426470588,0.25,0.994852941176,1.0,672,991,https://www.flickr.com/photos/dno1967b/29672247364,https://creativecommons.org/licenses/by/2.0/,Daniel Oines,https://www.flickr.com/people/dno1967b/ b4fba30537dd81b6,https://c1.staticflickr.com/6/5805/30597263631_b0c46f6b33_o.jpg,0.0,0.25,0.75,1.0,422,924,https://flickr.com/7961680@N07/30597263631,https://creativecommons.org/licenses/by/2.0/,Per \303\205str\303\266m,https://www.flickr.com/people/perkovich/ a78b1225e371f0a2,https://c1.staticflickr.com/6/5677/30593866135_e07bf8d940_o.jpg,0.0,0.25,0.5625,1.0,704,924,https://www.flickr.com/photos/gorka_huhezi/30593866135/,https://creativecommons.org/licenses/by/2.0/,Gorka Montiel,https://www.flickr.com/people/gorka_huhezi/ fe01d91cb69ed098,https://c1.staticflickr.com/9/8867/29202515804_eeee5bb52f_o.jpg,0.200627476882,0.25,0.601882430647,1.0,976,574,https://www.flickr.com/photos/135366503@N05/29202515804,https://creativecommons.org/licenses/by/2.0/,CLAUDIA DEA,https://www.flickr.com/people/135366503@N05/ f714f9bfd3b1974c,https://c1.staticflickr.com/9/8207/28451654095_947f219287_o.jpg,0.0,0.5,0.75,1.0,647,463,https://www.flickr.com/photos/tipsfortravellers/28451654095,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 30c042bd7384d9a2,https://c1.staticflickr.com/6/5695/30535589590_cc8d2b390d_o.jpg,0.0,0.25,0.497426470588,1.0,912,639,https://flickr.com/7432654@N02/30535589590,https://creativecommons.org/licenses/by/2.0/,distelfliege,https://www.flickr.com/people/distelfliege/ 412b792fe088b4e9,https://c1.staticflickr.com/1/353/31547975386_780677dfb8_o.jpg,0.502573529412,0.25,1.0,1.0,661,579,https://www.flickr.com/photos/husseinabdallah/31547975386,https://creativecommons.org/licenses/by/2.0/,abdallahh,https://www.flickr.com/people/husseinabdallah/ fd482264247b3c41,https://c1.staticflickr.com/9/8398/28905952120_6b4daf7c48_o.jpg,0.0,0.0,0.7484375,1.0,980,85,https://www.flickr.com/photos/flickbergers/28905952120/,https://creativecommons.org/licenses/by/2.0/,Tim Berger,https://www.flickr.com/people/flickbergers/ 47afbbac291afb31,https://c1.staticflickr.com/9/8727/27709379933_ef296f8d2e_o.jpg,0.0,0.25,0.75,1.0,950,766,https://www.flickr.com/photos/sixmilliondollardan/27709379933,https://creativecommons.org/licenses/by/2.0/,danjo paluska,https://www.flickr.com/people/sixmilliondollardan/ e626b31893ffe7f6,https://c1.staticflickr.com/6/5829/30522332120_9e7ddd2cd5_o.jpg,0.28125,0.0,0.84375,0.75,661,190,https://www.flickr.com/photos/paparutzi/30522332120/,https://creativecommons.org/licenses/by/2.0/,christina rutz,https://www.flickr.com/people/paparutzi/ d861730b6be8adf4,https://c1.staticflickr.com/9/8802/29976723722_7dac139fe7_o.jpg,0.499263622975,0.0,0.99852724595,0.75,880,82,https://www.flickr.com/photos/sansebastian2016/29976723722,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/ e9b36b22d744ecfb,https://c1.staticflickr.com/8/7479/29559184200_7840098afa_o.jpg,0.0,0.25,0.405378486056,1.0,546,481,https://www.flickr.com/photos/bagogames/29559184200,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/ 196ac1353270fe6c,https://c1.staticflickr.com/6/5620/30642577310_d8fd92bb36_o.jpg,0.25,0.25,0.75,1.0,561,578,https://flickr.com/57511216@N04/30642577310,https://creativecommons.org/licenses/by/2.0/,Daniel,https://www.flickr.com/people/57511216@N04/ 663546b50f0a655e,https://c1.staticflickr.com/6/5458/30043866300_928a2d28bb_o.jpg,0.0,0.226157082749,0.75,0.678471248247,407,805,http://www.flickr.com/photos/eltb/30043866300/,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ bbe5a1af1784dc71,https://c1.staticflickr.com/8/7696/28284615651_cccfc50b1b_o.jpg,0.0,0.25,0.75,1.0,693,634,https://www.flickr.com/photos/danielchownet/28284615651,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/ aeaa6257c8bf9865,https://c1.staticflickr.com/8/7555/26222424363_00dfffd6b7_o.jpg,0.331130690162,0.0,0.993392070485,1.0,980,255,https://www.flickr.com/photos/nubobo/26222424363/,https://creativecommons.org/licenses/by/2.0/,nubobo,https://www.flickr.com/people/nubobo/ 7327ef59a75606a8,https://c1.staticflickr.com/1/265/32567125011_b0f2b1e4d2_o.jpg,0.46493902439,0.25,1.0,1.0,971,515,https://www.flickr.com/photos/ruthanddave/32567125011/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 7941287d96e2a97d,https://c1.staticflickr.com/8/7433/27133764275_46b7345618_o.jpg,0.25,0.25,0.75,1.0,821,651,https://www.flickr.com/photos/134741223@N04/27133764275,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/ 2251fc3834568425,https://c1.staticflickr.com/6/5550/30645926583_06b8c09023_o.jpg,0.458686440678,0.0,0.917372881356,0.75,114,596,https://www.flickr.com/photos/jsjgeology/30645926583,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 48b6e5ef0c86af57,https://c1.staticflickr.com/8/7050/26898227675_aed79d5e10_o.jpg,0.0,0.0,0.726153846154,1.0,986,785,https://www.flickr.com/photos/peterscherub/26898227675,https://creativecommons.org/licenses/by/2.0/,judy dean,https://www.flickr.com/people/peterscherub/ d85e566653833c5b,https://c1.staticflickr.com/8/7672/27911589636_39cc5448d1_o.jpg,0.0,0.0,0.421177266576,0.75,821,408,https://www.flickr.com/photos/gammaman/27911589636,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/ 159c87854dba2439,https://c1.staticflickr.com/8/7288/28098505735_df0d9a77a1_o.jpg,0.0,0.25,0.5,1.0,556,349,https://www.flickr.com/photos/jill_carlson/28098505735/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 28a9d10e48f5c317,https://c1.staticflickr.com/8/7334/28096497335_315985133e_o.jpg,0.0,0.0,0.5625,0.75,986,601,https://www.flickr.com/photos/a_peach/28096497335,https://creativecommons.org/licenses/by/2.0/,A_Peach,https://www.flickr.com/people/a_peach/ f4021a2355a08a84,https://c1.staticflickr.com/8/7437/28048420711_11ac521ea8_o.jpg,0.0,0.0,0.422142857143,0.75,558,410,https://www.flickr.com/photos/bagogames/28048420711,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/ 9137f22576f67221,https://c1.staticflickr.com/9/8781/28704776765_028dbaef7b_o.jpg,0.0,0.0,0.5,0.75,779,311,https://www.flickr.com/photos/s2ublack/28704776765/,https://creativecommons.org/licenses/by/2.0/,Stewart Black,https://www.flickr.com/people/s2ublack/ 17b69544e99b8cfc,https://c1.staticflickr.com/1/686/31388266214_da4abe0856_o.jpg,0.333333333333,0.0,1.0,1.0,548,823,https://www.flickr.com/photos/rhemkes/31388266214,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 13acecd84f7ef16a,https://c1.staticflickr.com/9/8039/28406631783_c8b90d0e01_o.jpg,0.262273413897,0.25,0.786820241692,1.0,603,654,https://www.flickr.com/photos/familymwr/28406631783,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/ e93477a46f38d99d,https://c1.staticflickr.com/6/5256/29568920333_0bcb9a6799_o.jpg,0.0,0.0,0.5625,0.75,975,159,https://www.flickr.com/photos/jsjgeology/29568920333,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ c9ee2a48285aaa15,https://c1.staticflickr.com/6/5686/30568435063_b488f78730_o.jpg,0.280226209048,0.25,0.840678627145,1.0,913,567,https://www.flickr.com/photos/135302410@N02/30568435063,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/ 26cd2c61e18346ea,https://c1.staticflickr.com/8/7341/27040003656_d63b51e616_o.jpg,0.0,0.25,0.335144927536,1.0,706,474,https://flickr.com/47445767@N05/27040003656,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ f647829391509caa,https://c1.staticflickr.com/6/5506/30214132714_e8e57bf862_o.jpg,0.0,0.25,0.503698224852,1.0,405,914,https://www.flickr.com/photos/barteq24/30214132714,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/ fc6753079864d0df,https://c1.staticflickr.com/9/8099/29192177426_d209800937_o.jpg,0.5,0.0,1.0,0.75,560,515,https://www.flickr.com/photos/dodnewsfeatures/29192177426,https://creativecommons.org/licenses/by/2.0/,DoD News,https://www.flickr.com/people/dodnewsfeatures/ 89723de59bcd729f,https://c1.staticflickr.com/9/8821/28494980665_7600910e02_o.jpg,0.0,0.0595446584939,1.0,1.0,820,496,https://www.flickr.com/photos/rarvesen/28494980665,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/ 652701f43ad0e3cb,https://c1.staticflickr.com/9/8727/27860838673_09c3947d69_o.jpg,0.42234548336,0.0,1.0,0.75,821,651,https://www.flickr.com/photos/hisgett/27860838673,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 326f789026f60f2b,https://c1.staticflickr.com/8/7545/29854455250_7c2fcd0d09_o.jpg,0.0,0.0,0.5,0.75,561,220,https://flickr.com/100379608@N08/29854455250,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/ 6eb7d12b21504ee9,https://c1.staticflickr.com/1/613/31245442393_82c14ff959_o.jpg,0.0,0.25,0.75,1.0,830,163,https://flickr.com/83136374@N05/31245442393,https://creativecommons.org/licenses/by/2.0/,Ajay Suresh,https://www.flickr.com/people/ajay_suresh/ ce4a0aa202981fa8,https://c1.staticflickr.com/8/7386/27835662462_178d4de7fc_o.jpg,0.0,0.25,0.70534150613,1.0,9,738,https://www.flickr.com/photos/usdagov/27835662462,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ b58e4f4ba81fe624,https://c1.staticflickr.com/9/8601/28824981185_3063755b08_o.jpg,0.306766917293,0.0,1.0,1.0,896,443,https://www.flickr.com/photos/8269539@N04/28824981185/,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 834a4fbc1803557c,https://c1.staticflickr.com/1/727/31377394774_f5dced269d_o.jpg,0.0,0.0,0.5,0.75,851,944,https://www.flickr.com/photos/thepeachpeddler/31377394774,https://creativecommons.org/licenses/by/2.0/,thepeachpeddler,https://www.flickr.com/people/thepeachpeddler/ 0557707195f0c04c,https://c1.staticflickr.com/9/8643/28234298541_e4fd0853d2_o.jpg,0.55,0.25,1.0,1.0,427,498,https://flickr.com/25034321@N05/28234298541,https://creativecommons.org/licenses/by/2.0/,Ninian Reid,https://www.flickr.com/people/ninian_reid/ 2e812c3b619f4b68,https://c1.staticflickr.com/9/8866/28690639941_44e10630b5_o.jpg,0.4375,0.0,1.0,0.75,780,483,https://www.flickr.com/photos/thoseguys119/28690639941,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f5bd6bd67c9f31b9,https://c1.staticflickr.com/8/7633/27052183466_285326b7f9_o.jpg,0.0,0.25,0.5,1.0,490,327,https://www.flickr.com/photos/deniwlp84/27052183466,https://creativecommons.org/licenses/by/2.0/,Deni Williams,https://www.flickr.com/people/deniwlp84/ 8727f30177985200,https://c1.staticflickr.com/6/5682/30777446271_f88440e3bd_o.jpg,0.48007518797,0.0,1.0,0.75,536,845,https://www.flickr.com/photos/glorycycles/30777446271,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 758f02ad7d77c50b,https://c1.staticflickr.com/1/751/31777078281_6396633fa6_o.jpg,0.5,0.0,1.0,0.75,179,982,https://www.flickr.com/photos/58827557@N06/31777078281,https://creativecommons.org/licenses/by/2.0/,Clint Budd,https://www.flickr.com/people/58827557@N06/ 45890708ac7a91ce,https://c1.staticflickr.com/6/5516/25319249609_a88c3df281_o.jpg,0.0,0.436666666667,0.75,1.0,671,796,https://flickr.com/96223380@N02/25319249609,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ d414908a62d1232f,https://c1.staticflickr.com/1/395/31809726276_3f55a92e26_o.jpg,0.0,0.25,0.75,1.0,835,102,https://flickr.com/89719643@N08/31809726276,https://creativecommons.org/licenses/by/2.0/,Firu_kun,https://www.flickr.com/people/firu_kun/ 820145c8ad94595f,https://c1.staticflickr.com/1/686/32470033422_269415c929_o.jpg,0.0,0.0,0.75,1.0,699,256,https://flickr.com/127226743@N02/32470033422,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ c187af75232f06df,https://c1.staticflickr.com/8/7437/26859623276_cf65ed8680_o.jpg,0.333333333333,0.0,1.0,1.0,519,459,https://www.flickr.com/photos/box_repsol/26859623276,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 1f175a7ff580eff4,https://c1.staticflickr.com/9/8792/28355272936_f011d68d35_o.jpg,0.0,0.0,0.5625,0.75,763,234,https://www.flickr.com/photos/marsupilami92/28355272936,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ 78bdd4d6cc1c879f,https://c1.staticflickr.com/6/5506/30505544570_646bfef025_o.jpg,0.0,0.25,0.561328125,1.0,980,214,https://www.flickr.com/photos/666_is_money/30505544570,https://creativecommons.org/licenses/by/2.0/,Raquel Baranow,https://www.flickr.com/people/666_is_money/ 226872b02631d21f,https://c1.staticflickr.com/8/7300/27734595342_1ff7226a9b_o.jpg,0.0,0.25,0.75,1.0,940,824,https://www.flickr.com/photos/yto/27734595342/,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/ 136e2ca662372705,https://c1.staticflickr.com/9/8246/29006830961_13c9fd67b3_o.jpg,0.5,0.0,1.0,0.75,702,175,https://www.flickr.com/photos/box_repsol/29006830961,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ a23d4cb3e070d9df,https://c1.staticflickr.com/8/7434/27792852586_7d3023f05c_o.jpg,0.0,0.0,0.666666666667,1.0,512,627,https://www.flickr.com/photos/greggjerdingen/27792852586,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 0b83d114fac4d4e3,https://c1.staticflickr.com/8/7381/26878179294_be93afb756_o.jpg,0.25,0.25,0.75,1.0,461,577,https://www.flickr.com/photos/allthishappiness/26878179294,https://creativecommons.org/licenses/by/2.0/,kater,https://www.flickr.com/people/allthishappiness/ 016c19d0af0bef81,https://c1.staticflickr.com/8/7126/27021429202_b71d894daa_o.jpg,0.0,0.0,0.568119891008,1.0,780,444,https://www.flickr.com/photos/thoseguys119/27021429202,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 616db99ad802a9c0,https://c1.staticflickr.com/9/8188/28521502796_06e0f4d49c_o.jpg,0.0,0.0,0.666666666667,1.0,704,532,https://www.flickr.com/photos/17367470@N05/28521502796,https://creativecommons.org/licenses/by/2.0/,bluesbby,https://www.flickr.com/people/17367470@N05/ dc99ee87075dedba,https://c1.staticflickr.com/1/452/32387933792_4267a70723_o.jpg,0.4375,0.25,1.0,1.0,780,130,https://www.flickr.com/photos/thoseguys119/32387933792,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 9de139592b4596ad,https://c1.staticflickr.com/9/8610/29842748943_a641432f48_o.jpg,0.25,0.25,0.75,1.0,704,778,https://www.flickr.com/photos/polycola/29842748943,https://creativecommons.org/licenses/by/2.0/,Anders Lejczak,https://www.flickr.com/people/polycola/ 71f94f27a141f382,https://c1.staticflickr.com/9/8673/28003288044_04b807b762_o.jpg,0.0,0.25,0.561328125,1.0,321,91,https://www.flickr.com/photos/treegrow/28003288044/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ c7cf9e068c71afdd,https://c1.staticflickr.com/9/8281/28182226973_528473deef_o.jpg,0.0,0.25,0.75,1.0,507,868,https://www.flickr.com/photos/zigazou76/28182226973/,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 8aa44c083ed75dcc,https://c1.staticflickr.com/9/8153/28821472214_57a503a3de_o.jpg,0.0,0.0,0.561569688769,1.0,971,628,http://www.flickr.com/photos/phalaenopsisaphrodite523/28821472214/,https://creativecommons.org/licenses/by/2.0/,Francesca Cappa,https://www.flickr.com/people/phalaenopsisaphrodite523/ ce6bdedc89ee0c89,https://c1.staticflickr.com/4/3690/33075660575_f5edc56bb9_o.jpg,0.25,0.0,0.75,0.75,568,849,https://www.flickr.com/photos/yourbestdigs/33075660575/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 9e5b9a3387c17aec,https://c1.staticflickr.com/9/8377/29083734266_a16b9b52b1_o.jpg,0.251849112426,0.0,0.755547337278,0.75,885,841,https://www.flickr.com/photos/eltb/29083734266,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ cbf9f5a03d85ce43,https://c1.staticflickr.com/9/8435/29027344686_58bbebfe41_o.jpg,0.0,0.0,0.568396226415,0.75,651,181,https://www.flickr.com/photos/jus10h/29027344686,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ c8f1f43ffb4c0440,https://c1.staticflickr.com/9/8082/29138633751_a13bea87ff_o.jpg,0.25,0.0,0.75,0.75,947,495,https://www.flickr.com/photos/blumenbiene/29138633751,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ eee8b45fa7903f0f,https://c1.staticflickr.com/9/8238/29033565786_bdb3db8422_o.jpg,0.526542324247,0.25,1.0,1.0,324,30,https://www.flickr.com/photos/usfwsmidwest/29033565786,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 0a5a761882a098db,https://c1.staticflickr.com/9/8479/29516961070_bf28f8e150_o.jpg,0.0,0.0,0.666666666667,1.0,563,966,https://www.flickr.com/photos/swampa/29516961070,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/ 982b63d66e01aece,https://c1.staticflickr.com/8/7561/27079720035_216140f617_o.jpg,0.0,0.0,0.72731316726,0.75,918,928,https://www.flickr.com/photos/sorbus-galleria/27079720035,https://creativecommons.org/licenses/by/2.0/,Sorbus galleria,https://www.flickr.com/people/sorbus-galleria/ cc6261571a779f34,https://c1.staticflickr.com/1/423/32009819770_9619c31f27_o.jpg,0.4375,0.0,1.0,0.75,610,571,https://www.flickr.com/photos/27665395@N05/32009819770,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 7e6c3e93d160a094,https://c1.staticflickr.com/9/8796/27917027260_d0d6d5047b_o.jpg,0.0,0.231382978723,0.75,0.69414893617,567,424,https://flickr.com/93416311@N00/27917027260,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ f39982a7eefe2b72,https://c1.staticflickr.com/6/5791/29783361063_026863250a_o.jpg,0.4375,0.25,1.0,1.0,490,81,https://flickr.com/10390868@N07/29783361063,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 6047cf3b655d452e,https://c1.staticflickr.com/9/8640/28090607604_6a7c53b029_o.jpg,0.0,0.0,0.5625,0.75,909,852,https://www.flickr.com/photos/mickaeltr/28090607604/,https://creativecommons.org/licenses/by/2.0/,Micka\303\253l T.,https://www.flickr.com/people/mickaeltr/ 9b13a42a7a66a742,https://c1.staticflickr.com/6/5752/30775200585_0a2aa4ded7_o.jpg,0.0,0.0,0.7484375,1.0,821,856,https://www.flickr.com/photos/chaz_pics/30775200585/,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 42023d98eec3e21f,https://c1.staticflickr.com/6/5679/30400024723_eb2424c74a_o.jpg,0.421177266576,0.0,0.842354533153,0.75,459,544,https://www.flickr.com/photos/davidboily/30400024723/,https://creativecommons.org/licenses/by/2.0/,NomadicPics,https://www.flickr.com/people/davidboily/ 5a375880e9d0aaf8,https://c1.staticflickr.com/8/7235/26908523165_be94f00467_o.jpg,0.25,0.25,1.0,1.0,507,227,https://www.flickr.com/photos/hubble_esa/26908523165,https://creativecommons.org/licenses/by/2.0/,Hubble ESA,https://www.flickr.com/people/hubble_esa/ 43df149ab9f1ec3d,https://c1.staticflickr.com/8/7380/27325765973_2de71af52b_o.jpg,0.0,0.0,0.497426470588,0.75,404,391,https://www.flickr.com/photos/usnavy/27325765973,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 11f5bfa0348cf73b,https://c1.staticflickr.com/6/5750/30109407996_77b15e73d1_o.jpg,0.5,0.25,1.0,1.0,942,802,https://www.flickr.com/photos/mikespeaks/30109407996,https://creativecommons.org/licenses/by/2.0/,Mike Maguire,https://www.flickr.com/people/mikespeaks/ 60fc59f59f504047,https://c1.staticflickr.com/1/724/32424143031_75401da2da_o.jpg,0.0,0.0,0.5,0.75,669,392,https://flickr.com/138532424@N02/32424143031,https://creativecommons.org/licenses/by/2.0/,Australian Embassy Jakarta,https://www.flickr.com/people/kedubesaustralia/ abe67ca246604b15,https://c1.staticflickr.com/8/7361/28087108175_39f44efc6a_o.jpg,0.28125,0.25,0.84375,1.0,512,932,https://www.flickr.com/photos/notionscapital/28087108175,https://creativecommons.org/licenses/by/2.0/,Mike Licht,https://www.flickr.com/people/notionscapital/ cb8cdbf661de7c72,https://c1.staticflickr.com/9/8159/28528275813_2bfb4a6a46_o.jpg,0.25,0.25,0.75,1.0,981,542,https://www.flickr.com/photos/n28307/28528275813,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ ec237095abdb441b,https://c1.staticflickr.com/1/695/30685393134_88c43218d9_o.jpg,0.258078994614,0.0,1.0,0.75,910,930,https://www.flickr.com/photos/13476480@N07/30685393134,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 086cf1cec5b312c6,https://c1.staticflickr.com/8/7187/26885294675_618496a1e9_o.jpg,0.0,0.0,1.0,1.0,384,92,https://www.flickr.com/photos/jbrocker_photos/26885294675,https://creativecommons.org/licenses/by/2.0/,Jacqueline Brocker,https://www.flickr.com/people/jbrocker_photos/ 5e06b3ce04626b6c,https://c1.staticflickr.com/8/7612/27815003385_64b82cedf6_o.jpg,0.502573529412,0.25,1.0,1.0,404,190,https://www.flickr.com/photos/usnavy/27815003385,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ cc70e2d9c92d11d0,https://c1.staticflickr.com/9/8222/29035166292_da45e84a3f_o.jpg,0.0,0.0,0.666666666667,1.0,761,576,https://www.flickr.com/photos/133187873@N07/29035166292/,https://creativecommons.org/licenses/by/2.0/,Jennifer Firmenich,https://www.flickr.com/people/133187873@N07/ 1e0e7a14e406e6e9,https://c1.staticflickr.com/9/8652/28092495682_cac2170bc8_o.jpg,0.249079528719,0.0,0.747238586156,0.75,699,528,https://www.flickr.com/photos/steffenz/28092495682,https://creativecommons.org/licenses/by/2.0/,Steffen Zahn,https://www.flickr.com/people/steffenz/ 626077e609ca18b4,https://c1.staticflickr.com/8/7186/26279516544_6c500c73a3_o.jpg,0.0,0.0,0.496696035242,0.75,657,191,https://www.flickr.com/photos/eguidetravel/26279516544/,https://creativecommons.org/licenses/by/2.0/,eGuide Travel,https://www.flickr.com/people/eguidetravel/ 13992d45aea1ac78,https://c1.staticflickr.com/9/8472/29541019041_b680fa85ae_o.jpg,0.309309309309,0.0,1.0,1.0,308,574,https://www.flickr.com/photos/52450054@N04/29541019041/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 05db1d3ced78827e,https://c1.staticflickr.com/8/7604/27380853325_3ff7efe9f6_o.jpg,0.46104815864,0.25,0.92209631728,1.0,780,805,https://www.flickr.com/photos/thoseguys119/27380853325,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 6403e1c6f6853bba,https://c1.staticflickr.com/9/8092/29195089652_0e3f958e31_o.jpg,0.25,0.25,1.0,1.0,753,977,https://www.flickr.com/photos/jonicdao/29195089652/,https://creativecommons.org/licenses/by/2.0/,jojo nicdao,https://www.flickr.com/people/jonicdao/ 4ef3c9c9d2c5cd38,https://c1.staticflickr.com/9/8612/28302854456_7fd6d0670e_o.jpg,0.267530487805,0.25,0.802591463415,1.0,975,548,https://www.flickr.com/photos/jsjgeology/28302854456/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d7544981179c5e49,https://c1.staticflickr.com/1/493/32663662265_8175f81cf1_o.jpg,0.5,0.25,1.0,1.0,98,152,https://www.flickr.com/photos/markyharky/32663662265,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 45625711771f6741,https://c1.staticflickr.com/8/7789/26250637844_1a32b6105a_o.jpg,0.314020028612,0.0,0.942060085837,1.0,12,718,https://www.flickr.com/photos/postmanpetecoluk/26250637844/,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ 57cb2d0d4e60115f,https://c1.staticflickr.com/6/5574/29935756904_619835da00_o.jpg,0.25,0.0,0.75,0.75,977,998,https://www.flickr.com/photos/splodge360/29935756904,https://creativecommons.org/licenses/by/2.0/,Stephen Steven Hodge,https://www.flickr.com/people/splodge360/ dde22ae5b6aa2705,https://c1.staticflickr.com/8/7548/27081747240_b2f881bf72_o.jpg,0.468844984802,0.0,1.0,0.75,325,33,https://www.flickr.com/photos/petervonbagh/27081747240,https://creativecommons.org/licenses/by/2.0/,Peter von Bagh,https://www.flickr.com/people/petervonbagh/ 099f98003eacf5a8,https://c1.staticflickr.com/8/7654/26689131623_5437b57e06_o.jpg,0.0,0.0,0.521837349398,0.75,780,717,https://www.flickr.com/photos/thoseguys119/26689131623,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ bb9e5845df4de497,https://c1.staticflickr.com/1/379/31808300650_bdec0a706d_o.jpg,0.382786885246,0.25,1.0,1.0,309,560,https://www.flickr.com/photos/gails_pictures/31808300650,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ e58548561b357e77,https://c1.staticflickr.com/6/5511/30584211776_28e90ed707_o.jpg,0.0,0.0,0.75,1.0,583,117,https://flickr.com/10390868@N07/30584211776,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ ddc6474be0571ec6,https://c1.staticflickr.com/8/7389/27912404221_4394207050_o.jpg,0.0,0.0,1.0,1.0,697,436,https://www.flickr.com/photos/78428166@N00/27912404221,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ 1e4d8f729c80305c,https://c1.staticflickr.com/9/8679/28863704555_ccccce4225_o.jpg,0.333333333333,0.0,1.0,1.0,472,425,https://www.flickr.com/photos/quinet/28863704555/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ fab9b44e0d87c9d1,https://c1.staticflickr.com/6/5486/30180445021_2eac22a1f7_o.jpg,0.0,0.0,0.506305637982,0.75,337,287,https://www.flickr.com/photos/mypubliclands/30180445021,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 17d2415ade2b68a1,https://c1.staticflickr.com/8/7233/26703892982_a9c1ed938c_o.jpg,0.0,0.25,0.5,1.0,826,771,https://www.flickr.com/photos/tejvan/26703892982/,https://creativecommons.org/licenses/by/2.0/,Tejvan Pettinger,https://www.flickr.com/people/tejvan/ a05b6cb034b7fa44,https://c1.staticflickr.com/6/5723/30025343983_70de3205f1_o.jpg,0.0,0.0,0.5,0.75,405,725,https://www.flickr.com/photos/alessandroambrosetti/30025343983,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ 2fbbb2062cf585fd,https://c1.staticflickr.com/8/7101/27767445301_f66ee841df_o.jpg,0.333333333333,0.0,1.0,1.0,924,77,https://www.flickr.com/photos/kostas-limitsios/27767445301,https://creativecommons.org/licenses/by/2.0/,Kostas Limitsios,https://www.flickr.com/people/kostas-limitsios/ 61cefa6a34376c52,https://c1.staticflickr.com/8/7374/27898387651_9788695def_o.jpg,0.25,0.0,0.75,0.75,997,946,https://www.flickr.com/photos/quinet/27898387651,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 4c15cab91ce70b90,https://c1.staticflickr.com/8/7490/28946290610_c32cc53397_o.jpg,0.0,0.25,0.75,1.0,672,576,https://www.flickr.com/photos/glorycycles/28946290610,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 96e6305f9aa3d40c,https://c1.staticflickr.com/6/5635/29878649004_936558ca3c_o.jpg,0.0,0.0,0.672592592593,1.0,23,624,https://www.flickr.com/photos/photatojonez/29878649004,https://creativecommons.org/licenses/by/2.0/,Alexander Day,https://www.flickr.com/people/photatojonez/ 6900d8c619e7bcfb,https://c1.staticflickr.com/6/5835/30498612532_f7666a0c40_o.jpg,0.0,0.25,0.5,1.0,519,697,https://www.flickr.com/photos/box_repsol/30498612532,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 7f8a82fdac5cca80,https://c1.staticflickr.com/9/8162/28409390513_dafc4d3097_o.jpg,0.409546061415,0.0,0.81909212283,0.75,979,821,https://www.flickr.com/photos/bagogames/28409390513,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/ 4bcd048562317b69,https://c1.staticflickr.com/9/8246/28612811524_ed127f0289_o.jpg,0.4375,0.0,1.0,0.75,975,184,https://www.flickr.com/photos/jsjgeology/28612811524,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e779d2576c165949,https://c1.staticflickr.com/6/5326/30635888270_a32a409fb7_o.jpg,0.0,0.0,1.0,1.0,912,798,https://flickr.com/52066925@N00/30635888270,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ 1891666471fd859a,https://c1.staticflickr.com/9/8112/29304276195_081e1f7e22_o.jpg,0.25,0.0,1.0,0.400725593668,443,348,https://www.flickr.com/photos/xiquinho/29304276195,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/ 70da0375a4855a2b,https://c1.staticflickr.com/9/8217/28780187980_53b56b5d0c_o.jpg,0.0,0.25,0.695217391304,1.0,324,674,https://www.flickr.com/photos/usfwsmidwest/28780187980/,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ bb39a75d977b50cc,https://c1.staticflickr.com/9/8413/29711642155_73b2966a2d_o.jpg,0.25,0.0,1.0,1.0,981,42,https://www.flickr.com/photos/cogdog/29711642155/?map=1,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ f1df3a222f52c6ae,https://c1.staticflickr.com/8/7205/26726038911_f793d14ac2_o.jpg,0.4375,0.0,1.0,0.75,696,364,https://www.flickr.com/photos/computerhotline/26726038911/,https://creativecommons.org/licenses/by/2.0/,Thomas Bresson,https://www.flickr.com/people/computerhotline/ e763332902cd1d04,https://c1.staticflickr.com/6/5474/30419774994_076389d703_o.jpg,0.0,0.25,0.515344311377,1.0,416,316,https://www.flickr.com/photos/boscdanjou/30419774994/,https://creativecommons.org/licenses/by/2.0/,Bosc d'Anjou,https://www.flickr.com/people/boscdanjou/ 1128ae1d013bfead,https://c1.staticflickr.com/9/8320/29227972683_93d76cd87d_o.jpg,0.0,0.0,0.666666666667,1.0,442,106,https://www.flickr.com/photos/allagashbrewing/29227972683,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/ 81350e4e68286f1d,https://c1.staticflickr.com/1/257/32296349550_fea2fbd7ef_o.jpg,0.0,0.0,0.565217391304,1.0,874,87,https://www.flickr.com/photos/eltb/32296349550,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 0037457099831038,https://c1.staticflickr.com/8/7624/26750743561_98ff3b6de8_o.jpg,0.0,0.0,0.665684830633,1.0,820,803,https://www.flickr.com/photos/re-publica/26750743561,https://creativecommons.org/licenses/by/2.0/,re:publica,https://www.flickr.com/people/re-publica/ b3e1c45b2ee26ed9,https://c1.staticflickr.com/8/7769/27044150752_d18793d2d5_o.jpg,0.333333333333,0.0,1.0,1.0,114,314,https://www.flickr.com/photos/briangratwicke/27044150752,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ 20c6b5de5ccc6213,https://c1.staticflickr.com/9/8494/28500572574_92f800ee4a_o.jpg,0.0,0.0,0.51992481203,0.75,975,636,https://www.flickr.com/photos/jsjgeology/28500572574,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ eff36f2e4c2e8058,https://c1.staticflickr.com/8/7327/27994452046_944f9e7ceb_o.jpg,0.0,0.0,0.75,1.0,981,325,https://www.flickr.com/photos/lumen850/27994452046,https://creativecommons.org/licenses/by/2.0/,elminium,https://www.flickr.com/people/lumen850/ 6fdef96412a1a79c,https://c1.staticflickr.com/6/5791/30782694000_ed57ca3c93_o.jpg,0.0,0.0,0.5,0.75,539,930,https://www.flickr.com/photos/gotovan/30782694000,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/ c97e69c61ed82fde,https://c1.staticflickr.com/8/7338/27460776514_c5a89d703c_o.jpg,0.0,0.0,0.666666666667,1.0,480,563,https://www.flickr.com/photos/69663188@N00/27460776514/,https://creativecommons.org/licenses/by/2.0/,Grant.C,https://www.flickr.com/people/grant_subaru/ ab9f22a83e8fad15,https://c1.staticflickr.com/8/7077/27723495182_0dc1d7d748_o.jpg,0.261312217195,0.25,0.783936651584,1.0,100,554,https://www.flickr.com/photos/sbern/27723495182,https://creativecommons.org/licenses/by/2.0/,Stefan Berndtsson,https://www.flickr.com/people/sbern/ 880266c86a5cc884,https://c1.staticflickr.com/8/7515/27084790893_88c6ce0123_o.jpg,0.0,0.0,0.75,0.75,405,138,https://www.flickr.com/photos/craightonmiller/27084790893,https://creativecommons.org/licenses/by/2.0/,Craighton Miller,https://www.flickr.com/people/craightonmiller/ 639c3402d2f4087f,https://c1.staticflickr.com/9/8138/30186318601_3f7e1f11fa_o.jpg,0.25,0.0,0.75,0.75,526,605,https://flickr.com/48539981@N03/30186318601,https://creativecommons.org/licenses/by/2.0/,Felix Dance,https://www.flickr.com/people/felixdance/ 3917dce7a9a86181,https://c1.staticflickr.com/8/7485/26840080736_13f6407a06_o.jpg,0.0,0.0,0.666666666667,1.0,820,115,https://www.flickr.com/photos/nanpalmero/26840080736,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/ 97131307bfc8c73c,https://c1.staticflickr.com/1/772/32749639240_f2ece6e133_o.jpg,0.0,0.393668831169,0.75,1.0,484,588,https://www.flickr.com/photos/pyride/32749639240,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/ 94b07b8d87b1169a,https://c1.staticflickr.com/6/5793/30737912512_cbdea11a6b_o.jpg,0.0,0.0,0.75,0.75,820,748,https://www.flickr.com/photos/moonierocks/30737912512/,https://creativecommons.org/licenses/by/2.0/,Marilyn Roxie,https://www.flickr.com/people/moonierocks/ d87ffd300b8228d2,https://c1.staticflickr.com/6/5748/31329490516_4eb1ba925a_o.jpg,0.25,0.0,1.0,0.496696035242,919,546,https://www.flickr.com/photos/zionfiction/31329490516,https://creativecommons.org/licenses/by/2.0/,r. nial bradshaw,https://www.flickr.com/people/zionfiction/ b3ffbdb422bbaf07,https://c1.staticflickr.com/3/2944/32386765884_928eab48fc_o.jpg,0.0,0.0,0.5625,0.75,918,789,https://www.flickr.com/photos/usagapg/32386765884/,https://creativecommons.org/licenses/by/2.0/,Aberdeen Proving Ground,https://www.flickr.com/people/usagapg/ a84d56908d891680,https://c1.staticflickr.com/1/273/31871194741_bea04c27f5_o.jpg,0.421703296703,0.0,1.0,1.0,431,875,https://www.flickr.com/photos/viumariners/31871194741/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/ 88ce0ad1de0168f8,https://c1.staticflickr.com/8/7526/28075448522_50687f1edf_o.jpg,0.0,0.0,0.617213114754,0.75,309,407,https://www.flickr.com/photos/35142635@N05/28075448522,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 1849b094728d520a,https://c1.staticflickr.com/6/5683/30638280440_54bff19618_o.jpg,0.0,0.0,1.0,0.828947368421,884,637,https://www.flickr.com/photos/nat507/30638280440/,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/ 60ad0ed57f2d22db,https://c1.staticflickr.com/6/5541/30287126544_6e647613cd_o.jpg,0.0,0.373762376238,0.75,1.0,422,828,https://www.flickr.com/photos/duncanh1/30287126544,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ f5ec1f282e38d9b3,https://c1.staticflickr.com/9/8282/29296349346_8a99a2f048_o.jpg,0.28125,0.0,0.84375,0.75,309,127,https://www.flickr.com/photos/treegrow/29296349346,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 8c485ae77065eba8,https://c1.staticflickr.com/9/8560/28344396322_ff74b34b60_o.jpg,0.0,0.0,0.666666666667,1.0,93,543,https://www.flickr.com/photos/silkebaron/28344396322/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ a0c580e905ac8c77,https://c1.staticflickr.com/8/7714/26515336243_17d41eb4d7_o.jpg,0.0,0.0,0.625,1.0,699,424,https://www.flickr.com/photos/viaggioroutard/26515336243,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/ c3fd6b9a80845631,https://c1.staticflickr.com/9/8771/29233540675_e81fc2f05c_o.jpg,0.251849112426,0.0,0.755547337278,0.75,548,866,https://www.flickr.com/photos/28101583@N07/29233540675,https://creativecommons.org/licenses/by/2.0/,Drew Jacksich,https://www.flickr.com/people/28101583@N07/ 607da844c5c516c8,https://c1.staticflickr.com/8/7506/26562209630_00c069c15f_o.jpg,0.0,0.0,0.63924963925,1.0,672,587,https://www.flickr.com/photos/glorycycles/26562209630,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 62940f3805195b7d,https://c1.staticflickr.com/9/8218/29880087555_9b641a861f_o.jpg,0.25,0.0,1.0,1.0,699,495,https://www.flickr.com/photos/marsupilami92/29880087555/,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ 551fd05f307aa188,https://c1.staticflickr.com/6/5792/31095062510_05ab1c4823_o.jpg,0.501840942563,0.0,1.0,0.75,752,523,https://www.flickr.com/photos/davehamster/31095062510/,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 0930b6c9833f198c,https://c1.staticflickr.com/9/8755/27763656834_a276f8cc85_o.jpg,0.25,0.25,0.75,1.0,512,663,https://www.flickr.com/photos/greggjerdingen/27763656834,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ d603622bdc1d91fc,https://c1.staticflickr.com/6/5790/30126475762_cbdc7daee6_o.jpg,0.25,0.25,0.75,1.0,408,599,https://www.flickr.com/photos/kecko/30126475762,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ 64970b901ef0209e,https://c1.staticflickr.com/9/8724/28227819681_f95f42576a_o.jpg,0.25,0.25,1.0,0.75,873,95,https://www.flickr.com/photos/sheila_sund/28227819681,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/ dbe893759f87390d,https://c1.staticflickr.com/3/2263/32519576950_bdff5f7190_o.jpg,0.25,0.25,0.75,1.0,114,483,https://www.flickr.com/photos/37180297@N08/32519576950/,https://creativecommons.org/licenses/by/2.0/,LiCheng Shih,https://www.flickr.com/people/papilioshih/ 9c46fc881be714ca,https://c1.staticflickr.com/8/7415/27595256915_5661f0a51e_o.jpg,0.4375,0.0,1.0,0.75,405,455,https://www.flickr.com/photos/shankaronline/27595256915,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 3055dc98cf8a57a5,https://c1.staticflickr.com/6/5535/30714884170_a6254a5627_o.jpg,0.0,0.0,0.5,0.75,737,695,https://www.flickr.com/photos/stevendepolo/30714884170,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ d7b476c0f9e0e65d,https://c1.staticflickr.com/9/8751/28841277556_b19993cf78_o.jpg,0.4375,0.0,1.0,0.75,459,970,https://www.flickr.com/photos/127226743@N02/28841277556,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 665964e46080dae4,https://c1.staticflickr.com/6/5798/30274253233_a0df682f8a_o.jpg,0.496301775148,0.25,1.0,1.0,662,693,http://www.flickr.com/photos/91807507@N03/30274253233/,https://creativecommons.org/licenses/by/2.0/,GPS 56,https://www.flickr.com/people/91807507@N03/ 94867dda40b37ccf,https://c1.staticflickr.com/6/5542/30683767556_54e6d47319_o.jpg,0.4375,0.0,1.0,0.75,886,998,https://www.flickr.com/photos/mmmavocado/30683767556/,https://creativecommons.org/licenses/by/2.0/,Malcolm Manners,https://www.flickr.com/people/mmmavocado/ e86d3240501de2cc,https://c1.staticflickr.com/8/7684/26247186274_78c800d2a4_o.jpg,0.25,0.0,0.75,0.75,519,703,https://www.flickr.com/photos/box_repsol/26247186274,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ fadc7128db36bf61,https://c1.staticflickr.com/9/8855/28366763032_2354ff312e_o.jpg,0.0,0.0,0.75,0.5625,823,758,https://www.flickr.com/photos/mdagdept/28366763032/,https://creativecommons.org/licenses/by/2.0/,MdAgDept,https://www.flickr.com/people/mdagdept/ ec059989d017e677,https://c1.staticflickr.com/8/7398/27128063040_9e2b5e2c63_o.jpg,0.5,0.0,1.0,0.75,426,694,https://www.flickr.com/photos/sarahvain/27128063040,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/ 6feed34722f237e7,https://c1.staticflickr.com/8/7496/26320693773_b51590bb53_o.jpg,0.28125,0.25,0.84375,1.0,405,933,https://www.flickr.com/photos/39551170@N02/26320693773,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/ a4d8de5ed9daad7a,https://c1.staticflickr.com/8/7533/27739978502_cd63d8b273_o.jpg,0.438430311231,0.0,1.0,1.0,570,574,https://www.flickr.com/photos/transitomedellin/27739978502,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ e2fb2a36879328d6,https://c1.staticflickr.com/9/8139/30151198796_7f548b3512_o.jpg,0.299878836834,0.0,0.899636510501,0.75,95,444,https://www.flickr.com/photos/andymorffew/30151198796,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ 56aeb022610946ff,https://c1.staticflickr.com/1/716/30984539614_9264fd7673_o.jpg,0.0,0.0,0.621710526316,0.75,310,83,https://flickr.com/43272765@N04/30984539614,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 328558f4886154dd,https://c1.staticflickr.com/8/7510/27029142832_e379584840_o.jpg,0.28125,0.0,0.84375,0.75,570,482,https://www.flickr.com/photos/27665395@N05/27029142832,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 8f9c26fa4842489e,https://c1.staticflickr.com/9/8475/28534463493_8a29c6c868_o.jpg,0.25,0.0,1.0,1.0,975,499,https://www.flickr.com/photos/welix/28534463493,https://creativecommons.org/licenses/by/2.0/,Weli'mi'nakwan,https://www.flickr.com/people/welix/ 6ffb40ed27f1ea1d,https://c1.staticflickr.com/9/8276/30276366541_060424aaa2_o.jpg,0.0,0.25,0.5,1.0,647,842,https://www.flickr.com/photos/thejointstaff/30276366541/,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ 2446cc6251657e54,https://c1.staticflickr.com/1/274/31942975694_970ed59a0a_o.jpg,0.28125,0.0,0.84375,0.75,114,8,https://www.flickr.com/photos/scotnelson/31942975694/,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 0dc146817ba15f43,https://c1.staticflickr.com/9/8866/28242908073_27594bb6c5_o.jpg,0.526203208556,0.25,0.789304812834,1.0,971,517,https://www.flickr.com/photos/stephanridgway/28242908073/,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/ 9821d5cb5cee9844,https://c1.staticflickr.com/9/8651/27845346213_b3b4c44f18_o.jpg,0.0,0.0,0.649199417758,1.0,971,102,https://www.flickr.com/photos/jsjgeology/27845346213,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ f410f7e55ab34cd9,https://c1.staticflickr.com/1/709/30920000584_b999554ac0_o.jpg,0.497426470588,0.0,0.994852941176,0.75,744,730,https://www.flickr.com/photos/bvi4092/30920000584,https://creativecommons.org/licenses/by/2.0/,bvi4092,https://www.flickr.com/people/bvi4092/ d1d5ad9f7db05c65,https://c1.staticflickr.com/1/526/32103155146_c9a9d5a168_o.jpg,0.28125,0.0,0.84375,0.75,625,617,https://www.flickr.com/photos/newcastlelibraries/32103155146,https://creativecommons.org/licenses/by/2.0/,Newcastle Libraries,https://www.flickr.com/people/newcastlelibraries/ 78cc7e87b1c49531,https://c1.staticflickr.com/6/5708/31182535465_e2b18ce9e6_o.jpg,0.0,0.0,0.419028340081,0.75,875,425,https://www.flickr.com/photos/9759010@N07/31182535465,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/ 09a754c424c3fb4f,https://c1.staticflickr.com/9/8685/28362639536_a18ac0c458_o.jpg,0.28125,0.0,0.84375,0.75,975,913,https://www.flickr.com/photos/jsjgeology/28362639536,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 5a40245e1c994e21,https://c1.staticflickr.com/8/7322/26756536054_6bfab4ab37_o.jpg,0.0,0.249631811487,0.75,0.748895434462,653,511,https://www.flickr.com/photos/us_embassy_newzealand/26756536054/,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/ ff691ee265e67513,https://c1.staticflickr.com/9/8070/29539951820_b514fc01f1_o.jpg,0.154485049834,0.0,1.0,1.0,310,48,https://www.flickr.com/photos/gails_pictures/29539951820,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 658a3cc3b21a516d,https://c1.staticflickr.com/2/1449/26145403003_2c89142536_o.jpg,0.0,0.25,0.75,1.0,976,92,https://www.flickr.com/photos/29225212@N08/26145403003,https://creativecommons.org/licenses/by/2.0/,Mark Skarratts,https://www.flickr.com/people/29225212@N08/ 90b1e970fc800c4b,https://c1.staticflickr.com/6/5780/31235083381_ee9e0c741b_o.jpg,0.25,0.0,1.0,1.0,826,107,https://www.flickr.com/photos/jsjgeology/31235083381,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 96f2c8aeef574982,https://c1.staticflickr.com/8/7466/27241125076_9d511ec126_o.jpg,0.4375,0.25,1.0,1.0,874,236,https://www.flickr.com/photos/estudiante/27241125076,https://creativecommons.org/licenses/by/2.0/,Dan,https://www.flickr.com/people/estudiante/ 8fcb1f70b0d807cb,https://c1.staticflickr.com/9/8890/27997582240_62fc0c25b9_o.jpg,0.0,0.0,0.5,0.75,563,812,https://www.flickr.com/photos/harshlight/27997582240,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ b2e2031dba6d9110,https://c1.staticflickr.com/8/7352/26886474510_9a9c793ee3_o.jpg,0.255022321429,0.25,0.765066964286,1.0,848,704,https://www.flickr.com/photos/13476480@N07/26886474510,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ d1fc118dde717e86,https://c1.staticflickr.com/1/758/30943127713_8421db873d_o.jpg,0.0,0.0,0.5625,0.75,546,372,https://flickr.com/10688882@N00/30943127713,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ efd383818235664b,https://c1.staticflickr.com/9/8826/28394077390_eb2cf8eb96_o.jpg,0.0,0.281690140845,0.75,0.845070422535,507,668,http://www.flickr.com/photos/84894254@N03/28394077390,https://creativecommons.org/licenses/by/2.0/,Magdalena Roeseler,https://www.flickr.com/people/magdalenaroeseler/ e6ce7bdc752558f7,https://c1.staticflickr.com/8/7786/28026219961_47d5e5ba2d_o.jpg,0.0,0.0,0.5625,0.75,512,249,https://www.flickr.com/photos/daveseven/28026219961,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ 2d39235151ed8bbe,https://c1.staticflickr.com/1/262/31418889390_74084bed01_o.jpg,0.333333333333,0.0,1.0,1.0,661,501,https://www.flickr.com/photos/pasa/31418889390,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 6762025e55997283,https://c1.staticflickr.com/9/8194/29758772402_c1687b6a58_o.jpg,0.25,0.25,1.0,0.75,425,828,https://www.flickr.com/photos/rpavich/29758772402,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ b7a519c4f18f35dc,https://c1.staticflickr.com/1/457/31263070774_06a2cc166a_o.jpg,0.0,0.0,1.0,0.96975088968,905,415,https://www.flickr.com/photos/rulenumberone2/31263070774,https://creativecommons.org/licenses/by/2.0/,rulenumberone2,https://www.flickr.com/people/rulenumberone2/ 83a79e1c96a2c3d4,https://c1.staticflickr.com/9/8889/28941004276_884f939e06_o.jpg,0.0,0.25,0.5,1.0,875,472,https://www.flickr.com/photos/kieransphotostream/28941004276,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/ 361474ae41fc57b7,https://c1.staticflickr.com/1/686/32042498230_edf603fb8f_o.jpg,0.336764705882,0.0,1.0,1.0,635,81,https://www.flickr.com/photos/agenciabrasilia/32042498230,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 894fa71009a08f15,https://c1.staticflickr.com/9/8784/29844165165_2aaa9657ff_o.jpg,0.0,0.0,0.666666666667,1.0,885,894,https://www.flickr.com/photos/prof_richard/29844165165,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/ e6b37d9256c0c12d,https://c1.staticflickr.com/8/7072/28032764536_ace5ecb8d6_o.jpg,0.0,0.0,1.0,0.666666666667,638,400,https://www.flickr.com/photos/peterscherub/28032764536,https://creativecommons.org/licenses/by/2.0/,judy dean,https://www.flickr.com/people/peterscherub/ f580032c69051bf8,https://c1.staticflickr.com/6/5651/30245701914_9d8b8260c3_o.jpg,0.0,0.0,0.733746130031,1.0,396,903,https://www.flickr.com/photos/linvoyage/30245701914,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ 395827efe97502a2,https://c1.staticflickr.com/1/265/31685645216_acbf427dc8_o.jpg,0.271313364055,0.25,0.813940092166,1.0,580,671,https://www.flickr.com/photos/eebeephoto/31685645216/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/ 97445f57c27f2d47,https://c1.staticflickr.com/3/2545/32519532420_791c7a408f_o.jpg,0.25,0.0,1.0,1.0,977,796,https://www.flickr.com/photos/davidstanleytravel/32519532420/,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ e4b30712d50cef1d,https://c1.staticflickr.com/9/8548/29275499636_4f17fbf418_o.jpg,0.0,0.0,0.799676898223,1.0,133,148,https://www.flickr.com/photos/andymorffew/29275499636,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ f42d4a29adf9fdab,https://c1.staticflickr.com/9/8327/28658951111_5388512345_o.jpg,0.0,0.25,0.75,0.75,442,983,https://www.flickr.com/photos/hirlimann/28658951111,https://creativecommons.org/licenses/by/2.0/,Ludovic Hirlimann,https://www.flickr.com/people/hirlimann/ ae599bfbe60f9cb3,https://c1.staticflickr.com/8/7396/27761678751_a719e5b178_o.jpg,0.0,0.0,1.0,1.0,972,747,https://www.flickr.com/photos/martingarri/27761678751,https://creativecommons.org/licenses/by/2.0/,Martin Garrido,https://www.flickr.com/people/martingarri/ 559e47277444524a,https://c1.staticflickr.com/8/7388/26795017073_fb3ddb3121_o.jpg,0.0,0.0,0.786858974359,1.0,437,812,https://www.flickr.com/photos/eurosporttuning/26795017073,https://creativecommons.org/licenses/by/2.0/,Frank Derks,https://www.flickr.com/people/eurosporttuning/ 89998556679b6187,https://c1.staticflickr.com/6/5765/30854475991_9a9fff12e8_o.jpg,0.0,0.25,0.75,1.0,582,584,https://www.flickr.com/photos/artlung/30854475991,https://creativecommons.org/licenses/by/2.0/,Joe Crawford,https://www.flickr.com/people/artlung/ 0233419c159a2412,https://c1.staticflickr.com/9/8165/27745906263_fe81dd8d43_o.jpg,0.0,0.0,0.666666666667,1.0,960,706,https://www.flickr.com/photos/jmh-pics/27745906263,https://creativecommons.org/licenses/by/2.0/,Jan Mark Holzer,https://www.flickr.com/people/jmh-pics/ 8f7fcccbd5d77137,https://c1.staticflickr.com/1/491/31050374504_724f43a02f_o.jpg,0.0,0.0,0.75,0.75,825,788,https://flickr.com/52066925@N00/31050374504,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ f67c6df686c18aba,https://c1.staticflickr.com/9/8579/29585778993_6ef1054a62_o.jpg,0.0,0.330871491876,1.0,1.0,407,611,https://www.flickr.com/photos/eltb/29585778993,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 382ef525198b959e,https://c1.staticflickr.com/9/8451/29527354530_c777b7ea9c_o.jpg,0.0,0.0,0.587060702875,0.75,265,578,https://www.flickr.com/photos/calliope/29527354530,https://creativecommons.org/licenses/by/2.0/,liz west,https://www.flickr.com/people/calliope/ c162b94ff3381024,https://c1.staticflickr.com/9/8538/29608701050_00effef96d_o.jpg,0.0,0.25,0.5625,1.0,874,759,https://www.flickr.com/photos/127226743@N02/29608701050,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ d3773c79f0669d54,https://c1.staticflickr.com/8/7297/28182565672_eb6ef6a16b_o.jpg,0.0,0.0,0.907056798623,1.0,309,731,https://www.flickr.com/photos/linsepatron/28182565672/,https://creativecommons.org/licenses/by/2.0/,Line Sabroe,https://www.flickr.com/people/linsepatron/ 95a029749845b857,https://c1.staticflickr.com/8/7659/26217470653_5666790c94_o.jpg,0.0,0.0,0.554347826087,0.75,548,562,https://www.flickr.com/photos/trolleway/26217470653/,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/ a14bbb59334f2149,https://c1.staticflickr.com/9/8127/29818159100_72f8844620_o.jpg,0.25,0.25,0.75,1.0,561,228,https://www.flickr.com/photos/codnewsroom/29818159100,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ af124fbb600e535e,https://c1.staticflickr.com/9/8012/28533117934_ae1f3e25d8_o.jpg,0.28125,0.0,0.84375,0.75,875,423,https://www.flickr.com/photos/alper/28533117934,https://creativecommons.org/licenses/by/2.0/,Alper \303\207u\304\237un,https://www.flickr.com/people/alper/ 2666fa6693af3050,https://c1.staticflickr.com/9/8482/28824490374_3974fbe728_o.jpg,0.0,0.5,0.75,1.0,857,625,https://www.flickr.com/photos/zigazou76/28824490374,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ a6226e2dce2a68aa,https://c1.staticflickr.com/9/8237/28546433013_a39c7c9408_o.jpg,0.0,0.0,0.599757673667,0.75,515,601,https://www.flickr.com/photos/larry1732/28546433013,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ 826c2d54adef0c9a,https://c1.staticflickr.com/4/3923/32400195373_49ac1532dc_o.jpg,0.5,0.25,1.0,1.0,108,377,https://www.flickr.com/photos/chad_sparkes/32400195373,https://creativecommons.org/licenses/by/2.0/,Chad Sparkes,https://www.flickr.com/people/chad_sparkes/ 43fc9de02f6b5d28,https://c1.staticflickr.com/9/8393/29448302593_2082a11a68_o.jpg,0.0,0.0,0.666666666667,1.0,561,812,https://flickr.com/48542161@N04/29448302593,https://creativecommons.org/licenses/by/2.0/,Max Goldberg,https://www.flickr.com/people/max-goldberg/ 8a9b656eab3a1ff9,https://c1.staticflickr.com/8/7484/29357000516_bb90776bed_o.jpg,0.257672155689,0.0,0.773016467066,0.75,309,330,https://www.flickr.com/photos/42244964@N03/29357000516,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ 837c8620e10fa557,https://c1.staticflickr.com/6/5528/29943287876_a2311f3670_o.jpg,0.5,0.25,1.0,1.0,991,573,https://www.flickr.com/photos/sucriertt/29943287876,https://creativecommons.org/licenses/by/2.0/,Feroze Omardeen,https://www.flickr.com/people/sucriertt/ c459a562734cd971,https://c1.staticflickr.com/8/7737/28285793291_d085aef7bf_o.jpg,0.545358649789,0.25,1.0,1.0,752,839,https://www.flickr.com/photos/95472204@N03/28285793291,https://creativecommons.org/licenses/by/2.0/,Andrew & Alan Frost,https://www.flickr.com/people/95472204@N03/ fd79d55498824520,https://c1.staticflickr.com/9/8665/28026599983_5cf819e1b5_o.jpg,0.2806640625,0.0,0.8419921875,0.75,318,336,https://www.flickr.com/photos/treegrow/28026599983/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 994fbc8383a07e54,https://c1.staticflickr.com/1/355/31966431426_91189b87cb_o.jpg,0.0,0.25,0.537844036697,1.0,629,93,https://www.flickr.com/photos/jlcernadas/31966431426/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ fed194bf3b56fba7,https://c1.staticflickr.com/6/5718/30415657710_16e4f10804_o.jpg,0.0,0.0,0.496696035242,0.75,326,113,https://flickr.com/25733107@N04/30415657710,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/ 647b4857d92cc211,https://c1.staticflickr.com/6/5594/29709037893_1b2a8dae3c_o.jpg,0.2806640625,0.0,0.8419921875,0.75,676,258,https://www.flickr.com/photos/southbeachcars/29709037893,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 7860a041f0c076cd,https://c1.staticflickr.com/8/7463/27980245440_320c02e3c9_o.jpg,0.25,0.25,0.75,1.0,709,578,https://www.flickr.com/photos/renaud-camus/27980245440/?map=1,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/ ed7002893bc2f4c7,https://c1.staticflickr.com/3/2772/33058537475_52d61da4bf_o.jpg,0.25,0.0,0.75,0.75,868,231,https://www.flickr.com/photos/76969036@N02/33058537475/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 77542b97f0049769,https://c1.staticflickr.com/8/7773/29421177033_6a6b33f045_o.jpg,0.0,0.0,0.403311258278,0.75,459,748,https://www.flickr.com/photos/eltb/29421177033,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 564460cc9be9be61,https://c1.staticflickr.com/1/274/32364459001_74cd217de6_o.jpg,0.456338028169,0.0,0.912676056338,0.75,93,458,https://www.flickr.com/photos/dkeats/32364459001,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ cf78f63c54187bec,https://c1.staticflickr.com/4/3841/33086599681_35a7848664_o.jpg,0.4375,0.25,1.0,1.0,735,95,https://www.flickr.com/photos/27665395@N05/33086599681/,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 2621772a490cd0de,https://c1.staticflickr.com/6/5669/30977168166_1f49b257f4_o.jpg,0.0,0.25,0.665816326531,1.0,820,781,http://www.flickr.com/photos/rarvesen/30977168166/,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/ 3d6dcdafbb9dc27b,https://c1.staticflickr.com/6/5162/30237625155_1e08eb7500_o.jpg,0.498159057437,0.25,0.996318114875,1.0,561,691,https://www.flickr.com/photos/eaglebrook/30237625155,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ 517b88ad5ffd2fdf,https://c1.staticflickr.com/6/5458/30010629873_ca90218b76_o.jpg,0.0,0.0,0.747269890796,1.0,912,432,https://www.flickr.com/photos/happyskrappy/30010629873,https://creativecommons.org/licenses/by/2.0/,jenn,https://www.flickr.com/people/happyskrappy/ bf1f5852338a59a0,https://c1.staticflickr.com/8/7089/26249653033_6048fda7a3_o.jpg,0.528938906752,0.0,0.881564844587,1.0,136,152,https://www.flickr.com/photos/lakeworth/26249653033,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/ de236ab325734421,https://c1.staticflickr.com/6/5793/29696902090_e966724fc4_o.jpg,0.0458553791887,0.0,1.0,1.0,717,513,https://www.flickr.com/photos/13476480@N07/29696902090,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 26dab12c8c3812b8,https://c1.staticflickr.com/1/533/31762062631_e3776379a4_o.jpg,0.0,0.0,0.75,0.75,405,151,https://flickr.com/47224062@N03/31762062631,https://creativecommons.org/licenses/by/2.0/,Icaro Ferracini,https://www.flickr.com/people/icaroferracini/ 5685f380cdfd6bdb,https://c1.staticflickr.com/8/7296/26787580190_e667de75f7_o.jpg,0.499263622975,0.0,0.99852724595,0.75,718,107,https://www.flickr.com/photos/greggjerdingen/26787580190/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ ec422b98fc566186,https://c1.staticflickr.com/9/8029/29448876685_e910855ff6_o.jpg,0.0,0.0,0.508928571429,0.75,971,851,https://www.flickr.com/photos/linvoyage/29448876685,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ b0cf369571eb56b7,https://c1.staticflickr.com/9/8686/28597399595_1fd81114c6_o.jpg,0.327407407407,0.0,1.0,1.0,985,954,https://flickr.com/33497841@N02/28597399595,https://creativecommons.org/licenses/by/2.0/,Andrey Zharkikh,https://www.flickr.com/people/zharkikh/ 75307fc8548a1f68,https://c1.staticflickr.com/9/8644/30280625356_bf0f68e780_o.jpg,0.28125,0.25,0.84375,1.0,346,576,http://www.flickr.com/photos/eamoncurry/30280625356/,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/ 84958e67e869a4ab,https://c1.staticflickr.com/8/7577/28396934462_ea64974e9c_o.jpg,0.0,0.0,0.663235294118,1.0,626,929,https://www.flickr.com/photos/slgc/28396934462,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ aed5042a1020173c,https://c1.staticflickr.com/1/573/31411640740_99be7dd88e_o.jpg,0.5,0.25,1.0,1.0,404,828,https://www.flickr.com/photos/usnavy/31411640740,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 29aa4abd5ec26581,https://c1.staticflickr.com/6/5782/30742114125_67787e684a_o.jpg,0.498159057437,0.25,0.996318114875,1.0,608,624,https://flickr.com/69384212@N04/30742114125,https://creativecommons.org/licenses/by/2.0/,Lws & Clrk,https://www.flickr.com/people/lewis-clark/ c4aa9d77cb1b4927,https://c1.staticflickr.com/9/8137/30039197630_c2fabe1854_o.jpg,0.333333333333,0.0,1.0,1.0,854,557,https://www.flickr.com/photos/slapers/30039197630,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 31039bd613c75ef9,https://c1.staticflickr.com/9/8455/29775141261_96202ac088_o.jpg,0.0,0.0,0.515344311377,0.75,618,393,https://flickr.com/38014693@N04/29775141261,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de S\303\243o Paulo,https://www.flickr.com/people/governosp/ 56112174c8c0de61,https://c1.staticflickr.com/9/8463/29691928466_1cb8bd35ba_o.jpg,0.0,0.25,0.501846381093,1.0,539,828,https://www.flickr.com/photos/akras/29691928466,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/ bb67780f32491734,https://c1.staticflickr.com/6/5652/30883107485_ee1a53b58b_o.jpg,0.0,0.0,0.75,1.0,163,389,https://www.flickr.com/photos/ruthanddave/30883107485,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 0e6eddca6228ef7c,https://c1.staticflickr.com/9/8106/28256568960_84fecd9757_o.jpg,0.0,0.25,0.561328125,1.0,664,789,https://www.flickr.com/photos/marsupilami92/28256568960,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ b4da4e4c923c953c,https://c1.staticflickr.com/8/7707/29133731892_08abc2c3f5_o.jpg,0.28125,0.25,0.84375,1.0,548,662,https://www.flickr.com/photos/trolleway/29133731892/,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/ 030c68053c2778bd,https://c1.staticflickr.com/9/8136/29586786723_3ccaef6e64_o.jpg,0.0,0.0,0.665684830633,1.0,885,118,https://www.flickr.com/photos/martius/29586786723/,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 0642780a60983569,https://c1.staticflickr.com/9/8745/28343518894_c2b78c1d13_o.jpg,0.5,0.25,1.0,1.0,896,856,https://www.flickr.com/photos/elsie/28343518894/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 3bcdf6695c707c61,https://c1.staticflickr.com/9/8357/29099474294_358d0283a7_o.jpg,0.0,0.0,0.666666666667,1.0,980,428,http://www.flickr.com/photos/amslerpix/29099474294/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ b8a4c5b160a2027c,https://c1.staticflickr.com/9/8441/28592091365_6a551c4771_o.jpg,0.25,0.0,0.75,0.75,428,622,https://www.flickr.com/photos/sterlingcollege/28592091365/,https://creativecommons.org/licenses/by/2.0/,Sterling College,https://www.flickr.com/people/sterlingcollege/ fce9b52c90c9997e,https://c1.staticflickr.com/9/8861/28488132142_72d7f4d20f_o.jpg,0.278188180404,0.0,0.834564541213,0.75,875,677,https://www.flickr.com/photos/didbygraham/28488132142,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 65ce68b28671f73e,https://c1.staticflickr.com/1/293/32196905736_7c89181e47_o.jpg,0.25,0.25,0.75,1.0,719,586,https://www.flickr.com/photos/romanboed/32196905736,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/ 7a2313fbcedcbe22,https://c1.staticflickr.com/9/8268/29092236470_5b9da0ef79_o.jpg,0.0,0.0,0.75,0.5625,653,142,https://www.flickr.com/photos/quinet/29092236470/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 5085bbb36515834f,https://c1.staticflickr.com/8/7352/27673981061_48ef162039_o.jpg,0.25,0.0,1.0,0.75,418,588,https://www.flickr.com/photos/thomaspurves/27673981061,https://creativecommons.org/licenses/by/2.0/,Tom Purves,https://www.flickr.com/people/thomaspurves/ 72dff1bff620f618,https://c1.staticflickr.com/9/8562/29388220405_68c75e85df_o.jpg,0.25,0.25,0.75,1.0,863,424,https://www.flickr.com/photos/agenciabrasilia/29388220405,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 6d48d7b1238c5d8d,https://c1.staticflickr.com/9/8452/29591539195_af1acb82a3_o.jpg,0.0,0.0,0.75,0.5,973,479,https://www.flickr.com/photos/quinet/29591539195,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 57d1361e30f54c93,https://c1.staticflickr.com/6/5604/30411899672_a4c9e01257_o.jpg,0.0,0.0,0.5,0.75,431,682,https://flickr.com/51735829@N00/30411899672,https://creativecommons.org/licenses/by/2.0/,Dave n Laura,https://www.flickr.com/people/lauraanddave/ ca31395e1a54ce30,https://c1.staticflickr.com/8/7212/27153875976_f29075f182_o.jpg,0.28125,0.25,0.84375,1.0,657,867,https://www.flickr.com/photos/27665395@N05/27153875976,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 69cba04e99e74e91,https://c1.staticflickr.com/9/8082/29780987721_244aa630c4_o.jpg,0.0,0.419316375199,0.75,1.0,582,648,https://www.flickr.com/photos/hugo90/29780987721,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 2443c73a65826558,https://c1.staticflickr.com/9/8003/29082005145_fb4369cbb3_o.jpg,0.25,0.25,0.75,1.0,455,288,https://www.flickr.com/photos/boristhaser/29082005145,https://creativecommons.org/licenses/by/2.0/,Boris Thaser,https://www.flickr.com/people/boristhaser/ 62bf8f1aca3933ec,https://c1.staticflickr.com/9/8158/29270125475_0e5fc00d80_o.jpg,0.0,0.0,0.75,0.565438871473,407,656,https://www.flickr.com/photos/eltb/29270125475,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 38d50454657fe7f0,https://c1.staticflickr.com/8/7625/27202554790_2849f2bc07_o.jpg,0.4375,0.25,1.0,1.0,151,889,https://www.flickr.com/photos/amanderson/27202554790,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 77963a8fcd9d3815,https://c1.staticflickr.com/9/8304/28432708504_bff2971569_o.jpg,0.0,0.0,0.75,0.535877862595,541,579,https://www.flickr.com/photos/atoach/28432708504/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ e67ab4ba4bb4dea9,https://c1.staticflickr.com/9/8201/29529180516_295ea3d000_o.jpg,0.258620689655,0.25,0.775862068966,1.0,922,786,https://www.flickr.com/photos/yalelawlibrary/29529180516,https://creativecommons.org/licenses/by/2.0/,Yale Law Library,https://www.flickr.com/people/yalelawlibrary/ 471331bfea881dae,https://c1.staticflickr.com/8/7211/27310081935_d2c80e2bb8_o.jpg,0.306930693069,0.0,0.920792079208,1.0,821,944,https://www.flickr.com/photos/16179216@N07/27310081935/,https://creativecommons.org/licenses/by/2.0/,Barry Lewis,https://www.flickr.com/people/16179216@N07/ ea8362b1ea8764b8,https://c1.staticflickr.com/9/8726/29583628221_f4f930dfa1_o.jpg,0.0,0.25,0.471030042918,1.0,982,692,https://www.flickr.com/photos/apardavila/29583628221,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 3ecbd108c7a4a59a,https://c1.staticflickr.com/6/5601/30176824744_a6551f70d5_o.jpg,0.0,0.25,0.497426470588,1.0,405,801,https://flickr.com/34153108@N06/30176824744,https://creativecommons.org/licenses/by/2.0/,Gerard van der Schaaf,https://www.flickr.com/people/34153108@N06/ ed9d3ed4416fd039,https://c1.staticflickr.com/6/5540/31129728156_d2722fdc37_o.jpg,0.438430311231,0.0,1.0,1.0,33,755,https://www.flickr.com/photos/usfws_pacificsw/31129728156,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ 5121873f03384771,https://c1.staticflickr.com/6/5479/30694722112_314b552607_o.jpg,0.248713235294,0.0,0.746139705882,0.75,581,481,https://www.flickr.com/photos/agenciabrasilia/30694722112,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ e039b480f13cfa77,https://c1.staticflickr.com/9/8860/28783445131_6a14fdf3a4_o.jpg,0.0,0.0,1.0,0.75117370892,407,124,https://www.flickr.com/photos/eltb/28783445131,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ eba74af87036309b,https://c1.staticflickr.com/6/5685/30685445782_4a96f2c706_o.jpg,0.282131661442,0.25,0.846394984326,1.0,12,721,https://www.flickr.com/photos/taylar/30685445782,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ 84b42fffa7927f00,https://c1.staticflickr.com/9/8186/28946902624_f7639422d9_o.jpg,0.25,0.25,1.0,1.0,970,696,https://www.flickr.com/photos/jcbrandon/28946902624,https://creativecommons.org/licenses/by/2.0/,Farther Along,https://www.flickr.com/people/jcbrandon/ 8f7629134e069cc2,https://c1.staticflickr.com/8/7642/27156804385_81f0ef9394_o.jpg,0.195822454308,0.0,0.587467362924,0.75,780,672,https://www.flickr.com/photos/thoseguys119/27156804385,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f28f903cdb956e13,https://c1.staticflickr.com/1/286/31711157641_b206eaee23_o.jpg,0.28125,0.25,0.84375,1.0,33,779,https://flickr.com/146378829@N04/31711157641,https://creativecommons.org/licenses/by/2.0/,Alanah Nasadyk,https://www.flickr.com/people/146378829@N04/ beeecacedee95b9b,https://c1.staticflickr.com/9/8464/29230149522_e135af862c_o.jpg,0.0,0.0,0.665684830633,1.0,404,190,https://www.flickr.com/photos/usmcarchives/29230149522,https://creativecommons.org/licenses/by/2.0/,USMC Archives,https://www.flickr.com/people/usmcarchives/ c5e9f25a84c6a7ef,https://c1.staticflickr.com/6/5631/30573815501_c19947725f_o.jpg,0.0,0.25,0.5,1.0,561,803,https://flickr.com/53276480@N07/30573815501,https://creativecommons.org/licenses/by/2.0/,Maize & Blue Nation,https://www.flickr.com/people/maizenbluenation/ c31029c3ddc87098,https://c1.staticflickr.com/6/5682/30421980474_0c9e0e020f_o.jpg,0.0,0.0,0.75,0.5,312,994,https://flickr.com/52450054@N04/30421980474,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 485e14444aa4aed3,https://c1.staticflickr.com/1/334/30689857534_03594aec66_o.jpg,0.0,0.0,0.75,0.75,539,817,https://flickr.com/135797038@N08/30689857534,https://creativecommons.org/licenses/by/2.0/,So Many Desks,https://www.flickr.com/people/somanydesks/ 8bf9b171bbc22efc,https://c1.staticflickr.com/6/5575/30921758832_9ed9bd9e69_o.jpg,0.237949640288,0.25,0.713848920863,1.0,604,486,https://www.flickr.com/photos/thomasfisherlibrary/30921758832/,https://creativecommons.org/licenses/by/2.0/,"Thomas Fisher Rare Book Library, UofT",https://www.flickr.com/people/thomasfisherlibrary/ 557003bf047b560f,https://c1.staticflickr.com/9/8708/27664686744_fcd18d61c6_o.jpg,0.4375,0.25,1.0,1.0,976,817,https://www.flickr.com/photos/phelyan/27664686744/,https://creativecommons.org/licenses/by/2.0/,Phelyan Sanjoin,https://www.flickr.com/people/phelyan/ 9f7aef192b8fa8b3,https://c1.staticflickr.com/9/8133/30103273002_49907765c7_o.jpg,0.0,0.0,0.5,0.75,477,639,http://www.flickr.com/photos/8176740@N05/30103273002,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ 7acdc4decdc0fef2,https://c1.staticflickr.com/9/8841/27934444864_2922d006f6_o.jpg,0.0,0.0,0.75,1.0,975,754,https://www.flickr.com/photos/jsjgeology/27934444864,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ c64006ae09b27ec8,https://c1.staticflickr.com/8/7459/26889035454_c1096f1800_o.jpg,0.25,0.25,0.75,1.0,980,565,https://www.flickr.com/photos/valthorensguide/26889035454,https://creativecommons.org/licenses/by/2.0/,David Mitchell,https://www.flickr.com/people/valthorensguide/ 783b77fc4444708b,https://c1.staticflickr.com/8/7070/26750925261_3765a76918_o.jpg,0.5,0.0,1.0,0.75,830,586,https://www.flickr.com/photos/peter-trimming/26750925261/,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/ be9cf8a8b9de2376,https://c1.staticflickr.com/9/8446/27828530294_d0eb8245f6_o.jpg,0.281165311653,0.0,0.843495934959,1.0,808,102,https://www.flickr.com/photos/rvwithtito/27828530294/,https://creativecommons.org/licenses/by/2.0/,RVWithTito.com,https://www.flickr.com/people/rvwithtito/ bdb95712664d9e5f,https://c1.staticflickr.com/8/7307/27430765713_5f796b6e5b_o.jpg,0.25,0.0,0.75,0.75,405,732,https://www.flickr.com/photos/markyharky/27430765713/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 6985406661938601,https://c1.staticflickr.com/9/8552/29251374173_e66a29ba12_o.jpg,0.346121416526,0.25,1.0,1.0,309,146,https://www.flickr.com/photos/gails_pictures/29251374173,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 4f31358268225536,https://c1.staticflickr.com/9/8711/28380739570_9ca0911990_o.jpg,0.0,0.0,0.640173410405,1.0,734,614,https://www.flickr.com/photos/13476480@N07/28380739570,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c3925aca6643a543,https://c1.staticflickr.com/8/7719/27089871631_0af1c167c6_o.jpg,0.0,0.0,0.475899280576,0.75,780,72,https://www.flickr.com/photos/thoseguys119/27089871631,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 30d06d021ee9e8dd,https://c1.staticflickr.com/9/8776/28198767894_2cd0367367_o.jpg,0.438671875,0.25,1.0,1.0,997,810,https://www.flickr.com/photos/treegrow/28198767894,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ eeb541fd8ea08353,https://c1.staticflickr.com/6/5701/30886238101_9a34298857_o.jpg,0.0,0.25,0.5,1.0,973,537,https://flickr.com/135146612@N03/30886238101,https://creativecommons.org/licenses/by/2.0/,Weekend Wayfarers,https://www.flickr.com/people/135146612@N03/ 16c67aa07888528d,https://c1.staticflickr.com/8/7758/27835756243_50322ec4fc_o.jpg,0.0,0.0,0.5,0.75,484,357,https://www.flickr.com/photos/tipsfortravellers/27835756243,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 51d545471e30a2e7,https://c1.staticflickr.com/8/7276/27540823735_94957a61a8_o.jpg,0.25,0.28125,1.0,0.84375,702,510,https://www.flickr.com/photos/7armyjmtc/27540823735,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 8d026a82f7149f51,https://c1.staticflickr.com/9/8631/28316802542_21acdb9224_o.jpg,0.400242326333,0.25,1.0,1.0,739,687,https://www.flickr.com/photos/ericrosenbaum/28316802542,https://creativecommons.org/licenses/by/2.0/,Eric Rosenbaum,https://www.flickr.com/people/ericrosenbaum/ cd2027f2ef2bad13,https://c1.staticflickr.com/9/8357/28576417850_a7dd807b09_o.jpg,0.25,0.476244343891,1.0,1.0,709,344,https://www.flickr.com/photos/22711505@N05/28576417850,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 38b1bbd717f6e77b,https://c1.staticflickr.com/4/3948/32872085060_93d228fda0_o.jpg,0.0,0.25,0.506305637982,1.0,826,468,https://www.flickr.com/photos/jsjgeology/32872085060,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 070fdf97b04a48b3,https://c1.staticflickr.com/8/7555/27549752220_695c7548ec_o.jpg,0.0,0.0,0.514248704663,1.0,115,324,https://www.flickr.com/photos/scotnelson/27549752220,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 9552c19d7e2bca89,https://c1.staticflickr.com/6/5805/29673982384_a769d5b5e1_o.jpg,0.0,0.333333333333,1.0,1.0,948,490,https://flickr.com/119630347@N06/29673982384,https://creativecommons.org/licenses/by/2.0/,keith gallie,https://www.flickr.com/people/keefio/ 7627a84bd3a98a83,https://c1.staticflickr.com/6/5499/29694689793_da47cf877b_o.jpg,0.0,0.0,0.395454545455,1.0,780,467,https://www.flickr.com/photos/thoseguys119/29694689793,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 56f3542e14bacdff,https://c1.staticflickr.com/1/423/31205501720_74e365d8e1_o.jpg,0.263565891473,0.0,1.0,1.0,323,40,https://www.flickr.com/photos/gails_pictures/31205501720,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 3297efead7d32e38,https://c1.staticflickr.com/1/641/31682585402_88328f49d9_o.jpg,0.25,0.25,0.75,1.0,979,566,https://flickr.com/97044517@N04/31682585402,https://creativecommons.org/licenses/by/2.0/,Lars Ploug-S\303\270rensen,https://www.flickr.com/people/plougsorensen/ a81dc3dc71e6e04d,https://c1.staticflickr.com/6/5741/30623540545_7071123126_o.jpg,0.267938931298,0.0,0.803816793893,0.75,880,394,https://www.flickr.com/photos/40441865@N08/30623540545,https://creativecommons.org/licenses/by/2.0/,mitchell haindfield,https://www.flickr.com/people/40441865@N08/ 418ea9dad45595d9,https://c1.staticflickr.com/9/8004/29131347565_976f176046_o.jpg,0.254464285714,0.25,0.763392857143,1.0,429,29,https://www.flickr.com/photos/garlandcannon/29131347565,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/ bda1d2236583367a,https://c1.staticflickr.com/9/8436/28692914810_0e888b3e29_o.jpg,0.0,0.0,0.5625,0.75,792,669,https://www.flickr.com/photos/10515323@N08/28692914810,https://creativecommons.org/licenses/by/2.0/,Hazel Nicholson,https://www.flickr.com/people/10515323@N08/ c63a1e5c6861c194,https://c1.staticflickr.com/6/5443/30351926664_1e19358eab_o.jpg,0.28125,0.0,0.84375,0.75,626,848,https://www.flickr.com/photos/garryknight/30351926664,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ e38149be6618db5d,https://c1.staticflickr.com/9/8434/29163720990_6dd70519f9_o.jpg,0.4375,0.25,1.0,1.0,986,897,https://www.flickr.com/photos/torsten-behrens/29163720990,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ a30d09723ea2d470,https://c1.staticflickr.com/6/5329/30428022622_1f613b655a_o.jpg,0.25,0.0,1.0,0.75,971,815,https://www.flickr.com/photos/rvoegtli/30428022622/,https://creativecommons.org/licenses/by/2.0/,Rosmarie Voegtli,https://www.flickr.com/people/rvoegtli/ d067d31645d501ef,https://c1.staticflickr.com/9/8691/28443781445_fd90c7aa47_o.jpg,0.28125,0.25,0.84375,1.0,780,389,https://www.flickr.com/photos/119034083@N02/28443781445,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/ 1864b9416370c851,https://c1.staticflickr.com/8/7741/27321838121_b3435f9810_o.jpg,0.249079528719,0.25,0.747238586156,1.0,604,656,https://www.flickr.com/photos/londonmatt/27321838121,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ afa01ad786b66529,https://c1.staticflickr.com/9/8806/29503639764_4cdde02f9d_o.jpg,0.5,0.25,1.0,1.0,404,46,https://www.flickr.com/photos/usnavy/29503639764,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 3c7d9aa291688ebd,https://c1.staticflickr.com/9/8600/28620694595_7f5e0d8b6d_o.jpg,0.43661971831,0.0,1.0,0.75,127,984,https://www.flickr.com/photos/treegrow/28620694595/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 70ef4858481e66b9,https://c1.staticflickr.com/8/7176/26903297972_0711470d1c_o.jpg,0.46493902439,0.0,1.0,0.75,964,157,https://www.flickr.com/photos/ruthanddave/26903297972/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 8316ba0f531fad9f,https://c1.staticflickr.com/8/7444/27932136736_9374df3471_o.jpg,0.280784844384,0.0,0.842354533153,1.0,673,870,https://flickr.com/37922399@N05/27932136736,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 7f6d8a15cec61bc8,https://c1.staticflickr.com/9/8475/28264251200_55f2796260_o.jpg,0.480855855856,0.25,1.0,1.0,144,423,https://www.flickr.com/photos/25553993@N02/28264251200/,https://creativecommons.org/licenses/by/2.0/,Kev Chapman,https://www.flickr.com/people/25553993@N02/ 00c290a290534440,https://c1.staticflickr.com/6/5647/31130082665_914d94fcc9_o.jpg,0.5,0.25,1.0,1.0,973,267,https://www.flickr.com/photos/clairity/31130082665,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 21112149d8e4d116,https://c1.staticflickr.com/9/8244/29736684056_d41d206c49_o.jpg,0.0,0.0,1.0,0.75,600,673,https://www.flickr.com/photos/garlandcannon/29736684056,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/ cf750ad0576fc8a6,https://c1.staticflickr.com/9/8110/29872852795_0ff32dc56f_o.jpg,0.0,0.0,0.666666666667,1.0,606,557,https://www.flickr.com/photos/janitors/29872852795,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 4162bf598f15bf78,https://c1.staticflickr.com/9/8131/30165532185_ec71243097_o.jpg,0.0,0.0,0.666666666667,1.0,980,922,https://www.flickr.com/photos/alaska_region/30165532185,https://creativecommons.org/licenses/by/2.0/,USDA Forest Service Alaska Region,https://www.flickr.com/people/alaska_region/ 390a0d9986a6710e,https://c1.staticflickr.com/1/604/32463410642_d7b44ba09e_o.jpg,0.229667609618,0.25,0.689002828854,1.0,431,290,https://www.flickr.com/photos/viumariners/32463410642/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/ c720fc6cfb89e3e3,https://c1.staticflickr.com/9/8111/28932536731_4d0442f0f3_o.jpg,0.333333333333,0.0,1.0,1.0,417,851,https://www.flickr.com/photos/fotosagenciabrasil/28932536731,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/ b0f973d5662aac61,https://c1.staticflickr.com/8/7233/26261709574_e1c9139194_o.jpg,0.331617647059,0.0,0.994852941176,1.0,706,871,https://www.flickr.com/photos/shankaronline/26261709574,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 30a26012f3ba7aa6,https://c1.staticflickr.com/8/7064/26530906274_9538372f61_o.jpg,0.32700729927,0.0,0.98102189781,1.0,548,596,https://www.flickr.com/photos/robdammers/26530906274,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ d0f0a97371490ea8,https://c1.staticflickr.com/8/7080/27600104456_5b8bae56cd_o.jpg,0.0,0.0,1.0,0.657393850659,407,814,https://www.flickr.com/photos/eltb/27600104456,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ c9aa364f27386ef6,https://c1.staticflickr.com/8/7294/26985045545_9ce9bb6847_o.jpg,0.25,0.0,0.75,0.75,848,576,https://www.flickr.com/photos/7armyjmtc/26985045545,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 58c4788adb094b2f,https://c1.staticflickr.com/8/7332/27104706172_cfc064a95e_o.jpg,0.371487603306,0.0,1.0,0.75,780,218,https://www.flickr.com/photos/thoseguys119/27104706172,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 682b38680fc040ee,https://c1.staticflickr.com/9/8679/30296688752_085a8a90f2_o.jpg,0.198707592892,0.0,1.0,1.0,959,291,https://www.flickr.com/photos/torontohistory/30296688752,https://creativecommons.org/licenses/by/2.0/,Toronto History,https://www.flickr.com/people/torontohistory/ 88cc9c866912bb77,https://c1.staticflickr.com/6/5527/30647215664_729c2a8d2e_o.jpg,0.0,0.25,0.53506097561,1.0,971,542,https://www.flickr.com/photos/ruthanddave/30647215664,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 531e1dc1a349a4a5,https://c1.staticflickr.com/8/7434/28100093945_ae00c6842c_o.jpg,0.333333333333,0.0,1.0,1.0,875,668,https://www.flickr.com/photos/km30192002/28100093945,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/ 9ae77e61affa68c1,https://c1.staticflickr.com/6/5471/29801296414_4daf55b9f6_o.jpg,0.5,0.25,1.0,1.0,913,518,https://www.flickr.com/photos/usfwsmtnprairie/29801296414,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ da49c4bd1f22dda4,https://c1.staticflickr.com/9/8009/29056978703_77538201ec_o.jpg,0.250923190547,0.25,0.75276957164,1.0,289,246,https://www.flickr.com/photos/usfwshq/29056978703,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/ e195beba96d8a70f,https://c1.staticflickr.com/9/8600/27999426663_6eea641722_o.jpg,0.25,0.0,1.0,1.0,437,810,https://www.flickr.com/photos/65843623@N02/27999426663,https://creativecommons.org/licenses/by/2.0/,Alberto from Spain,https://www.flickr.com/people/65843623@N02/ 68a3a7fccc5243c0,https://c1.staticflickr.com/9/8518/28854990806_d6472f5218_o.jpg,0.0,0.0,0.5625,0.75,577,710,https://www.flickr.com/photos/64667184@N02/28854990806/,https://creativecommons.org/licenses/by/2.0/,James Abbott,https://www.flickr.com/people/jamesabbott1963/ dd1996d05bed1259,https://c1.staticflickr.com/6/5832/30802462922_54a9a49c79_o.jpg,0.0,0.0,1.0,1.0,699,58,https://www.flickr.com/photos/catsper/30802462922,https://creativecommons.org/licenses/by/2.0/,J c,https://www.flickr.com/people/catsper/ d419872a0ca20782,https://c1.staticflickr.com/6/5705/30088551103_06be1fe185_o.jpg,0.0,0.25,0.75,1.0,820,391,https://www.flickr.com/photos/zaffi/30088551103,https://creativecommons.org/licenses/by/2.0/,Raffi Asdourian,https://www.flickr.com/people/zaffi/ 76741c5d63a56011,https://c1.staticflickr.com/8/7094/26778467563_fba7edecef_o.jpg,0.0,0.0,1.0,1.0,976,599,https://www.flickr.com/photos/rvc/26778467563/,https://creativecommons.org/licenses/by/2.0/,Rafael Vianna Croffi,https://www.flickr.com/people/rvc/ 0d96a2b5331ae369,https://c1.staticflickr.com/1/562/32520553416_a1579ee449_o.jpg,0.0,0.0,0.666666666667,1.0,105,366,https://www.flickr.com/photos/rexness/32520553416,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/ 1a31aebfb1aed595,https://c1.staticflickr.com/1/260/31812953540_da4ef6816e_o.jpg,0.305359661495,0.0,0.916078984485,1.0,948,210,https://www.flickr.com/photos/gaby1/31812953540,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 89b8cfdccad2d38c,https://c1.staticflickr.com/6/5349/31222750705_1df267d84b_o.jpg,0.0,0.0,0.380308880309,0.75,979,575,https://www.flickr.com/photos/walterpro/31222750705,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ 86d7f79b27d8e9cd,https://c1.staticflickr.com/8/7331/27350928380_12e535a763_o.jpg,0.0,0.25,0.5,1.0,459,429,https://www.flickr.com/photos/quinet/27350928380,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 78a36d2087e10530,https://c1.staticflickr.com/9/8009/28657987212_8a9e095845_o.jpg,0.249631811487,0.0,0.748895434462,0.75,613,435,https://www.flickr.com/photos/13476480@N07/28657987212,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 2da87918bc750711,https://c1.staticflickr.com/8/7769/27662145891_ce44167707_o.jpg,0.4375,0.25,1.0,1.0,808,442,https://www.flickr.com/photos/dlnorman/27662145891,https://creativecommons.org/licenses/by/2.0/,D'Arcy Norman,https://www.flickr.com/people/dlnorman/ 33f949b9ac9bffd2,https://c1.staticflickr.com/8/7289/27122464873_5366122771_o.jpg,0.4108,0.25,1.0,1.0,536,850,https://www.flickr.com/photos/glorycycles/27122464873,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ db963aee5969f160,https://c1.staticflickr.com/9/8492/29121966346_71f35d911e_o.jpg,0.0,0.28125,0.75,0.84375,310,200,https://www.flickr.com/photos/usfwsmtnprairie/29121966346,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ e12a17932f739ea6,https://c1.staticflickr.com/8/7328/27351929353_492f3058d2_o.jpg,0.0,0.0,1.0,0.841059602649,304,943,https://www.flickr.com/photos/104342908@N08/27351929353,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/ 1b94bd2fd2689d3f,https://c1.staticflickr.com/6/5345/30508564714_934412b08b_o.jpg,0.0,0.25,0.735241502683,1.0,147,914,http://www.flickr.com/photos/blachswan/30508564714/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ e372fb60603d19eb,https://c1.staticflickr.com/8/7382/27070395126_7c56624074_o.jpg,0.276744186047,0.0,0.83023255814,0.75,780,654,https://www.flickr.com/photos/thoseguys119/27070395126,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 02ea3849038381ff,https://c1.staticflickr.com/8/7720/26931270544_e4339a9172_o.jpg,0.25,0.464122137405,1.0,1.0,702,490,https://www.flickr.com/photos/7armyjmtc/26931270544,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 34ab7b212045cec4,https://c1.staticflickr.com/6/5643/22783816858_2a0f4df9f5_o.jpg,0.578822733424,0.0,1.0,0.75,563,161,https://flickr.com/9505106@N02/22783816858,https://creativecommons.org/licenses/by/2.0/,Benito Condemi de Felice,https://www.flickr.com/people/bedesign/ f076c7ab432c528d,https://c1.staticflickr.com/8/7458/27523536234_be6d0287e8_o.jpg,0.0,0.0,0.666666666667,1.0,407,642,https://www.flickr.com/photos/eltb/27523536234,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 2f3ef912ac6b0250,https://c1.staticflickr.com/9/8423/28732924263_fbc59cba1a_o.jpg,0.25,0.25,0.75,1.0,986,70,https://www.flickr.com/photos/vahemart/28732924263/,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 8ae56aa3aaf970ca,https://c1.staticflickr.com/8/7325/27612369013_951e01b304_o.jpg,0.24882629108,0.0,1.0,1.0,666,166,https://flickr.com/26777097@N03/27612369013,https://creativecommons.org/licenses/by/2.0/,Jan Hammershaug,https://www.flickr.com/people/hammershaug/ 662f0bd43a7a394c,https://c1.staticflickr.com/8/7079/26520594243_e8fe458603_o.jpg,0.28125,0.25,0.84375,1.0,123,671,https://www.flickr.com/photos/lafoodie/26520594243,https://creativecommons.org/licenses/by/2.0/,L.A. Foodie,https://www.flickr.com/people/lafoodie/ 73c377387cee48ad,https://c1.staticflickr.com/9/8190/29728622111_70d1910dbf_o.jpg,0.25,0.0,0.75,0.75,989,568,https://www.flickr.com/photos/cohenvandervelde/29728622111/,https://creativecommons.org/licenses/by/2.0/,Cohen Van der Velde,https://www.flickr.com/people/cohenvandervelde/ c9ab570c037b890d,https://c1.staticflickr.com/8/7320/27211544444_4ff72148b5_o.jpg,0.376029654036,0.0,1.0,0.75,405,477,https://www.flickr.com/photos/bmbc/27211544444,https://creativecommons.org/licenses/by/2.0/,bridgewatermbc,https://www.flickr.com/people/bmbc/ 4b5cb77f306c6473,https://c1.staticflickr.com/9/8256/28780742656_24252f31c7_o.jpg,0.0,0.25,0.5,1.0,980,804,https://www.flickr.com/photos/mypubliclands/28780742656,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ ba5a8ce3cf16d3c7,https://c1.staticflickr.com/3/2146/32031010323_ab5ce2a718_o.jpg,0.25,0.0,0.75,0.75,116,954,https://www.flickr.com/photos/silkebaron/32031010323/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ e04bee37b5336cbf,https://c1.staticflickr.com/9/8621/28232175006_faab55a17b_o.jpg,0.25,0.0,1.0,0.56338028169,308,999,https://flickr.com/130093583@N04/28232175006,https://creativecommons.org/licenses/by/2.0/,Janet Graham,https://www.flickr.com/people/130093583@N04/ b45fa39e7236c16b,https://c1.staticflickr.com/8/7575/26545609693_2dcda71408_o.jpg,0.0,0.0,0.878172588832,1.0,309,260,http://www.flickr.com/photos/43272765@N04/26545609693,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ d08cf5e6c4605f74,https://c1.staticflickr.com/6/5537/29722203784_99cd9ce155_o.jpg,0.25,0.25,1.0,1.0,918,356,https://www.flickr.com/photos/artlung/29722203784,https://creativecommons.org/licenses/by/2.0/,Joe Crawford,https://www.flickr.com/people/artlung/ 713105e8bda5472c,https://c1.staticflickr.com/9/8239/29480202512_32dde52f01_o.jpg,0.25,0.0,1.0,0.75,310,850,https://www.flickr.com/photos/orangeaurochs/29480202512,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ 366caad06763b53d,https://c1.staticflickr.com/9/8006/29593961576_7417526a13_o.jpg,0.0,0.25,0.471030042918,1.0,840,497,https://flickr.com/38986305@N06/29593961576,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/ 20ad0885462dc12f,https://c1.staticflickr.com/8/7565/26485982724_5334f911c5_o.jpg,0.0,0.0,0.561569688769,1.0,320,889,https://www.flickr.com/photos/31031835@N08/26485982724,https://creativecommons.org/licenses/by/2.0/,John Tann,https://www.flickr.com/people/31031835@N08/ ffce60210764e242,https://c1.staticflickr.com/1/652/31810035072_497bb9b9e3_o.jpg,0.281690140845,0.0,0.845070422535,0.75,986,536,https://flickr.com/114409174@N07/31810035072,https://creativecommons.org/licenses/by/2.0/,nestor ferraro,https://www.flickr.com/people/nestorferraro/ 79d103440ab60cdb,https://c1.staticflickr.com/9/8600/29705946093_c4ee764743_o.jpg,0.210272873194,0.0,1.0,1.0,484,574,https://www.flickr.com/photos/darrenshilson/29705946093,https://creativecommons.org/licenses/by/2.0/,Darren Shilson,https://www.flickr.com/people/darrenshilson/ ea6a509c71e8d794,https://c1.staticflickr.com/8/7258/27459186044_e5b55dac38_o.jpg,0.4375,0.25,1.0,1.0,914,217,https://www.flickr.com/photos/hockeyholic/27459186044,https://creativecommons.org/licenses/by/2.0/,Andy Blackledge,https://www.flickr.com/people/hockeyholic/ c8b54d9146aaa440,https://c1.staticflickr.com/6/5520/30499015996_25265d7274_o.jpg,0.0,0.2806640625,0.75,0.8419921875,709,10,https://www.flickr.com/photos/southbeachcars/30499015996,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 5b9cfa2f055cd9a1,https://c1.staticflickr.com/8/7618/26221283983_cfbcc376ff_o.jpg,0.335787923417,0.0,1.0,1.0,971,563,https://www.flickr.com/photos/bravenboer/26221283983/,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/ 893e2abe2cfbeb64,https://c1.staticflickr.com/8/7767/27073060115_c20b7a64c8_o.jpg,0.0,0.0,0.5625,0.75,706,874,https://www.flickr.com/photos/jsjgeology/27073060115,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 178a2bef27ef6162,https://c1.staticflickr.com/8/7365/26855254721_63e142b6a0_o.jpg,0.421177266576,0.25,0.842354533153,1.0,986,34,https://www.flickr.com/photos/peter-kudlacz/26855254721,https://creativecommons.org/licenses/by/2.0/,Peter Kudlacz,https://www.flickr.com/people/peter-kudlacz/ 6a95efa7bc5f4e48,https://c1.staticflickr.com/8/7458/26615327133_03693d788d_o.jpg,0.0,0.0,0.666666666667,1.0,980,3,https://www.flickr.com/photos/oregondot/26615327133,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/ defcc0e67346fb39,https://c1.staticflickr.com/9/8186/28995290133_6a314df601_o.jpg,0.314020028612,0.0,0.942060085837,1.0,982,247,https://www.flickr.com/photos/lge/28995290133,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ b6a5dbc20dc808d3,https://c1.staticflickr.com/8/7037/27036592194_8dd824439e_o.jpg,0.0,0.4375,0.75,1.0,323,773,https://www.flickr.com/photos/chaz_pics/27036592194,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ a3f437b6dc2d6c4d,https://c1.staticflickr.com/1/722/32131983090_4f49d17c5a_o.jpg,0.43661971831,0.25,1.0,1.0,51,448,https://www.flickr.com/photos/rusty_clark/32131983090,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 477c70799ba00b5a,https://c1.staticflickr.com/9/8242/29615739252_55d215833a_o.jpg,0.252777777778,0.0,0.758333333333,0.75,706,489,https://www.flickr.com/photos/rich701/29615739252,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/ fcaaf6c070d0d7a3,https://c1.staticflickr.com/6/5205/29854451120_9bfb6844cd_o.jpg,0.333333333333,0.0,1.0,1.0,561,222,https://flickr.com/100379608@N08/29854451120,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/ 70f2b41c6c0e9951,https://c1.staticflickr.com/8/7162/26789143930_f6ec4d04d1_o.jpg,0.249631811487,0.25,0.748895434462,1.0,662,820,https://www.flickr.com/photos/greggjerdingen/26789143930,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 43c85cc95db8ca82,https://c1.staticflickr.com/9/8740/28048237754_2c9e89c81c_o.jpg,0.0,0.25,0.5,1.0,982,14,http://www.flickr.com/photos/50264926@N02/28048237754,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ def8b638330a429a,https://c1.staticflickr.com/6/5516/30827957656_010c0c9be6_o.jpg,0.248348017621,0.25,0.745044052863,1.0,981,701,https://flickr.com/124906627@N06/30827957656,https://creativecommons.org/licenses/by/2.0/,Fabien LE JEUNE,https://www.flickr.com/people/124906627@N06/ 7d7102a099be414d,https://c1.staticflickr.com/6/5509/31372095431_0a4aa92619_o.jpg,0.28125,0.25,0.84375,1.0,971,517,https://www.flickr.com/photos/ruthanddave/31372095431/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ ad4f260c05f3cbc2,https://c1.staticflickr.com/8/7432/27131972211_3c0479aebc_o.jpg,0.25,0.0,1.0,1.0,780,389,https://www.flickr.com/photos/thoseguys119/27131972211/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ b72598892abcab9c,https://c1.staticflickr.com/9/8743/28765960962_1cf92c774a_o.jpg,0.0,0.25,0.75,0.75,896,582,https://flickr.com/94896083@N03/28765960962,https://creativecommons.org/licenses/by/2.0/,Martin Gent,https://www.flickr.com/people/94896083@N03/ 9847d292c776e26e,https://c1.staticflickr.com/9/8263/29144649432_6b4f561188_o.jpg,0.0,0.0,0.75,1.0,921,670,https://www.flickr.com/photos/90384027@N00/29144649432/,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/ 82adc9bc71be5d99,https://c1.staticflickr.com/8/7357/27990168345_1ac23d7c7d_o.jpg,0.25,0.385187580854,1.0,0.770375161708,898,155,https://www.flickr.com/photos/lge/27990168345,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 31792980a21aea1b,https://c1.staticflickr.com/6/5339/31206308941_89ba46afe7_o.jpg,0.250521920668,0.0,0.501043841336,0.75,976,18,https://www.flickr.com/photos/vastateparksstaff/31206308941,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 002e4f93a2db2848,https://c1.staticflickr.com/9/8547/30332686526_5d5e4fc267_o.jpg,0.0,0.0,0.619458128079,0.75,755,205,https://www.flickr.com/photos/51764518@N02/30332686526,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ b6871d5446d66411,https://c1.staticflickr.com/9/8221/29186491756_d90388986d_o.jpg,0.500736377025,0.25,1.0,1.0,924,701,https://www.flickr.com/photos/us_embassy_newzealand/29186491756/,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/ 31d7acb588ab6203,https://c1.staticflickr.com/9/8722/28209149041_d150f8fbd5_o.jpg,0.25,0.25,0.75,1.0,859,345,https://www.flickr.com/photos/134969748@N06/28209149041/,https://creativecommons.org/licenses/by/2.0/,Michel Meynsbrughen,https://www.flickr.com/people/134969748@N06/ c3df182351f38e2d,https://c1.staticflickr.com/9/8583/28355161722_8c18072f8e_o.jpg,0.333333333333,0.0,1.0,1.0,673,793,https://www.flickr.com/photos/paxson_woelber/28355161722,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/ f0bba6ce1cfb18e3,https://c1.staticflickr.com/1/435/32161160540_7fa275a933_o.jpg,0.25,0.0,0.75,0.75,774,522,http://www.flickr.com/photos/pgenterprises/32161160540/,https://creativecommons.org/licenses/by/2.0/,Pete G,https://www.flickr.com/people/pgenterprises/ b1f1a1003a90acd7,https://c1.staticflickr.com/6/5755/29798388221_790a1a513b_o.jpg,0.24882629108,0.0,1.0,1.0,320,693,https://www.flickr.com/photos/amantedar/29798388221/,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/ 84690a716f9a6c11,https://c1.staticflickr.com/8/7351/26748489474_0ac12b42c4_o.jpg,0.502573529412,0.25,1.0,1.0,518,903,https://www.flickr.com/photos/agenciabrasilia/26748489474,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ cb539a2083b0a8ea,https://c1.staticflickr.com/9/8140/29914852416_8f3c5499d1_o.jpg,0.277173913043,0.0,0.83152173913,0.75,672,601,https://www.flickr.com/photos/glorycycles/29914852416,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 3ce25cb1b2d242f5,https://c1.staticflickr.com/9/8728/28482702402_6a9654bf3b_o.jpg,0.28125,0.25,0.84375,1.0,693,706,https://www.flickr.com/photos/stevendepolo/28482702402,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ baa9f8295070dd66,https://c1.staticflickr.com/6/5647/31302346581_73ebd78d22_o.jpg,0.0,0.0,0.452314165498,0.75,976,668,https://www.flickr.com/photos/8269539@N04/31302346581/,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 658149bf0e6e9f85,https://c1.staticflickr.com/8/7735/27779452085_a89179147f_o.jpg,0.0,0.0,0.699395770393,1.0,560,104,https://www.flickr.com/photos/photographingtravis/27779452085,https://creativecommons.org/licenses/by/2.0/,Travis Wise,https://www.flickr.com/people/photographingtravis/ 59f73601f7ac9705,https://c1.staticflickr.com/6/5738/30947817110_7c36bfe67e_o.jpg,0.28125,0.25,0.84375,1.0,978,721,https://www.flickr.com/photos/rusty_clark/30947817110/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ bca436f44f6b862f,https://c1.staticflickr.com/6/5458/30558271052_3945615113_o.jpg,0.28125,0.25,0.84375,1.0,459,151,https://flickr.com/29484524@N00/30558271052,https://creativecommons.org/licenses/by/2.0/,The Greater Southwestern Exploration Company,https://www.flickr.com/people/gsec/ 4839164a8a3b1bac,https://c1.staticflickr.com/9/8338/29166083912_3ff57ef94f_o.jpg,0.0,0.30849220104,0.75,1.0,821,944,https://www.flickr.com/photos/60900612@N08/29166083912/,https://creativecommons.org/licenses/by/2.0/,Thomas's Pics,https://www.flickr.com/people/60900612@N08/ bf4ecf00aa6a7fba,https://c1.staticflickr.com/8/7573/26980834191_3d489bf0ac_o.jpg,0.25,0.0,0.75,0.75,854,84,https://www.flickr.com/photos/insmu74/26980834191,https://creativecommons.org/licenses/by/2.0/,Stefan Munder,https://www.flickr.com/people/insmu74/ 7a52ac62104601c2,https://c1.staticflickr.com/8/7414/27153294905_ee998bc4f8_o.jpg,0.333049403748,0.0,1.0,0.75,417,497,https://www.flickr.com/photos/virginia_gymnastics/27153294905,https://creativecommons.org/licenses/by/2.0/,C B,https://www.flickr.com/people/virginia_gymnastics/ 9b370bdb123ec5d6,https://c1.staticflickr.com/1/309/32095235596_1e1d91ca32_o.jpg,0.0,0.25,0.5,1.0,920,360,https://flickr.com/77742560@N06/32095235596,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 778a1138481787d5,https://c1.staticflickr.com/1/738/31830964004_d439c25c32_o.jpg,0.25,0.25,1.0,1.0,479,688,http://www.flickr.com/photos/artotemsco/31830964004/,https://creativecommons.org/licenses/by/2.0/,Artotem,https://www.flickr.com/people/artotemsco/ b4bf9dcbd95e05d1,https://c1.staticflickr.com/9/8575/30238799946_68ea3b58d8_o.jpg,0.270897239264,0.25,0.812691717791,1.0,982,826,https://www.flickr.com/photos/apardavila/30238799946,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 1b04e7d71ebb40da,https://c1.staticflickr.com/9/8421/29018069334_8f322192bd_o.jpg,0.0,0.0,0.5625,0.75,718,345,https://www.flickr.com/photos/hugo90/29018069334,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 25d148185e670285,https://c1.staticflickr.com/1/260/32078591901_a91cbb6684_o.jpg,0.25,0.0,0.75,0.75,653,511,https://www.flickr.com/photos/armysmdc/32078591901/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Space and Missile Defense Command (SMDC),https://www.flickr.com/people/armysmdc/ 2454b6ee5107d99b,https://c1.staticflickr.com/8/7261/26752594452_117a38cf35_o.jpg,0.0,0.0,0.521837349398,0.75,100,584,https://www.flickr.com/photos/kitkaphotogirl/26752594452,https://creativecommons.org/licenses/by/2.0/,Christine Majul,https://www.flickr.com/people/kitkaphotogirl/ 40245e8bf0b9dd6c,https://c1.staticflickr.com/4/3903/33101838470_67c588ae7d_o.jpg,0.25,0.25,0.75,1.0,771,468,https://www.flickr.com/photos/monkey-kc/33101838470,https://creativecommons.org/licenses/by/2.0/,Kalvin Chan,https://www.flickr.com/people/monkey-kc/ 629194828049a497,https://c1.staticflickr.com/1/722/32243820372_593d602088_o.jpg,0.25,0.5,1.0,1.0,582,544,https://www.flickr.com/photos/quinet/32243820372,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 9e55e674cd4aca84,https://c1.staticflickr.com/9/8051/28566809215_3545920a70_o.jpg,0.28125,0.25,0.84375,1.0,976,648,https://www.flickr.com/photos/usdagov/28566809215/,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 59d085fdb8a522d8,https://c1.staticflickr.com/6/5667/31026655610_639367ab7f_o.jpg,0.25,0.0,1.0,0.75,960,28,https://www.flickr.com/photos/ambigel/31026655610/,https://creativecommons.org/licenses/by/2.0/,Alexander Andrade,https://www.flickr.com/people/ambigel/ 3694c28c34717560,https://c1.staticflickr.com/9/8409/28892387935_ef1e796436_o.jpg,0.333333333333,0.0,1.0,1.0,980,931,https://www.flickr.com/photos/aotaro/28892387935,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/ 8eca639840976a76,https://c1.staticflickr.com/9/8786/29644163912_240e1bb875_o.jpg,0.28125,0.25,0.84375,1.0,386,413,https://www.flickr.com/photos/wwarby/29644163912,https://creativecommons.org/licenses/by/2.0/,William Warby,https://www.flickr.com/people/wwarby/ 223759cd7c163535,https://c1.staticflickr.com/6/5557/31220389531_9ce994d4d5_o.jpg,0.0,0.25,0.5625,1.0,931,665,https://flickr.com/49588910@N00/31220389531,https://creativecommons.org/licenses/by/2.0/,# annola,https://www.flickr.com/people/annola/ 2c60b2871e740696,https://c1.staticflickr.com/9/8545/29322182345_b089d38820_o.jpg,0.5,0.25,1.0,1.0,376,84,https://www.flickr.com/photos/97169514@N06/29322182345/,https://creativecommons.org/licenses/by/2.0/,Mike Macke,https://www.flickr.com/people/97169514@N06/ 31c64a90529935a2,https://c1.staticflickr.com/1/609/31980794632_9a7afe9216_o.jpg,0.25,0.0,1.0,0.44375,956,36,https://www.flickr.com/photos/hisgett/31980794632,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 0357da27656a85f8,https://c1.staticflickr.com/6/5322/30333305332_c88d0b6961_o.jpg,0.0,0.25,0.5,1.0,859,766,https://www.flickr.com/photos/agenciabrasilia/30333305332,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 99c649f1364eb2ea,https://c1.staticflickr.com/9/8825/29456327171_bb14641923_o.jpg,0.0458553791887,0.0,1.0,1.0,696,559,https://www.flickr.com/photos/zeevveez/29456327171,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ b59cd6b083780579,https://c1.staticflickr.com/9/8285/28762224560_d9d9c029bf_o.jpg,0.333333333333,0.0,1.0,1.0,866,884,https://www.flickr.com/photos/30478819@N08/28762224560,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 015f9237f0fb238f,https://c1.staticflickr.com/8/7309/28001984465_92989d911f_o.jpg,0.0,0.0,0.5,0.75,704,589,https://www.flickr.com/photos/pawel_pacholec/28001984465/,https://creativecommons.org/licenses/by/2.0/,Pawel Pacholec,https://www.flickr.com/people/pawel_pacholec/ 975a56312782d90a,https://c1.staticflickr.com/4/3769/33273964465_f3695f039f_o.jpg,0.25,0.25,1.0,1.0,449,131,https://flickr.com/70360263@N03/33273964465,https://creativecommons.org/licenses/by/2.0/,Kim Singdahlsen,https://www.flickr.com/people/70360263@N03/ 0608704c3098e9c4,https://c1.staticflickr.com/8/7624/27509752052_01be111f4a_o.jpg,0.228169014085,0.25,0.684507042254,1.0,704,668,https://www.flickr.com/photos/thorsten-hofmeister/27509752052,https://creativecommons.org/licenses/by/2.0/,Thorsten Hofmeister,https://www.flickr.com/people/thorsten-hofmeister/ 1b5013bae08d7e52,https://c1.staticflickr.com/1/629/31731855000_ae6796b942_o.jpg,0.33686440678,0.0,0.673728813559,0.75,405,394,https://flickr.com/37804979@N00/31731855000,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ f374c0c3f8bbc431,https://c1.staticflickr.com/8/7667/27782025613_2249c77e14_o.jpg,0.421177266576,0.25,0.842354533153,1.0,971,362,https://www.flickr.com/photos/kosalabandara/27782025613,https://creativecommons.org/licenses/by/2.0/,Kosala Bandara,https://www.flickr.com/people/kosalabandara/ 1f18c39535f9a771,https://c1.staticflickr.com/8/7086/26812413863_8f7c66083e_o.jpg,0.29770531401,0.0,0.893115942029,0.75,320,393,https://www.flickr.com/photos/gails_pictures/26812413863,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 5b1dd36ac2739d68,https://c1.staticflickr.com/9/8054/29675037322_2eb0782106_o.jpg,0.175409836066,0.0,1.0,1.0,310,590,https://www.flickr.com/photos/gails_pictures/29675037322,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ f60f43d2320b8375,https://c1.staticflickr.com/9/8445/29540449602_9aa9f82b84_o.jpg,0.25,0.0,1.0,0.608536585366,734,655,https://www.flickr.com/photos/filipbossuyt/29540449602,https://creativecommons.org/licenses/by/2.0/,filip bossuyt,https://www.flickr.com/people/filipbossuyt/ b48c77df77ea4392,https://c1.staticflickr.com/6/5675/31039201011_b33dfba066_o.jpg,0.28125,0.25,0.84375,1.0,12,123,https://www.flickr.com/photos/9750464@N02/31039201011/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ 60703de4aa8de09f,https://c1.staticflickr.com/6/5782/30155274082_6b964fb38f_o.jpg,0.25,0.0,1.0,0.5,561,72,https://www.flickr.com/photos/116153846@N06/30155274082/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ 4d220903b814d05a,https://c1.staticflickr.com/6/5458/30801136686_2d0fd56d2f_o.jpg,0.0,0.332106038292,1.0,0.996318114875,864,287,https://www.flickr.com/photos/senkreu/30801136686/in/album-72157676163816066/,https://creativecommons.org/licenses/by/2.0/,Castellers d'Esplugues,https://www.flickr.com/people/senkreu/ 0d22bfd77b1b4f42,https://c1.staticflickr.com/9/8488/29713629496_dabe572df0_o.jpg,0.0,0.25,0.5,1.0,561,776,https://www.flickr.com/photos/116153846@N06/29713629496/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ f451e307d16c4ced,https://c1.staticflickr.com/1/750/31760378145_ffe3b91468_o.jpg,0.263237518911,0.25,0.789712556732,1.0,855,909,http://www.flickr.com/photos/soul_stealer/31760378145/,https://creativecommons.org/licenses/by/2.0/,Martin SoulStealer,https://www.flickr.com/people/soul_stealer/ 679ea1ad7c815a3b,https://c1.staticflickr.com/9/8730/29371609435_136112c23c_o.jpg,0.25,0.0,1.0,0.579761904762,437,297,https://www.flickr.com/photos/autohistorian/29371609435,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 06227762bad2b330,https://c1.staticflickr.com/6/5691/30589543195_a70c225cda_o.jpg,0.3,0.25,0.9,1.0,515,66,https://www.flickr.com/photos/85546319@N04/30589543195,https://creativecommons.org/licenses/by/2.0/,Robert Sheie,https://www.flickr.com/people/85546319@N04/ 8fb0238f76cdb721,https://c1.staticflickr.com/9/8474/29393231170_6233dbf5c4_o.jpg,0.248713235294,0.25,0.746139705882,1.0,340,183,https://www.flickr.com/photos/blmnevada/29393231170/,https://creativecommons.org/licenses/by/2.0/,BLM Nevada,https://www.flickr.com/people/blmnevada/ e8b191e94906ede6,https://c1.staticflickr.com/6/5524/30495584252_77be73657a_o.jpg,0.0,0.0,0.5,0.75,971,298,https://www.flickr.com/photos/slaporte/30495584252/,https://creativecommons.org/licenses/by/2.0/,Stephen,https://www.flickr.com/people/slaporte/ 450a592d56df96fc,https://c1.staticflickr.com/8/7299/27274568355_fd96ee14f6_o.jpg,0.28125,0.25,0.84375,1.0,875,79,https://www.flickr.com/photos/sea_beach_express/27274568355,https://creativecommons.org/licenses/by/2.0/,Kristain Baty,https://www.flickr.com/people/sea_beach_express/ 08c533e22dd00f1c,https://c1.staticflickr.com/9/8388/28411519474_2aa773bde8_o.jpg,0.4375,0.25,1.0,1.0,310,619,https://www.flickr.com/photos/hayzphotos/28411519474/,https://creativecommons.org/licenses/by/2.0/,Paul Hayday,https://www.flickr.com/people/hayzphotos/ 3f76f6e3eea94a65,https://c1.staticflickr.com/1/410/32188956012_a69ef28a34_o.jpg,0.0,0.25,0.669368600683,1.0,747,270,https://flickr.com/56292751@N03/32188956012,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/ 356344792d7618a5,https://c1.staticflickr.com/8/7068/27031317355_00c7a67b0f_o.jpg,0.0,0.43661971831,0.75,1.0,443,571,https://www.flickr.com/photos/eltb/27031317355,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 8607209efa55c15b,https://c1.staticflickr.com/9/8101/28586783001_3da553f99e_o.jpg,0.0,0.25,0.5625,1.0,810,52,https://www.flickr.com/photos/68147320@N02/28586783001,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ 0166096402d36771,https://c1.staticflickr.com/6/5631/30516679126_cf3946c7ce_o.jpg,0.333333333333,0.0,1.0,1.0,885,930,https://flickr.com/32916425@N04/30516679126,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ ae15c565e54d8928,https://c1.staticflickr.com/8/7402/27388545703_2746ba9417_o.jpg,0.578822733424,0.0,1.0,0.75,981,569,https://www.flickr.com/photos/usdagov/27388545703,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 9e4c17addf566964,https://c1.staticflickr.com/9/8399/29038404101_7d45ab0b41_o.jpg,0.0,0.25,0.503698224852,1.0,688,767,https://www.flickr.com/photos/eltb/29038404101,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 9c194c7fc0ef02f2,https://c1.staticflickr.com/6/5513/30112856425_4e6ac8616d_o.jpg,0.504405286344,0.25,1.0,1.0,561,540,https://www.flickr.com/photos/codnewsroom/30112856425,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 9971855bd0b70297,https://c1.staticflickr.com/8/7711/27123847181_21ef361b14_o.jpg,0.28125,0.0,0.84375,0.75,428,607,https://www.flickr.com/photos/londonmatt/27123847181,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 6ef50fd6d78ac91a,https://c1.staticflickr.com/9/8326/28544673953_665803f158_o.jpg,0.0,0.0,0.51724137931,0.75,830,902,https://www.flickr.com/photos/robdammers/28544673953,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ d1811c249db313e6,https://c1.staticflickr.com/9/8207/29606580866_b380112c09_o.jpg,0.0,0.0,1.0,0.908777969019,889,290,https://www.flickr.com/photos/atoach/29606580866,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 646d3915eba3dd7c,https://c1.staticflickr.com/8/7408/26898818163_746a632cfa_o.jpg,0.278621495327,0.0,0.835864485981,0.75,669,930,https://www.flickr.com/photos/publicresourceorg/26898818163/,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/ 1fed1fe97fefe793,https://c1.staticflickr.com/9/8665/28236456323_7124344a63_o.jpg,0.0,0.0,0.75,0.75,918,805,https://www.flickr.com/photos/23024164@N06/28236456323,https://creativecommons.org/licenses/by/2.0/,Damian Gadal,https://www.flickr.com/people/23024164@N06/ 231d616fa10cc908,https://c1.staticflickr.com/9/8127/29948121035_6e6c64491c_o.jpg,0.333333333333,0.0,1.0,1.0,340,181,https://www.flickr.com/photos/blmoregon/29948121035,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 2634a742a7e89a48,https://c1.staticflickr.com/1/602/32770576855_08faa9af95_o.jpg,0.299878836834,0.0,0.899636510501,0.75,293,666,https://www.flickr.com/photos/happymillerman/32770576855,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ a1b15a7b9573fc9d,https://c1.staticflickr.com/9/8401/30036859065_9510da323f_o.jpg,0.0,0.25,0.75,1.0,561,859,https://www.flickr.com/photos/smaedli/30036859065,https://creativecommons.org/licenses/by/2.0/,Chad Kainz,https://www.flickr.com/people/smaedli/ 30c9109a90483273,https://c1.staticflickr.com/6/5086/30139519396_9690187f2f_o.jpg,0.333333333333,0.0,1.0,1.0,859,263,https://www.flickr.com/photos/prof_richard/30139519396,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/ aed8d839589a6059,https://c1.staticflickr.com/2/1495/26503575620_c93d2fed41_o.jpg,0.28125,0.0,0.84375,0.75,830,843,https://www.flickr.com/photos/raver_mikey/26503575620/,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/ d0ba16c850fec4b5,https://c1.staticflickr.com/8/7454/26920109042_58d819b711_o.jpg,0.0,0.0,0.75,0.56338028169,733,249,https://www.flickr.com/photos/dok1/26920109042,https://creativecommons.org/licenses/by/2.0/,Don O'Brien,https://www.flickr.com/people/dok1/ b3b73c39a00a2299,https://c1.staticflickr.com/6/5519/30270414202_0ba7b1d8e7_o.jpg,0.438671875,0.0,1.0,0.75,873,112,https://www.flickr.com/photos/powellburns/30270414202,https://creativecommons.org/licenses/by/2.0/,Powell Burns,https://www.flickr.com/people/powellburns/ 6668807f6060a45f,https://c1.staticflickr.com/8/7160/26802349742_0e4da3e604_o.jpg,0.5,0.0,1.0,0.75,821,626,https://www.flickr.com/photos/kecko/26802349742,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ f3332771b727a5ee,https://c1.staticflickr.com/9/8665/28842206286_db59e6f23d_o.jpg,0.25,0.0,0.75,0.75,760,669,https://www.flickr.com/photos/nicokaiser/28842206286,https://creativecommons.org/licenses/by/2.0/,Nico Kaiser,https://www.flickr.com/people/nicokaiser/ 2184d30260150e71,https://c1.staticflickr.com/8/7264/27218548615_95a0430eed_o.jpg,0.0,0.0,0.75,0.75,114,60,https://www.flickr.com/photos/artlung/27218548615,https://creativecommons.org/licenses/by/2.0/,Joe Crawford,https://www.flickr.com/people/artlung/ 91e0a7a55c1d75f3,https://c1.staticflickr.com/9/8289/28859190345_36c83f30ff_o.jpg,0.0,0.0,1.0,0.75117370892,407,640,https://www.flickr.com/photos/eltb/28859190345,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 59121a5a8acd5f0b,https://c1.staticflickr.com/9/8452/28454774783_59cf8db4cf_o.jpg,0.25,0.0,0.75,0.75,971,855,https://www.flickr.com/photos/blackwing_de/28454774783,https://creativecommons.org/licenses/by/2.0/,Sebastian Werner,https://www.flickr.com/people/blackwing_de/ 86426a047c914b15,https://c1.staticflickr.com/9/8893/28160821316_f5d63eb270_o.jpg,0.2515625,0.0,1.0,1.0,309,711,https://www.flickr.com/photos/gails_pictures/28160821316/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 54eb8d77f36d65dc,https://c1.staticflickr.com/8/7292/27476175660_94f5e0ebb7_o.jpg,0.502573529412,0.0,1.0,0.75,449,467,https://www.flickr.com/photos/byzantiumbooks/27476175660/,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ 443d5de0d68061d7,https://c1.staticflickr.com/6/5546/29731072524_c488ae9045_o.jpg,0.0,0.28125,0.75,0.84375,763,678,https://flickr.com/8388191@N07/29731072524,https://creativecommons.org/licenses/by/2.0/,Terry Platt,https://www.flickr.com/people/mobilealabama/ b7eca631d6e00632,https://c1.staticflickr.com/8/7219/27127453951_d917daa1f9_o.jpg,0.25,0.0,0.75,0.75,788,900,https://www.flickr.com/photos/joneslibraryma/27127453951/,https://creativecommons.org/licenses/by/2.0/,Jones Library,https://www.flickr.com/people/joneslibraryma/ 31d4266388257ff9,https://c1.staticflickr.com/6/5647/29695160954_c8e36b048a_o.jpg,0.681470588235,0.0,1.0,0.75,780,909,https://www.flickr.com/photos/thoseguys119/29695160954,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 934b8b9ad14bfdab,https://c1.staticflickr.com/9/8813/28290786071_8c32334b50_o.jpg,0.210588633288,0.25,0.631765899865,1.0,980,639,https://flickr.com/59274709@N03/28290786071,https://creativecommons.org/licenses/by/2.0/,Przemek P,https://www.flickr.com/people/globalquiz/ ff06a10fb89f68bf,https://c1.staticflickr.com/9/8609/27681911664_96bf1842ca_o.jpg,0.2806640625,0.0,0.8419921875,0.75,920,688,https://www.flickr.com/photos/cogdog/27681911664/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 367be14d42db2cb6,https://c1.staticflickr.com/1/624/32367927704_876e4e3239_o.jpg,0.0,0.25,0.496696035242,1.0,704,857,https://www.flickr.com/photos/vastateparksstaff/32367927704/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 9780a9ec0de2ea32,https://c1.staticflickr.com/8/7335/27803775181_c66a27a3d8_o.jpg,0.0,0.0,0.665684830633,1.0,9,693,https://www.flickr.com/photos/sarahvain/27803775181,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/ 5a0bc772d79bf4f7,https://c1.staticflickr.com/1/622/32042124816_6e182d9203_o.jpg,0.0,0.464122137405,0.75,1.0,438,378,https://www.flickr.com/photos/blmoregon/32042124816,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 4b9046fff85b4f64,https://c1.staticflickr.com/8/7065/27132333685_f24e0312ca_o.jpg,0.0,0.0,0.666666666667,1.0,867,943,https://www.flickr.com/photos/andreas_neumeier/27132333685,https://creativecommons.org/licenses/by/2.0/,Andreas Neumeier,https://www.flickr.com/people/andreas_neumeier/ 8f76cff7e5a6b6d5,https://c1.staticflickr.com/1/721/32445155051_491334423a_o.jpg,0.424446202532,0.25,1.0,1.0,320,900,http://www.flickr.com/photos/47602497@N06/32445155051,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/ b706f029d5f7bbc9,https://c1.staticflickr.com/6/5486/30871161412_eeb4b57b00_o.jpg,0.217252396166,0.0,1.0,1.0,512,685,https://www.flickr.com/photos/autohistorian/30871161412,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ ed469c7126fb88bb,https://c1.staticflickr.com/6/5734/31214670086_b650c0ed73_o.jpg,0.2806640625,0.25,0.8419921875,1.0,963,685,https://www.flickr.com/photos/powellburns/31214670086,https://creativecommons.org/licenses/by/2.0/,Powell Burns,https://www.flickr.com/people/powellburns/ 752226a59337fd4f,https://c1.staticflickr.com/8/7384/27729145561_10ff4bd4d4_o.jpg,0.280784844384,0.0,0.842354533153,1.0,699,915,https://www.flickr.com/photos/provence___provenza/27729145561,https://creativecommons.org/licenses/by/2.0/,Daniel70mi Falciola,https://www.flickr.com/people/provence___provenza/ f748e6d1a654d88e,https://c1.staticflickr.com/1/410/31903287406_1e00e4de72_o.jpg,0.0,0.25,0.5625,1.0,108,927,https://www.flickr.com/photos/jimg944/31903287406/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ df9afc207b6417ce,https://c1.staticflickr.com/9/8346/29210725372_503534f942_o.jpg,0.0,0.0,0.75,0.540644171779,490,482,https://www.flickr.com/photos/tynigh/29210725372/,https://creativecommons.org/licenses/by/2.0/,Ty Nigh,https://www.flickr.com/people/tynigh/ bfc923081f179706,https://c1.staticflickr.com/9/8163/29650838375_4b096ac35a_o.jpg,0.4375,0.0,1.0,0.75,12,165,http://www.flickr.com/photos/j_benson/29650838375/,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/ fae27865dc0dfdb6,https://c1.staticflickr.com/8/7103/26725562970_3c1d3f8733_o.jpg,0.438671875,0.0,1.0,0.75,337,678,https://www.flickr.com/photos/fishwasher/26725562970,https://creativecommons.org/licenses/by/2.0/,Vlad Podvorny,https://www.flickr.com/people/fishwasher/ 1f9ecce63e94ba97,https://c1.staticflickr.com/6/5552/30908389806_a8cc5d878b_o.jpg,0.333333333333,0.0,1.0,1.0,693,472,https://www.flickr.com/photos/comedynose/30908389806,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/ 15d354fcc3fa027e,https://c1.staticflickr.com/6/5625/30682716776_f15f30b9f6_o.jpg,0.0,0.0,1.0,1.0,739,537,https://flickr.com/60944636@N00/30682716776,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/ 081f36a3036c82e9,https://c1.staticflickr.com/9/8345/28715142401_2b41f16de0_o.jpg,0.231890459364,0.0,0.695671378092,0.75,405,632,https://flickr.com/96223380@N02/28715142401,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ d81b302bd03ccca2,https://c1.staticflickr.com/6/5624/30799095616_9475195a1b_o.jpg,0.25,0.0,0.75,0.75,312,881,https://www.flickr.com/photos/ansk/30799095616,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/ 8060e42dc3b7147a,https://c1.staticflickr.com/8/7354/28135262255_356dace0d8_o.jpg,0.25,0.0,0.75,0.75,818,318,https://www.flickr.com/photos/thecarspy/28135262255,https://creativecommons.org/licenses/by/2.0/,The Car Spy,https://www.flickr.com/people/thecarspy/ c39e14b985d2504a,https://c1.staticflickr.com/9/8618/30465704306_1f55cbe415_o.jpg,0.49889380531,0.25,1.0,1.0,495,979,https://www.flickr.com/photos/eltb/30465704306,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 45a0dfd2c88a3f13,https://c1.staticflickr.com/6/5754/31231179316_03a30b08f4_o.jpg,0.0,0.0,0.5,0.75,779,751,https://www.flickr.com/photos/mujitra/31231179316,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/ a90bf0cacb5662ed,https://c1.staticflickr.com/8/7312/27905486782_56fe2e5767_o.jpg,0.4375,0.25,1.0,1.0,875,480,https://www.flickr.com/photos/69203347@N03/27905486782,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ c32cc4ffb4f85ecd,https://c1.staticflickr.com/8/7395/27084897643_bbae9cce8c_o.jpg,0.250923190547,0.0,0.75276957164,0.75,604,221,https://www.flickr.com/photos/jorge-11/27084897643,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/ 0b380045d7f9bf06,https://c1.staticflickr.com/8/7358/26990370230_c25b68b97c_o.jpg,0.0,0.0,0.617213114754,0.75,294,2,https://www.flickr.com/photos/amanderson/26990370230,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 6d818e8669f3ac61,https://c1.staticflickr.com/6/5731/30521493686_630cce0076_o.jpg,0.0,0.0,0.75,1.0,434,139,https://www.flickr.com/photos/stevendepolo/30521493686,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 77ac531050fb1153,https://c1.staticflickr.com/9/8342/28776338230_c9ea2c2994_o.jpg,0.0,0.5,0.75,1.0,874,808,https://www.flickr.com/photos/zigazou76/28776338230,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 2bb77d79f0a8a869,https://c1.staticflickr.com/9/8557/28406946510_2722a7e834_o.jpg,0.4375,0.25,1.0,1.0,808,667,https://flickr.com/61008969@N03/28406946510,https://creativecommons.org/licenses/by/2.0/,ICTE-UQ,https://www.flickr.com/people/icte-uq/ 283cbf4827004f2f,https://c1.staticflickr.com/6/5673/31101328662_0f917f545e_o.jpg,0.0,0.25,0.483695652174,1.0,820,448,https://www.flickr.com/photos/jus10h/31101328662,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ c967ac383bc39e0b,https://c1.staticflickr.com/8/7289/27254670985_326c9aca15_o.jpg,0.263433813893,0.0,0.790301441678,1.0,555,52,https://www.flickr.com/photos/walterpro/27254670985,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ d0df52c255e4d14d,https://c1.staticflickr.com/8/7246/27479788632_4837443f8b_o.jpg,0.25,0.0,1.0,0.724689165187,498,800,https://www.flickr.com/photos/trondheim_byarkiv/27479788632,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim,https://www.flickr.com/people/trondheim_byarkiv/ 6bb46ab95f32861f,https://c1.staticflickr.com/9/8051/29695835045_9219ebd8c5_o.jpg,0.26075619296,0.0,0.782268578879,1.0,815,797,https://www.flickr.com/photos/yamahawatercraft/29695835045/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/ 02851c38dfce98b0,https://c1.staticflickr.com/8/7562/27520834756_dca8248c4d_o.jpg,0.25,0.25,0.75,1.0,986,931,https://www.flickr.com/photos/cogdog/27520834756/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 43a736b30b249139,https://c1.staticflickr.com/9/8182/28394501131_6100344c20_o.jpg,0.28125,0.0,0.84375,0.75,490,716,https://www.flickr.com/photos/fdecomite/28394501131,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 278c6878aa810fed,https://c1.staticflickr.com/9/8153/7456686468_3307378ab3_o.jpg,0.25,0.25,0.75,1.0,770,519,https://www.flickr.com/photos/dominicspics/7456686468,https://creativecommons.org/licenses/by/2.0/,Dominic Alves,https://www.flickr.com/people/dominicspics/ 566908f2a76c406c,https://c1.staticflickr.com/9/8437/28219029883_1a083fd1e4_o.jpg,0.25,0.25,0.75,1.0,976,700,https://www.flickr.com/photos/mypubliclands/28219029883,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ ed542bad1c02dfec,https://c1.staticflickr.com/8/7069/27386644351_f4aac62dd5_o.jpg,0.270061728395,0.0,1.0,1.0,320,944,https://www.flickr.com/photos/gails_pictures/27386644351,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 7f5ba3e3f3eca6b3,https://c1.staticflickr.com/8/7344/27377155134_bd2c853e53_o.jpg,0.25,0.25,0.75,1.0,137,375,https://www.flickr.com/photos/blachswan/27377155134,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ ada5e14c279fd3e9,https://c1.staticflickr.com/6/5824/30974869612_e907fca9ca_o.jpg,0.25,0.25,1.0,1.0,729,495,https://www.flickr.com/photos/rodrigoparedes/30974869612,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/ d9b229c394707b6c,https://c1.staticflickr.com/8/7344/28029362406_7ea1da8055_o.jpg,0.25,0.0,0.75,0.75,512,860,https://www.flickr.com/photos/karen_roe/28029362406,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ b0f28f897d4e1624,https://c1.staticflickr.com/1/140/31274923920_f1f76e0744_o.jpg,0.25,0.25,0.75,1.0,85,775,https://www.flickr.com/photos/simonmatzinger/31274923920/,https://creativecommons.org/licenses/by/2.0/,Simon Matzinger,https://www.flickr.com/people/simonmatzinger/ b245f492db3b8daa,https://c1.staticflickr.com/8/7101/27868852041_98bec1eb36_o.jpg,0.0,0.25,0.567503924647,1.0,826,687,https://www.flickr.com/photos/atoach/27868852041,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 89265ce23a10ebe9,https://c1.staticflickr.com/6/5681/30425702622_55ef49272f_o.jpg,0.0,0.0,0.5,0.75,982,624,https://www.flickr.com/photos/armymaterielcommand/30425702622/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/ 394efece813cf835,https://c1.staticflickr.com/6/5468/29975017416_bb705990b5_o.jpg,0.0,0.25,0.5625,1.0,975,422,https://www.flickr.com/photos/jsjgeology/29975017416,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 4564855b694b4c4f,https://c1.staticflickr.com/8/7616/26553708633_c25f01eb54_o.jpg,0.0,0.0,0.473457675753,0.75,780,130,https://www.flickr.com/photos/thoseguys119/26553708633,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c15bfaa5507a192b,https://c1.staticflickr.com/8/7332/28106145076_c11dd3b14d_o.jpg,0.0,0.25,0.5,1.0,558,507,https://www.flickr.com/photos/vitofun/28106145076,https://creativecommons.org/licenses/by/2.0/,Vito Fun,https://www.flickr.com/people/vitofun/ 3bd2be0773c5597d,https://c1.staticflickr.com/9/8876/28971611026_6a15cc1c73_o.jpg,0.4375,0.0,1.0,0.75,986,647,https://www.flickr.com/photos/jseelbach/28971611026,https://creativecommons.org/licenses/by/2.0/,Julius Seelbach,https://www.flickr.com/people/jseelbach/ 4f62bef440d663c2,https://c1.staticflickr.com/6/5830/31320120676_a73163cb09_o.jpg,0.25,0.0,1.0,1.0,50,57,https://flickr.com/146749261@N05/31320120676,https://creativecommons.org/licenses/by/2.0/,@ FS Images,https://www.flickr.com/people/146749261@N05/ a9410c6d06bca7ef,https://c1.staticflickr.com/8/7377/27899968076_ca4d9c5e6b_o.jpg,0.0,0.5,0.75,1.0,558,387,https://www.flickr.com/photos/esoastronomy/27899968076,https://creativecommons.org/licenses/by/2.0/,European Southern Observatory,https://www.flickr.com/people/esoastronomy/ 865c22c59f23a382,https://c1.staticflickr.com/9/8535/29753512076_033baa1e5f_o.jpg,0.25,0.0,0.75,0.75,967,501,https://www.flickr.com/photos/shankaronline/29753512076,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 9ec17e0dd0115e57,https://c1.staticflickr.com/6/5779/30700157176_c010eb19d6_o.jpg,0.0,0.0,0.498159057437,0.75,752,984,https://www.flickr.com/photos/davehamster/30700157176,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 96c9b394d26a0e07,https://c1.staticflickr.com/9/8385/29345403475_32da13b313_o.jpg,0.0,0.25,0.5,1.0,426,837,https://www.flickr.com/photos/cmichel67/29345403475,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/ 59c61c1e72a3757b,https://c1.staticflickr.com/4/3720/32463465520_3ab218ebe5_o.jpg,0.25,0.0,0.75,0.75,116,824,https://www.flickr.com/photos/silkebaron/32463465520,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ 46f7ffbffac617ed,https://c1.staticflickr.com/9/8705/28257724020_cbc8260034_o.jpg,0.0896551724138,0.0,1.0,1.0,319,282,https://www.flickr.com/photos/gails_pictures/28257724020,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ ad54fe631197c46f,https://c1.staticflickr.com/6/5777/30306598544_45d7790434_o.jpg,0.25,0.0,1.0,1.0,810,577,https://www.flickr.com/photos/68147320@N02/30306598544,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ 5568d5c80c28f3a9,https://c1.staticflickr.com/7/6080/6101018315_13df00e66d_o.jpg,0.479437229437,0.25,0.958874458874,1.0,875,545,https://www.flickr.com/photos/davidwilson1949/6101018315,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 0a991d4b1bb84222,https://c1.staticflickr.com/8/7442/27810141205_259c2c7141_o.jpg,0.250923190547,0.0,0.75276957164,0.75,896,619,https://www.flickr.com/photos/13476480@N07/27810141205,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 80bab2fc1b1f0cc6,https://c1.staticflickr.com/8/7415/26893561024_bfd5dcd3ae_o.jpg,0.0,0.0,1.0,1.0,484,145,https://www.flickr.com/photos/map/26893561024,https://creativecommons.org/licenses/by/2.0/,map,https://www.flickr.com/people/map/ a8b5ebcf8fa29c5f,https://c1.staticflickr.com/6/5622/30730405831_b9b247002b_o.jpg,0.0,0.25,0.67667238422,1.0,820,913,https://flickr.com/47225149@N07/30730405831,https://creativecommons.org/licenses/by/2.0/,Dutch Boyd,https://www.flickr.com/people/localvegas/ bc0d82ed9e18bc52,https://c1.staticflickr.com/1/301/31994799785_32116bbdd8_o.jpg,0.25,0.25,1.0,1.0,693,800,https://www.flickr.com/photos/sixteenmilesofstring/31994799785/,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/ 854ec432cb7cb227,https://c1.staticflickr.com/6/5543/29900346290_78c6f293ca_o.jpg,0.0,0.0,0.75,1.0,975,382,http://www.flickr.com/photos/47445767@N05/29900346290,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ fdc25f6bef50f0f7,https://c1.staticflickr.com/8/7414/26794876006_355be34bc8_o.jpg,0.332842415317,0.0,0.99852724595,1.0,404,910,https://www.flickr.com/photos/navcent/26794876006/,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/ 07291b807f06aba9,https://c1.staticflickr.com/6/5689/30674880970_b88f507b85_o.jpg,0.0,0.0,0.666666666667,1.0,653,413,https://www.flickr.com/photos/usarmyafrica/30674880970,https://creativecommons.org/licenses/by/2.0/,US Army Africa,https://www.flickr.com/people/usarmyafrica/ 01d22f91e26bb81c,https://c1.staticflickr.com/2/1671/26467041370_d4f20e2aea_o.jpg,0.485426008969,0.25,1.0,1.0,407,37,https://www.flickr.com/photos/eltb/26467041370,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 64dcdbce369b771e,https://c1.staticflickr.com/9/8295/28730331744_3ed9892235_o.jpg,0.4375,0.0,1.0,0.75,979,395,https://www.flickr.com/photos/lofink/28730331744/,https://creativecommons.org/licenses/by/2.0/,David Lofink,https://www.flickr.com/people/lofink/ 0e3e585fada8a9b7,https://c1.staticflickr.com/8/7040/27184333564_9a53ab7e6d_o.jpg,0.0,0.0,0.5625,0.75,416,651,https://www.flickr.com/photos/stevendepolo/27184333564,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ d3d5b0e4d7406947,https://c1.staticflickr.com/1/479/32218813675_2e18ac3471_o.jpg,0.0,0.0,0.645728643216,0.75,851,568,https://www.flickr.com/photos/thepeachpeddler/32218813675,https://creativecommons.org/licenses/by/2.0/,thepeachpeddler,https://www.flickr.com/people/thepeachpeddler/ 1e7d95b4f2f7f145,https://c1.staticflickr.com/8/7449/27467868920_f98e65b86b_o.jpg,0.271186440678,0.0,1.0,1.0,717,552,https://www.flickr.com/photos/duncanh1/27467868920/,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 8951b233e5c08a1b,https://c1.staticflickr.com/4/3764/33456857325_563ae52d0c_o.jpg,0.0,0.0,1.0,1.0,796,576,https://www.flickr.com/photos/billmorrow/33456857325/,https://creativecommons.org/licenses/by/2.0/,Bill Morrow,https://www.flickr.com/people/billmorrow/ 4346a9236f07a96e,https://c1.staticflickr.com/8/7428/27867864261_46a5e6c462_o.jpg,0.25,0.0,0.75,0.75,561,911,http://www.flickr.com/photos/dinumukherjee/27867864261/,https://creativecommons.org/licenses/by/2.0/,Dinu Mukherjee,https://www.flickr.com/people/dinumukherjee/ c281a3896a13dcf4,https://c1.staticflickr.com/8/7600/27537864963_76fb237586_o.jpg,0.0,0.0,0.70534150613,0.75,920,642,https://www.flickr.com/photos/byzantiumbooks/27537864963,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ ee02222da14c4baf,https://c1.staticflickr.com/6/5750/29920916720_224b3e8d5a_o.jpg,0.0,0.5,0.75,1.0,563,396,https://flickr.com/25797459@N06/29920916720,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/ 5148632709203f26,https://c1.staticflickr.com/9/8137/29668016191_e4f2e0cbfa_o.jpg,0.0,0.0,0.56338028169,0.75,526,412,https://www.flickr.com/photos/jaygalvin/29668016191,https://creativecommons.org/licenses/by/2.0/,Jay Galvin,https://www.flickr.com/people/jaygalvin/ 252c688d536c7b81,https://c1.staticflickr.com/9/8550/30217166912_5d961c0678_o.jpg,0.0,0.25,0.5625,1.0,820,459,https://www.flickr.com/photos/jasoncartwright/30217166912,https://creativecommons.org/licenses/by/2.0/,Jason Cartwright,https://www.flickr.com/people/jasoncartwright/ 24d22f8923e66373,https://c1.staticflickr.com/9/8083/29040614113_ec4b1c787b_o.jpg,0.0,0.0,1.0,1.0,963,783,https://flickr.com/73451168@N00/29040614113,https://creativecommons.org/licenses/by/2.0/,J Wynia,https://www.flickr.com/people/jwynia/ 6e958521c7586286,https://c1.staticflickr.com/6/5641/31141619325_6d09acf278_o.jpg,0.0,0.25,0.499263622975,1.0,404,473,https://www.flickr.com/photos/us_embassy_newzealand/31141619325,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/ 6c9db8b16874d992,https://c1.staticflickr.com/6/5588/30840611922_21199963bd_o.jpg,0.5,0.25,1.0,1.0,976,586,https://www.flickr.com/photos/o_0/30840611922/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 581f4a7fb19abc45,https://c1.staticflickr.com/1/479/31038106223_dc8034279a_o.jpg,0.305989583333,0.25,1.0,1.0,420,102,http://www.flickr.com/photos/iblee/31038106223/,https://creativecommons.org/licenses/by/2.0/,lee leblanc,https://www.flickr.com/people/iblee/ 0e1a8a2ee27559a5,https://c1.staticflickr.com/8/7285/27877075156_38378fc26a_o.jpg,0.0,0.0,1.0,1.0,960,884,https://www.flickr.com/photos/naotakem/27877075156,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/ 36ed2d50cfbb3372,https://c1.staticflickr.com/9/8713/28391753412_49cd680fd7_o.jpg,0.333333333333,0.0,1.0,1.0,980,865,https://www.flickr.com/photos/mypubliclands/28391753412,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 1f6ac792e75f9cad,https://c1.staticflickr.com/1/725/32378658705_0f24d3a0a5_o.jpg,0.0,0.0,1.0,1.0,313,923,https://www.flickr.com/photos/treegrow/32378658705,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 6e703bb64d14b304,https://c1.staticflickr.com/9/8741/28297568711_599c18187b_o.jpg,0.0,0.0,0.666666666667,1.0,428,567,https://www.flickr.com/photos/visitmelbourne/28297568711/,https://creativecommons.org/licenses/by/2.0/,Tourism Victoria,https://www.flickr.com/people/visitmelbourne/ f88259852b5bfa56,https://c1.staticflickr.com/9/8547/29584949230_40562154e6_o.jpg,0.0,0.0,0.603085553997,1.0,405,570,https://www.flickr.com/photos/hisgett/29584949230/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 69248938edf0e2ee,https://c1.staticflickr.com/8/7353/27498210483_f8bf1723b1_o.jpg,0.0,0.0,0.5,0.75,459,642,https://www.flickr.com/photos/summonedbyfells/27498210483/,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/ 14df9b521676ff6b,https://c1.staticflickr.com/1/347/31431438860_a5e3d32ed0_o.jpg,0.0,0.0,1.0,0.811382113821,891,81,https://www.flickr.com/photos/dohastadiumplusqatar/31431438860/,https://creativecommons.org/licenses/by/2.0/,Doha Stadium Plus Qatar,https://www.flickr.com/people/dohastadiumplusqatar/ bc0ba0112bee28da,https://c1.staticflickr.com/8/7726/26782042864_af5deed0c7_o.jpg,0.25,0.0,1.0,1.0,976,678,https://www.flickr.com/photos/16725630@N00/26782042864,https://creativecommons.org/licenses/by/2.0/,Matt Zimmerman,https://www.flickr.com/people/16725630@N00/ 1bfd727f7f331275,https://c1.staticflickr.com/1/260/31057995984_1ccb2c024a_o.jpg,0.0,0.0,0.75,1.0,875,918,https://www.flickr.com/photos/69203347@N03/31057995984/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 6aa3d188c976eee9,https://c1.staticflickr.com/8/7043/26989165486_6ca2ed97d2_o.jpg,0.0,0.0,0.666666666667,1.0,100,388,https://www.flickr.com/photos/ddebold/26989165486,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ 0bce12d12f20fbb9,https://c1.staticflickr.com/8/7504/29239307602_57bfc14926_o.jpg,0.25,0.25,0.75,1.0,355,88,https://www.flickr.com/photos/pyramidtexts/29239307602,https://creativecommons.org/licenses/by/2.0/,Vincent Brown,https://www.flickr.com/people/pyramidtexts/ 2b0092b5867e5f13,https://c1.staticflickr.com/8/7563/27934954655_f7d9f09407_o.jpg,0.0,0.0,0.75,0.5,853,497,https://www.flickr.com/photos/21560098@N06/27934954655,https://creativecommons.org/licenses/by/2.0/,Nina Matthews Photography,https://www.flickr.com/people/21560098@N06/ 9dcbcc82b1e47120,https://c1.staticflickr.com/8/7561/27682536761_f805b2fefa_o.jpg,0.0,0.25,0.5625,1.0,644,408,https://www.flickr.com/photos/jdlasica/27682536761,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ c2c3ce724c93cb14,https://c1.staticflickr.com/6/5676/30347548570_b030fda4a7_o.jpg,0.5,0.25,1.0,1.0,459,691,http://www.flickr.com/photos/barretthall/30347548570/,https://creativecommons.org/licenses/by/2.0/,popofatticus,https://www.flickr.com/people/barretthall/ 0906b1904b146f57,https://c1.staticflickr.com/9/8635/30432237455_356523ec6e_o.jpg,0.4375,0.0,1.0,0.75,920,504,https://www.flickr.com/photos/bazzadarambler/30432237455,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ b21cc2dd249a7859,https://c1.staticflickr.com/6/5667/30798815560_4d58dcdf25_o.jpg,0.0,0.0,0.75,0.75,471,695,https://www.flickr.com/photos/27353377@N04/30798815560/,https://creativecommons.org/licenses/by/2.0/,Carrie A.,https://www.flickr.com/people/27353377@N04/ 306bb14e4dd599b3,https://c1.staticflickr.com/8/7392/28064760906_5a5bbd3d8a_o.jpg,0.307365439093,0.0,0.92209631728,1.0,629,858,https://www.flickr.com/photos/jdlasica/28064760906,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ be3b333c8f71ae5a,https://c1.staticflickr.com/1/93/31520511066_542a3e0445_o.jpg,0.229217603912,0.0,0.687652811736,1.0,709,995,https://flickr.com/8146925@N08/31520511066,https://creativecommons.org/licenses/by/2.0/,\303\201ngel M. Felic\303\255simo,https://www.flickr.com/people/elgolem/ 333393730953e5b3,https://c1.staticflickr.com/9/8011/29216897003_fbc15e496b_o.jpg,0.28125,0.25,0.84375,1.0,625,844,https://www.flickr.com/photos/publiclibrariesnsw/29216897003,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/ 3d98314058b49796,https://c1.staticflickr.com/8/7184/27330675470_f01cd844b3_o.jpg,0.493045387994,0.25,0.986090775988,1.0,426,752,https://www.flickr.com/photos/72821066@N04/27330675470,https://creativecommons.org/licenses/by/2.0/,Kathleen,https://www.flickr.com/people/72821066@N04/ 3d858aa8d3b69b42,https://c1.staticflickr.com/6/5557/29863694915_a6c9a6665b_o.jpg,0.0,0.0,0.622507122507,1.0,341,457,https://www.flickr.com/photos/7326810@N08/29863694915,https://creativecommons.org/licenses/by/2.0/,Jean,https://www.flickr.com/people/7326810@N08/ 82502e2866b5d58e,https://c1.staticflickr.com/1/702/31958439974_839e53d97e_o.jpg,0.0,0.0,0.75,1.0,548,956,https://www.flickr.com/photos/belurashok/31958439974,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ 758a2ce307c70cb7,https://c1.staticflickr.com/9/8736/28449013200_a0dc04bf4c_o.jpg,0.0,0.0,0.75117370892,1.0,606,510,https://www.flickr.com/photos/tamakisono/28449013200,https://creativecommons.org/licenses/by/2.0/,Tamaki Sono,https://www.flickr.com/people/tamakisono/ d82b521a161e3cfa,https://c1.staticflickr.com/6/5479/30679608780_e484e611ed_o.jpg,0.0,0.0,0.666666666667,1.0,719,739,https://www.flickr.com/photos/ben_salter/30679608780,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 0fc6f2d31f532581,https://c1.staticflickr.com/6/5776/30046535856_4c6ee79d68_o.jpg,0.25,0.0,1.0,0.619458128079,27,626,https://www.flickr.com/photos/12567713@N00/30046535856,https://creativecommons.org/licenses/by/2.0/,born1945,https://www.flickr.com/people/12567713@N00/ 2339fc4559a37fb2,https://c1.staticflickr.com/6/5823/30235945205_f5ff47929b_o.jpg,0.0,0.0,1.0,0.799676898223,960,230,https://www.flickr.com/photos/bluemarleysabyss/30235945205,https://creativecommons.org/licenses/by/2.0/,Julia S.,https://www.flickr.com/people/bluemarleysabyss/ a4641b1496f6d212,https://c1.staticflickr.com/6/5683/29969439090_15a8f03be2_o.jpg,0.273726851852,0.25,0.821180555556,1.0,672,235,https://www.flickr.com/photos/glorycycles/29969439090,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 6f7e882f95d9cad1,https://c1.staticflickr.com/9/8089/29592676161_e7cdb8e7c2_o.jpg,0.0,0.25,0.5625,1.0,906,56,https://www.flickr.com/photos/adactio/29592676161,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/ 384922a61058d22a,https://c1.staticflickr.com/9/8638/28621782691_b5b92622b9_o.jpg,0.281690140845,0.25,0.845070422535,1.0,309,957,https://www.flickr.com/photos/rippchenmitkraut66/28621782691/,https://creativecommons.org/licenses/by/2.0/,rippchenmitkraut66,https://www.flickr.com/people/rippchenmitkraut66/ 74a0f69178788c94,https://c1.staticflickr.com/9/8552/29890747401_b02169b564_o.jpg,0.0,0.235387045814,1.0,1.0,922,233,https://www.flickr.com/photos/rich701/29890747401/,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/ 04727f8a38a80019,https://c1.staticflickr.com/1/426/30867308804_7688962f8e_o.jpg,0.0,0.0,0.5,0.75,717,617,https://www.flickr.com/photos/78428166@N00/30867308804/,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ d2c219fdbd8fa0f0,https://c1.staticflickr.com/8/7519/26955322890_76804ba70f_o.jpg,0.25,0.0,0.75,0.75,972,624,https://www.flickr.com/photos/usaghumphreys/26955322890,https://creativecommons.org/licenses/by/2.0/,USAG- Humphreys,https://www.flickr.com/people/usaghumphreys/ 8e0cab0af054d36d,https://c1.staticflickr.com/9/8450/29096384102_a8bd2945bb_o.jpg,0.248348017621,0.0,0.745044052863,0.75,484,300,https://www.flickr.com/photos/sybarite48/29096384102,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 969cc631529587a2,https://c1.staticflickr.com/1/721/32349330296_21b1655fec_o.jpg,0.333333333333,0.0,1.0,1.0,511,240,https://www.flickr.com/photos/imo-un/32349330296,https://creativecommons.org/licenses/by/2.0/,International Maritime Organization,https://www.flickr.com/people/imo-un/ 39d50c128ba7b0bd,https://c1.staticflickr.com/8/7202/26933423786_c7e2e292b6_o.jpg,0.25,0.0,0.75,0.75,752,68,https://www.flickr.com/photos/joe_labrie_photographe/26933423786/,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/ 9d27aa28f202ae78,https://c1.staticflickr.com/9/8279/28519602574_421d3bb35c_o.jpg,0.275154798762,0.25,0.825464396285,1.0,593,531,https://flickr.com/100239928@N08/28519602574,https://creativecommons.org/licenses/by/2.0/,BTC Keychain,https://www.flickr.com/people/btckeychain/ 63addd49ab984a14,https://c1.staticflickr.com/8/7426/26580891193_64130dd4e6_o.jpg,0.0,0.25,0.5625,1.0,780,811,https://www.flickr.com/photos/thoseguys119/26580891193,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 4f7952d5ab4d7f39,https://c1.staticflickr.com/8/7414/27653365675_d946076c36_o.jpg,0.31726618705,0.0,0.951798561151,1.0,896,68,https://www.flickr.com/photos/621crw/27653365675/,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/ 1cdd7d5724781f3e,https://c1.staticflickr.com/1/740/31904299905_e19ef4e4c5_o.jpg,0.5,0.0,1.0,0.75,818,566,https://www.flickr.com/photos/greggjerdingen/31904299905,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 59c03ccc5cb833f1,https://c1.staticflickr.com/8/7516/26965614291_69ef89061c_o.jpg,0.633522727273,0.25,1.0,1.0,459,517,https://www.flickr.com/photos/22711505@N05/26965614291,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 97bed290680759be,https://c1.staticflickr.com/8/7645/27687952991_bc3c647f5f_o.jpg,0.25,0.25,0.75,1.0,566,733,https://www.flickr.com/photos/sodaigomi/27687952991,https://creativecommons.org/licenses/by/2.0/,sodai gomi,https://www.flickr.com/people/sodaigomi/ ff0c3df74e9f135e,https://c1.staticflickr.com/6/5447/30634365842_7f9795843b_o.jpg,0.0,0.25,0.504444444444,1.0,309,506,http://www.flickr.com/photos/patrick_k59/30634365842/,https://creativecommons.org/licenses/by/2.0/,patrickkavanagh,https://www.flickr.com/people/patrick_k59/ 9ec8e5c890b81bec,https://c1.staticflickr.com/1/538/31953872514_49b33f5c90_o.jpg,0.4375,0.0,1.0,0.75,833,431,https://www.flickr.com/photos/exoticvacations/31953872514/,https://creativecommons.org/licenses/by/2.0/,Wangpin Thondup,https://www.flickr.com/people/exoticvacations/ df572b6bd546d236,https://c1.staticflickr.com/6/5796/30707232921_cbcebcf3fd_o.jpg,0.25,0.0,1.0,0.75,863,677,https://flickr.com/8060974@N02/30707232921,https://creativecommons.org/licenses/by/2.0/,Jenny Brown,https://www.flickr.com/people/jennyellenbrown/ abe66b0da8ba0cee,https://c1.staticflickr.com/9/8398/29584610700_f4b2de2224_o.jpg,0.25,0.0,1.0,1.0,909,699,https://www.flickr.com/photos/adactio/29584610700,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/ b5761c4a445eee44,https://c1.staticflickr.com/9/8072/29162789670_7fa9814061_o.jpg,0.25,0.0,1.0,1.0,693,564,https://www.flickr.com/photos/jeepersmedia/29162789670,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ bec534f903cf5c51,https://c1.staticflickr.com/9/8053/28783558610_bfcd207777_o.jpg,0.311985172982,0.25,0.935955518946,1.0,309,121,https://www.flickr.com/photos/gails_pictures/28783558610,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 178f5890f92a92a0,https://c1.staticflickr.com/9/8207/29155554523_72e2b20b06_o.jpg,0.25,0.25,1.0,1.0,490,931,https://www.flickr.com/photos/antoine-imbert/29155554523,https://creativecommons.org/licenses/by/2.0/,Antoine Imbert,https://www.flickr.com/people/antoine-imbert/ 6f55c835fbdd6d98,https://c1.staticflickr.com/8/7430/26992832744_643a944acd_o.jpg,0.210588633288,0.0,0.631765899865,0.75,615,922,https://www.flickr.com/photos/mujitra/26992832744,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/ ce5ea55a4e02fbaa,https://c1.staticflickr.com/9/8317/29144929061_bec56ce980_o.jpg,0.225,0.0,0.675,0.75,653,771,https://www.flickr.com/photos/ftmeade/29144929061,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/ 67b3d77c9b48e559,https://c1.staticflickr.com/8/7509/27411623806_1662e45bf2_o.jpg,0.0,0.0,1.0,0.876480541455,947,452,https://www.flickr.com/photos/92252798@N07/27411623806,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/ c5b048a9be49d144,https://c1.staticflickr.com/8/7343/27275933712_c7fde42257_o.jpg,0.568493150685,0.25,1.0,1.0,752,859,https://www.flickr.com/photos/odolphie/27275933712,https://creativecommons.org/licenses/by/2.0/,Niki Odolphie,https://www.flickr.com/people/odolphie/ 19917ce4c0b73d03,https://c1.staticflickr.com/8/7288/26653682243_628884d4f6_o.jpg,0.260918674699,0.25,0.782756024096,1.0,324,421,https://www.flickr.com/photos/zeevveez/26653682243,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ ce81ad607ec10f0e,https://c1.staticflickr.com/3/2048/32878661076_01bfc34e57_o.jpg,0.25,0.25,0.75,1.0,765,773,https://www.flickr.com/photos/big-ashb/32878661076/,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/ 2ca9a74e9461a362,https://c1.staticflickr.com/9/8827/28241039050_2c557eb372_o.jpg,0.25,0.298309178744,1.0,0.894927536232,975,884,https://www.flickr.com/photos/jsjgeology/28241039050,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ f041df267ce93962,https://c1.staticflickr.com/8/7683/27716953064_29679bc94a_o.jpg,0.4375,0.0,1.0,0.75,975,48,https://www.flickr.com/photos/jsjgeology/27716953064,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1c015da4dd90f54c,https://c1.staticflickr.com/9/8071/29334655541_2793451f1a_o.jpg,0.25,0.0,1.0,1.0,980,597,https://www.flickr.com/photos/amslerpix/29334655541,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 15b8410a7a0fc434,https://c1.staticflickr.com/8/7333/27727564000_1fe1c23bc1_o.jpg,0.25,0.313118811881,1.0,0.939356435644,980,5,https://www.flickr.com/photos/blmoregon/27727564000,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ d37c6ec499a02bc6,https://c1.staticflickr.com/4/3865/32902482982_5b7fe586d9_o.jpg,0.25,0.0,0.75,0.75,868,965,https://www.flickr.com/photos/76969036@N02/32902482982,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ a1c46868be2ff302,https://c1.staticflickr.com/1/512/32344107335_f1eb8eaba4_o.jpg,0.25,0.27032208589,1.0,0.810966257669,512,539,https://www.flickr.com/photos/andreboeni/32344107335,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ a1f111b8f669920d,https://c1.staticflickr.com/6/5536/30697916911_873c73d330_o.jpg,0.236940298507,0.0,0.710820895522,1.0,653,736,https://www.flickr.com/photos/thejointstaff/30697916911,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ 568db43a7ae9904e,https://c1.staticflickr.com/9/8023/29466569235_239555efe7_o.jpg,0.249631811487,0.25,0.748895434462,1.0,896,784,https://www.flickr.com/photos/markyharky/29466569235,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 97c72b4e6148bdd6,https://c1.staticflickr.com/9/8299/29495450326_68081f5b7d_o.jpg,0.285686119874,0.0,0.857058359621,0.75,972,564,https://www.flickr.com/photos/catsper/29495450326,https://creativecommons.org/licenses/by/2.0/,J c,https://www.flickr.com/people/catsper/ c2444bf73d554023,https://c1.staticflickr.com/1/525/32588098091_5fe70c8d82_o.jpg,0.0,0.0,0.5625,0.75,518,330,https://www.flickr.com/photos/jamesbondsv/32588098091,https://creativecommons.org/licenses/by/2.0/,Steven Vance,https://www.flickr.com/people/jamesbondsv/ 498fe23c9b77db96,https://c1.staticflickr.com/6/5348/30540867642_286f83e003_o.jpg,0.28125,0.0,0.84375,0.75,450,510,https://www.flickr.com/photos/augustbrill/30540867642/,https://creativecommons.org/licenses/by/2.0/,August Brill,https://www.flickr.com/people/augustbrill/ bca5c8f95cd08bb5,https://c1.staticflickr.com/6/5740/30897148861_bbd57f8335_o.jpg,0.25,0.25,0.75,1.0,979,598,https://www.flickr.com/photos/braiu_74/30897148861/,https://creativecommons.org/licenses/by/2.0/,Paolo Braiuca,https://www.flickr.com/people/braiu_74/ 61848a7a553d1b5c,https://c1.staticflickr.com/9/8257/28809838033_8d50bef5e4_o.jpg,0.5,0.25,1.0,1.0,959,922,https://www.flickr.com/photos/glenbowman/28809838033,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 8adcd740959ffadc,https://c1.staticflickr.com/1/356/32419087811_5e71ab356d_o.jpg,0.0,0.0,1.0,0.666666666667,341,611,http://www.flickr.com/photos/happymillerman/32419087811/,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ 769b04f34bb2a350,https://c1.staticflickr.com/8/7538/26791253293_b750bb1032_o.jpg,0.0,0.0,0.5,0.75,777,57,https://www.flickr.com/photos/usafe/26791253293/,https://creativecommons.org/licenses/by/2.0/,USAFE AFAFRICA,https://www.flickr.com/people/usafe/ 09540b63dc9894c5,https://c1.staticflickr.com/8/7196/27080002421_2473986b0a_o.jpg,0.0,0.25,0.63875,1.0,448,500,https://www.flickr.com/photos/51764518@N02/27080002421,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 80aaa01c95b76d0a,https://c1.staticflickr.com/6/5815/30978067906_6aab221b70_o.jpg,0.0,0.0,1.0,1.0,499,134,http://www.flickr.com/photos/jonicdao/30978067906/,https://creativecommons.org/licenses/by/2.0/,jojo nicdao,https://www.flickr.com/people/jonicdao/ 706c48da4ebcf737,https://c1.staticflickr.com/6/5338/30478269120_7a6d569965_o.jpg,0.0,0.0,0.5,0.75,898,612,https://flickr.com/56324301@N00/30478269120,https://creativecommons.org/licenses/by/2.0/,rohypnol [Francesco Zaia],https://www.flickr.com/people/rohypnol/ 7c1307f03ca3108b,https://c1.staticflickr.com/1/772/31323010074_e3d7feb1aa_o.jpg,0.423913043478,0.0,0.847826086957,0.75,407,771,https://www.flickr.com/photos/eltb/31323010074,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ beaf64b58a74512f,https://c1.staticflickr.com/9/8745/28726152391_b21090a7f7_o.jpg,0.0,0.0,0.499263622975,0.75,896,764,https://www.flickr.com/photos/13476480@N07/28726152391,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 7af23b2069f08360,https://c1.staticflickr.com/9/8725/28599606353_f2da87c816_o.jpg,0.0,0.25,0.5,1.0,820,85,https://www.flickr.com/photos/146190439@N03/28599606353/,https://creativecommons.org/licenses/by/2.0/,Klimacamp im Rheinland,https://www.flickr.com/people/146190439@N03/ 4f5ca68718bd3263,https://c1.staticflickr.com/1/406/31599942061_ccee753564_o.jpg,0.2806640625,0.25,0.8419921875,1.0,750,734,https://flickr.com/73840284@N04/31599942061,https://creativecommons.org/licenses/by/2.0/,Harry Rose,https://www.flickr.com/people/macleaygrassman/ 12738de9177dafd6,https://c1.staticflickr.com/2/1519/26737086846_557652b2cd_o.jpg,0.0,0.280784844384,1.0,0.842354533153,980,407,https://www.flickr.com/photos/ekigyuu/26737086846,https://creativecommons.org/licenses/by/2.0/,California Cow,https://www.flickr.com/people/ekigyuu/ 176e15c13401b234,https://c1.staticflickr.com/1/533/31616898185_c847deb981_o.jpg,0.25,0.25,0.75,1.0,981,325,https://www.flickr.com/photos/jseita/31616898185,https://creativecommons.org/licenses/by/2.0/,Jun Seita,https://www.flickr.com/people/jseita/ 255cc92540462d11,https://c1.staticflickr.com/9/8621/29061797951_8e770decf8_o.jpg,0.0,0.25,0.75,1.0,786,551,https://www.flickr.com/photos/mig/29061797951,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/ 8f59677ee8f12cbd,https://c1.staticflickr.com/9/8782/29040754903_242deaa93d_o.jpg,0.4375,0.25,1.0,1.0,625,610,https://www.flickr.com/photos/publiclibrariesnsw/29040754903,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/ 37f7386a82f542c7,https://c1.staticflickr.com/1/428/31640670023_d9bb6276cb_o.jpg,0.25,0.0,1.0,0.684051724138,592,476,https://www.flickr.com/photos/phoebe_photo/31640670023,https://creativecommons.org/licenses/by/2.0/,Phoebe Baker,https://www.flickr.com/people/phoebe_photo/ 852e6b3080ab17d2,https://c1.staticflickr.com/1/288/32264250986_b0e60f8a74_o.jpg,0.0,0.25,0.736583184258,1.0,310,962,https://flickr.com/43272765@N04/32264250986,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 920cca78581d9f4c,https://c1.staticflickr.com/1/735/32127327552_fe9e52d6c8_o.jpg,0.0,0.25,0.599757673667,1.0,880,851,https://www.flickr.com/photos/stevendepolo/32127327552,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 092818c8c6c5982a,https://c1.staticflickr.com/6/5754/29593995264_76e9bc50f9_o.jpg,0.0,0.0,0.666666666667,1.0,718,120,https://www.flickr.com/photos/greggjerdingen/29593995264,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 771af14fce3fba43,https://c1.staticflickr.com/6/5476/30753183936_958193daae_o.jpg,0.28125,0.0,0.84375,0.75,820,911,https://www.flickr.com/photos/dhaun/30753183936/,https://creativecommons.org/licenses/by/2.0/,Dirk Haun,https://www.flickr.com/people/dhaun/ a8656992ebce4856,https://c1.staticflickr.com/2/1637/26140671534_d9daf08651_o.jpg,0.333333333333,0.0,1.0,1.0,976,894,https://www.flickr.com/photos/o_0/26140671534/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 5098cfb8c7073c11,https://c1.staticflickr.com/8/7495/27018332354_f199013190_o.jpg,0.0,0.0,0.75,0.5625,459,151,https://www.flickr.com/photos/atoach/27018332354,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ c31bf2a561660a48,https://c1.staticflickr.com/6/5755/30669717416_3011752a30_o.jpg,0.0,0.0,0.5,0.75,108,649,https://www.flickr.com/photos/u07ch/30669717416,https://creativecommons.org/licenses/by/2.0/,Chris Hoare,https://www.flickr.com/people/u07ch/ c873c43ba87746e4,https://c1.staticflickr.com/9/8630/28729485836_d91dcfb607_o.jpg,0.336764705882,0.0,1.0,1.0,647,396,https://www.flickr.com/photos/shankaronline/28729485836,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 43c9215ee68bc5d7,https://c1.staticflickr.com/9/8418/29823325382_be6a60cda5_o.jpg,0.25,0.25,0.75,1.0,985,159,https://www.flickr.com/photos/yann07/29823325382,https://creativecommons.org/licenses/by/2.0/,Yann C\305\223uru,https://www.flickr.com/people/yann07/ 50828d348b4b02e3,https://c1.staticflickr.com/8/7625/28370914165_a3ee0f995f_o.jpg,0.0,0.0,0.75,1.0,309,41,https://flickr.com/86548370@N00/28370914165,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 2605210b837b62c0,https://c1.staticflickr.com/6/5612/30458504186_56dac3ea08_o.jpg,0.0,0.25,0.524546827795,1.0,40,305,https://www.flickr.com/photos/puliarfanita/30458504186/,https://creativecommons.org/licenses/by/2.0/,Anita Ritenour,https://www.flickr.com/people/puliarfanita/ aa9bc11261d7a2ff,https://c1.staticflickr.com/8/7525/28250324241_42fcd989be_o.jpg,0.498153618907,0.25,1.0,1.0,848,801,https://www.flickr.com/photos/13476480@N07/28250324241,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 1717f691372b0819,https://c1.staticflickr.com/6/5577/31104154361_7f2f38526f_o.jpg,0.28125,0.0,0.84375,0.75,975,855,https://www.flickr.com/photos/jsjgeology/31104154361,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 31808e17e25f3752,https://c1.staticflickr.com/1/661/32365383110_a722efd9d5_o.jpg,0.25,0.428627760252,1.0,1.0,612,410,https://flickr.com/52107254@N05/32365383110,https://creativecommons.org/licenses/by/2.0/,Grace Hwu,https://www.flickr.com/people/sotghwu/ 2f97c75ea7a469ac,https://c1.staticflickr.com/9/8072/28779080532_522ea40971_o.jpg,0.0,0.25,0.5,1.0,620,530,https://www.flickr.com/photos/juggernautco/28779080532,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ 08453c8cf2a132ff,https://c1.staticflickr.com/9/8416/30393287656_d947c76460_o.jpg,0.0,0.0,0.510804769001,0.75,548,48,https://www.flickr.com/photos/belurashok/30393287656,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ eb6c759090300089,https://c1.staticflickr.com/8/7081/27209879421_10ba356c74_o.jpg,0.333333333333,0.0,1.0,1.0,402,793,https://www.flickr.com/photos/mwf2005/27209879421,https://creativecommons.org/licenses/by/2.0/,muffinn,https://www.flickr.com/people/mwf2005/ de9cd631e3f1bb3b,https://c1.staticflickr.com/6/5489/29879506755_eb432db4ca_o.jpg,0.25,0.0,0.75,0.75,443,855,https://www.flickr.com/photos/jlascar/29879506755/,https://creativecommons.org/licenses/by/2.0/,Jorge L\303\241scar,https://www.flickr.com/people/jlascar/ ce2f060a73fb9743,https://c1.staticflickr.com/1/694/32579057382_9bfe3c1ac7_o.jpg,0.0,0.25,0.5625,1.0,875,675,https://www.flickr.com/photos/69203347@N03/32579057382,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 29225ff6d19ebacd,https://c1.staticflickr.com/2/1476/26646359952_04816c536a_o.jpg,0.0,0.25,0.515344311377,1.0,407,40,https://www.flickr.com/photos/eltb/26646359952,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ da04a8e89336ef9c,https://c1.staticflickr.com/8/7695/26588583343_537a1a71fa_o.jpg,0.0,0.25,0.5,1.0,540,471,https://www.flickr.com/photos/dierkschaefer/26588583343/,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/ c6c1eb153349fd71,https://c1.staticflickr.com/9/8035/29700852775_6618412aae_o.jpg,0.0,0.0,0.802588996764,1.0,769,356,https://www.flickr.com/photos/dirkhansen/29700852775,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/ c4a0f75e6a0dcdab,https://c1.staticflickr.com/1/371/32356421506_ce717e0650_o.jpg,0.25,0.25,0.75,1.0,971,317,https://www.flickr.com/photos/davebloggs007/32356421506,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ a1a48d6b76aed9c7,https://c1.staticflickr.com/9/8505/28883283213_fb987bc869_o.jpg,0.0,0.0,1.0,0.831960461285,635,403,https://www.flickr.com/photos/kwarz/28883283213,https://creativecommons.org/licenses/by/2.0/,zeitfaenger.at,https://www.flickr.com/people/kwarz/ 080e84af4ff421bc,https://c1.staticflickr.com/6/5666/29641817484_7003c5ca5e_o.jpg,0.0,0.0,1.0,0.666666666667,459,796,https://www.flickr.com/photos/annaustin/29641817484/,https://creativecommons.org/licenses/by/2.0/,Anna Hanks,https://www.flickr.com/people/annaustin/ 28be9026c07a8fd6,https://c1.staticflickr.com/9/8768/28085160720_d38ef0ffe2_o.jpg,0.0,0.25,0.5,1.0,519,123,https://www.flickr.com/photos/box_repsol/28085160720,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 83d5a14d9ffa8eb1,https://c1.staticflickr.com/6/5664/30861030616_226717c7ff_o.jpg,0.280784844384,0.0,0.842354533153,1.0,976,626,http://www.flickr.com/photos/paalia/30861030616/,https://creativecommons.org/licenses/by/2.0/,Paul Stocker,https://www.flickr.com/people/paalia/ d3ceb2329adfe9a5,https://c1.staticflickr.com/9/8474/29199633881_56fc117997_o.jpg,0.0,0.0,0.75,0.503698224852,407,766,https://www.flickr.com/photos/eltb/29199633881,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ ea6b10138e655e0f,https://c1.staticflickr.com/6/5572/30334799742_da9f43616b_o.jpg,0.25,0.0,0.75,0.75,672,424,https://www.flickr.com/photos/blmoregon/30334799742,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 2fc2878b88ad6b2b,https://c1.staticflickr.com/8/7249/26376699344_c01f4b9896_o.jpg,0.25,0.0,1.0,1.0,556,439,https://www.flickr.com/photos/27665395@N05/26376699344,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ cf648fe7d2176bdc,https://c1.staticflickr.com/1/733/32562068886_2c8ef40172_o.jpg,0.312410841655,0.0,0.937232524964,1.0,986,397,https://www.flickr.com/photos/tdlucas5000/32562068886,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ 69720b5bb72880f7,https://c1.staticflickr.com/9/8568/30344899681_e1fc8222bd_o.jpg,0.25,0.0,0.75,0.75,146,492,https://www.flickr.com/photos/o_0/30344899681,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 895807aae38ee82c,https://c1.staticflickr.com/9/8639/28526148964_d4850cd58d_o.jpg,0.25,0.0,1.0,1.0,426,447,https://www.flickr.com/photos/crondeau/28526148964,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/ b2ea3efeec905a9f,https://c1.staticflickr.com/9/8890/28605143951_182e356e20_o.jpg,0.5,0.25,1.0,1.0,499,187,https://www.flickr.com/photos/cbroders/28605143951,https://creativecommons.org/licenses/by/2.0/,Counse,https://www.flickr.com/people/cbroders/ 1281b9ec06ee7ea6,https://c1.staticflickr.com/6/5326/30880259920_6732d53b03_o.jpg,0.0,0.25,0.462765957447,1.0,695,447,https://www.flickr.com/photos/hisgett/30880259920/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ e13257fa72f9d0f8,https://c1.staticflickr.com/8/7158/27087600992_3f521b8e06_o.jpg,0.438430311231,0.0,1.0,1.0,498,896,https://www.flickr.com/photos/mark-gunn/27087600992,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ bb79e91249a0870c,https://c1.staticflickr.com/9/8158/28938349365_ea8f93db1a_o.jpg,0.0,0.0,0.739130434783,1.0,456,847,https://www.flickr.com/photos/hinkelstone/28938349365,https://creativecommons.org/licenses/by/2.0/,Karl-Ludwig Poggemann,https://www.flickr.com/people/hinkelstone/ 7d38e5523a5d5656,https://c1.staticflickr.com/3/2069/32678434991_7b325511b0_o.jpg,0.0,0.0,0.666666666667,1.0,404,70,https://www.flickr.com/photos/usnavy/32678434991,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 75b516f2f1ee9163,https://c1.staticflickr.com/8/7360/27317635511_104e050e50_o.jpg,0.0,0.0,0.421177266576,0.75,833,77,https://www.flickr.com/photos/ankurp/27317635511,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ 9296cc676dd39564,https://c1.staticflickr.com/9/8348/28325633061_5f3e78c0d4_o.jpg,0.306985294118,0.0,0.920955882353,0.75,815,820,https://www.flickr.com/photos/dangrothe/28325633061,https://creativecommons.org/licenses/by/2.0/,Daniel Grothe,https://www.flickr.com/people/dangrothe/ e826a9302605cd52,https://c1.staticflickr.com/9/8573/28906202873_b1ece8e79f_o.jpg,0.0,0.25,0.504444444444,1.0,561,228,https://www.flickr.com/photos/jill_carlson/28906202873/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ ca7099ba7e889162,https://c1.staticflickr.com/2/1479/26178206403_111aff1b1c_o.jpg,0.28125,0.0,0.84375,0.75,780,555,https://www.flickr.com/photos/119034083@N02/26178206403,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/ 0b491af542f7ffd9,https://c1.staticflickr.com/6/5681/31419344116_b398ef6521_o.jpg,0.0,0.0,0.75,1.0,986,998,https://flickr.com/125734989@N03/31419344116,https://creativecommons.org/licenses/by/2.0/,Tu\341\272\245n An,https://www.flickr.com/people/125734989@N03/ 41b367f57b6da354,https://c1.staticflickr.com/1/276/32309427916_f8489035e8_o.jpg,0.4375,0.25,1.0,1.0,108,676,https://www.flickr.com/photos/jimg944/32309427916,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 0b3e55f4f58ece40,https://c1.staticflickr.com/9/8424/29940355582_76d4cfbc92_o.jpg,0.0,0.25,0.75,1.0,600,882,https://www.flickr.com/photos/ryanrocketship/29940355582,https://creativecommons.org/licenses/by/2.0/,Ryan Ruppe,https://www.flickr.com/people/ryanrocketship/ 08fc91166bd0c709,https://c1.staticflickr.com/9/8193/29002397180_ffc3fd5978_o.jpg,0.5,0.25,1.0,1.0,457,35,https://www.flickr.com/photos/b-j-oe-r-n/29002397180/,https://creativecommons.org/licenses/by/2.0/,Bj\303\266rn Rudner,https://www.flickr.com/people/b-j-oe-r-n/ b57c41ba26a0b986,https://c1.staticflickr.com/8/7320/27939723092_65e625efb5_o.jpg,0.11073253833,0.0,1.0,1.0,986,45,https://www.flickr.com/photos/29233640@N07/27939723092,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ 38f5a375cb13f34d,https://c1.staticflickr.com/9/8879/28714081425_9fce7f78ed_o.jpg,0.5,0.25,1.0,1.0,367,827,https://www.flickr.com/photos/hirlimann/28714081425,https://creativecommons.org/licenses/by/2.0/,Ludovic Hirlimann,https://www.flickr.com/people/hirlimann/ f53395c5f78ae587,https://c1.staticflickr.com/8/7134/27080802626_d88a1ecd23_o.jpg,0.0,0.0,0.75,1.0,479,475,https://www.flickr.com/photos/rusty_clark/27080802626,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 843282d597cbb732,https://c1.staticflickr.com/9/8022/28739516601_22e520a6fa_o.jpg,0.0,0.25,0.561328125,1.0,305,132,https://www.flickr.com/photos/treegrow/28739516601,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 7ec06f818f54c205,https://c1.staticflickr.com/1/639/32146846790_b1d654dfd8_o.jpg,0.369205298013,0.25,1.0,1.0,662,976,https://www.flickr.com/photos/jlcernadas/32146846790/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ 82adc75ee7644ed0,https://c1.staticflickr.com/8/7576/27849526600_7f96d6639b_o.jpg,0.0,0.25,0.549459041731,1.0,324,793,https://www.flickr.com/photos/usfwsmidwest/27849526600,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ d67d5b9e6dec4a70,https://c1.staticflickr.com/9/8199/29000937046_f82b0cb579_o.jpg,0.25,0.25,1.0,1.0,944,860,https://www.flickr.com/photos/wwworks/29000937046,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ f35981e6a0f004a5,https://c1.staticflickr.com/1/436/31515730173_119b45d974_o.jpg,0.0,0.0,0.5,0.75,40,700,https://www.flickr.com/photos/thomasjhannigan/31515730173,https://creativecommons.org/licenses/by/2.0/,Tom Hannigan,https://www.flickr.com/people/thomasjhannigan/ ecaaedfeb274cddb,https://c1.staticflickr.com/6/5563/30625931284_b7ae5ef4cb_o.jpg,0.0,0.0,1.0,0.97153024911,780,340,https://www.flickr.com/photos/thoseguys119/30625931284/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 621dcaab311223ba,https://c1.staticflickr.com/6/5662/30733306236_c9472f2864_o.jpg,0.28125,0.25,0.84375,1.0,875,731,https://www.flickr.com/photos/27665395@N05/30733306236,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ cb17fa667332aac3,https://c1.staticflickr.com/8/7605/27371016364_afbb0a6dbe_o.jpg,0.0,0.25,0.5625,1.0,629,586,https://www.flickr.com/photos/crocieristi/27371016364,https://creativecommons.org/licenses/by/2.0/,Carlo Mirante,https://www.flickr.com/people/crocieristi/ 3b69f49f024116fc,https://c1.staticflickr.com/1/714/31171861424_5a5617153d_o.jpg,0.43661971831,0.25,1.0,1.0,130,124,https://www.flickr.com/photos/rusty_clark/31171861424,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ c592398cdcd493a5,https://c1.staticflickr.com/9/8262/29508132101_4108122796_o.jpg,0.0,0.25,0.75,1.0,786,742,https://www.flickr.com/photos/mig/29508132101/,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/ 421a948ee9a80f0e,https://c1.staticflickr.com/1/579/31523298460_b1f6ec1def_o.jpg,0.438430311231,0.0,1.0,1.0,931,571,https://www.flickr.com/photos/jeffreyww/31523298460,https://creativecommons.org/licenses/by/2.0/,jeffreyw,https://www.flickr.com/people/jeffreyww/ d095bb06d6ad44b8,https://c1.staticflickr.com/9/8167/29732411705_fa2a3ee5a5_o.jpg,0.0,0.25,0.69150779896,1.0,558,136,https://www.flickr.com/photos/duncanh1/29732411705,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 90d3f81e621b293e,https://c1.staticflickr.com/8/7513/27399900161_6f53c78564_o.jpg,0.333333333333,0.0,1.0,1.0,310,903,https://www.flickr.com/photos/dynphoto/27399900161,https://creativecommons.org/licenses/by/2.0/,Dyn Photo,https://www.flickr.com/people/dynphoto/ c9fce44b8d67afe1,https://c1.staticflickr.com/9/8349/29359078094_49183bb4ea_o.jpg,0.0,0.0945017182131,1.0,1.0,457,308,https://www.flickr.com/photos/col_and_tasha/29359078094,https://creativecommons.org/licenses/by/2.0/,Col Ford and Natasha de Vere,https://www.flickr.com/people/col_and_tasha/ 733e7043d93f83ca,https://c1.staticflickr.com/9/8738/27834808194_97e5a2b7a1_o.jpg,0.25,0.0,1.0,1.0,512,485,https://www.flickr.com/photos/rsanajong/27834808194,https://creativecommons.org/licenses/by/2.0/,Ruth San,https://www.flickr.com/people/rsanajong/ ba4373e3f59af4a0,https://c1.staticflickr.com/9/8711/27980786170_447dac7067_o.jpg,0.497426470588,0.25,0.994852941176,1.0,625,914,https://www.flickr.com/photos/vvbad/27980786170,https://creativecommons.org/licenses/by/2.0/,VVBAD,https://www.flickr.com/people/vvbad/ 20ac8849cd117b3d,https://c1.staticflickr.com/9/8669/28431512451_f5f071c93d_o.jpg,0.28125,0.0,0.84375,0.75,428,350,https://www.flickr.com/photos/londonmatt/28431512451,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 4d05d6759e6bbea0,https://c1.staticflickr.com/8/7351/27384369951_51a4eb11e0_o.jpg,0.0,0.25,0.5625,1.0,875,333,https://www.flickr.com/photos/wltmauc/27384369951,https://creativecommons.org/licenses/by/2.0/,Aubrey Morandarte,https://www.flickr.com/people/wltmauc/ d7049fcdaac68ecb,https://c1.staticflickr.com/8/7649/27765706161_76b96c6ef0_o.jpg,0.331130690162,0.0,0.993392070485,1.0,484,880,https://www.flickr.com/photos/sybarite48/27765706161,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 3f2ff80c87db61c7,https://c1.staticflickr.com/9/8393/29775669361_009cb8405d_o.jpg,0.0,0.25,0.75,1.0,631,887,https://www.flickr.com/photos/85546319@N04/29775669361,https://creativecommons.org/licenses/by/2.0/,Robert Sheie,https://www.flickr.com/people/85546319@N04/ 8ec955279d3c6e36,https://c1.staticflickr.com/6/5493/30575524842_6f7e6737f1_o.jpg,0.333333333333,0.0,1.0,1.0,896,498,https://www.flickr.com/photos/ministeriodedefensaperu/30575524842,https://creativecommons.org/licenses/by/2.0/,Galeria del Ministerio de Defensa del Per\303\272,https://www.flickr.com/people/ministeriodedefensaperu/ b44aed3a2c49bd26,https://c1.staticflickr.com/9/8359/28821368104_b41b4a0028_o.jpg,0.25,0.25,0.75,1.0,971,66,https://www.flickr.com/photos/phalaenopsisaphrodite523/28821368104,https://creativecommons.org/licenses/by/2.0/,Francesca Cappa,https://www.flickr.com/people/phalaenopsisaphrodite523/ bae442721bb0e3ab,https://c1.staticflickr.com/9/8559/29245860155_05e62df601_o.jpg,0.0,0.28125,0.75,0.84375,539,549,https://www.flickr.com/photos/neu318/29245860155/,https://creativecommons.org/licenses/by/2.0/,Jorge de la Llama,https://www.flickr.com/people/neu318/ 15177f5c6296a584,https://c1.staticflickr.com/8/7455/27103205752_218c57f4a2_o.jpg,0.470789074355,0.0,1.0,0.75,896,979,https://www.flickr.com/photos/ronmacphotos/27103205752,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 884e9f571fd83de2,https://c1.staticflickr.com/2/1554/26658449942_fd427d848f_o.jpg,0.0,0.0,0.5,0.75,826,22,https://flickr.com/141187322@N06/26658449942,https://creativecommons.org/licenses/by/2.0/,KayRetired,https://www.flickr.com/people/141187322@N06/ 19d19504fb4a3f8f,https://c1.staticflickr.com/6/5452/30654015815_fba453d886_o.jpg,0.248713235294,0.25,0.746139705882,1.0,581,867,https://www.flickr.com/photos/taniwha/30654015815/,https://creativecommons.org/licenses/by/2.0/,Br3nda,https://www.flickr.com/people/taniwha/ 5ef849fc4feb9459,https://c1.staticflickr.com/8/7294/27203310790_26c7ec64d2_o.jpg,0.0,0.0,0.296590909091,0.75,980,565,https://www.flickr.com/photos/aryehalex/27203310790,https://creativecommons.org/licenses/by/2.0/,Aryeh Alex,https://www.flickr.com/people/aryehalex/ 9eafc3680ef735a3,https://c1.staticflickr.com/1/762/32445436676_d4f63261a4_o.jpg,0.234978540773,0.0,0.704935622318,0.75,93,812,https://www.flickr.com/photos/dkeats/32445436676,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ c54d9d576a077722,https://c1.staticflickr.com/8/7504/29539752324_0a97b37e7d_o.jpg,0.0,0.0,0.666666666667,1.0,874,758,https://www.flickr.com/photos/markusspiske/29539752324,https://creativecommons.org/licenses/by/2.0/,Markus Spiske,https://www.flickr.com/people/markusspiske/ ab1da57dc73af11f,https://c1.staticflickr.com/8/7549/28062009672_bda3a3dfc4_o.jpg,0.0,0.0,0.75,0.75,704,87,https://www.flickr.com/photos/hendrikwieduwilt/28062009672,https://creativecommons.org/licenses/by/2.0/,Hendrik Wieduwilt,https://www.flickr.com/people/hendrikwieduwilt/ 66289ced86959b55,https://c1.staticflickr.com/8/7305/26967083915_f906ea57ab_o.jpg,0.5,0.25,1.0,1.0,752,926,https://www.flickr.com/photos/joe_labrie_photographe/26967083915,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/ 3a521bd7aee61d11,https://c1.staticflickr.com/6/5719/30852469481_201995f74c_o.jpg,0.0,0.25,0.561328125,1.0,540,542,https://www.flickr.com/photos/southbeachcars/30852469481,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ ba2bed779882997f,https://c1.staticflickr.com/8/7493/26956468191_3cd61bc2fc_o.jpg,0.5,0.25,1.0,1.0,833,77,https://www.flickr.com/photos/123835587@N04/26956468191/,https://creativecommons.org/licenses/by/2.0/,Justin Raycraft,https://www.flickr.com/people/123835587@N04/ 674f7b59808a92d3,https://c1.staticflickr.com/6/5546/30297814024_0040ba10e4_o.jpg,0.25,0.0,0.75,0.75,729,813,https://www.flickr.com/photos/comedynose/30297814024,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/ 44ccb5aa5ed7f50f,https://c1.staticflickr.com/9/8480/29644572925_3d70064905_o.jpg,0.25,0.0,1.0,0.501846381093,999,561,https://www.flickr.com/photos/vastateparksstaff/29644572925,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 3522bf2abd44efd8,https://c1.staticflickr.com/9/8227/29278408452_ca0d70003e_o.jpg,0.5,0.0,1.0,0.75,604,147,https://www.flickr.com/photos/134741223@N04/29278408452,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/ dc0bd508e4fdb97d,https://c1.staticflickr.com/8/7556/27841568901_52762f3021_o.jpg,0.333333333333,0.0,1.0,1.0,548,425,https://www.flickr.com/photos/rhemkes/27841568901,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ b7d817561de999ee,https://c1.staticflickr.com/3/2622/32279907963_2731533a7e_o.jpg,0.25,0.5,1.0,1.0,647,943,https://www.flickr.com/photos/art_inthecity/32279907963,https://creativecommons.org/licenses/by/2.0/,art_inthecity,https://www.flickr.com/people/art_inthecity/ 8e8c3bfb94c534b4,https://c1.staticflickr.com/9/8081/29455694985_bfddb58b13_o.jpg,0.25,0.0,1.0,0.75,820,399,https://www.flickr.com/photos/stephanski/29455694985,https://creativecommons.org/licenses/by/2.0/,Stephan Hochhaus,https://www.flickr.com/people/stephanski/ 35ec4b8826601287,https://c1.staticflickr.com/6/5522/31114175862_11363e3c13_o.jpg,0.0,0.0,0.75,1.0,652,681,https://www.flickr.com/photos/andydr/31114175862,https://creativecommons.org/licenses/by/2.0/,Andrew Ratto,https://www.flickr.com/people/andydr/ 345db4b138d1d5ee,https://c1.staticflickr.com/9/8862/28856215882_36bbaa4862_o.jpg,0.226984126984,0.0,1.0,1.0,612,812,https://www.flickr.com/photos/andyarthur/28856215882,https://creativecommons.org/licenses/by/2.0/,Andy Arthur,https://www.flickr.com/people/andyarthur/ ffef4dd4b93b672a,https://c1.staticflickr.com/8/7552/27097150551_7a543c0143_o.jpg,0.311253561254,0.0,0.933760683761,1.0,559,969,https://www.flickr.com/photos/toussaintconseil/27097150551,https://creativecommons.org/licenses/by/2.0/,Glonadine,https://www.flickr.com/people/toussaintconseil/ a01b650e7cc9d959,https://c1.staticflickr.com/8/7719/27800830305_a3accb28de_o.jpg,0.0,0.500736377025,0.75,1.0,842,684,https://www.flickr.com/photos/worldskillsteamuk/27800830305,https://creativecommons.org/licenses/by/2.0/,WorldSkills UK,https://www.flickr.com/people/worldskillsteamuk/ 37b5c59e52011801,https://c1.staticflickr.com/4/3090/3195790760_5355cb7e72_o.jpg,0.0,0.0,0.678571428571,1.0,830,748,https://www.flickr.com/photos/davidwilson1949/3195790760,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 4be81b675b8e129a,https://c1.staticflickr.com/8/7356/27806524135_34767941ed_o.jpg,0.497426470588,0.25,0.994852941176,1.0,820,804,https://www.flickr.com/photos/agenciabrasilia/27806524135,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 3a6fe666cdb93bc8,https://c1.staticflickr.com/8/7250/27761888672_7cba8864a8_o.jpg,0.25,0.0,1.0,0.531155015198,688,819,https://www.flickr.com/photos/dalbera/27761888672,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 44fcd78843219bb2,https://c1.staticflickr.com/8/7158/26893210830_88e518167e_o.jpg,0.0,0.412939297125,0.75,1.0,702,703,https://www.flickr.com/photos/texaus1/26893210830/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ 41356f6242a7044e,https://c1.staticflickr.com/8/7434/27115854595_d179284daa_o.jpg,0.248348017621,0.0,0.745044052863,0.75,100,915,https://www.flickr.com/photos/usfwsmidwest/27115854595,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ aa17dfdac249291a,https://c1.staticflickr.com/9/8783/28845140625_e01129bf0d_o.jpg,0.421177266576,0.0,0.842354533153,0.75,875,682,https://www.flickr.com/photos/102010851@N02/28845140625,https://creativecommons.org/licenses/by/2.0/,EastLondoner,https://www.flickr.com/people/102010851@N02/ e75c42a0c5d43067,https://c1.staticflickr.com/9/8271/30254566246_2203f09f40_o.jpg,0.578822733424,0.0,1.0,0.75,348,284,https://www.flickr.com/photos/larry1732/30254566246,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ a37df1410c95fcb1,https://c1.staticflickr.com/8/7467/27162381975_66abbac267_o.jpg,0.28125,0.25,0.84375,1.0,437,299,https://www.flickr.com/photos/nzcarfreak/27162381975,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ c4ae3effff7d7b58,https://c1.staticflickr.com/9/8271/29310863194_8d223ae7dd_o.jpg,0.25,0.25,1.0,1.0,769,839,https://www.flickr.com/photos/124962693@N07/29310863194,https://creativecommons.org/licenses/by/2.0/,Samuel Ab\303\244cherli,https://www.flickr.com/people/abaecherliphotography/ ba463d52a4710bca,https://c1.staticflickr.com/9/8463/28683623145_b6cff04704_o.jpg,0.25,0.25,0.75,1.0,638,667,https://www.flickr.com/photos/elsie/28683623145/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 39a748dc7a3d964a,https://c1.staticflickr.com/6/5475/30977606640_cac48fe32b_o.jpg,0.0,0.25,0.407456724368,1.0,972,211,https://flickr.com/95611897@N07/30977606640,https://creativecommons.org/licenses/by/2.0/,Monica Valentine,https://www.flickr.com/people/mrvishere/ dd94cf0d2ea23ba0,https://c1.staticflickr.com/8/7634/26763706346_d5514db485_o.jpg,0.0,0.25,0.391134289439,1.0,922,757,https://www.flickr.com/photos/13476480@N07/26763706346,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 485083d9858ee92d,https://c1.staticflickr.com/9/8875/28648949680_df4648cd14_o.jpg,0.25,0.0,1.0,0.75,633,565,https://www.flickr.com/photos/sparkfun/28648949680,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/ a84245835f36d314,https://c1.staticflickr.com/1/278/31991337321_8516591ff9_o.jpg,0.237949640288,0.25,0.713848920863,1.0,875,702,https://www.flickr.com/photos/didbygraham/31991337321,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ a433dbbf64eabff5,https://c1.staticflickr.com/9/8190/29020061046_319fda7645_o.jpg,0.28125,0.25,0.84375,1.0,875,425,http://www.flickr.com/photos/ww1photos/29020061046/,https://creativecommons.org/licenses/by/2.0/,Jane Jones,https://www.flickr.com/people/ww1photos/ 51bd174c6af19d7e,https://c1.staticflickr.com/8/7761/26262944403_aa86481599_o.jpg,0.4375,0.25,1.0,1.0,730,798,https://www.flickr.com/photos/shankaronline/26262944403,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ a40071ec26435025,https://c1.staticflickr.com/9/8275/29384944121_67a39cc629_o.jpg,0.5,0.0,1.0,0.75,985,831,https://www.flickr.com/photos/63122283@N06/29384944121,https://creativecommons.org/licenses/by/2.0/,Nelo Hotsuma,https://www.flickr.com/people/63122283@N06/ 4508280660cef26f,https://c1.staticflickr.com/8/7502/27681843185_9258ae802b_o.jpg,0.279141104294,0.0,1.0,1.0,896,722,https://www.flickr.com/photos/13476480@N07/27681843185,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ ba2388c5818dc5e8,https://c1.staticflickr.com/6/5487/30651045523_a4ba0898c3_o.jpg,0.578822733424,0.25,1.0,1.0,629,253,http://www.flickr.com/photos/crocieristi/30651045523/,https://creativecommons.org/licenses/by/2.0/,Carlo Mirante,https://www.flickr.com/people/crocieristi/ 9d25701c69713071,https://c1.staticflickr.com/9/8103/29246314865_c8948e9776_o.jpg,0.25,0.0,1.0,0.5,777,260,https://www.flickr.com/photos/usarmyband/29246314865/,https://creativecommons.org/licenses/by/2.0/,The United States Army Band,https://www.flickr.com/people/usarmyband/ 01f7e845b4bb6858,https://c1.staticflickr.com/8/7792/27085754636_2685ffd98b_o.jpg,0.28125,0.25,0.84375,1.0,871,836,https://www.flickr.com/photos/ewolivera/27085754636,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ 648072f37bcdd6ae,https://c1.staticflickr.com/9/8531/29525291730_3b2c7b8706_o.jpg,0.395150720839,0.0,0.790301441678,0.75,629,414,https://www.flickr.com/photos/zongo/29525291730,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 08d4d6367652408d,https://c1.staticflickr.com/8/7346/27611303280_ea821aee4c_o.jpg,0.28125,0.25,0.84375,1.0,610,590,https://www.flickr.com/photos/thenationalguard/27611303280,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ 0843587aeeed537c,https://c1.staticflickr.com/8/7010/26360186874_8a87624db1_o.jpg,0.25,0.0,1.0,1.0,90,275,https://www.flickr.com/photos/zeevveez/26360186874,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ e0c8a54b9089b71f,https://c1.staticflickr.com/9/8893/28391004082_5502350087_o.jpg,0.267938931298,0.25,0.803816793893,1.0,95,470,https://www.flickr.com/photos/usfwsmtnprairie/28391004082,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 12adcb247798eccb,https://c1.staticflickr.com/6/5748/30530295911_3f908cf6e2_o.jpg,0.25,0.0,0.75,0.75,560,551,https://www.flickr.com/photos/am1974/30530295911,https://creativecommons.org/licenses/by/2.0/,Artur Malinowski,https://www.flickr.com/people/am1974/ 3f3fdf6909d02648,https://c1.staticflickr.com/6/5635/30327965204_1743b182f0_o.jpg,0.0,0.330871491876,1.0,1.0,688,871,https://www.flickr.com/photos/eltb/30327965204,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ d3c293a5432c1467,https://c1.staticflickr.com/9/8411/29217652146_28730ddf61_o.jpg,0.249079528719,0.25,0.747238586156,1.0,830,903,https://www.flickr.com/photos/97934454@N06/29217652146,https://creativecommons.org/licenses/by/2.0/,danielhak,https://www.flickr.com/people/97934454@N06/ 0cda86f27b9c06d3,https://c1.staticflickr.com/1/361/32357946790_e058b399e6_o.jpg,0.0,0.25,0.421177266576,1.0,875,746,https://www.flickr.com/photos/9759010@N07/32357946790,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/ bf9db7779061b1fe,https://c1.staticflickr.com/8/7080/27520678742_94c6271095_o.jpg,0.250923190547,0.0,0.75276957164,0.75,459,901,https://www.flickr.com/photos/jorge-11/27520678742,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/ 20e2fd13ef9cf574,https://c1.staticflickr.com/9/8875/29774562686_3b806b5f0b_o.jpg,0.0,0.0,0.663235294118,1.0,311,696,https://www.flickr.com/photos/95230066@N07/29774562686/,https://creativecommons.org/licenses/by/2.0/,British Pest Control Association,https://www.flickr.com/people/95230066@N07/ f80a82a2f8246daa,https://c1.staticflickr.com/6/5564/30851389850_2225a12fa0_o.jpg,0.250923190547,0.25,0.75276957164,1.0,704,790,https://www.flickr.com/photos/79157069@N03/30851389850,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ 14b8551ab09247f1,https://c1.staticflickr.com/9/8489/29640246375_f249f48ed7_o.jpg,0.25,0.0,0.75,0.75,896,516,https://www.flickr.com/photos/markyharky/29640246375,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ aed5fe49871fb602,https://c1.staticflickr.com/9/8570/26676446682_5b8f3df8ef_o.jpg,0.0,0.25,0.75,1.0,820,427,https://www.flickr.com/photos/bjoern/26676446682,https://creativecommons.org/licenses/by/2.0/,bjoern,https://www.flickr.com/people/bjoern/ 20443c017b395b1a,https://c1.staticflickr.com/3/2327/32703994062_55cc6f8501_o.jpg,0.25,0.25,1.0,1.0,669,886,https://www.flickr.com/photos/mrsdkrebs/32703994062/,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/ 4a47643e0cbec878,https://c1.staticflickr.com/1/738/32754348005_26a1521c37_o.jpg,0.25,0.0,0.75,0.75,477,751,http://www.flickr.com/photos/148039650@N02/32754348005,https://creativecommons.org/licenses/by/2.0/,Rasul RAUMA,https://www.flickr.com/people/148039650@N02/ f1f10c7f021c34f1,https://c1.staticflickr.com/9/8712/28277395334_c493239c54_o.jpg,0.22009569378,0.0,1.0,1.0,85,387,https://flickr.com/124436036@N03/28277395334,https://creativecommons.org/licenses/by/2.0/,Raveendra Jayashantha,https://www.flickr.com/people/raveejaya/ fd524559c4495d3f,https://c1.staticflickr.com/9/8322/29115437495_65f89408d3_o.jpg,0.25,0.25,0.75,1.0,896,892,https://www.flickr.com/photos/ronmacphotos/29115437495,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 28673788d6d3a60c,https://c1.staticflickr.com/6/5593/30254805131_42df3b7485_o.jpg,0.0,0.243095930233,0.75,0.729287790698,888,515,https://www.flickr.com/photos/eltb/30254805131,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ e885199cada243d0,https://c1.staticflickr.com/1/468/31749576282_e2efcfe9e3_o.jpg,0.296147672552,0.0,0.888443017657,0.75,923,387,https://flickr.com/68716054@N00/31749576282,https://creativecommons.org/licenses/by/2.0/,Ro\315\254\315\254\315\240\315\240\315\241\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240s\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240a\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240 Menkman,https://www.flickr.com/people/r00s/ 715cc5844ea4610f,https://c1.staticflickr.com/8/7711/26822564273_5e3124dafa_o.jpg,0.500736377025,0.0,1.0,0.75,711,740,https://www.flickr.com/photos/143676616@N05/26822564273,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 76b6198d4d51562e,https://c1.staticflickr.com/8/7362/27888840622_6b62ce584f_o.jpg,0.415322580645,0.0,0.83064516129,0.75,896,789,https://www.flickr.com/photos/13476480@N07/27888840622,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ d1d5352856991fb2,https://c1.staticflickr.com/9/8142/29237897450_f66ddca483_o.jpg,0.25,0.25,1.0,0.75,653,565,https://flickr.com/8269539@N04/29237897450,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ fa9c42057a5307ad,https://c1.staticflickr.com/6/5552/30739511221_fb3fe23ebe_o.jpg,0.0,0.25,0.75,0.75,777,840,https://flickr.com/129351189@N08/30739511221,https://creativecommons.org/licenses/by/2.0/,Feria del Libro Ricardo Palma,https://www.flickr.com/people/feriaricardopalma/ 8cdd2c5a83ebe45d,https://c1.staticflickr.com/1/352/31382012173_5083819142_o.jpg,0.437669376694,0.0,1.0,1.0,581,126,https://www.flickr.com/photos/comedynose/31382012173,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/ c711349016578f1c,https://c1.staticflickr.com/1/620/32248387266_9752e1e58d_o.jpg,0.0,0.25,0.75,1.0,921,594,https://flickr.com/53301297@N00/32248387266,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ f2ca5edd0642ec45,https://c1.staticflickr.com/6/5756/29929006834_47c47b660c_o.jpg,0.5,0.0,1.0,0.75,607,582,https://flickr.com/137479669@N05/29929006834,https://creativecommons.org/licenses/by/2.0/,Milton Keynes Museum,https://www.flickr.com/people/mkmuseum/ 87743e32802dd7a7,https://c1.staticflickr.com/1/339/32216988033_e4d18c4805_o.jpg,0.4375,0.25,1.0,1.0,904,935,https://www.flickr.com/photos/garryknight/32216988033,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ 3989a0847481e163,https://c1.staticflickr.com/1/474/32401038240_fb5fd06095_o.jpg,0.262096774194,0.0,1.0,0.75,799,918,https://www.flickr.com/photos/51764518@N02/32401038240,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 77f164cf9db76f09,https://c1.staticflickr.com/9/8108/29204038206_6047cc58ae_o.jpg,0.493045387994,0.0,0.986090775988,0.75,694,706,https://www.flickr.com/photos/144833373@N06/29204038206/,https://creativecommons.org/licenses/by/2.0/,World Rowing Championships,https://www.flickr.com/people/144833373@N06/ b21eb8444933ba74,https://c1.staticflickr.com/8/7300/27380302823_69e3a616bc_o.jpg,0.0,0.25,0.598790322581,1.0,664,765,https://www.flickr.com/photos/sybarite48/27380302823,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 9a1f83edfdf2a408,https://c1.staticflickr.com/6/5529/30770277271_d5f6d34e6f_o.jpg,0.254464285714,0.0,0.763392857143,0.75,141,194,https://www.flickr.com/photos/usfwsmidwest/30770277271,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 74e357a88ff94a07,https://c1.staticflickr.com/6/5487/30156644213_bd0e22d1b8_o.jpg,0.25,0.0,0.75,0.75,978,544,https://www.flickr.com/photos/alexbalzanella/30156644213/,https://creativecommons.org/licenses/by/2.0/,Alex Balzanella,https://www.flickr.com/people/alexbalzanella/ 55ed9483245c673c,https://c1.staticflickr.com/6/5570/30386992654_3b519dce00_o.jpg,0.64768683274,0.0,0.97153024911,0.75,780,931,https://www.flickr.com/photos/thoseguys119/30386992654/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f30e7bbbea617fcd,https://c1.staticflickr.com/6/5671/31383339865_339bec2ee0_o.jpg,0.493694362018,0.0,1.0,0.75,854,460,https://www.flickr.com/photos/13476480@N07/31383339865/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ b2d2abae235f1ba8,https://c1.staticflickr.com/1/757/30969345234_af04fefa32_o.jpg,0.0,0.0,0.75,0.568396226415,755,413,https://www.flickr.com/photos/51764518@N02/30969345234,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 7e6e5dd2d64f09b4,https://c1.staticflickr.com/9/8550/29525655001_2ce702423b_o.jpg,0.5,0.0,1.0,0.75,561,502,https://flickr.com/57511216@N04/29525655001,https://creativecommons.org/licenses/by/2.0/,Daniel,https://www.flickr.com/people/57511216@N04/ c9421d0f01f06128,https://c1.staticflickr.com/1/570/32685883375_3e62518cde_o.jpg,0.0,0.0,0.75,0.75,663,498,https://www.flickr.com/photos/sparkfun/32685883375,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/ 0a5a40e34c53246e,https://c1.staticflickr.com/9/8539/29437931322_aca0e1697a_o.jpg,0.25,0.0,1.0,0.75,498,213,https://www.flickr.com/photos/83015819@N00/29437931322,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/ 9622dd5fe518a3c8,https://c1.staticflickr.com/8/7437/27215745213_97ba084bd8_o.jpg,0.28125,0.25,0.84375,1.0,780,352,https://www.flickr.com/photos/thoseguys119/27215745213,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ cfdfa6e881689ffd,https://c1.staticflickr.com/6/5462/31252626776_98fa27d99c_o.jpg,0.0,0.0,0.75,0.75,672,858,https://www.flickr.com/photos/glorycycles/31252626776,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 6a2c70c10ec98aa9,https://c1.staticflickr.com/6/5820/30619778402_ee2a7940d2_o.jpg,0.25,0.25,1.0,0.75,725,705,https://www.flickr.com/photos/big-ashb/30619778402/,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/ 71445da10dc28475,https://c1.staticflickr.com/1/469/31909526470_ba30bd4195_o.jpg,0.25,0.25,0.75,1.0,721,161,https://www.flickr.com/photos/vzbv_de/31909526470,https://creativecommons.org/licenses/by/2.0/,Verbraucherzentrale Bundesverband,https://www.flickr.com/people/vzbv_de/ 775e08a934201ee6,https://c1.staticflickr.com/9/8279/29847648686_07c8963e83_o.jpg,0.0,0.0,0.666666666667,1.0,348,774,https://www.flickr.com/photos/o_0/29847648686,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 02b847a6e0f27405,https://c1.staticflickr.com/3/2797/32702689612_f6040606e1_o.jpg,0.4375,0.0,1.0,0.75,418,767,http://www.flickr.com/photos/pulencio/32702689612/,https://creativecommons.org/licenses/by/2.0/,Pulencio,https://www.flickr.com/people/pulencio/ 84f0657453e1a0d3,https://c1.staticflickr.com/9/8244/29405427562_f455716e3a_o.jpg,0.0,0.0,0.5,0.75,563,497,https://www.flickr.com/photos/soso__1991/29405427562/,https://creativecommons.org/licenses/by/2.0/,SALoOM,https://www.flickr.com/people/soso__1991/ 790dee2e3edd6ad1,https://c1.staticflickr.com/6/5546/31328503322_8d77867d21_o.jpg,0.445652173913,0.0,1.0,0.75,972,673,https://flickr.com/22592971@N04/31328503322,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ 7d0850c4c0afc9cb,https://c1.staticflickr.com/8/7388/27210334620_e00616a48f_o.jpg,0.25,0.25,0.75,1.0,461,41,https://www.flickr.com/photos/allthishappiness/27210334620,https://creativecommons.org/licenses/by/2.0/,kater,https://www.flickr.com/people/allthishappiness/ 70dd1a97d4663a72,https://c1.staticflickr.com/6/5521/31101799446_246d0a71b9_o.jpg,0.0,0.0,0.666666666667,1.0,519,489,https://www.flickr.com/photos/box_repsol/31101799446,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 6ec273991aff4793,https://c1.staticflickr.com/8/7692/29235770415_f2f60be9ae_o.jpg,0.25,0.0,1.0,0.75,471,544,https://www.flickr.com/photos/stevendepolo/29235770415,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 80fe66caea074891,https://c1.staticflickr.com/8/7235/27665655161_4e8b1bc93b_o.jpg,0.500736377025,0.25,1.0,1.0,561,979,https://www.flickr.com/photos/132774913@N06/27665655161,https://creativecommons.org/licenses/by/2.0/,Winnipeg Blue Bombers,https://www.flickr.com/people/132774913@N06/ e6076758f0c3c5f8,https://c1.staticflickr.com/9/8390/28681356530_e17d714bb6_o.jpg,0.0,0.25,0.35861423221,1.0,826,508,https://flickr.com/64337707@N07/28681356530,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/ 0ab42873bae1b88e,https://c1.staticflickr.com/4/3806/33360835281_c6c24e7000_o.jpg,0.0,0.25,0.5,1.0,396,724,https://www.flickr.com/photos/linvoyage/33360835281,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ d3c8c49a69abce81,https://c1.staticflickr.com/2/1538/26741641236_5441dc1b29_o.jpg,0.280784844384,0.0,0.842354533153,1.0,501,114,https://www.flickr.com/photos/141009962@N07/26741641236/,https://creativecommons.org/licenses/by/2.0/,juan jesus jald\303\263n cuevas,https://www.flickr.com/people/141009962@N07/ 5bb467651a9bb186,https://c1.staticflickr.com/6/5568/30954086432_acdd119d38_o.jpg,0.0,0.0,0.666666666667,1.0,966,427,https://www.flickr.com/photos/o_0/30954086432,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 1ab735409e8db949,https://c1.staticflickr.com/8/7791/27248510654_18799b8d18_o.jpg,0.28125,0.0,0.84375,0.75,661,18,https://www.flickr.com/photos/barrettelementary/27248510654/,https://creativecommons.org/licenses/by/2.0/,K.W. Barrett,https://www.flickr.com/people/barrettelementary/ 8ff2f242d37fd0e9,https://c1.staticflickr.com/8/7060/27193480481_b7a095c3f8_o.jpg,0.0,0.0,0.510804769001,0.75,834,544,https://www.flickr.com/photos/usnavy/27193480481,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ d24ff49949d9ac44,https://c1.staticflickr.com/8/7799/27030844646_15d89c6d22_o.jpg,0.518089725036,0.0,1.0,0.75,821,736,https://www.flickr.com/photos/jsjgeology/27030844646,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 23f2f2219e81150b,https://c1.staticflickr.com/8/7365/27834122886_8e18b2a107_o.jpg,0.0,0.322864321608,0.75,0.968592964824,112,8,https://www.flickr.com/photos/scotnelson/27834122886,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 6073219e8d1af6e7,https://c1.staticflickr.com/8/7507/30111436405_3c987dc815_o.jpg,0.0,0.333333333333,1.0,1.0,561,798,https://www.flickr.com/photos/116153846@N06/30111436405/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ 2108c89efef75b8c,https://c1.staticflickr.com/4/3934/33309518296_f896e2cd1b_o.jpg,0.5,0.0,1.0,0.75,971,116,https://www.flickr.com/photos/davebloggs007/33309518296/,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 3c1eb816ca5b35f6,https://c1.staticflickr.com/9/8066/28453457941_3a74f7ed1c_o.jpg,0.4375,0.25,1.0,1.0,975,517,https://www.flickr.com/photos/jsjgeology/28453457941,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 5b8864d18fc512b3,https://c1.staticflickr.com/6/5524/30171673324_72085cce79_o.jpg,0.5,0.25,1.0,1.0,416,990,https://www.flickr.com/photos/gotovan/30171673324,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/ f772bf5039d59ff2,https://c1.staticflickr.com/8/7357/26845607294_b92f85f3a8_o.jpg,0.25,0.0,1.0,0.5625,826,870,https://www.flickr.com/photos/simonsimages/26845607294/,https://creativecommons.org/licenses/by/2.0/,simonsimages,https://www.flickr.com/people/simonsimages/ ef24dde54169ff22,https://c1.staticflickr.com/8/7107/26958155412_33d5efe254_o.jpg,0.0,0.25,0.5,1.0,563,673,https://www.flickr.com/photos/insmu74/26958155412,https://creativecommons.org/licenses/by/2.0/,Stefan Munder,https://www.flickr.com/people/insmu74/ a22a37dfbd62067b,https://c1.staticflickr.com/8/7545/27312391441_4c79588f7f_o.jpg,0.245614035088,0.0,0.736842105263,0.75,323,532,https://www.flickr.com/photos/usfwsmidwest/27312391441,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 77e9c7e43c7d5748,https://c1.staticflickr.com/6/5749/31055712736_f148051b90_o.jpg,0.28125,0.0,0.84375,0.75,940,67,https://www.flickr.com/photos/30478819@N08/31055712736/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ cbad7143016a1593,https://c1.staticflickr.com/1/431/31024670673_2c7a56b53b_o.jpg,0.25,0.0,0.75,0.75,820,97,https://www.flickr.com/photos/jus10h/31024670673,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 41394f0da7ac8b12,https://c1.staticflickr.com/9/8498/29300292724_71a5f04400_o.jpg,0.468844984802,0.0,1.0,0.75,313,90,https://www.flickr.com/photos/nrgoodrum/29300292724,https://creativecommons.org/licenses/by/2.0/,nick goodrum,https://www.flickr.com/people/nrgoodrum/ 461afde2e6af3979,https://c1.staticflickr.com/1/727/32485772451_baf506599f_o.jpg,0.5,0.0,1.0,0.75,519,439,https://www.flickr.com/photos/box_repsol/32485772451,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ bb02668924d52bb9,https://c1.staticflickr.com/9/8727/28312365824_b445f72bbd_o.jpg,0.25,0.0,0.75,0.75,818,288,https://www.flickr.com/photos/glenbowman/28312365824,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 411951a49e593a59,https://c1.staticflickr.com/8/7292/27375279856_d1b83ae488_o.jpg,0.0,0.0,0.669128508124,1.0,672,858,https://www.flickr.com/photos/28521130@N02/27375279856/,https://creativecommons.org/licenses/by/2.0/,Chris Crook,https://www.flickr.com/people/28521130@N02/ 0f7e263edbeb463b,https://c1.staticflickr.com/8/7343/26472974134_451e8a5534_o.jpg,0.4375,0.25,1.0,1.0,418,317,https://www.flickr.com/photos/flightlog/26472974134,https://creativecommons.org/licenses/by/2.0/,flightlog,https://www.flickr.com/people/flightlog/ 06479a6fdd009458,https://c1.staticflickr.com/6/5523/29316362203_e7346dc71d_o.jpg,0.0,0.0,0.5625,0.75,473,944,https://flickr.com/40797569@N08/29316362203,https://creativecommons.org/licenses/by/2.0/,Potomac Conservancy,https://www.flickr.com/people/potomacconservancy/ 61a0fcc8c2cbfe7b,https://c1.staticflickr.com/8/7132/26798293134_1e0edc36ef_o.jpg,0.25,0.0,1.0,0.599757673667,539,693,https://www.flickr.com/photos/taymazvalley/26798293134,https://creativecommons.org/licenses/by/2.0/,Taymaz Valley,https://www.flickr.com/people/taymazvalley/ fadce27a1f790ab2,https://c1.staticflickr.com/8/7222/27500618016_0652c953c2_o.jpg,0.299878836834,0.0,0.899636510501,0.75,985,966,https://www.flickr.com/photos/nordique/27500618016,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ c901fea3283a3c08,https://c1.staticflickr.com/9/8512/28287472501_e1076a2dd4_o.jpg,0.0,0.0,0.666666666667,1.0,972,541,https://www.flickr.com/photos/85189931@N00/28287472501,https://creativecommons.org/licenses/by/2.0/,niki georgiev,https://www.flickr.com/people/85189931@N00/ 2d8239598bd135a6,https://c1.staticflickr.com/9/8129/29365605063_6a143232a8_o.jpg,0.0,0.25,0.5,1.0,875,490,https://www.flickr.com/photos/126337928@N05/29365605063/,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ f22c5f698989dac1,https://c1.staticflickr.com/8/7515/27325766933_22ec88dff6_o.jpg,0.0,0.0,0.482608695652,0.75,404,672,https://www.flickr.com/photos/usnavy/27325766933,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 266a1194c77111ad,https://c1.staticflickr.com/9/8196/28428018770_9767b6e05d_o.jpg,0.25,0.25,0.75,1.0,981,596,https://www.flickr.com/photos/amslerpix/28428018770/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 09690637b62a30e2,https://c1.staticflickr.com/9/8480/29174231222_e37b7e906c_o.jpg,0.250553097345,0.25,0.751659292035,1.0,664,403,https://www.flickr.com/photos/romanboed/29174231222/,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/ f457d4739be4220a,https://c1.staticflickr.com/1/663/31658703571_ab7d3bfa45_o.jpg,0.5,0.25,1.0,1.0,662,724,http://flickr.com/photos/52900873@N07/31658703571,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 59d4ef6a62cd2cc8,https://c1.staticflickr.com/8/7374/27259191121_f7da80606f_o.jpg,0.0,0.0,0.666666666667,1.0,519,903,https://www.flickr.com/photos/box_repsol/27259191121,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 5775f0a2539557b5,https://c1.staticflickr.com/8/7492/26531234650_50379dc45b_o.jpg,0.0,0.0,0.5625,0.75,920,801,https://www.flickr.com/photos/davidstanleytravel/26531234650,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 9a7ccdb8130eea74,https://c1.staticflickr.com/9/8122/28887298422_7461ab30a6_o.jpg,0.0,0.0,0.5,0.75,426,563,https://www.flickr.com/photos/olsenart/28887298422,https://creativecommons.org/licenses/by/2.0/,Lucky Lynda,https://www.flickr.com/people/olsenart/ 0efe0b9f4c7fbbde,https://c1.staticflickr.com/8/7271/28166356505_b2a03dda3e_o.jpg,0.28125,0.25,0.84375,1.0,933,957,https://www.flickr.com/photos/rickmccharles/28166356505,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/ 937ca399748151ab,https://c1.staticflickr.com/8/7368/27387537931_36c1d70c2a_o.jpg,0.501840942563,0.25,1.0,1.0,912,474,https://www.flickr.com/photos/santaolalla/27387537931,https://creativecommons.org/licenses/by/2.0/,David Santaolalla,https://www.flickr.com/people/santaolalla/ c9d73a6dc7d2976a,https://c1.staticflickr.com/1/429/32561737455_0651c04b03_o.jpg,0.0,0.0,0.666666666667,1.0,980,865,https://www.flickr.com/photos/rexness/32561737455,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/ 6ecd7be3b9148eb6,https://c1.staticflickr.com/8/7395/27054388030_f17312443c_o.jpg,0.5,0.0,1.0,0.75,820,928,https://www.flickr.com/photos/weeklydig/27054388030/,https://creativecommons.org/licenses/by/2.0/,digboston,https://www.flickr.com/people/weeklydig/ 0fe46e75ce4b4f5b,https://c1.staticflickr.com/8/7093/27731191752_a073b3bf5c_o.jpg,0.5,0.25,1.0,1.0,950,740,https://www.flickr.com/photos/blumenbiene/27731191752,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ 7b52f5142202daae,https://c1.staticflickr.com/9/8352/29820540052_93171e6f19_o.jpg,0.280784844384,0.0,0.842354533153,1.0,913,998,https://www.flickr.com/photos/erix/29820540052/,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand,https://www.flickr.com/people/erix/ 7affc41bb3afd497,https://c1.staticflickr.com/9/8512/29680556911_0ae14a5200_o.jpg,0.4375,0.0,1.0,0.75,818,38,https://www.flickr.com/photos/zombieite/29680556911/,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ 138c6da5418a677c,https://c1.staticflickr.com/6/5537/31298816746_dd9d8f4932_o.jpg,0.42174796748,0.0,0.843495934959,0.75,405,583,https://www.flickr.com/photos/janitors/31298816746,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ c0cda0f5a54343b7,https://c1.staticflickr.com/1/358/31599093551_0bdc7a6c9b_o.jpg,0.295072115385,0.25,0.885216346154,1.0,512,593,https://www.flickr.com/photos/autohistorian/31599093551,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 8e74142c7309ad83,https://c1.staticflickr.com/9/8095/28536323773_562be5df8e_o.jpg,0.0,0.0,1.0,1.0,986,998,https://www.flickr.com/photos/olibac/28536323773,https://creativecommons.org/licenses/by/2.0/,OliBac,https://www.flickr.com/people/olibac/ 5ec34636f28023c4,https://c1.staticflickr.com/6/5644/30824316621_bb24e7b70e_o.jpg,0.25,0.0,0.75,0.75,973,583,https://www.flickr.com/photos/145232592@N06/30824316621,https://creativecommons.org/licenses/by/2.0/,Martin7d2,https://www.flickr.com/people/martin7d2/ 0bf0ecc2bd421ed4,https://c1.staticflickr.com/9/8109/29544815330_c50f74cb70_o.jpg,0.295454545455,0.0,1.0,1.0,431,572,http://www.flickr.com/photos/ftmeade/29544815330/,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/ 3d2abcbe53ac654b,https://c1.staticflickr.com/6/5784/31233267866_96fba514ff_o.jpg,0.496696035242,0.0,0.993392070485,0.75,889,313,https://www.flickr.com/photos/sybarite48/31233267866,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ fdd851f6ae77be88,https://c1.staticflickr.com/9/8834/28307295070_7ee8deee90_o.jpg,0.148333333333,0.0,1.0,1.0,437,812,https://www.flickr.com/photos/bobtheberto/28307295070,https://creativecommons.org/licenses/by/2.0/,Rob "Berto" Bennett,https://www.flickr.com/people/bobtheberto/ e3deab462fb7c09b,https://c1.staticflickr.com/9/8541/29640261375_159969f3cb_o.jpg,0.0,0.0,0.666666666667,1.0,896,629,https://www.flickr.com/photos/markyharky/29640261375,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 7878f540f14ffd97,https://c1.staticflickr.com/1/308/31812394461_f7aa941f0b_o.jpg,0.4375,0.0,1.0,0.75,615,330,http://www.flickr.com/photos/dainismatisons/31812394461/,https://creativecommons.org/licenses/by/2.0/,Dainis Matisons,https://www.flickr.com/people/dainismatisons/ 0236cfbb669df537,https://c1.staticflickr.com/8/7702/27276060153_2f4bc2727f_o.jpg,0.0,0.25,1.0,1.0,955,753,https://www.flickr.com/photos/scotnelson/27276060153,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 269a6408c3567daa,https://c1.staticflickr.com/6/5659/30201556241_40688d0574_o.jpg,0.0,0.25,0.5,1.0,581,256,https://www.flickr.com/photos/martius/30201556241/,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 888207991e7d9a62,https://c1.staticflickr.com/1/442/32368069962_f9161bf5ca_o.jpg,0.2806640625,0.0,0.8419921875,0.75,341,280,https://www.flickr.com/photos/bazzadarambler/32368069962,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ fffc0f50c61e3b48,https://c1.staticflickr.com/9/8050/29238106374_ed8b41008a_o.jpg,0.0,0.0,1.0,1.0,964,151,https://www.flickr.com/photos/vuarnet/29238106374,https://creativecommons.org/licenses/by/2.0/,Raul Ramirez,https://www.flickr.com/people/vuarnet/ c7ae7f635e1f4c23,https://c1.staticflickr.com/1/620/32695541516_b69d21deb6_o.jpg,0.299878836834,0.25,0.899636510501,1.0,133,940,https://www.flickr.com/photos/ddebold/32695541516,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/ f5ef83baa43b63ab,https://c1.staticflickr.com/9/8102/27874528933_8458516b77_o.jpg,0.0,0.0,0.499263622975,0.75,13,649,https://www.flickr.com/photos/steve_childs/27874528933,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/ 75778d2f7f332f88,https://c1.staticflickr.com/9/8640/29313871471_762746eb7e_o.jpg,0.25,0.249631811487,1.0,0.748895434462,526,347,https://www.flickr.com/photos/agenciasenado/29313871471,https://creativecommons.org/licenses/by/2.0/,Senado Federal,https://www.flickr.com/people/agenciasenado/ 559f35d37c4a07bc,https://c1.staticflickr.com/6/5804/30015712255_662742b7f0_o.jpg,0.25,0.376029654036,1.0,1.0,982,242,https://www.flickr.com/photos/apardavila/30015712255,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ f98193bb7316d308,https://c1.staticflickr.com/6/5801/30441949116_3a5f07529c_o.jpg,0.25,0.0,0.75,0.75,968,397,https://www.flickr.com/photos/30478819@N08/30441949116/in/pool-43256560@N00,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 42b3b6655dff3c11,https://c1.staticflickr.com/6/5556/30181865684_87ed30299a_o.jpg,0.0,0.25,0.5625,1.0,769,86,https://www.flickr.com/photos/stmunchins/30181865684,https://creativecommons.org/licenses/by/2.0/,St Munchin's College,https://www.flickr.com/people/stmunchins/ 65ec917501cea531,https://c1.staticflickr.com/6/5814/29884134796_4487c7a8d4_o.jpg,0.5,0.25,1.0,1.0,512,903,https://www.flickr.com/photos/8782469@N05/29884134796,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/ eadcb6de5c696016,https://c1.staticflickr.com/1/701/31029076984_cc9e65c275_o.jpg,0.4375,0.25,1.0,1.0,108,520,https://www.flickr.com/photos/jimg944/31029076984,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 59a81dc505fa7880,https://c1.staticflickr.com/8/7799/27273146292_43651c9faa_o.jpg,0.5,0.0,1.0,0.75,16,940,https://www.flickr.com/photos/j_benson/27273146292,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/ ef240eb72d120e2c,https://c1.staticflickr.com/9/8755/28543750790_5c78714742_o.jpg,0.0,0.0,0.5625,0.75,782,761,https://www.flickr.com/photos/smoses/28543750790,https://creativecommons.org/licenses/by/2.0/,Steve Moses,https://www.flickr.com/people/smoses/ 79b720eb49104c82,https://c1.staticflickr.com/8/7038/26339862774_f0f3e6e569_o.jpg,0.25,0.0,0.75,0.75,405,956,https://www.flickr.com/photos/km30192002/26339862774/,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/ e72b4a53de5625eb,https://c1.staticflickr.com/8/7657/27823358415_d92d626069_o.jpg,0.0,0.0,0.6,0.75,327,416,https://www.flickr.com/photos/usdagov/27823358415,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ c00fb01a57be369a,https://c1.staticflickr.com/9/8408/28691791931_82a3941aa5_o.jpg,0.0,0.0,1.0,1.0,469,667,https://www.flickr.com/photos/martius/28691791931,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ b4670b193da40e71,https://c1.staticflickr.com/1/358/32646041781_b440815498_o.jpg,0.0,0.0,1.0,1.0,672,809,https://www.flickr.com/photos/glorycycles/32646041781,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 9570cf07d89eb8dc,https://c1.staticflickr.com/8/7686/27090297601_e819e000a8_o.jpg,0.4375,0.0,1.0,0.75,780,218,https://www.flickr.com/photos/thoseguys119/27090297601,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ dfaef9bdc97b1361,https://c1.staticflickr.com/8/7421/28005743806_4d622ca4a3_o.jpg,0.0,0.0,0.524546827795,0.75,407,477,https://www.flickr.com/photos/eltb/28005743806,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 4ab364ae20108a00,https://c1.staticflickr.com/3/2371/32750716142_0743d73ee3_o.jpg,0.0,0.0527240773286,1.0,1.0,288,505,https://www.flickr.com/photos/56433265@N04/32750716142/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/ 4cf9444ad9769047,https://c1.staticflickr.com/6/5747/31028727726_f4b27be387_o.jpg,0.0,0.0,0.547453703704,0.75,356,292,https://www.flickr.com/photos/apardavila/31028727726/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ d478dd5c88b5989d,https://c1.staticflickr.com/8/7448/27561888023_0f31553db8_o.jpg,0.0,0.0,0.5625,0.75,278,371,https://www.flickr.com/photos/zongo/27561888023/,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ e37e5b0c059acd02,https://c1.staticflickr.com/8/7535/27259874356_7430d654bc_o.jpg,0.206601876676,0.0,0.619805630027,0.75,477,214,https://www.flickr.com/photos/yutakaseki/27259874356,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/ aa1e1c0b36552a0a,https://c1.staticflickr.com/9/8050/29300586745_cbc589a67c_o.jpg,0.0,0.25,0.5,1.0,826,581,https://www.flickr.com/photos/vahemart/29300586745,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 28c0abf047e40045,https://c1.staticflickr.com/9/8275/29779084234_6d2646c73d_o.jpg,0.28125,0.0,0.84375,0.75,93,10,https://www.flickr.com/photos/mikeprince/29779084234,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/ 599ac6d6465bf890,https://c1.staticflickr.com/8/7794/29551203465_7308e41432_o.jpg,0.0,0.25,0.75,1.0,763,817,https://flickr.com/65638600@N05/29551203465,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/ 952a620d7a4f60ae,https://c1.staticflickr.com/6/5723/30318842764_fedb0c4571_o.jpg,0.25,0.0,1.0,0.574644549763,990,880,https://flickr.com/144478206@N07/30318842764,https://creativecommons.org/licenses/by/2.0/,Lala89_Photos,https://www.flickr.com/people/144478206@N07/ 66e658dada57b19b,https://c1.staticflickr.com/1/367/31753190055_6bc017906f_o.jpg,0.25,0.0,1.0,0.561328125,208,356,https://www.flickr.com/photos/collegelibrary/31753190055,https://creativecommons.org/licenses/by/2.0/,college.library,https://www.flickr.com/people/collegelibrary/ 2665962a18d430c7,https://c1.staticflickr.com/8/7037/26481733644_acd622abd3_o.jpg,0.0,0.299878836834,0.75,0.899636510501,920,403,https://www.flickr.com/photos/kjgarbutt/26481733644,https://creativecommons.org/licenses/by/2.0/,Kurtis Garbutt,https://www.flickr.com/people/kjgarbutt/ 8040781ab11d0835,https://c1.staticflickr.com/9/8408/28828162184_074ccb5d9a_o.jpg,0.0,0.25,0.5625,1.0,840,589,https://www.flickr.com/photos/cgk/28828162184,https://creativecommons.org/licenses/by/2.0/,Colby Gutierrez-Kraybill,https://www.flickr.com/people/cgk/ d7342b38486ebb53,https://c1.staticflickr.com/6/5599/29943810933_3274973921_o.jpg,0.28125,0.25,0.84375,1.0,491,760,https://www.flickr.com/photos/preciosa-ornela/29943810933,https://creativecommons.org/licenses/by/2.0/,PRECIOSA ORNELA,https://www.flickr.com/people/preciosa-ornela/ bd0610feded7ec1b,https://c1.staticflickr.com/1/328/32217867622_6fe759b7e5_o.jpg,0.0,0.25,0.5625,1.0,763,709,https://www.flickr.com/photos/brighton/32217867622/,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ 6079cb82635e92ac,https://c1.staticflickr.com/8/7076/27027168645_e5b81f217c_o.jpg,0.501840942563,0.25,1.0,1.0,512,768,https://www.flickr.com/photos/128326674@N06/27027168645/,https://creativecommons.org/licenses/by/2.0/,Yahya S.,https://www.flickr.com/people/128326674@N06/ 2f424e671e404ab0,https://c1.staticflickr.com/9/8505/28970608513_cab4dfdd73_o.jpg,0.42174796748,0.0,0.843495934959,0.75,699,161,https://www.flickr.com/photos/terrazzo/28970608513,https://creativecommons.org/licenses/by/2.0/,Terrazzo,https://www.flickr.com/people/terrazzo/ 0521a4a8e93e0e4b,https://c1.staticflickr.com/8/7342/28048792285_bacd8997ab_o.jpg,0.25,0.25,1.0,1.0,968,888,https://flickr.com/34948727@N00/28048792285,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/ 214f30a244fe72ce,https://c1.staticflickr.com/9/8827/29684851835_86ca0376cb_o.jpg,0.0,0.0,0.5,0.75,920,573,https://www.flickr.com/photos/texasbackroads/29684851835,https://creativecommons.org/licenses/by/2.0/,Nicolas Henderson,https://www.flickr.com/people/texasbackroads/ c38fa17fa4fd04d5,https://c1.staticflickr.com/8/7669/27720287474_73d1c86b8b_o.jpg,0.4375,0.25,1.0,1.0,975,41,https://www.flickr.com/photos/jsjgeology/27720287474,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e4ae5fc80887595b,https://c1.staticflickr.com/1/376/32778543196_8152c76dbd_o.jpg,0.0,0.0,0.739130434783,1.0,825,407,https://flickr.com/60206297@N00/32778543196,https://creativecommons.org/licenses/by/2.0/,Ben Babcock,https://www.flickr.com/people/tachyondecay/ 676e585dd6d051a5,https://c1.staticflickr.com/1/479/31658408380_98a187c130_o.jpg,0.25,0.43661971831,1.0,1.0,747,586,https://www.flickr.com/photos/mark6mauno/31658408380,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ 74cbbe6557010b90,https://c1.staticflickr.com/8/7372/27551672686_8322c67618_o.jpg,0.0,0.0,0.608450704225,1.0,294,311,https://www.flickr.com/photos/dkeats/27551672686/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 8c2fa585600ddea5,https://c1.staticflickr.com/9/8849/28426200266_992d422ac2_o.jpg,0.333333333333,0.0,1.0,1.0,320,281,https://www.flickr.com/photos/52450054@N04/28426200266,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 54a2b9969fb46aa6,https://c1.staticflickr.com/1/272/32939631885_650114eb25_o.jpg,0.333333333333,0.0,1.0,1.0,796,867,https://www.flickr.com/photos/allagashbrewing/32939631885/,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/ 81d6069b4470d4be,https://c1.staticflickr.com/6/5578/31693045371_8443584aac_o.jpg,0.28125,0.0,0.84375,0.75,875,862,https://www.flickr.com/photos/didbygraham/31693045371,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 1b327e6ea8bd09a4,https://c1.staticflickr.com/8/7312/27163031120_532f4d1cdd_o.jpg,0.564049586777,0.0,1.0,0.75,971,387,https://www.flickr.com/photos/akashadorable/27163031120,https://creativecommons.org/licenses/by/2.0/,reverie_rambler,https://www.flickr.com/people/akashadorable/ 1f89e933953617e6,https://c1.staticflickr.com/8/7361/26847281933_37ce75c081_o.jpg,0.25,0.0,1.0,0.5625,108,759,https://www.flickr.com/photos/royluck/26847281933,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/ c9c1488c58fcdcdd,https://c1.staticflickr.com/8/7411/27842914380_e209894490_o.jpg,0.0,0.0,1.0,1.0,986,788,https://www.flickr.com/photos/surveying/27842914380,https://creativecommons.org/licenses/by/2.0/,Jnzl's Photos,https://www.flickr.com/people/surveying/ 4a641e323c76d103,https://c1.staticflickr.com/1/596/32596360476_c42efbca9e_o.jpg,0.0,0.25,0.5,1.0,821,72,https://www.flickr.com/photos/8269539@N04/32596360476,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 1d2945f5fa9243c4,https://c1.staticflickr.com/1/383/32551380376_83d79b110a_o.jpg,0.0,0.25,0.618442622951,1.0,438,577,https://www.flickr.com/photos/pagedooley/32551380376,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/ 6ca7c2f97cfdf88a,https://c1.staticflickr.com/6/5033/29234670074_0729424f94_o.jpg,0.28125,0.0,0.84375,0.75,937,398,https://www.flickr.com/photos/scotnelson/29234670074,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 5ac6c7b08b43d357,https://c1.staticflickr.com/6/5463/29926220843_3e13cbb84f_o.jpg,0.0,0.25,0.75,1.0,405,914,https://www.flickr.com/photos/littlepixel/29926220843,https://creativecommons.org/licenses/by/2.0/,Little Pixel,https://www.flickr.com/people/littlepixel/ dd059db2ad7c2bbe,https://c1.staticflickr.com/1/601/31209657333_e86cacd672_o.jpg,0.0,0.25,0.5,1.0,718,685,https://www.flickr.com/photos/42220226@N07/31209657333,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ e00e2cee784b3d64,https://c1.staticflickr.com/3/2260/32063012944_422916d362_o.jpg,0.0,0.0,0.75,0.715608465608,255,102,https://www.flickr.com/photos/rpavich/32063012944/in/pool-28342859@N00,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ d3f812e2792545ae,https://c1.staticflickr.com/9/8085/29038130681_19680fd4b6_o.jpg,0.0,0.25,0.5625,1.0,816,849,https://www.flickr.com/photos/fdecomite/29038130681/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 6b9181d388823638,https://c1.staticflickr.com/9/8113/30029133521_611d62fe7e_o.jpg,0.433722527473,0.0,0.867445054945,0.75,561,859,https://www.flickr.com/photos/codnewsroom/30029133521,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ d931e6ea6f10f794,https://c1.staticflickr.com/9/8632/28456712252_d5b0c99d2f_o.jpg,0.28125,0.25,0.84375,1.0,512,779,https://www.flickr.com/photos/daveseven/28456712252,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ 86ff221686395d10,https://c1.staticflickr.com/8/7778/26784657156_e24e8a4393_o.jpg,0.5,0.0,1.0,0.75,548,359,https://www.flickr.com/photos/rhemkes/26784657156,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ aa599669eaf946e9,https://c1.staticflickr.com/9/8273/29428455751_04d3928fa8_o.jpg,0.110879174853,0.25,0.332637524558,1.0,896,507,https://www.flickr.com/photos/ronmacphotos/29428455751,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 189b2d6b5e40fcfe,https://c1.staticflickr.com/6/5796/30321080300_9c3126e52a_o.jpg,0.165467625899,0.0,0.496402877698,0.75,719,701,https://www.flickr.com/photos/mark-gunn/30321080300,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ 09aee3942a61d089,https://c1.staticflickr.com/9/8594/28122678171_eceed0549b_o.jpg,0.0,0.25,0.75,0.75,507,814,https://www.flickr.com/photos/bpprice/28122678171,https://creativecommons.org/licenses/by/2.0/,brando.n,https://www.flickr.com/people/bpprice/ e9707612604d7c3f,https://c1.staticflickr.com/8/7323/27234323661_a52ed5c67c_o.jpg,0.281690140845,0.25,0.845070422535,1.0,875,235,https://www.flickr.com/photos/kieransphotostream/27234323661/,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/ a18a3ca747e9990d,https://c1.staticflickr.com/9/8794/28557064535_06c5151d04_o.jpg,0.5,0.25,1.0,1.0,662,648,https://www.flickr.com/photos/42220226@N07/28557064535,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ dded0eae55b5c2f0,https://c1.staticflickr.com/6/5583/30386552480_5cce017915_o.jpg,0.0,0.0,0.666666666667,1.0,820,670,https://www.flickr.com/photos/usnavy/30386552480,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 0e41860a981627d1,https://c1.staticflickr.com/9/8134/30000181236_bd6790d4d3_o.jpg,0.688300349243,0.0,1.0,0.75,975,269,https://www.flickr.com/photos/39090590@N02/30000181236,https://creativecommons.org/licenses/by/2.0/,Cyril Fluck,https://www.flickr.com/people/39090590@N02/ c14265cd7f744b28,https://c1.staticflickr.com/6/5625/30516595856_9d1207466d_o.jpg,0.25,0.0,0.75,0.75,820,864,https://www.flickr.com/photos/rollercoasterphilosophy/30516595856/,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ 4501bbdc3b7c86bd,https://c1.staticflickr.com/1/395/31538324564_8f14f93c35_o.jpg,0.25,0.25,1.0,1.0,482,126,https://flickr.com/49048289@N00/31538324564,https://creativecommons.org/licenses/by/2.0/,Jaymis Loveday,https://www.flickr.com/people/jaymis/ 3b16ea7cd84b3f23,https://c1.staticflickr.com/8/7509/28757213003_690bd7fd23_o.jpg,0.0,0.0,0.5,0.75,629,378,https://flickr.com/132004986@N08/28757213003,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ 08d8ffda8c34184a,https://c1.staticflickr.com/9/8129/28565513834_4526a29dcb_o.jpg,0.4375,0.25,1.0,1.0,459,532,https://www.flickr.com/photos/127226743@N02/28565513834,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 6d5fcbd90ee92ae0,https://c1.staticflickr.com/1/576/31724116814_bb81924d73_o.jpg,0.25,0.25,1.0,1.0,114,795,https://www.flickr.com/photos/nikkvalentine/31724116814,https://creativecommons.org/licenses/by/2.0/,The Manic Macrographer,https://www.flickr.com/people/nikkvalentine/ fcfffdfa6b5c8500,https://c1.staticflickr.com/9/8167/28608321612_bfd29ca336_o.jpg,0.0,0.0,0.666666666667,1.0,490,637,https://www.flickr.com/photos/cogdog/28608321612,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 6c45e7530872effb,https://c1.staticflickr.com/6/5589/29625874934_b06433044d_o.jpg,0.25,0.0,0.75,0.75,976,352,https://www.flickr.com/photos/tipsfortravellers/29625874934,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 9774fad47495a40b,https://c1.staticflickr.com/8/7513/28472026273_0babddf802_o.jpg,0.4375,0.25,1.0,1.0,629,358,https://www.flickr.com/photos/sedoglia/28472026273,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/ 64316286d0342333,https://c1.staticflickr.com/1/424/31991344911_6be254bd84_o.jpg,0.4375,0.25,1.0,1.0,875,765,https://www.flickr.com/photos/didbygraham/31991344911,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 3d8d44a02f73c91c,https://c1.staticflickr.com/8/7443/27019909701_b4af197501_o.jpg,0.0,0.0,0.587060702875,0.75,688,900,https://www.flickr.com/photos/brighton/27019909701,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ 7a92047da1d3db68,https://c1.staticflickr.com/9/8216/28993004061_27fac24cd3_o.jpg,0.25,0.25,0.75,1.0,985,918,https://www.flickr.com/photos/treeworld/28993004061,https://creativecommons.org/licenses/by/2.0/,Treeworld Wholesale,https://www.flickr.com/people/treeworld/ 609351d96ac0dfb6,https://c1.staticflickr.com/6/5338/31219731371_5ae0d364c7_o.jpg,0.0,0.0,0.5,0.75,405,932,https://www.flickr.com/photos/janitors/31219731371/,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 1023afc7eca78c9e,https://c1.staticflickr.com/1/506/32447128386_1403f97cef_o.jpg,0.0,0.25,0.5625,1.0,875,731,https://www.flickr.com/photos/69203347@N03/32447128386/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 48007e9a5ed7c30f,https://c1.staticflickr.com/9/8256/28910491822_c9583f0a50_o.jpg,0.333333333333,0.0,1.0,1.0,662,785,https://www.flickr.com/photos/greggjerdingen/28910491822,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ d345db71031aa39f,https://c1.staticflickr.com/6/5551/30548881306_bf3b213f83_o.jpg,0.25,0.0,0.75,0.75,699,43,https://www.flickr.com/photos/minoritenplatz8/30548881306,https://creativecommons.org/licenses/by/2.0/,"Bundesministerium f\303\274r Europa, Integration und \303\204u\303\237eres",https://www.flickr.com/people/minoritenplatz8/ 199c375ad2d6fdb2,https://c1.staticflickr.com/9/8407/30095240116_f33a7ba450_o.jpg,0.259962406015,0.0,0.779887218045,0.75,426,694,https://www.flickr.com/photos/60712129@N06/30095240116,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/ f6588f74b4e9b983,https://c1.staticflickr.com/9/8847/28451770185_d02fcd2513_o.jpg,0.0,0.0,0.5625,0.75,695,117,https://www.flickr.com/photos/robthurman/28451770185/,https://creativecommons.org/licenses/by/2.0/,Rob Thurman,https://www.flickr.com/people/robthurman/ 3434117840d9d6ca,https://c1.staticflickr.com/8/7195/27808986721_4fb07fe14c_o.jpg,0.25,0.0,0.75,0.75,635,393,https://www.flickr.com/photos/texasbackroads/27808986721,https://creativecommons.org/licenses/by/2.0/,Nicolas Henderson,https://www.flickr.com/people/texasbackroads/ 50bcbeb838c1a63f,https://c1.staticflickr.com/8/7771/26876093820_50354a70db_o.jpg,0.435549525102,0.0,1.0,1.0,725,91,https://www.flickr.com/photos/ben_salter/26876093820,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 7996e393b5b0b30c,https://c1.staticflickr.com/3/2293/32091123753_963a0e5588_o.jpg,0.0,0.25,0.531155015198,1.0,405,96,https://www.flickr.com/photos/erussell1984/32091123753,https://creativecommons.org/licenses/by/2.0/,airbus777,https://www.flickr.com/people/erussell1984/ 3d0cccdb3a1d5e65,https://c1.staticflickr.com/3/2122/32163128993_8426f97943_o.jpg,0.25,0.25,0.75,1.0,820,576,https://www.flickr.com/photos/jus10h/32163128993,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 839d946a0d0a5663,https://c1.staticflickr.com/9/8011/29882980516_22af19caff_o.jpg,0.5,0.25,1.0,1.0,932,60,https://www.flickr.com/photos/whitefield_d/29882980516,https://creativecommons.org/licenses/by/2.0/,whity,https://www.flickr.com/people/whitefield_d/ c4418378709b8d9b,https://c1.staticflickr.com/8/7026/26362253863_fddc38aca7_o.jpg,0.25,0.25,0.75,1.0,147,594,https://www.flickr.com/photos/shankaronline/26362253863,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ e91feee7c50d4495,https://c1.staticflickr.com/9/8686/28858724151_eb8938466d_o.jpg,0.0,0.0,0.689655172414,1.0,281,138,https://www.flickr.com/photos/132295270@N07/28858724151,https://creativecommons.org/licenses/by/2.0/,Renee,https://www.flickr.com/people/132295270@N07/ 4e1ab845386728fe,https://c1.staticflickr.com/6/5485/30241996990_bcaa48371e_o.jpg,0.0,0.25,0.5625,1.0,937,90,https://www.flickr.com/photos/rusty_clark/30241996990/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ d8c4089a3576443d,https://c1.staticflickr.com/6/5562/30748214112_343b8443e3_o.jpg,0.0,0.25,0.75,1.0,672,313,https://www.flickr.com/photos/glorycycles/30748214112,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ e4bd6dffe8b8001f,https://c1.staticflickr.com/9/8396/28621942172_239d9de014_o.jpg,0.333333333333,0.0,1.0,1.0,848,662,https://www.flickr.com/photos/kecko/28621942172,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ 722d7c82f9e52277,https://c1.staticflickr.com/8/7271/26545528480_1b891167d4_o.jpg,0.0,0.4375,0.75,1.0,404,351,https://www.flickr.com/photos/cantoni/26545528480,https://creativecommons.org/licenses/by/2.0/,Brian Cantoni,https://www.flickr.com/people/cantoni/ 42478da69b1c3eff,https://c1.staticflickr.com/8/7335/27386988465_dd101df059_o.jpg,0.281690140845,0.25,0.845070422535,1.0,309,929,https://www.flickr.com/photos/treegrow/27386988465/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ e911b78fc1055cc5,https://c1.staticflickr.com/8/7283/28238272885_2430ee56a7_o.jpg,0.5,0.0,1.0,0.75,294,644,https://www.flickr.com/photos/flowcomm/28238272885/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 911dab47e4328d7a,https://c1.staticflickr.com/9/8412/29097441651_dbdf3baa6b_o.jpg,0.481910274964,0.25,0.963820549928,1.0,604,286,https://www.flickr.com/photos/13476480@N07/29097441651,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 825652a2826f685e,https://c1.staticflickr.com/1/267/31938516570_e0734fa10a_o.jpg,0.0,0.0,0.75,1.0,978,101,https://www.flickr.com/photos/21218849@N03/31938516570,https://creativecommons.org/licenses/by/2.0/,Samuel Mann,https://www.flickr.com/people/21218849@N03/ b2b636550fe63454,https://c1.staticflickr.com/6/5623/30284008400_2454fa756a_o.jpg,0.502573529412,0.0,1.0,0.75,896,66,https://www.flickr.com/photos/thenationalguard/30284008400,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ 23840c9cc37a53c0,https://c1.staticflickr.com/9/8681/28602643166_bddce9c0e1_o.jpg,0.25,0.0,0.75,0.75,576,840,https://www.flickr.com/photos/georgiapeanuts/28602643166,https://creativecommons.org/licenses/by/2.0/,Georgia Peanut Commission,https://www.flickr.com/people/georgiapeanuts/ 8a45a1ea4a1a65cf,https://c1.staticflickr.com/6/5513/30827580826_502fbce35f_o.jpg,0.0,0.25,0.498159057437,1.0,561,892,https://www.flickr.com/photos/eaglebrook/30827580826/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ b4d47d94d05be00c,https://c1.staticflickr.com/8/7364/27401393906_2145f108da_o.jpg,0.280784844384,0.0,0.842354533153,1.0,390,758,https://www.flickr.com/photos/knowledge-test/27401393906,https://creativecommons.org/licenses/by/2.0/,Dan Markeye,https://www.flickr.com/people/knowledge-test/ acc03214bc7d48af,https://c1.staticflickr.com/1/472/32390265560_4e5a13daa3_o.jpg,0.25,0.0,0.75,0.75,868,317,https://www.flickr.com/photos/76969036@N02/32390265560/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 8bdfc8e753fae72e,https://c1.staticflickr.com/9/8774/28456514846_be84e93845_o.jpg,0.0,0.0,0.75,0.5625,981,6,https://www.flickr.com/photos/31176607@N05/28456514846,https://creativecommons.org/licenses/by/2.0/,kuhnmi,https://www.flickr.com/people/31176607@N05/ 1f505a31deab676f,https://c1.staticflickr.com/1/309/31495207013_6fc614d7c1_o.jpg,0.238832853026,0.0,0.716498559078,0.75,650,886,https://www.flickr.com/photos/jlcernadas/31495207013,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ 99119015bf34c6c0,https://c1.staticflickr.com/9/8383/28451510993_90187910f5_o.jpg,0.309221311475,0.25,0.927663934426,1.0,498,879,https://www.flickr.com/photos/grassrootsgroundswell/28451510993,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/ 40b06d2896786534,https://c1.staticflickr.com/8/7049/26818295110_667b53e79c_o.jpg,0.252702702703,0.0,1.0,0.75,498,255,https://www.flickr.com/photos/bensutherland/26818295110/,https://creativecommons.org/licenses/by/2.0/,Ben Sutherland,https://www.flickr.com/people/bensutherland/ 5f0fed356dee47ea,https://c1.staticflickr.com/8/7345/26757700901_c6eb4fc802_o.jpg,0.0,0.0,0.666666666667,1.0,33,371,https://www.flickr.com/photos/52450054@N04/26757700901,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 9477f255b71f6b9a,https://c1.staticflickr.com/9/8732/28515741375_45d2b7446c_o.jpg,0.0,0.25,0.75,1.0,71,44,https://www.flickr.com/photos/orangeaurochs/28515741375,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ 7ac0bf712465fa94,https://c1.staticflickr.com/6/5249/29761151600_c017855f01_o.jpg,0.43661971831,0.25,1.0,1.0,407,824,https://www.flickr.com/photos/eltb/29761151600,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ b84a93a43c2e6952,https://c1.staticflickr.com/6/5738/30304239583_281288ae97_o.jpg,0.0,0.25,0.75,1.0,672,305,https://www.flickr.com/photos/glorycycles/30304239583,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ f95beb1b4c17878a,https://c1.staticflickr.com/9/8149/28535892163_d979bf03e6_o.jpg,0.0,0.0,0.666666666667,1.0,966,255,https://www.flickr.com/photos/o_0/28535892163,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 1c38a2d69363416f,https://c1.staticflickr.com/1/393/32129997635_5c5ef1c548_o.jpg,0.0,0.0,0.5625,0.75,437,243,https://www.flickr.com/photos/nzcarfreak/32129997635/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 938a906cc0b428c9,https://c1.staticflickr.com/1/760/32410150256_63a8579323_o.jpg,0.431603773585,0.0,1.0,0.75,406,122,https://flickr.com/146272131@N07/32410150256,https://creativecommons.org/licenses/by/2.0/,foundin_a_attic,https://www.flickr.com/people/foundin_a_attic/ 29ac99f0d95cdcdd,https://c1.staticflickr.com/8/7428/27658392430_91b25f1d3f_o.jpg,0.5,0.25,1.0,1.0,625,461,https://www.flickr.com/photos/agenciabrasilia/27658392430,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ e5f6a5ac9f490579,https://c1.staticflickr.com/6/5643/31227326132_d1fd11bc18_o.jpg,0.5,0.25,1.0,1.0,948,149,https://www.flickr.com/photos/afotador/31227326132/,https://creativecommons.org/licenses/by/2.0/,Antonio Soler,https://www.flickr.com/people/afotador/ 2a66e3683892b0bf,https://c1.staticflickr.com/9/8321/29446152012_b21bdd5386_o.jpg,0.0,0.0,1.0,0.838016528926,918,491,https://www.flickr.com/photos/39527581@N07/29446152012,https://creativecommons.org/licenses/by/2.0/,Rossano aka Bud Care,https://www.flickr.com/people/39527581@N07/ 835e24b4ed9fe89e,https://c1.staticflickr.com/8/7414/27018819202_b596beb541_o.jpg,0.28125,0.25,0.84375,1.0,875,607,https://www.flickr.com/photos/kieransphotostream/27018819202,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/ b812fe040a59f02b,https://c1.staticflickr.com/6/5817/30128435065_b9928c6a31_o.jpg,0.0,0.0,0.745709828393,1.0,699,847,https://www.flickr.com/photos/13476480@N07/30128435065,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c2b3d7f2a26d82b4,https://c1.staticflickr.com/8/7432/26928405236_ea330a1420_o.jpg,0.456538461538,0.25,1.0,1.0,676,745,https://www.flickr.com/photos/jeepersmedia/26928405236,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 06b1cba3db1a8469,https://c1.staticflickr.com/8/7185/27046737425_cba8e10853_o.jpg,0.25,0.0,1.0,0.75,819,805,https://www.flickr.com/photos/hubble_esa/27046737425,https://creativecommons.org/licenses/by/2.0/,Hubble ESA,https://www.flickr.com/people/hubble_esa/ 0e87ed0b347be1f5,https://c1.staticflickr.com/9/8816/28227817650_3e6e9f66d9_o.jpg,0.25,0.25,1.0,1.0,329,475,https://www.flickr.com/photos/ajari/28227817650,https://creativecommons.org/licenses/by/2.0/,ajari,https://www.flickr.com/people/ajari/ 79a52fcb62931c16,https://c1.staticflickr.com/8/7078/27032428163_f333cea8b8_o.jpg,0.446030640669,0.0,0.892061281337,0.75,320,521,https://www.flickr.com/photos/yogendra174/27032428163,https://creativecommons.org/licenses/by/2.0/,Yogendra Joshi,https://www.flickr.com/people/yogendra174/ eb422284a1db57ca,https://c1.staticflickr.com/1/610/31566618594_5585d70b93_o.jpg,0.0,0.0,0.809756097561,1.0,875,918,https://www.flickr.com/photos/didbygraham/31566618594,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ e6557602770210ec,https://c1.staticflickr.com/8/7618/26889485530_9d881a092a_o.jpg,0.0,0.0,1.0,0.864093959732,821,853,https://www.flickr.com/photos/jsjgeology/26889485530,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e447255d088ee0d2,https://c1.staticflickr.com/6/5347/30781945710_28289fce31_o.jpg,0.25,0.25,0.75,1.0,982,297,https://flickr.com/109289138@N06/30781945710,https://creativecommons.org/licenses/by/2.0/,Joburg Cricket Club,https://www.flickr.com/people/joburgcricketclub/ 1b735d0ca8fa4658,https://c1.staticflickr.com/8/7652/26841289895_2084a7be77_o.jpg,0.249079528719,0.0,0.747238586156,0.75,426,576,https://www.flickr.com/photos/64141731@N03/26841289895/,https://creativecommons.org/licenses/by/2.0/,EarlRShumaker,https://www.flickr.com/people/64141731@N03/ 033a52c1c012a91a,https://c1.staticflickr.com/1/393/31672716672_e940171ebc_o.jpg,0.0,0.0,0.75,0.599757673667,145,893,https://flickr.com/143049688@N08/31672716672,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ 2d0a59ef8c6ae8c7,https://c1.staticflickr.com/8/7472/26793667800_bc330f1c6b_o.jpg,0.5,0.0,1.0,0.75,305,394,https://www.flickr.com/photos/14583963@N00/26793667800,https://creativecommons.org/licenses/by/2.0/,David Short,https://www.flickr.com/people/14583963@N00/ b5dd4cc6c73d9ca4,https://c1.staticflickr.com/9/8622/28227149660_533b077257_o.jpg,0.319375,0.0,0.958125,0.75,310,92,https://www.flickr.com/photos/gails_pictures/28227149660/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ b75c2d7987c07de0,https://c1.staticflickr.com/9/8294/29757868145_238785614a_o.jpg,0.0,0.0,1.0,0.799676898223,484,640,https://www.flickr.com/photos/voyagesetc/29757868145/,https://creativecommons.org/licenses/by/2.0/,Voyages etc...,https://www.flickr.com/people/voyagesetc/ 2654d1714186f4cf,https://c1.staticflickr.com/6/5803/31367915755_7e6dac1a09_o.jpg,0.0,0.25,0.5,1.0,980,292,https://www.flickr.com/photos/jkirkhart35/31367915755,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/ 3af60dc851f08921,https://c1.staticflickr.com/8/7429/26829976903_640631837e_o.jpg,0.25,0.279641185647,1.0,0.838923556942,705,893,https://www.flickr.com/photos/bloggers/26829976903,https://creativecommons.org/licenses/by/2.0/,Reynosa Blogs,https://www.flickr.com/people/bloggers/ b46f612b8ddf49d9,https://c1.staticflickr.com/3/2296/32883058552_1734eba9cf_o.jpg,0.0,0.0,0.75,0.618442622951,922,148,https://www.flickr.com/photos/pedrosimoes7/32883058552,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Sim\303\265es,https://www.flickr.com/people/pedrosimoes7/ 8ae07af391ffc807,https://c1.staticflickr.com/9/8884/28953729636_3d1358d264_o.jpg,0.0,0.0,1.0,0.878172588832,554,557,https://www.flickr.com/photos/55229469@N07/28953729636,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ 3ca34fa3de88cc00,https://c1.staticflickr.com/2/1542/26140721244_742d5e42f7_o.jpg,0.0,0.0,0.5,0.75,976,455,https://www.flickr.com/photos/o_0/26140721244/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ f90b27c30ce3d0a5,https://c1.staticflickr.com/1/729/32029788255_a409dd5bbd_o.jpg,0.0,0.0,0.666666666667,1.0,747,635,https://flickr.com/130263698@N03/32029788255,https://creativecommons.org/licenses/by/2.0/,EDUSPACES / PRZESTRZENIE EDUKACJI,https://www.flickr.com/people/eduspaces/ 16299d503aca0747,https://c1.staticflickr.com/8/7779/30192276612_b2e91c77f7_o.jpg,0.0,0.4375,0.75,1.0,709,71,https://www.flickr.com/photos/127226743@N02/30192276612,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 2074bd735fbae7e6,https://c1.staticflickr.com/9/8285/29612354546_017a40684a_o.jpg,0.28125,0.25,0.84375,1.0,459,589,http://www.flickr.com/photos/publiclibrariesnsw/29612354546/,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/ 3c1b3819c671f1c7,https://c1.staticflickr.com/9/8130/28760229320_3a5ae15bd9_o.jpg,0.333333333333,0.0,1.0,1.0,404,819,https://www.flickr.com/photos/usnavy/28760229320,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 25874c497bad3513,https://c1.staticflickr.com/9/8336/29295989611_8cf777413f_o.jpg,0.28125,0.0,0.84375,0.75,331,229,https://flickr.com/48592349@N04/29295989611,https://creativecommons.org/licenses/by/2.0/,synspectrum,https://www.flickr.com/people/epector/ 360f3a52bf210786,https://c1.staticflickr.com/9/8437/29372668891_bd7b0ef31f_o.jpg,0.28125,0.0,0.84375,0.75,641,513,https://www.flickr.com/photos/12707238@N00/29372668891/,https://creativecommons.org/licenses/by/2.0/,Eric.Ray,https://www.flickr.com/people/12707238@N00/ dfcdb56602a27874,https://c1.staticflickr.com/8/7338/27156142911_1e824ffc9a_o.jpg,0.25,0.267938931298,1.0,0.803816793893,898,454,https://www.flickr.com/photos/diegopig/27156142911,https://creativecommons.org/licenses/by/2.0/,rossomoto,https://www.flickr.com/people/diegopig/ eeb1d693013e23a3,https://c1.staticflickr.com/1/761/32130695771_8a89772f30_o.jpg,0.598814229249,0.0,0.998023715415,0.75,499,755,https://flickr.com/50780602@N04/32130695771,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/ ff054a4d161132be,https://c1.staticflickr.com/6/5705/30907256391_a0685de1d6_o.jpg,0.0,0.0,0.406214039125,1.0,981,56,https://www.flickr.com/photos/tydence/30907256391/,https://creativecommons.org/licenses/by/2.0/,Tydence Davis,https://www.flickr.com/people/tydence/ ccebf4596e8cbda3,https://c1.staticflickr.com/9/8427/29311843692_562840db60_o.jpg,0.28125,0.0,0.84375,0.75,875,645,https://www.flickr.com/photos/wltmauc/29311843692,https://creativecommons.org/licenses/by/2.0/,Aubrey Morandarte,https://www.flickr.com/people/wltmauc/ 99805d4960192f88,https://c1.staticflickr.com/8/7107/27038132083_b15f434b57_o.jpg,0.148333333333,0.0,1.0,1.0,611,856,https://www.flickr.com/photos/moritzbarcelona/27038132083,https://creativecommons.org/licenses/by/2.0/,Moritz Barcelona,https://www.flickr.com/people/moritzbarcelona/ d12f9a23c008d5f2,https://c1.staticflickr.com/8/7686/26693225850_e60413daed_o.jpg,0.336764705882,0.0,1.0,1.0,146,380,https://www.flickr.com/photos/shankaronline/26693225850,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 97381efa5629e7ee,https://c1.staticflickr.com/8/7483/28672006730_a3acdaf6d3_o.jpg,0.25,0.0,0.75,0.75,976,340,https://www.flickr.com/photos/o_0/28672006730/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ a9ea22a0c71efadf,https://c1.staticflickr.com/9/8245/29237800431_b00b3a9bc6_o.jpg,0.25,0.0,1.0,0.75,979,677,https://www.flickr.com/photos/trendscout/29237800431,https://creativecommons.org/licenses/by/2.0/,Matthias Mueller,https://www.flickr.com/people/trendscout/ 50bedbf72f252003,https://c1.staticflickr.com/9/8377/29030865421_d150fe2990_o.jpg,0.327407407407,0.0,1.0,1.0,138,114,https://www.flickr.com/photos/gails_pictures/29030865421,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ c51f1196222919c4,https://c1.staticflickr.com/1/310/31951828901_08cd1e28b9_o.jpg,0.25,0.0,1.0,1.0,875,484,https://flickr.com/24431382@N03/31951828901,https://creativecommons.org/licenses/by/2.0/,Eric Fischer,https://www.flickr.com/people/walkingsf/ 2095031cc22c29a6,https://c1.staticflickr.com/3/2814/33086806092_3dbf7850f2_o.jpg,0.25,0.0,1.0,1.0,416,681,https://flickr.com/34764035@N00/33086806092,https://creativecommons.org/licenses/by/2.0/,Rhian,https://www.flickr.com/people/rhian/ aca4f156b3f7a62e,https://c1.staticflickr.com/1/364/32200613363_bf5a333dc2_o.jpg,0.386029411765,0.25,1.0,1.0,310,227,https://www.flickr.com/photos/gails_pictures/32200613363,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 41576c09bbf8dc2b,https://c1.staticflickr.com/8/7283/27363759014_c1bafe475b_o.jpg,0.0,0.42174796748,0.75,0.843495934959,487,211,https://www.flickr.com/photos/patrice_calatayu/27363759014,https://creativecommons.org/licenses/by/2.0/,Patrice CALATAYU,https://www.flickr.com/people/patrice_calatayu/ ad54c1a840f1b492,https://c1.staticflickr.com/8/7512/27752785024_bf37c83f8c_o.jpg,0.482608695652,0.0,0.965217391304,0.75,407,714,https://www.flickr.com/photos/eltb/27752785024,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 60d007a49adf54f5,https://c1.staticflickr.com/6/5468/30043044433_59f61f5f0c_o.jpg,0.0,0.0,0.75,0.75,672,631,https://www.flickr.com/photos/glorycycles/30043044433,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 9a944a8589c8cbe8,https://c1.staticflickr.com/8/7298/27010907881_55eb132033_o.jpg,0.28125,0.25,0.84375,1.0,469,710,https://www.flickr.com/photos/transitomedellin/27010907881,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ 9c6dcbc0ff9ce8ca,https://c1.staticflickr.com/1/129/31435313352_bc533a7b79_o.jpg,0.25,0.25,0.75,1.0,752,227,https://flickr.com/63142286@N04/31435313352,https://creativecommons.org/licenses/by/2.0/,Arturo Hurtado,https://www.flickr.com/people/omnious100/ d9b46861ab203acc,https://c1.staticflickr.com/9/8137/30226057285_4be8d314a1_o.jpg,0.0,0.25,0.498159057437,1.0,499,957,https://flickr.com/93839835@N04/30226057285,https://creativecommons.org/licenses/by/2.0/,Emily Mathews,https://www.flickr.com/people/eamathe/ c7a7621b9880d3e9,https://c1.staticflickr.com/9/8004/29545188632_3315961402_o.jpg,0.358931552588,0.25,1.0,1.0,310,16,https://www.flickr.com/photos/gails_pictures/29545188632,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 6a6ad1e3a2b9277d,https://c1.staticflickr.com/4/3696/32757171431_2b8b7d3b9b_o.jpg,0.0,0.0,0.75,1.0,735,302,https://www.flickr.com/photos/27665395@N05/32757171431,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ b6d11b2c6f75bf60,https://c1.staticflickr.com/2/1585/26147188944_54548a2f5a_o.jpg,0.571911196911,0.0,0.953185328185,0.75,669,733,https://www.flickr.com/photos/vasenka/26147188944,https://creativecommons.org/licenses/by/2.0/,VasenkaPhotography,https://www.flickr.com/people/vasenka/ 1578ca19a2c0360a,https://c1.staticflickr.com/8/7326/28119610611_dab400b915_o.jpg,0.25,0.25,1.0,1.0,924,754,https://flickr.com/32031278@N03/28119610611,https://creativecommons.org/licenses/by/2.0/,Debbie Tingzon,https://www.flickr.com/people/ilove9and23/ c9fd3859d99b4a90,https://c1.staticflickr.com/6/5810/29977128264_151d923d50_o.jpg,0.28125,0.0,0.84375,0.75,923,316,https://www.flickr.com/photos/fzhenghu/29977128264,https://creativecommons.org/licenses/by/2.0/,zhenghu feng,https://www.flickr.com/people/fzhenghu/ 936f105c7446bb29,https://c1.staticflickr.com/8/7492/27884336631_4b90b2ebcc_o.jpg,0.277173913043,0.25,0.83152173913,1.0,633,533,https://www.flickr.com/photos/textlad/27884336631,https://creativecommons.org/licenses/by/2.0/,textlad,https://www.flickr.com/people/textlad/ c8a199f5803ee5c3,https://c1.staticflickr.com/8/7642/28458258174_1956a7bdd2_o.jpg,0.0,0.0,0.666666666667,1.0,699,426,https://www.flickr.com/photos/stevendepolo/28458258174/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ b64acf4eab440b2e,https://c1.staticflickr.com/8/7359/27216101415_841dc967bc_o.jpg,0.34375,0.25,1.0,1.0,760,251,https://www.flickr.com/photos/gaby1/27216101415,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 7e65289742afe3c4,https://c1.staticflickr.com/6/5637/30289217513_f3a316d508_o.jpg,0.210588633288,0.25,0.631765899865,1.0,980,959,https://www.flickr.com/photos/surfergirl30/30289217513,https://creativecommons.org/licenses/by/2.0/,SurFeRGiRL30,https://www.flickr.com/people/surfergirl30/ e3b840af402afdd3,https://c1.staticflickr.com/8/7443/27015576273_e19a5f3d57_o.jpg,0.0,0.0,0.666666666667,1.0,100,322,https://www.flickr.com/photos/happymillerman/27015576273,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ a9b9c17c560e9f2d,https://c1.staticflickr.com/6/5549/31085297735_73118807c1_o.jpg,0.0,0.0,0.910344827586,1.0,689,139,https://www.flickr.com/photos/dullhunk/31085297735,https://creativecommons.org/licenses/by/2.0/,Duncan Hull,https://www.flickr.com/people/dullhunk/ d83601902dd0caec,https://c1.staticflickr.com/8/7694/26928048702_47ab534c5f_o.jpg,0.0,0.0,0.75,0.75,725,556,https://www.flickr.com/photos/sudeep1106/26928048702/,https://creativecommons.org/licenses/by/2.0/,NINXIVI,https://www.flickr.com/people/sudeep1106/ 0259ac3162d7a7fa,https://c1.staticflickr.com/6/5696/31084399295_30dff1afc0_o.jpg,0.499263622975,0.25,0.99852724595,1.0,520,879,https://www.flickr.com/photos/joanneum/31084399295/,https://creativecommons.org/licenses/by/2.0/,Universalmuseum Joanneum,https://www.flickr.com/people/joanneum/ 44cf1dd2658609ae,https://c1.staticflickr.com/6/5341/30852899235_fdd942db58_o.jpg,0.0,0.4375,0.75,1.0,939,717,https://www.flickr.com/photos/notionscapital/30852899235/,https://creativecommons.org/licenses/by/2.0/,Mike Licht,https://www.flickr.com/people/notionscapital/ d06aecec9905e07a,https://c1.staticflickr.com/9/8161/29586005000_d92939076b_o.jpg,0.25,0.0,1.0,1.0,848,866,https://www.flickr.com/photos/quinet/29586005000,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ b53c546e0c820bb3,https://c1.staticflickr.com/6/5526/30302865136_084b7f60bc_o.jpg,0.0,0.0,0.75,1.0,913,728,http://www.flickr.com/photos/12707238@N00/30302865136/,https://creativecommons.org/licenses/by/2.0/,Eric.Ray,https://www.flickr.com/people/12707238@N00/ 493c91831f0ec982,https://c1.staticflickr.com/1/609/31545040516_f984d42523_o.jpg,0.28125,0.0,0.84375,0.75,780,769,https://www.flickr.com/photos/thoseguys119/31545040516,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 92af5a5cc010faa5,https://c1.staticflickr.com/9/8615/28432497356_5feb74085a_o.jpg,0.5,0.25,1.0,1.0,739,866,https://www.flickr.com/photos/blumenbiene/28432497356,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ 4721d7e8bd28c774,https://c1.staticflickr.com/6/5833/31273196086_f3d8ae7a8c_o.jpg,0.334315169367,0.0,1.0,1.0,498,849,https://flickr.com/35842362@N03/31273196086,https://creativecommons.org/licenses/by/2.0/,Fr James Bradley,https://www.flickr.com/people/jamesbradley/ 8450782fcc783297,https://c1.staticflickr.com/8/7299/28131689106_cc292d7aea_o.jpg,0.25,0.25,1.0,1.0,953,145,https://www.flickr.com/photos/tseenster/28131689106,https://creativecommons.org/licenses/by/2.0/,Tseen Khoo,https://www.flickr.com/people/tseenster/ 998a88a57b1f5866,https://c1.staticflickr.com/6/5713/31168161645_f1c2277747_o.jpg,0.25,0.250923190547,1.0,0.75276957164,407,260,https://www.flickr.com/photos/eltb/31168161645,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 792f731bef8ede95,https://c1.staticflickr.com/9/8568/29296141311_2205f92eee_o.jpg,0.0,0.0,0.75,1.0,309,134,https://www.flickr.com/photos/treegrow/29296141311/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 0b1f0c1067369bc5,https://c1.staticflickr.com/8/7797/27234854036_8e8f0f2040_o.jpg,0.25,0.0,0.75,0.75,668,344,https://www.flickr.com/photos/eberhardtschool/27234854036,https://creativecommons.org/licenses/by/2.0/,Eberhardt School,https://www.flickr.com/people/eberhardtschool/ 3657914a0279e3f4,https://c1.staticflickr.com/6/5659/22827195288_826a8dd140_o.jpg,0.0,0.25,0.497426470588,1.0,141,892,https://www.flickr.com/photos/dkeats/22827195288,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 0bb78770d50d0b08,https://c1.staticflickr.com/9/8855/27847199394_82b0112261_o.jpg,0.0,0.25,0.650420168067,1.0,923,833,https://www.flickr.com/photos/archivesnz/27847199394,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/ 249b57e677ca70b1,https://c1.staticflickr.com/8/7284/27028290533_131d119b4e_o.jpg,0.0,0.0,0.5,0.75,321,126,https://www.flickr.com/photos/52450054@N04/27028290533,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 9499bacadd0dd08c,https://c1.staticflickr.com/8/7453/27394843814_c9dcbbe0ed_o.jpg,0.4375,0.25,1.0,1.0,875,815,https://www.flickr.com/photos/69203347@N03/27394843814,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 7bca0c8e6c898cb2,https://c1.staticflickr.com/8/7370/27233994275_fedc98b696_o.jpg,0.315396113602,0.0,1.0,1.0,855,327,https://www.flickr.com/photos/bobtheberto/27233994275/,https://creativecommons.org/licenses/by/2.0/,Rob "Berto" Bennett,https://www.flickr.com/people/bobtheberto/ 4be4164a0ed03fd3,https://c1.staticflickr.com/8/7271/26933797270_a42909fd17_o.jpg,0.0,0.0,0.5,0.75,58,531,https://www.flickr.com/photos/gregthebusker/26933797270,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/ 8a8d7bb089dd305d,https://c1.staticflickr.com/8/7228/26804684992_b375b4f80c_o.jpg,0.25,0.0,1.0,0.599757673667,964,394,https://www.flickr.com/photos/55229469@N07/26804684992,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ abed3321f9001b33,https://c1.staticflickr.com/9/8626/28913863926_41079762e3_o.jpg,0.25,0.0,1.0,0.75,806,763,https://www.flickr.com/photos/wwworks/28913863926,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ 0fc931f15a2d8642,https://c1.staticflickr.com/6/5229/30106298771_fec9ce0c12_o.jpg,0.25,0.0,0.75,0.75,854,835,https://www.flickr.com/photos/billy1125/30106298771,https://creativecommons.org/licenses/by/2.0/,billy1125,https://www.flickr.com/people/billy1125/ e79ae44ee3c2a62b,https://c1.staticflickr.com/1/408/32677324675_3f790abfe0_o.jpg,0.0,0.0,0.370241116751,0.75,780,663,https://www.flickr.com/photos/thoseguys119/32677324675,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ db3f8c29f1206c6d,https://c1.staticflickr.com/1/592/31350109004_d381562c25_o.jpg,0.513100436681,0.0,1.0,0.75,780,757,https://www.flickr.com/photos/thoseguys119/31350109004,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c9e3bde5498910fb,https://c1.staticflickr.com/9/8030/29239632673_a83715dbb5_o.jpg,0.28125,0.0,0.84375,0.75,467,646,https://www.flickr.com/photos/pleia2/29239632673,https://creativecommons.org/licenses/by/2.0/,Elizabeth K. Joseph,https://www.flickr.com/people/pleia2/ 88e1f5aff515e97b,https://c1.staticflickr.com/1/374/32464237896_259ea58a9c_o.jpg,0.255402384501,0.0,0.766207153502,0.75,780,772,https://www.flickr.com/photos/thoseguys119/32464237896,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 9e4a8daa0cb264f3,https://c1.staticflickr.com/9/8257/29144549922_c5abc64173_o.jpg,0.0,0.0,0.75,1.0,93,679,https://www.flickr.com/photos/lunasinestrellas/29144549922/,https://creativecommons.org/licenses/by/2.0/,Luna sin estrellas,https://www.flickr.com/people/lunasinestrellas/ 217eec00b01bf033,https://c1.staticflickr.com/2/1701/26135990113_1a7f58c8c1_o.jpg,0.485426008969,0.25,1.0,1.0,885,547,http://www.flickr.com/photos/eltb/26135990113/,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 9bd7b2674aec286b,https://c1.staticflickr.com/8/7644/28405692645_6f3c0ebf74_o.jpg,0.333333333333,0.0,1.0,1.0,986,468,https://www.flickr.com/photos/cogdog/28405692645,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 355dbeaa03053d72,https://c1.staticflickr.com/8/7024/26511739334_c0bed67eab_o.jpg,0.0,0.25,0.5,1.0,402,511,https://www.flickr.com/photos/garryknight/26511739334,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ e6ee56e07376218e,https://c1.staticflickr.com/6/5570/30231900824_f02d01330f_o.jpg,0.0,0.0,0.664212076583,1.0,561,859,https://www.flickr.com/photos/eaglebrook/30231900824/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ a40a92752aa6ea98,https://c1.staticflickr.com/8/7265/27354265243_0a54f65750_o.jpg,0.0,0.0,0.5,0.75,401,880,https://www.flickr.com/photos/ufv/27354265243,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ 4e600c516b012ccb,https://c1.staticflickr.com/9/8818/28234711730_7711bb03ea_o.jpg,0.0,0.0,0.5625,0.75,108,997,https://www.flickr.com/photos/jimg944/28234711730,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ d24af6599b132df7,https://c1.staticflickr.com/8/7526/26872854330_e7530c80c2_o.jpg,0.0,0.25,0.75,1.0,934,168,https://www.flickr.com/photos/36749444@N06/26872854330/in/photolist-GkKohM-qhAiSF-GWEpmE,https://creativecommons.org/licenses/by/2.0/,Kanesue,https://www.flickr.com/people/36749444@N06/ dd825b19ef666dfa,https://c1.staticflickr.com/6/5667/30635924806_38c33782e2_o.jpg,0.371959942775,0.0,1.0,1.0,699,741,https://www.flickr.com/photos/94941635@N07/30635924806,https://creativecommons.org/licenses/by/2.0/,Zolt\303\241n V\303\266r\303\266s,https://www.flickr.com/people/94941635@N07/ e38f625efd714dd6,https://c1.staticflickr.com/9/8555/28578693850_1246a34796_o.jpg,0.0,0.25,0.5,1.0,982,1000,https://flickr.com/50264926@N02/28578693850,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ a294d25fa47f3e0f,https://c1.staticflickr.com/9/8041/29514261752_35f6e439ce_o.jpg,0.425206124853,0.0,0.850412249706,1.0,868,907,https://www.flickr.com/photos/jeepersmedia/29514261752,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ a5cfef9ed6a8dec2,https://c1.staticflickr.com/9/8274/29149589715_d493dea8b1_o.jpg,0.0,0.25,0.75,1.0,985,76,https://www.flickr.com/photos/enneafive/29149589715,https://creativecommons.org/licenses/by/2.0/,Johan Neven,https://www.flickr.com/people/enneafive/ bcb1fc26577fab9b,https://c1.staticflickr.com/8/7394/27748987361_e72772240f_o.jpg,0.303167420814,0.0,1.0,1.0,11,349,https://www.flickr.com/photos/sbern/27748987361/,https://creativecommons.org/licenses/by/2.0/,Stefan Berndtsson,https://www.flickr.com/people/sbern/ 5e183a0b419135cf,https://c1.staticflickr.com/6/5542/30422800205_6139ae9f4b_o.jpg,0.0,0.25,0.5625,1.0,976,703,https://www.flickr.com/photos/hinnosaar/30422800205/,https://creativecommons.org/licenses/by/2.0/,Marit & Toomas Hinnosaar,https://www.flickr.com/people/hinnosaar/ ad04103e7d948c42,https://c1.staticflickr.com/8/7182/26861447261_4642e530c5_o.jpg,0.438430311231,0.0,1.0,1.0,650,310,https://www.flickr.com/photos/stonehenge-stone-circle/26861447261,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/ dc0eec83984edb10,https://c1.staticflickr.com/6/5502/30360292444_b514812e98_o.jpg,0.28125,0.25,0.84375,1.0,11,810,https://www.flickr.com/photos/usfwsmidwest/30360292444,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 97e13da721657e0d,https://c1.staticflickr.com/6/5590/30487029583_b8853ee1de_o.jpg,0.25,0.25,1.0,1.0,787,944,https://www.flickr.com/photos/michaelpollak/30487029583/,https://creativecommons.org/licenses/by/2.0/,Michael Pollak,https://www.flickr.com/people/michaelpollak/ b92ef31584177015,https://c1.staticflickr.com/6/5565/30644083575_1349bba3bd_o.jpg,0.0,0.25,0.75,1.0,981,123,https://www.flickr.com/photos/shakespearesmonkey/30644083575,https://creativecommons.org/licenses/by/2.0/,Shakespearesmonkey,https://www.flickr.com/people/shakespearesmonkey/ 0337e3d16cb41b21,https://c1.staticflickr.com/9/8411/30240966512_664b571e81_o.jpg,0.5,0.0,1.0,0.75,561,151,https://www.flickr.com/photos/jill_carlson/30240966512,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 3d1263812667f066,https://c1.staticflickr.com/2/1691/26755604905_4ea4a236fc_o.jpg,0.25,0.25,0.75,1.0,95,145,https://www.flickr.com/photos/briangratwicke/26755604905,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ 2c7ebc0931e10714,https://c1.staticflickr.com/1/404/32546963372_cb15bc4a2a_o.jpg,0.0,0.0,1.0,0.75,23,946,https://www.flickr.com/photos/theslowlane/32546963372/,https://creativecommons.org/licenses/by/2.0/,Robert Ashworth,https://www.flickr.com/people/theslowlane/ 22fadd66bd941d49,https://c1.staticflickr.com/6/5749/30464465033_e23416209f_o.jpg,0.0,0.0,1.0,1.0,909,998,https://www.flickr.com/photos/afropicmusing/30464465033,https://creativecommons.org/licenses/by/2.0/,afromusing,https://www.flickr.com/people/afropicmusing/ 3562b7816d66aa24,https://c1.staticflickr.com/8/7799/27018510983_cf20dc0d08_o.jpg,0.0,0.25,0.5625,1.0,108,778,https://www.flickr.com/photos/jimg944/27018510983/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ d4ee46712caa11a4,https://c1.staticflickr.com/6/5470/31284834945_2c560fe4c8_o.jpg,0.0,0.0,0.75,0.75,973,628,https://www.flickr.com/photos/mcleod/31284834945,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/ 051774d307585d4e,https://c1.staticflickr.com/9/8679/29599778314_59d98842be_o.jpg,0.0,0.25,0.5,1.0,913,888,https://www.flickr.com/photos/dwhartwig/29599778314,https://creativecommons.org/licenses/by/2.0/,Daniel Hartwig,https://www.flickr.com/people/dwhartwig/ be48857b72c72e1e,https://c1.staticflickr.com/9/8599/28320371786_51b044002f_o.jpg,0.4375,0.0,1.0,0.75,459,424,https://www.flickr.com/photos/hockeyholic/28320371786,https://creativecommons.org/licenses/by/2.0/,Andy Blackledge,https://www.flickr.com/people/hockeyholic/ 1cd63c5a4e46c2a5,https://c1.staticflickr.com/9/8267/28494820283_8998d64d8e_o.jpg,0.25,0.49294205052,1.0,1.0,922,295,https://flickr.com/23112312@N08/28494820283,https://creativecommons.org/licenses/by/2.0/,Jeremy Crawshaw,https://www.flickr.com/people/23112312@N08/ 8650522e17b05230,https://c1.staticflickr.com/9/8533/29343681456_36741b0b62_o.jpg,0.28125,0.25,0.84375,1.0,980,865,https://www.flickr.com/photos/gromin/29343681456,https://creativecommons.org/licenses/by/2.0/,Nikolay Gromin,https://www.flickr.com/people/gromin/ b45b8f2953395e46,https://c1.staticflickr.com/6/5832/29862667216_02c9278b84_o.jpg,0.0,0.578822733424,0.75,1.0,669,9,https://www.flickr.com/photos/ankurp/29862667216,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ a53c345afc11bbd1,https://c1.staticflickr.com/1/717/31031428114_04abae523e_o.jpg,0.376029654036,0.0,1.0,0.75,209,392,http://www.flickr.com/photos/ocalways/31031428114/,https://creativecommons.org/licenses/by/2.0/,Rain Love AMR,https://www.flickr.com/people/ocalways/ e6ca5fecc3d5e79b,https://c1.staticflickr.com/9/8277/30016655546_b86c66b577_o.jpg,0.545358649789,0.0,1.0,0.75,563,638,https://www.flickr.com/photos/22711505@N05/30016655546,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 374d2237f8c530f0,https://c1.staticflickr.com/1/651/31813939606_93934760b9_o.jpg,0.306766917293,0.0,1.0,1.0,975,492,https://flickr.com/47445767@N05/31813939606,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 762c96c7232c41d3,https://c1.staticflickr.com/6/5566/30105991314_54bd58a449_o.jpg,0.25,0.313471502591,1.0,1.0,135,154,https://www.flickr.com/photos/usfwsmidwest/30105991314,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ d60ea538d53c2df9,https://c1.staticflickr.com/1/264/31567101626_1a4d1206a8_o.jpg,0.485101744186,0.0,0.970203488372,0.75,920,478,https://www.flickr.com/photos/jannerboy62/31567101626,https://creativecommons.org/licenses/by/2.0/,Nick Fewings 4.5 Million views,https://www.flickr.com/people/jannerboy62/ 461514ec6fbc129d,https://c1.staticflickr.com/8/7427/27009074653_582f4f2ff1_o.jpg,0.255022321429,0.0,0.765066964286,0.75,484,712,https://www.flickr.com/photos/wm_archiv/27009074653,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 1b7c237e43a63caf,https://c1.staticflickr.com/9/8898/28506547841_be23964e90_o.jpg,0.0,0.0,0.535877862595,0.75,404,672,https://www.flickr.com/photos/usnavy/28506547841,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ a3ee7919f271d98d,https://c1.staticflickr.com/8/7461/26998814703_5d356ccc4d_o.jpg,0.0,0.0,0.465149359886,0.75,405,673,https://www.flickr.com/photos/8269539@N04/26998814703,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 2fc91631196a3adc,https://c1.staticflickr.com/1/716/32421990446_584b9d361a_o.jpg,0.0,0.0,0.69578313253,1.0,93,74,https://www.flickr.com/photos/dkeats/32421990446,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ a518ced9fc09eeb3,https://c1.staticflickr.com/6/5149/29351584224_93c7d9e2f9_o.jpg,0.484655688623,0.0,1.0,0.75,975,99,https://www.flickr.com/photos/jsjgeology/29351584224,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 746fb399ad9fc267,https://c1.staticflickr.com/6/5336/30231283265_14b6ee31e6_o.jpg,0.4375,0.25,1.0,1.0,114,723,https://www.flickr.com/photos/fdecomite/30231283265,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 384b14c41908dc29,https://c1.staticflickr.com/1/585/32730398506_ddf703526f_o.jpg,0.300604229607,0.0,1.0,1.0,11,311,https://www.flickr.com/photos/93892629@N07/32730398506,https://creativecommons.org/licenses/by/2.0/,\303\205sa Berndtsson,https://www.flickr.com/people/93892629@N07/ bbb0357f89274659,https://c1.staticflickr.com/9/8732/29368841321_541c7470cc_o.jpg,0.0,0.0,0.5,0.75,780,948,https://www.flickr.com/photos/vagueonthehow/29368841321/,https://creativecommons.org/licenses/by/2.0/,vagueonthehow,https://www.flickr.com/people/vagueonthehow/ ff5ddcfaa1c76900,https://c1.staticflickr.com/6/5805/22793192778_25b26d630e_o.jpg,0.578822733424,0.25,1.0,1.0,131,464,https://www.flickr.com/photos/131880272@N06/22793192778,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/ e5386614902f7e64,https://c1.staticflickr.com/6/5673/30078066750_f5872b14a5_o.jpg,0.210588633288,0.25,0.631765899865,1.0,59,988,https://www.flickr.com/photos/treegrow/30078066750,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 1bc32170033310e1,https://c1.staticflickr.com/6/5588/30177392281_7caf5594ce_o.jpg,0.0,0.25,0.75,1.0,963,594,https://www.flickr.com/photos/tatuaggi/30177392281,https://creativecommons.org/licenses/by/2.0/,Ettore Bechis,https://www.flickr.com/people/tatuaggi/ 014ee52a7dd86d97,https://c1.staticflickr.com/1/311/32288188235_d355c08431_o.jpg,0.210588633288,0.0,0.631765899865,0.75,707,845,https://www.flickr.com/photos/decorativeconcrete/32288188235,https://creativecommons.org/licenses/by/2.0/,Decorative Concrete Kingdom,https://www.flickr.com/people/decorativeconcrete/ 1d22328a7d3c614b,https://c1.staticflickr.com/8/7300/27529993902_fed7cee370_o.jpg,0.508771929825,0.0,1.0,0.75,548,832,https://www.flickr.com/photos/robdammers/27529993902,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 9d9cafee70a5c36c,https://c1.staticflickr.com/6/5599/30868079715_0b9b3d9007_o.jpg,0.0,0.25,0.5,1.0,747,590,https://www.flickr.com/photos/usarak/30868079715,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/ 1868ebc9a642cdd4,https://c1.staticflickr.com/1/694/31702181972_0f94583d77_o.jpg,0.498153618907,0.0,1.0,0.75,946,59,https://www.flickr.com/photos/115537423@N04/31702181972,https://creativecommons.org/licenses/by/2.0/,Wilson leonel,https://www.flickr.com/people/115537423@N04/ fa603ad6c8c15ffa,https://c1.staticflickr.com/8/7086/27431790074_25f39a6e35_o.jpg,0.0,0.0,0.645863570392,1.0,98,753,https://www.flickr.com/photos/56433265@N04/27431790074/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/ 0f5dd2e31d909b87,https://c1.staticflickr.com/9/8578/28647406616_ab542dd24e_o.jpg,0.0,0.0,1.0,1.0,852,251,https://flickr.com/51035644690@N01/28647406616,https://creativecommons.org/licenses/by/2.0/,evan p. cordes,https://www.flickr.com/people/pheezy/ fc8dc0b93c18de1e,https://c1.staticflickr.com/9/8155/29534218241_63aa8aa37b_o.jpg,0.25,0.0,1.0,0.5,854,888,https://www.flickr.com/photos/quinet/29534218241,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ e2c0772c89ba1596,https://c1.staticflickr.com/8/7411/27672740946_6cc8b73e14_o.jpg,0.5,0.0,1.0,0.75,896,793,https://www.flickr.com/photos/faceme/27672740946,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ f72f0436f6e41e44,https://c1.staticflickr.com/8/7454/26809610052_20270a5f53_o.jpg,0.25,0.0,1.0,1.0,934,874,https://www.flickr.com/photos/jeepersmedia/26809610052,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 0b843636fc363ee1,https://c1.staticflickr.com/9/8103/28926703856_b99063c160_o.jpg,0.253152818991,0.25,0.759458456973,1.0,876,861,https://www.flickr.com/photos/fhgitarre/28926703856/,https://creativecommons.org/licenses/by/2.0/,FHgitarre,https://www.flickr.com/people/fhgitarre/ 6b138f3aa500019c,https://c1.staticflickr.com/1/729/32189230183_d29dc75307_o.jpg,0.0,0.0,0.594707520891,1.0,566,786,https://www.flickr.com/photos/kansasscanner/32189230183/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 3c983ed5706e47f4,https://c1.staticflickr.com/9/8568/28050869630_4608cd36b1_o.jpg,0.28125,0.25,0.84375,1.0,975,279,https://www.flickr.com/photos/jsjgeology/28050869630,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 7f22cad03f98680c,https://c1.staticflickr.com/2/1469/26481375110_e8584eb767_o.jpg,0.25,0.0,0.75,0.75,548,199,https://www.flickr.com/photos/rhemkes/26481375110,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 8eb4269f7df9dd34,https://c1.staticflickr.com/9/8601/27738413184_c4988c50fd_o.jpg,0.0,0.0,0.696832579186,1.0,946,675,https://www.flickr.com/photos/elzey/27738413184,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/ ea4d7b75b62442c3,https://c1.staticflickr.com/8/7523/29268242562_5a6de66600_o.jpg,0.499263622975,0.25,0.99852724595,1.0,459,539,https://www.flickr.com/photos/vahemart/29268242562/,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ b487aeab486ea554,https://c1.staticflickr.com/9/8129/29153364483_7dd9d095e7_o.jpg,0.25,0.25,0.75,1.0,437,145,https://www.flickr.com/photos/greggjerdingen/29153364483,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 8f9b32c998191657,https://c1.staticflickr.com/8/7479/28144633622_7d08d2fa25_o.jpg,0.5,0.0,1.0,0.75,405,517,https://www.flickr.com/photos/7332125@N04/28144633622/,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 9f13bca209872673,https://c1.staticflickr.com/8/7460/28144985255_46bb6c33ff_o.jpg,0.0,0.5,0.75,1.0,443,454,https://www.flickr.com/photos/dordrecht-holland/28144985255,https://creativecommons.org/licenses/by/2.0/,Paul van de Velde,https://www.flickr.com/people/dordrecht-holland/ 320d9663a6005ff6,https://c1.staticflickr.com/9/8021/29297048024_9e7608376c_o.jpg,0.0,0.25,0.5,1.0,704,801,https://www.flickr.com/photos/126337928@N05/29297048024,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ af218bccd2f180e2,https://c1.staticflickr.com/1/255/31776378102_64ca543a62_o.jpg,0.0,0.248348017621,0.75,0.745044052863,484,705,https://www.flickr.com/photos/34517490@N00/31776378102/,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/ 116032ec85db1800,https://c1.staticflickr.com/1/602/30880438894_440656f7a3_o.jpg,0.0,0.0,0.5,0.75,471,709,https://www.flickr.com/photos/kunstee/30880438894,https://creativecommons.org/licenses/by/2.0/,Kunstee,https://www.flickr.com/people/kunstee/ 37e8241784d70dc5,https://c1.staticflickr.com/9/8730/28188306564_1ecef17662_o.jpg,0.249079528719,0.0,0.747238586156,0.75,746,774,https://www.flickr.com/photos/lespetitescases/28188306564,https://creativecommons.org/licenses/by/2.0/,Gautier Poupeau,https://www.flickr.com/people/lespetitescases/ aa1fadae19ef0fab,https://c1.staticflickr.com/9/8232/28833810563_39db7f87cb_o.jpg,0.0,0.0,0.75,1.0,499,89,https://www.flickr.com/photos/southbeachcars/28833810563/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 59a63a0db488ff84,https://c1.staticflickr.com/6/5657/29898836313_d4a5a4e22f_o.jpg,0.336764705882,0.0,1.0,1.0,976,256,https://www.flickr.com/photos/jetef2/29898836313/,https://creativecommons.org/licenses/by/2.0/,E. D'Ascoli Photographies,https://www.flickr.com/people/jetef2/ 520b90ccad6c7548,https://c1.staticflickr.com/6/5585/30967336290_bcdc643cb8_o.jpg,0.0,0.0,0.75,0.5625,848,162,https://flickr.com/73162879@N06/30967336290,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ 960ce53aec5fb183,https://c1.staticflickr.com/8/7564/27029139362_ca14fc8a16_o.jpg,0.25,0.0,1.0,1.0,735,596,https://www.flickr.com/photos/27665395@N05/27029139362,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 42a2d92e3bc25651,https://c1.staticflickr.com/6/5603/30864408346_8718889064_o.jpg,0.0,0.0,0.597580645161,0.75,9,27,https://www.flickr.com/photos/carbonnyc/30864408346/,https://creativecommons.org/licenses/by/2.0/,David Goehring,https://www.flickr.com/people/carbonnyc/ 8fdbd989dc328d5a,https://c1.staticflickr.com/1/406/20022073588_33eb5c3074_o.jpg,0.25,0.25,1.0,1.0,986,229,https://www.flickr.com/photos/zedzap/20022073588,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/ 243cf820d9e41c55,https://c1.staticflickr.com/6/5742/30158119163_7fc22e95bc_o.jpg,0.0,0.0,0.496696035242,0.75,484,605,https://www.flickr.com/photos/sybarite48/30158119163,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 526c329e60bc418f,https://c1.staticflickr.com/9/8275/29456805432_ee6b00ba79_o.jpg,0.0,0.0,1.0,0.710806697108,923,531,https://www.flickr.com/photos/oldguardmuseum/29456805432/,https://creativecommons.org/licenses/by/2.0/,Old Guard History,https://www.flickr.com/people/oldguardmuseum/ 4105136a49187bef,https://c1.staticflickr.com/1/381/31759733072_cab4ffef66_o.jpg,0.0,0.278188180404,0.75,0.834564541213,611,948,https://www.flickr.com/photos/spreadshirt/31759733072,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/ f1c92bd6523f45f6,https://c1.staticflickr.com/8/7569/27692283386_e2ccf8ce8f_o.jpg,0.0,0.452546296296,0.75,1.0,890,451,https://www.flickr.com/photos/143441264@N02/27692283386/,https://creativecommons.org/licenses/by/2.0/,Archive of the Sibelius Museum,https://www.flickr.com/people/143441264@N02/ f5ccf5074f7d6e54,https://c1.staticflickr.com/8/7283/27215297016_d0bf505d68_o.jpg,0.322864321608,0.25,0.968592964824,1.0,413,982,https://www.flickr.com/photos/morebyless/27215297016,https://creativecommons.org/licenses/by/2.0/,morebyless,https://www.flickr.com/people/morebyless/ 88551a82a47b7d36,https://c1.staticflickr.com/8/7482/27879621073_e3653e6d20_o.jpg,0.573910081744,0.25,1.0,1.0,405,599,https://www.flickr.com/photos/8269539@N04/27879621073,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 7ac1dde4600dd8bd,https://c1.staticflickr.com/6/5128/30088670415_e31221dc6e_o.jpg,0.25,0.25,1.0,1.0,680,58,https://www.flickr.com/photos/feeliz/30088670415/,https://creativecommons.org/licenses/by/2.0/,Jana Lehmann,https://www.flickr.com/people/feeliz/ 77f0896794e789ce,https://c1.staticflickr.com/1/675/32796183436_2a53cbffaa_o.jpg,0.28125,0.25,0.84375,1.0,704,319,https://www.flickr.com/photos/rjbailey/32796183436/,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/ 1f473a12955e704d,https://c1.staticflickr.com/1/558/31995530663_2eb85f915f_o.jpg,0.25,0.29465849387,1.0,1.0,688,878,https://www.flickr.com/photos/krossbow/31995530663,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/ 096b03daf4e82382,https://c1.staticflickr.com/1/548/31575343796_f12ac75663_o.jpg,0.0,0.25,0.75,0.75,499,312,https://www.flickr.com/photos/45958601@N02/31575343796,https://creativecommons.org/licenses/by/2.0/,joey zanotti,https://www.flickr.com/people/45958601@N02/ 6367ac8abbfbee7f,https://c1.staticflickr.com/9/8025/29088179735_5417532c14_o.jpg,0.25,0.0,0.75,0.75,975,460,https://www.flickr.com/photos/carbonnyc/29088179735/,https://creativecommons.org/licenses/by/2.0/,David Goehring,https://www.flickr.com/people/carbonnyc/ a76bc8cab3c11e85,https://c1.staticflickr.com/8/7678/26851311721_835c391891_o.jpg,0.4375,0.25,1.0,1.0,699,909,https://flickr.com/7295874@N03/26851311721,https://creativecommons.org/licenses/by/2.0/,RachelH_,https://www.flickr.com/people/bagelmouse/ 7a8c8c7fa376b0a9,https://c1.staticflickr.com/9/8844/27681246153_97760ebbca_o.jpg,0.5,0.0,1.0,0.75,146,644,https://www.flickr.com/photos/laikolosse/27681246153/,https://creativecommons.org/licenses/by/2.0/,laikolosse,https://www.flickr.com/people/laikolosse/ 25ab60d9f3673538,https://c1.staticflickr.com/1/564/32537365476_2147837bc1_o.jpg,0.25,0.25,1.0,0.75,709,651,https://www.flickr.com/photos/dalbera/32537365476/,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 5d7a2a638b6bb82d,https://c1.staticflickr.com/1/406/32501864826_3c97be7d4d_o.jpg,0.0,0.25,0.5625,1.0,480,457,https://www.flickr.com/photos/truckhardware/32501864826,https://creativecommons.org/licenses/by/2.0/,Truck Hardware,https://www.flickr.com/people/truckhardware/ 1a8ce1a41fa41835,https://c1.staticflickr.com/6/5534/30193283054_6884d4a39d_o.jpg,0.0,0.217252396166,1.0,1.0,986,711,https://www.flickr.com/photos/hugostorero/30193283054,https://creativecommons.org/licenses/by/2.0/,Cesar Hugo STORERO,https://www.flickr.com/people/hugostorero/ 3763c4fde457c54e,https://c1.staticflickr.com/9/8668/30529456405_7ea2cd5bd6_o.jpg,0.210588633288,0.0,0.631765899865,0.75,752,485,https://www.flickr.com/photos/pedrik/30529456405,https://creativecommons.org/licenses/by/2.0/,pedrik,https://www.flickr.com/people/pedrik/ 57cd88b0f78f0da7,https://c1.staticflickr.com/6/5724/30470416702_971fe1301d_o.jpg,0.0,0.0,1.0,0.799676898223,702,386,https://www.flickr.com/photos/peterhess/30470416702,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/ e37fa47b70126729,https://c1.staticflickr.com/9/8417/30102225021_56e0772232_o.jpg,0.25,0.0,0.75,0.75,889,788,https://www.flickr.com/photos/barnimages/30102225021,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ 0d90cded2ee351c6,https://c1.staticflickr.com/9/8338/28986449914_81a0e47869_o.jpg,0.0,0.0,0.75,1.0,971,511,https://www.flickr.com/photos/28416709@N06/28986449914,https://creativecommons.org/licenses/by/2.0/,Stevan Nicholas,https://www.flickr.com/people/28416709@N06/ 767c7c8bd98366bf,https://c1.staticflickr.com/9/8094/28886227310_10e3958031_o.jpg,0.0,0.0,1.0,0.75,410,44,https://www.flickr.com/photos/arjanrichter/28886227310,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/ 10f7d3be7715ddda,https://c1.staticflickr.com/8/7618/26699437172_741b2c8520_o.jpg,0.25,0.0,0.75,0.75,469,587,https://www.flickr.com/photos/transitomedellin/26699437172,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ 31c99affa0ec993e,https://c1.staticflickr.com/6/5737/30517578140_0e8b5961e2_o.jpg,0.0,0.25,0.42174796748,1.0,976,238,https://www.flickr.com/photos/wilfred_hdez/30517578140/,https://creativecommons.org/licenses/by/2.0/,Wilfred Hdez,https://www.flickr.com/people/wilfred_hdez/ fb9d0b6b7c769055,https://c1.staticflickr.com/9/8348/29213677625_a373258140_o.jpg,0.0,0.0,1.0,1.0,874,417,https://flickr.com/51966661@N00/29213677625,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/ 8f87ac50c8e01474,https://c1.staticflickr.com/6/5741/30407672434_f1cf0253f1_o.jpg,0.25,0.0,1.0,0.5,777,775,https://www.flickr.com/photos/devdsp/30407672434,https://creativecommons.org/licenses/by/2.0/,Adam Thomas,https://www.flickr.com/people/devdsp/ b521cfe682e3c26a,https://c1.staticflickr.com/8/7395/27787563850_489d5ec964_o.jpg,0.421177266576,0.0,0.842354533153,0.75,706,479,https://www.flickr.com/photos/12216515@N00/27787563850,https://creativecommons.org/licenses/by/2.0/,Charles Fulton,https://www.flickr.com/people/12216515@N00/ 800bbac9e2e5974d,https://c1.staticflickr.com/1/293/30961094834_95715bc054_o.jpg,0.25,0.25,0.75,1.0,470,582,https://www.flickr.com/photos/shankaronline/30961094834/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 32d6ea19973089f4,https://c1.staticflickr.com/8/7345/26831347744_a4d253db99_o.jpg,0.5,0.0,1.0,0.75,401,507,https://www.flickr.com/photos/joi/26831347744,https://creativecommons.org/licenses/by/2.0/,Joi Ito,https://www.flickr.com/people/joi/ 932324a2f222b471,https://c1.staticflickr.com/8/7252/26281652183_50755b76a6_o.jpg,0.25,0.0,0.75,0.75,405,394,https://www.flickr.com/photos/km30192002/26281652183,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/ a4e1aa5e532bc7e8,https://c1.staticflickr.com/9/8241/29657959122_a498d5474d_o.jpg,0.202420424403,0.25,0.60726127321,1.0,405,492,https://www.flickr.com/photos/hisgett/29657959122,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 5be253aedd66d5b6,https://c1.staticflickr.com/9/8142/28763062985_8c370bb541_o.jpg,0.0,0.25,0.75,0.75,764,460,https://www.flickr.com/photos/rusty_clark/28763062985,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ d892b14aefe43916,https://c1.staticflickr.com/1/596/31714138494_4fac9eeb28_o.jpg,0.267530487805,0.25,0.802591463415,1.0,924,860,https://www.flickr.com/photos/ruthanddave/31714138494/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 87df0342c5a405d2,https://c1.staticflickr.com/9/8520/29507482162_2ab5b651e3_o.jpg,0.0,0.25,0.75,1.0,929,630,https://www.flickr.com/photos/joyosity/29507482162,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/ eec346a1a967a408,https://c1.staticflickr.com/1/446/30909014673_d4828c6944_o.jpg,0.421177266576,0.0,0.842354533153,0.75,324,82,https://flickr.com/149503105@N07/30909014673,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ 93c222c6a2c24b65,https://c1.staticflickr.com/9/8108/28585771872_d18a7cd414_o.jpg,0.333333333333,0.0,1.0,1.0,986,923,https://www.flickr.com/photos/postmanpetecoluk/28585771872,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ e1168b88200e4032,https://c1.staticflickr.com/8/7621/28221527962_cbb8e4c946_o.jpg,0.331130690162,0.0,0.993392070485,1.0,986,727,https://www.flickr.com/photos/sybarite48/28221527962,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ c3f0e246fc398615,https://c1.staticflickr.com/6/5557/30434868972_10f1abf010_o.jpg,0.5,0.0,1.0,0.75,821,774,https://flickr.com/48318374@N08/30434868972,https://creativecommons.org/licenses/by/2.0/,nzsteam,https://www.flickr.com/people/nzsteam/ a32d21752b6760a6,https://c1.staticflickr.com/9/8475/29647962622_02b47e8317_o.jpg,0.219917012448,0.25,0.659751037344,1.0,520,776,https://www.flickr.com/photos/navcent/29647962622,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/ 6dfb92193c305bf8,https://c1.staticflickr.com/1/617/31946745173_db8884b047_o.jpg,0.4375,0.25,1.0,1.0,569,988,https://www.flickr.com/photos/garryknight/31946745173/,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ 42218a71facb4e2e,https://c1.staticflickr.com/9/8162/29300587920_b9bb32986c_o.jpg,0.280784844384,0.0,0.842354533153,1.0,972,745,https://www.flickr.com/photos/fibonacciblue/29300587920,https://creativecommons.org/licenses/by/2.0/,Fibonacci Blue,https://www.flickr.com/people/fibonacciblue/ 4cb88aa5bfe86ef0,https://c1.staticflickr.com/9/8067/28365952413_775de417d4_o.jpg,0.437669376694,0.0,1.0,1.0,511,854,https://www.flickr.com/photos/28169156@N03/28365952413,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/ d168fa26f75fb35a,https://c1.staticflickr.com/8/7419/27752222831_d70c650f13_o.jpg,0.0,0.0,0.515344311377,0.75,830,399,https://www.flickr.com/photos/marinelson/27752222831,https://creativecommons.org/licenses/by/2.0/,Marinelson Almeida - Traveling through Brazil,https://www.flickr.com/people/marinelson/ 53043cdddefa8193,https://c1.staticflickr.com/8/7703/26874347942_bd6276b976_o.jpg,0.0,0.0,0.465149359886,0.75,781,225,https://www.flickr.com/photos/glynlowe/26874347942,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ 8aba9f1a3dac78f3,https://c1.staticflickr.com/9/8418/29398409330_2f5b3e66ae_o.jpg,0.5,0.0,1.0,0.75,108,424,https://www.flickr.com/photos/raita/29398409330,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/ 5ae72bdc2348ec2f,https://c1.staticflickr.com/6/5833/29489317533_d4923336a0_o.jpg,0.333333333333,0.0,1.0,1.0,860,680,https://www.flickr.com/photos/yourbestdigs/29489317533/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ df65608e84f96fed,https://c1.staticflickr.com/8/7359/27268221802_f0fb74792e_o.jpg,0.25,0.0,0.75,0.75,820,781,https://www.flickr.com/photos/jus10h/27268221802,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 7270a0d2e24cb23e,https://c1.staticflickr.com/8/7286/27524507964_39f665a58a_o.jpg,0.0,0.0,0.75,1.0,997,332,https://www.flickr.com/photos/treegrow/27524507964,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 98cb2bb141a416cf,https://c1.staticflickr.com/9/8576/28193722465_7f78cda71b_o.jpg,0.25,0.0,1.0,1.0,971,517,https://www.flickr.com/photos/m_p_king/28193722465,https://creativecommons.org/licenses/by/2.0/,M. King,https://www.flickr.com/people/m_p_king/ 16e43e4c2c0f5502,https://c1.staticflickr.com/6/5675/30962143600_40ccc30555_o.jpg,0.25,0.0,0.75,0.75,147,675,http://www.flickr.com/photos/blachswan/30962143600/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ b1f03fd058c84618,https://c1.staticflickr.com/8/7024/26844113400_1235e6633b_o.jpg,0.486191860465,0.0,0.97238372093,0.75,437,458,https://www.flickr.com/photos/armingruber/26844113400,https://creativecommons.org/licenses/by/2.0/,Armin Gruber,https://www.flickr.com/people/armingruber/ 2a41f0ad4c85b559,https://c1.staticflickr.com/1/632/32696308045_1278aef54d_o.jpg,0.0,0.0,0.47170487106,0.75,822,909,https://www.flickr.com/photos/13476480@N07/32696308045,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 1263596b7e17d4ff,https://c1.staticflickr.com/8/7247/27842110632_8495196eb1_o.jpg,0.325801749271,0.0,0.977405247813,1.0,706,828,https://www.flickr.com/photos/robdammers/27842110632,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 3b50fc2b89c09b45,https://c1.staticflickr.com/6/5535/30232795964_0e5bc000d4_o.jpg,0.28125,0.25,0.84375,1.0,875,929,https://www.flickr.com/photos/69203347@N03/30232795964,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 8f6cb980405c2e92,https://c1.staticflickr.com/9/8686/28452846745_6344dd1cb8_o.jpg,0.0,0.0,1.0,1.0,310,814,https://www.flickr.com/photos/12463666@N03/28452846745/,https://creativecommons.org/licenses/by/2.0/,Bob M ~,https://www.flickr.com/people/12463666@N03/ 81dfe18c7dd3deaf,https://c1.staticflickr.com/1/382/31845395606_6bff66ff46_o.jpg,0.0,0.0,1.0,1.0,563,158,https://flickr.com/98826299@N00/31845395606,https://creativecommons.org/licenses/by/2.0/,Deb Nystrom,https://www.flickr.com/people/stella12/ 6f589f53e4a555b4,https://c1.staticflickr.com/8/7241/26618242513_a6059fb3a9_o.jpg,0.28125,0.0,0.84375,0.75,780,161,https://www.flickr.com/photos/thoseguys119/26618242513,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ fcc45c8ecf9c3e09,https://c1.staticflickr.com/8/7426/27325185776_b03b5a0440_o.jpg,0.25,0.0,1.0,0.75,422,587,https://www.flickr.com/photos/rodrigoparedes/27325185776,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/ bd9a4aad686037a8,https://c1.staticflickr.com/9/8133/29211145524_c59ecc89dd_o.jpg,0.0,0.25,0.75,0.75,980,803,https://www.flickr.com/photos/amslerpix/29211145524/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ d8100f1cba65d977,https://c1.staticflickr.com/8/7423/27534868650_43fb11d01d_o.jpg,0.0,0.0,0.5,0.75,593,134,https://www.flickr.com/photos/esoastronomy/27534868650,https://creativecommons.org/licenses/by/2.0/,European Southern Observatory,https://www.flickr.com/people/esoastronomy/ 0f80305a421a181b,https://c1.staticflickr.com/9/8601/30297580082_d59be04f91_o.jpg,0.25,0.25,0.75,1.0,976,911,https://www.flickr.com/photos/o_0/30297580082,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 0c2a8a70b9b8bc3c,https://c1.staticflickr.com/8/7049/26848092634_a5406f8977_o.jpg,0.304268292683,0.0,0.912804878049,0.75,319,431,https://www.flickr.com/photos/gails_pictures/26848092634/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ cf998720406428f2,https://c1.staticflickr.com/6/5804/30440480655_6ba05917fd_o.jpg,0.0,0.0,0.423913043478,0.75,780,879,https://www.flickr.com/photos/thoseguys119/30440480655,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 582914a8320bd4a9,https://c1.staticflickr.com/6/5494/30335407000_4e63b1f8bc_o.jpg,0.333333333333,0.0,1.0,1.0,519,843,https://www.flickr.com/photos/box_repsol/30335407000,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 13773eecaef83f87,https://c1.staticflickr.com/1/347/32751802035_442079b727_o.jpg,0.264605462822,0.25,0.793816388467,1.0,101,851,https://www.flickr.com/photos/wildreturn/32751802035,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ 6bc772d2517bb3ce,https://c1.staticflickr.com/1/487/31406703274_1e0b99afba_o.jpg,0.0,0.0,0.663235294118,1.0,520,862,https://www.flickr.com/photos/toomore/31406703274,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/ 7b82ff21ef498c7c,https://c1.staticflickr.com/8/7128/27293625855_0bde1d86f0_o.jpg,0.0,0.0,0.433722527473,0.75,114,824,https://www.flickr.com/photos/gaby1/27293625855,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ b6568cb98082d52a,https://c1.staticflickr.com/9/8190/29287863204_649537e900_o.jpg,0.333333333333,0.0,1.0,1.0,480,652,https://flickr.com/38712296@N07/29287863204,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 33b29f2223cae641,https://c1.staticflickr.com/6/5574/31465401962_48fd9a8686_o.jpg,0.0,0.313471502591,0.75,1.0,558,618,https://www.flickr.com/photos/22711505@N05/31465401962,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ ac86c20e5581fc24,https://c1.staticflickr.com/1/368/31868515121_f26897d528_o.jpg,0.0,0.25,0.5625,1.0,796,72,https://www.flickr.com/photos/stevendepolo/31868515121,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ b3ce5663b62f4eed,https://c1.staticflickr.com/8/7479/26962246971_3f7ce78c62_o.jpg,0.25,0.0,1.0,0.75,982,779,https://www.flickr.com/photos/brendan-c/26962246971,https://creativecommons.org/licenses/by/2.0/,Brendan C,https://www.flickr.com/people/brendan-c/ 9121f84b22dd6eb5,https://c1.staticflickr.com/9/8356/28568404183_1e69cdc052_o.jpg,0.25,0.0,1.0,1.0,875,731,https://www.flickr.com/photos/didbygraham/28568404183,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 02d9e9b244c336c3,https://c1.staticflickr.com/9/8094/29850039242_0d4537d4b3_o.jpg,0.497426470588,0.25,0.994852941176,1.0,426,461,https://www.flickr.com/photos/60712129@N06/29850039242,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/ 1ad7add95f5b5fa3,https://c1.staticflickr.com/6/5718/30865042696_e5bb7dacd5_o.jpg,0.25,0.0,0.75,0.75,885,652,https://www.flickr.com/photos/jlascar/30865042696,https://creativecommons.org/licenses/by/2.0/,Jorge L\303\241scar,https://www.flickr.com/people/jlascar/ 622aaed69e07495a,https://c1.staticflickr.com/8/7552/26769229011_eedb953d03_o.jpg,0.25352897474,0.25,0.76058692422,1.0,985,451,https://www.flickr.com/photos/romanboed/26769229011,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/ 482879640e88f893,https://c1.staticflickr.com/8/7639/27983273125_26ecd630e1_o.jpg,0.255402384501,0.0,0.766207153502,0.75,662,467,https://www.flickr.com/photos/usacehq/27983273125,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers,https://www.flickr.com/people/usacehq/ 0f2e8e58a991472b,https://c1.staticflickr.com/8/7655/27935989691_ac313d4515_o.jpg,0.0,0.0,0.701966717095,1.0,120,697,https://www.flickr.com/photos/taylar/27935989691,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ e55cc7469a84476a,https://c1.staticflickr.com/8/7272/27358210700_5179520305_o.jpg,0.4375,0.0,1.0,0.75,89,227,https://www.flickr.com/photos/pamelav/27358210700,https://creativecommons.org/licenses/by/2.0/,Pamela V White,https://www.flickr.com/people/pamelav/ ce99a0896f6c9277,https://c1.staticflickr.com/9/8450/29336528460_9b0afb9aa5_o.jpg,0.28125,0.0,0.84375,0.75,964,316,https://www.flickr.com/photos/linsinchen/29336528460,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/ 2f606d106a854e58,https://c1.staticflickr.com/9/8325/28840808243_77e11f0538_o.jpg,0.0,0.25,0.5,1.0,563,569,https://www.flickr.com/photos/harshlight/28840808243,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ 37ba2e92645e5fdf,https://c1.staticflickr.com/8/7757/26592631594_13445d47ef_o.jpg,0.0,0.25,0.544615384615,1.0,821,354,https://www.flickr.com/photos/robdammers/26592631594,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 7f7856afe236ce4f,https://c1.staticflickr.com/6/5318/30061455171_04cdd57616_o.jpg,0.0,0.0,0.666666666667,1.0,426,798,https://www.flickr.com/photos/jcookfisher/30061455171/,https://creativecommons.org/licenses/by/2.0/,jcookfisher,https://www.flickr.com/people/jcookfisher/ e855ba5abd770ab3,https://c1.staticflickr.com/4/3707/32425177480_44d7e0e1a1_o.jpg,0.24213836478,0.0,1.0,1.0,349,375,https://www.flickr.com/photos/erix/32425177480,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand,https://www.flickr.com/people/erix/ 55a7dbb8e91f2536,https://c1.staticflickr.com/8/7617/27258155576_535ea4969d_o.jpg,0.5,0.0,1.0,0.75,480,778,https://www.flickr.com/photos/mjtmail/27258155576,https://creativecommons.org/licenses/by/2.0/,mjtmail (tiggy),https://www.flickr.com/people/mjtmail/ d6864c58495327f7,https://c1.staticflickr.com/9/8564/27936064894_7909854bf0_o.jpg,0.5,0.0,1.0,0.75,971,9,https://www.flickr.com/photos/davebloggs007/27936064894,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 3de80a620a7af2ec,https://c1.staticflickr.com/1/388/31107382244_a0df541bfc_o.jpg,0.28125,0.0,0.84375,0.75,97,428,https://www.flickr.com/photos/ewolivera/31107382244,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ 9ffdf9ac514cfba3,https://c1.staticflickr.com/6/5453/30780416321_e59d0b54a7_o.jpg,0.25,0.4375,1.0,1.0,122,136,https://www.flickr.com/photos/30478819@N08/30780416321,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ b4ab8f1890027769,https://c1.staticflickr.com/6/5446/30867889631_d0bef56d32_o.jpg,0.0,0.0,0.56298600311,1.0,875,806,https://flickr.com/135275665@N03/30867889631,https://creativecommons.org/licenses/by/2.0/,Eddy Verschueren,https://www.flickr.com/people/traveltopper/ acc42d38cddee1cf,https://c1.staticflickr.com/1/631/32757850631_6a2b164034_o.jpg,0.4375,0.0,1.0,0.75,865,47,https://www.flickr.com/photos/27665395@N05/32757850631/,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 954b2d556ac3fe1a,https://c1.staticflickr.com/8/7500/26774462223_1a9022705b_o.jpg,0.503303964758,0.0,1.0,0.75,310,339,https://www.flickr.com/photos/theocrazzolara/26774462223/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ c3742d2b9aee03fd,https://c1.staticflickr.com/1/541/32440448362_8fbf0e683f_o.jpg,0.331617647059,0.0,0.994852941176,1.0,971,574,https://flickr.com/133488379@N08/32440448362,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ fb55e4fe303ce588,https://c1.staticflickr.com/6/5695/31074183890_76bce0c94a_o.jpg,0.330631399317,0.0,1.0,0.75,672,309,https://www.flickr.com/photos/glorycycles/31074183890,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 309a61f58932f9d3,https://c1.staticflickr.com/8/7210/27224447633_1384ea41fe_o.jpg,0.250923190547,0.0,0.75276957164,0.75,324,68,https://www.flickr.com/photos/usfwsmidwest/27224447633,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 73add730ee6a64da,https://c1.staticflickr.com/1/497/32646040911_a77e4ef080_o.jpg,0.25,0.0,1.0,0.75,672,121,https://www.flickr.com/photos/glorycycles/32646040911,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ df3a6d57446e3adb,https://c1.staticflickr.com/1/517/32438911541_3c1ccc6f61_o.jpg,0.333333333333,0.0,1.0,1.0,105,875,https://www.flickr.com/photos/rexness/32438911541/,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/ 6ca9feaa8708e7e8,https://c1.staticflickr.com/1/751/32065884240_cdaff4ef66_o.jpg,0.25,0.0,1.0,1.0,735,220,https://www.flickr.com/photos/27665395@N05/32065884240,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 2692929876296ef9,https://c1.staticflickr.com/8/7122/27677841415_2db0b99cd3_o.jpg,0.25,0.25,0.75,1.0,854,692,https://www.flickr.com/photos/tjshirey/27677841415,https://creativecommons.org/licenses/by/2.0/,Trevin Shirey,https://www.flickr.com/people/tjshirey/ e8de68d1c0953ebb,https://c1.staticflickr.com/9/8822/28310394774_47b6ca2d2f_o.jpg,0.0,0.0,0.75,0.75,498,759,https://www.flickr.com/photos/91425144@N04/28310394774,https://creativecommons.org/licenses/by/2.0/,Arran Bee,https://www.flickr.com/people/91425144@N04/ 52ce80df32914dc3,https://c1.staticflickr.com/6/5774/30437564623_84c217d22e_o.jpg,0.25,0.0,1.0,0.5,820,892,https://www.flickr.com/photos/jus10h/30437564623,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 92ea83a3d0c9e527,https://c1.staticflickr.com/8/7205/26861262392_80978e75b0_o.jpg,0.248348017621,0.25,0.745044052863,1.0,26,772,https://www.flickr.com/photos/aah-yeah/26861262392/,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/ 97191f504702f144,https://c1.staticflickr.com/9/8349/28460060652_228b06bb24_o.jpg,0.333333333333,0.0,1.0,1.0,699,97,https://www.flickr.com/photos/parisharing/28460060652,https://creativecommons.org/licenses/by/2.0/,ParisSharing,https://www.flickr.com/people/parisharing/ 46599a10d96c0eb4,https://c1.staticflickr.com/8/7337/26834139236_423a8e3f43_o.jpg,0.0,0.0,1.0,1.0,792,646,https://www.flickr.com/photos/juliejordanscott/26834139236/,https://creativecommons.org/licenses/by/2.0/,Julie Jordan Scott,https://www.flickr.com/people/juliejordanscott/ 109d5ba3faba5681,https://c1.staticflickr.com/9/8679/30485799251_df0c39c8ba_o.jpg,0.25,0.0,1.0,1.0,437,30,https://www.flickr.com/photos/27665395@N05/30485799251,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ f48e17b979a7452c,https://c1.staticflickr.com/4/3903/33011767050_d7e9f02e3b_o.jpg,0.576662143826,0.0,1.0,0.75,976,850,https://www.flickr.com/photos/tdlucas5000/33011767050,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ acee304e6400ce8a,https://c1.staticflickr.com/3/2645/32678938611_e6a643f851_o.jpg,0.25,0.0,1.0,0.75,459,539,https://flickr.com/46262306@N04/32678938611,https://creativecommons.org/licenses/by/2.0/,Aberdeen Proving Ground,https://www.flickr.com/people/usagapg/ 58496c486d66074c,https://c1.staticflickr.com/9/8780/27829070344_d2fb385064_o.jpg,0.223015320334,0.25,0.669045961003,1.0,808,889,https://www.flickr.com/photos/rvwithtito/27829070344,https://creativecommons.org/licenses/by/2.0/,RVWithTito.com,https://www.flickr.com/people/rvwithtito/ e9d0f9392ff838d7,https://c1.staticflickr.com/8/7514/28010171106_b5c4353457_o.jpg,0.25,0.0,0.75,0.75,896,550,https://www.flickr.com/photos/markyharky/28010171106,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 9ee06b354699f2ad,https://c1.staticflickr.com/6/5566/29915855306_64d08fe59a_o.jpg,0.0,0.25,0.561328125,1.0,384,586,https://www.flickr.com/photos/vermazeren/29915855306,https://creativecommons.org/licenses/by/2.0/,Arend,https://www.flickr.com/people/vermazeren/ d354518b87ffbb13,https://c1.staticflickr.com/8/7774/29631250731_431446c495_o.jpg,0.0,0.0,0.666666666667,1.0,820,875,https://www.flickr.com/photos/pahudson/29631250731,https://creativecommons.org/licenses/by/2.0/,Paul Hudson,https://www.flickr.com/people/pahudson/ ee6645f71a018440,https://c1.staticflickr.com/6/5777/30672888112_f828e31701_o.jpg,0.44937150838,0.25,0.89874301676,1.0,719,762,https://www.flickr.com/photos/batjko/30672888112,https://creativecommons.org/licenses/by/2.0/,Patrick Metzdorf,https://www.flickr.com/people/batjko/ 42a19e9c01e5c21b,https://c1.staticflickr.com/9/8281/29711825985_718f24b572_o.jpg,0.0,0.0,0.741835147745,1.0,539,1000,https://www.flickr.com/photos/stefanjurca/29711825985,https://creativecommons.org/licenses/by/2.0/,\310\230tefan Jurc\304\203,https://www.flickr.com/people/stefanjurca/ fdbe38b88ce78d48,https://c1.staticflickr.com/6/5553/30860906230_e3c4e56785_o.jpg,0.0,0.0,0.654970760234,1.0,718,815,https://flickr.com/91807507@N03/30860906230,https://creativecommons.org/licenses/by/2.0/,GPS 56,https://www.flickr.com/people/91807507@N03/ 1c01d534ef51a95b,https://c1.staticflickr.com/9/8478/29176937053_6a61ccef36_o.jpg,0.312410841655,0.0,0.937232524964,1.0,548,915,https://www.flickr.com/photos/guillermo_andre/29176937053,https://creativecommons.org/licenses/by/2.0/,EL GUILLE!,https://www.flickr.com/people/guillermo_andre/ 92898d18fe5b3878,https://c1.staticflickr.com/9/8129/27951178783_25b6df5062_o.jpg,0.0,0.0,0.5,0.75,975,529,https://www.flickr.com/photos/usdagov/27951178783/,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 5bbcb7778094b7e6,https://c1.staticflickr.com/9/8591/28057745730_85e7e6e313_o.jpg,0.249631811487,0.0,0.748895434462,0.75,323,90,https://flickr.com/37180297@N08/28057745730,https://creativecommons.org/licenses/by/2.0/,LiCheng Shih,https://www.flickr.com/people/papilioshih/ 8681f8354ddc63c2,https://c1.staticflickr.com/9/8500/29406799161_6ee6ef4711_o.jpg,0.250923190547,0.25,0.75276957164,1.0,407,637,https://www.flickr.com/photos/eltb/29406799161,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 29718ae37e7bcf85,https://c1.staticflickr.com/9/8323/28934998602_168431139b_o.jpg,0.0,0.25,0.50110619469,1.0,422,978,https://www.flickr.com/photos/dakohuang/28934998602,https://creativecommons.org/licenses/by/2.0/,Dako Huang,https://www.flickr.com/people/dakohuang/ e42b0e5c445d64c8,https://c1.staticflickr.com/6/5171/29805978361_3b0ea12cf2_o.jpg,0.0,0.0,0.561569688769,1.0,699,913,https://www.flickr.com/photos/ankurp/29805978361,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ ccedf4668d0eb6a6,https://c1.staticflickr.com/9/8379/29135109294_477050b474_o.jpg,0.0,0.0,0.75,1.0,818,873,https://www.flickr.com/photos/zombieite/29135109294/,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ bdb929dd37dabb1f,https://c1.staticflickr.com/6/5511/30457121645_8bbc078a89_o.jpg,0.0,0.516304347826,0.75,1.0,709,829,https://www.flickr.com/photos/dalbera/30457121645,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 34622e0ecc448248,https://c1.staticflickr.com/6/5486/30597457194_4ddbed3fa6_o.jpg,0.0,0.0,0.75,1.0,820,801,https://flickr.com/94643613@N00/30597457194,https://creativecommons.org/licenses/by/2.0/,Bruce Matsunaga,https://www.flickr.com/people/brucematsunaga/ 8e16731930492dff,https://c1.staticflickr.com/8/7304/28159241886_cd566b2ec2_o.jpg,0.0,0.48007518797,0.75,1.0,318,300,https://www.flickr.com/photos/26138378@N03/28159241886,https://creativecommons.org/licenses/by/2.0/,Patrick Clement,https://www.flickr.com/people/26138378@N03/ c24ccdbf81172891,https://c1.staticflickr.com/8/7463/27935986990_cf48dc6482_o.jpg,0.25,0.0,0.75,0.75,986,504,https://www.flickr.com/photos/juggernautco/27935986990,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ 05998799afb7ac0c,https://c1.staticflickr.com/9/8226/28886344023_2f9c499a00_o.jpg,0.25,0.0,1.0,1.0,979,59,https://www.flickr.com/photos/vastateparksstaff/28886344023/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ ff85b924d590993f,https://c1.staticflickr.com/8/7263/27216212215_08cb29f933_o.jpg,0.25,0.25,0.75,1.0,484,881,https://www.flickr.com/photos/143247890@N03/27216212215/,https://creativecommons.org/licenses/by/2.0/,Bob Jenkin,https://www.flickr.com/people/143247890@N03/ e7833b508b1852c0,https://c1.staticflickr.com/6/5469/30276728356_34280408b2_o.jpg,0.0,0.0,0.423337856174,0.75,885,615,https://www.flickr.com/photos/eltb/30276728356,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 100723caed6d6dea,https://c1.staticflickr.com/9/8383/28370471220_42d6019d6a_o.jpg,0.43661971831,0.0,1.0,0.75,114,859,https://www.flickr.com/photos/scotnelson/28370471220,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 3a9b212f46f382c7,https://c1.staticflickr.com/9/8809/28571687610_1b40e1b9f1_o.jpg,0.25,0.576662143826,1.0,1.0,407,585,https://www.flickr.com/photos/eltb/28571687610,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ e81841e3844ec917,https://c1.staticflickr.com/6/5817/30318536444_0623cc599a_o.jpg,0.0,0.25,0.464488636364,1.0,145,326,https://www.flickr.com/photos/jsjgeology/30318536444,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 0c13a20bdc50509d,https://c1.staticflickr.com/9/8857/27758686543_9b58fa3bb3_o.jpg,0.0,0.0,0.5,0.75,437,698,https://www.flickr.com/photos/greggjerdingen/27758686543,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 3c1a419fb63a4761,https://c1.staticflickr.com/8/7328/27154507170_ed8574ba33_o.jpg,0.25,0.0,0.75,0.75,51,171,https://www.flickr.com/photos/tipsfortravellers/27154507170,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 53953db800a896ff,https://c1.staticflickr.com/8/7734/27255732686_b711f99c35_o.jpg,0.0,0.0,0.5,0.75,548,297,https://www.flickr.com/photos/rhemkes/27255732686,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 9179ac93ffefa78d,https://c1.staticflickr.com/8/7424/26766057214_2e713ef3f5_o.jpg,0.0,0.25,0.462765957447,1.0,752,72,http://www.flickr.com/99962592@N00/26766057214/,https://creativecommons.org/licenses/by/2.0/,Niki Odolphie,https://www.flickr.com/people/odolphie/ 4fa03bb639031370,https://c1.staticflickr.com/9/8866/28465400856_9c9caa40ed_o.jpg,0.258620689655,0.0,0.775862068966,0.75,404,31,https://www.flickr.com/photos/usnavy/28465400856,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ da579190142584d2,https://c1.staticflickr.com/8/7425/27582329305_bf76f0573c_o.jpg,0.0,0.25,0.61620294599,1.0,309,90,https://www.flickr.com/photos/gails_pictures/27582329305,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 9fb05793b2868e38,https://c1.staticflickr.com/1/662/31696478304_a534323294_o.jpg,0.249079528719,0.25,0.747238586156,1.0,752,462,https://www.flickr.com/photos/davehamster/31696478304,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 2b955cce7381f8c3,https://c1.staticflickr.com/9/8411/28938804182_0a1b7fcb15_o.jpg,0.0,0.0,0.592295345104,0.75,309,772,https://www.flickr.com/photos/35142635@N05/28938804182/,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 768e42796bb19958,https://c1.staticflickr.com/9/8553/29554729693_be62678ede_o.jpg,0.0,0.25,0.75,1.0,830,782,https://www.flickr.com/photos/eschipul/29554729693,https://creativecommons.org/licenses/by/2.0/,Ed Schipul,https://www.flickr.com/people/eschipul/ 5100e5e7380a77ea,https://c1.staticflickr.com/8/7298/26354547924_0e95b0619b_o.jpg,0.28125,0.0,0.84375,0.75,976,832,https://www.flickr.com/photos/discoveroregon/26354547924,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 9bc2f8d943e3915e,https://c1.staticflickr.com/8/7289/27864749046_3059d1d8b8_o.jpg,0.4375,0.0,1.0,0.75,923,563,https://www.flickr.com/photos/36668466@N05/27864749046,https://creativecommons.org/licenses/by/2.0/,Fernando Medina,https://www.flickr.com/people/36668466@N05/ 9b01c1ae12d0bddc,https://c1.staticflickr.com/9/8204/29313204124_5f2e2e0f58_o.jpg,0.0,0.0,0.669128508124,1.0,556,422,https://www.flickr.com/photos/pedrosimoes7/29313204124,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Sim\303\265es,https://www.flickr.com/people/pedrosimoes7/ ec1c634bfdffe570,https://c1.staticflickr.com/9/8656/27988047840_755fe60365_o.jpg,0.4375,0.0,1.0,0.75,570,912,https://www.flickr.com/photos/27665395@N05/27988047840,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 9cd76f824613628a,https://c1.staticflickr.com/6/5465/30772881352_5b19d004dc_o.jpg,0.0,0.25,1.0,1.0,973,392,https://www.flickr.com/photos/jsjgeology/30772881352,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 65b875a0c3287375,https://c1.staticflickr.com/8/7405/27209122780_171effda61_o.jpg,0.210588633288,0.0,0.631765899865,0.75,583,484,https://www.flickr.com/photos/stijlfoto/27209122780/,https://creativecommons.org/licenses/by/2.0/,Jan Willem van Wessel,https://www.flickr.com/people/stijlfoto/ 9507a85152aebd8d,https://c1.staticflickr.com/9/8619/28384388396_0da1827073_o.jpg,0.251849112426,0.25,0.755547337278,1.0,405,984,https://www.flickr.com/photos/barteq24/28384388396,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/ 1d2fafe35c9e1a37,https://c1.staticflickr.com/1/636/31449274014_19d0b7b0db_o.jpg,0.28125,0.0,0.84375,0.75,859,876,https://www.flickr.com/photos/smemon/31449274014,https://creativecommons.org/licenses/by/2.0/,Sean MacEntee,https://www.flickr.com/people/smemon/ 3b094b21176bb71f,https://c1.staticflickr.com/9/8573/26493767750_af674077bf_o.jpg,0.0,0.0,0.5625,0.75,962,260,https://www.flickr.com/photos/cogdog/26493767750,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ b56538d3be220376,https://c1.staticflickr.com/9/8580/30059931081_69b42d0c26_o.jpg,0.28125,0.0,0.84375,0.75,710,364,https://www.flickr.com/photos/leo_nghinphu/30059931081,https://creativecommons.org/licenses/by/2.0/,Leo Chu\341\273\221i,https://www.flickr.com/people/leo_nghinphu/ 606c9a889cc714b8,https://c1.staticflickr.com/9/8818/28234712590_d5cc31be3b_o.jpg,0.0,0.25,0.5625,1.0,108,391,https://www.flickr.com/photos/jimg944/28234712590,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 8d41ed7c32623d5a,https://c1.staticflickr.com/8/7580/27616522622_723400540a_o.jpg,0.266552511416,0.0,0.799657534247,0.75,407,340,https://www.flickr.com/photos/22711505@N05/27616522622,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ f25e1473a8117b31,https://c1.staticflickr.com/6/5718/31101332462_45130921f9_o.jpg,0.25,0.0,0.75,0.75,820,680,https://www.flickr.com/photos/jus10h/31101332462,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 64996d79666a2f72,https://c1.staticflickr.com/8/7277/27323489826_2e4e465dab_o.jpg,0.260869565217,0.0,1.0,1.0,458,197,https://www.flickr.com/photos/publicresourceorg/27323489826,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/ 95e179e395bad3da,https://c1.staticflickr.com/8/7385/26392708813_c8d4ab3c6f_o.jpg,0.333333333333,0.0,1.0,1.0,985,468,https://www.flickr.com/photos/98044123@N06/26392708813/,https://creativecommons.org/licenses/by/2.0/,morten thomsen,https://www.flickr.com/people/98044123@N06/ a993d1ee47eb1deb,https://c1.staticflickr.com/8/7400/26382293333_ab0c25523a_o.jpg,0.25,0.25,1.0,1.0,53,780,https://www.flickr.com/photos/perkovich/26382293333,https://creativecommons.org/licenses/by/2.0/,Per \303\205str\303\266m,https://www.flickr.com/people/perkovich/ 81ff39ed042bcd0b,https://c1.staticflickr.com/9/8424/29435846625_b6809f7cab_o.jpg,0.421177266576,0.0,0.842354533153,0.75,818,473,https://www.flickr.com/photos/117096107@N03/29435846625,https://creativecommons.org/licenses/by/2.0/,Kieran White,https://www.flickr.com/people/117096107@N03/ aec8b6be7171f1b0,https://c1.staticflickr.com/9/8419/29882027610_2d372fb49d_o.jpg,0.328402366864,0.0,1.0,1.0,982,84,https://flickr.com/63704136@N00/29882027610,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 34589520bdc0241a,https://c1.staticflickr.com/6/5081/30211775385_43d551de16_o.jpg,0.25,0.0,1.0,0.75,968,248,https://flickr.com/35096833@N07/30211775385,https://creativecommons.org/licenses/by/2.0/,KID the Euforia,https://www.flickr.com/people/blueberrystream/ 9ad47c37f1ad5968,https://c1.staticflickr.com/9/8012/29245448422_4d721b1df6_o.jpg,0.4375,0.25,1.0,1.0,979,417,https://www.flickr.com/photos/lofink/29245448422,https://creativecommons.org/licenses/by/2.0/,David Lofink,https://www.flickr.com/people/lofink/ f63051413723905d,https://c1.staticflickr.com/9/8807/28419079741_b0c52a5bdb_o.jpg,0.28125,0.0,0.84375,0.75,392,936,https://www.flickr.com/photos/mypubliclands/28419079741,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 3aad3176a0b5183e,https://c1.staticflickr.com/8/7333/27185020962_d4d718c4ac_o.jpg,0.262273413897,0.25,0.786820241692,1.0,493,79,https://www.flickr.com/photos/michaelpollak/27185020962,https://creativecommons.org/licenses/by/2.0/,Michael Pollak,https://www.flickr.com/people/michaelpollak/ 2aa24b844d862881,https://c1.staticflickr.com/9/8591/28267365313_e0c4a30511_o.jpg,0.400242326333,0.0,1.0,0.75,986,627,https://www.flickr.com/photos/pavdw/28267365313,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/ a16861c334188321,https://c1.staticflickr.com/8/7706/26189359803_d4c2f4ca29_o.jpg,0.381765463918,0.25,0.763530927835,1.0,672,812,https://www.flickr.com/photos/computerhotline/26189359803,https://creativecommons.org/licenses/by/2.0/,Thomas Bresson,https://www.flickr.com/people/computerhotline/ 952cbd5b5966c92a,https://c1.staticflickr.com/8/7449/27194087184_feb1db0985_o.jpg,0.0,0.25,0.5625,1.0,820,452,https://www.flickr.com/photos/weeklydig/27194087184,https://creativecommons.org/licenses/by/2.0/,digboston,https://www.flickr.com/people/weeklydig/ 2beb0fdd6372a48e,https://c1.staticflickr.com/1/291/32732479015_a87c8fe1ac_o.jpg,0.0,0.0,0.75,1.0,875,586,https://www.flickr.com/photos/69203347@N03/32732479015/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ b030485f194b0053,https://c1.staticflickr.com/6/5192/29685196730_0bf04b8a7a_o.jpg,0.0,0.0,0.515344311377,0.75,975,579,https://www.flickr.com/photos/jsjgeology/29685196730,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 867cd35b008ae182,https://c1.staticflickr.com/9/8253/29327869835_70db5cabe6_o.jpg,0.25,0.25,0.75,1.0,303,119,https://www.flickr.com/photos/vahemart/29327869835/,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 759c0826c52ee872,https://c1.staticflickr.com/9/8505/29103696345_d625509442_o.jpg,0.263565891473,0.0,1.0,1.0,655,645,https://www.flickr.com/photos/karen_roe/29103696345,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ 9a8481cf9796d0ab,https://c1.staticflickr.com/9/8323/29494543686_7cc4ef1c82_o.jpg,0.5,0.25,1.0,1.0,972,902,https://flickr.com/126540849@N02/29494543686,https://creativecommons.org/licenses/by/2.0/,Jacques Mignon,https://www.flickr.com/people/jacquesmignon/ b7fa44c32caaffb3,https://c1.staticflickr.com/8/7341/26984977414_2e5558444c_o.jpg,0.0,0.0,0.75,1.0,763,713,https://www.flickr.com/photos/shankaronline/26984977414,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 637e6a264d6014a8,https://c1.staticflickr.com/6/5576/29766573323_e12a9b81c5_o.jpg,0.0,0.25,0.574644549763,1.0,539,696,https://www.flickr.com/photos/22711505@N05/29766573323,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ b1efadf78cf1de1e,https://c1.staticflickr.com/1/44/31380261692_5604b80179_o.jpg,0.25,0.0,1.0,0.75,918,514,https://www.flickr.com/photos/home_of_chaos/31380261692,https://creativecommons.org/licenses/by/2.0/,thierry ehrmann,https://www.flickr.com/people/home_of_chaos/ 2e72d9445e342a0d,https://c1.staticflickr.com/6/5820/30483301745_744e943c67_o.jpg,0.25,0.25,0.75,1.0,519,986,https://www.flickr.com/photos/box_repsol/30483301745,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ eff76dc3f74bdc0f,https://c1.staticflickr.com/6/5511/30786850411_2885e1022e_o.jpg,0.0,0.25,0.5,1.0,975,753,https://www.flickr.com/photos/danielchodusov/30786850411,https://creativecommons.org/licenses/by/2.0/,Daniel Chodusov,https://www.flickr.com/people/danielchodusov/ 623301e88f850657,https://c1.staticflickr.com/6/5461/29931816924_d7f3ee9f05_o.jpg,0.284198113208,0.0,0.852594339623,0.75,763,956,https://www.flickr.com/photos/calliope/29931816924,https://creativecommons.org/licenses/by/2.0/,liz west,https://www.flickr.com/people/calliope/ 71694ee01836ed7d,https://c1.staticflickr.com/6/5508/30794665160_9ccdc813c6_o.jpg,0.0,0.0,0.75,0.501846381093,922,542,https://flickr.com/23112312@N08/30794665160,https://creativecommons.org/licenses/by/2.0/,Jeremy Crawshaw,https://www.flickr.com/people/23112312@N08/ a0fc6dbee6adb547,https://c1.staticflickr.com/9/8320/29492813276_be30f9d210_o.jpg,0.5,0.25,1.0,1.0,731,524,https://www.flickr.com/photos/o_0/29492813276,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ b34fda89012c8bea,https://c1.staticflickr.com/6/5814/31836680684_a109c5d34c_o.jpg,0.28125,0.25,0.84375,1.0,407,10,https://www.flickr.com/photos/sheila_sund/31836680684,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/ ddb9bf0eb25bf2b0,https://c1.staticflickr.com/9/8102/29102905071_a8515700de_o.jpg,0.25,0.0,1.0,1.0,889,512,https://www.flickr.com/photos/fdecomite/29102905071/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 5388b80c84396dd4,https://c1.staticflickr.com/9/8109/29696568495_733b79c182_o.jpg,0.0,0.0,0.395150720839,0.75,566,827,https://www.flickr.com/photos/robdammers/29696568495,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ ac1b0876bbe8e9a4,https://c1.staticflickr.com/6/5155/29903511760_495908d89b_o.jpg,0.0,0.0,0.75,1.0,426,250,http://www.flickr.com/photos/torsten-behrens/29903511760/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ 252f99ec5f509656,https://c1.staticflickr.com/6/5554/30912205341_5db71c4f48_o.jpg,0.591404665314,0.25,0.82796653144,1.0,719,454,https://www.flickr.com/photos/132033298@N04/30912205341,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/ 9c820652a68b2d02,https://c1.staticflickr.com/6/5546/29799868360_bd503c036c_o.jpg,0.0,0.25,0.75,1.0,755,48,https://www.flickr.com/photos/40441865@N08/29799868360,https://creativecommons.org/licenses/by/2.0/,mitchell haindfield,https://www.flickr.com/people/40441865@N08/ 46e80fd106c3792b,https://c1.staticflickr.com/9/8152/28444480440_bef4fcb851_o.jpg,0.438430311231,0.0,1.0,1.0,820,836,https://flickr.com/35150587@N05/28444480440,https://creativecommons.org/licenses/by/2.0/,johnkell,https://www.flickr.com/people/johnkell/ ca105d51ad8facff,https://c1.staticflickr.com/6/5770/30118502580_afb1c2061e_o.jpg,0.5,0.25,1.0,1.0,556,620,https://www.flickr.com/photos/grahammitchellphotography/30118502580/,https://creativecommons.org/licenses/by/2.0/,Graham Mitchell,https://www.flickr.com/people/grahammitchellphotography/ 857321cb22c1c419,https://c1.staticflickr.com/1/438/32213058236_94bd1d6bed_o.jpg,0.315088757396,0.25,0.945266272189,1.0,990,715,https://flickr.com/97121495@N03/32213058236,https://creativecommons.org/licenses/by/2.0/,Tutto Giardinaggio,https://www.flickr.com/people/giardinaggioitalia/ d15cac710711747a,https://c1.staticflickr.com/9/8024/29622358505_19eb3d2831_o.jpg,0.0,0.0,0.666666666667,1.0,973,648,https://www.flickr.com/photos/rollercoasterphilosophy/29622358505,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ f6d1cf47a8aa20a8,https://c1.staticflickr.com/8/7545/28364965246_ab9af36b39_o.jpg,0.0,0.0,1.0,1.0,889,300,https://www.flickr.com/photos/grego1402/28364965246/,https://creativecommons.org/licenses/by/2.0/,grego1402,https://www.flickr.com/people/grego1402/ 86c8cd1d8f84ce8f,https://c1.staticflickr.com/8/7728/26780933470_38a1049ef4_o.jpg,0.42174796748,0.25,0.843495934959,1.0,880,448,https://www.flickr.com/photos/a-weidinger/26780933470,https://creativecommons.org/licenses/by/2.0/,Alfred Weidinger,https://www.flickr.com/people/a-weidinger/ 4ff23f2ad38fd401,https://c1.staticflickr.com/6/5737/31036804316_eaabf7c802_o.jpg,0.0,0.0,0.5,0.75,355,100,https://www.flickr.com/photos/kkoshy/31036804316,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/ 63791ac2fd017aeb,https://c1.staticflickr.com/9/8861/28137868683_42f159e76e_o.jpg,0.0036036036036,0.0,1.0,1.0,133,820,https://www.flickr.com/photos/walterpro/28137868683/,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ 2e5c3ffd121e2f9c,https://c1.staticflickr.com/1/361/31615860221_ab561987d6_o.jpg,0.0,0.0,0.623395149786,1.0,747,808,https://flickr.com/56292751@N03/31615860221,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/ 4b74dc92cf2e80d0,https://c1.staticflickr.com/8/7523/27798676602_cf1d5af5a5_o.jpg,0.248348017621,0.25,0.745044052863,1.0,108,532,https://www.flickr.com/photos/shankaronline/27798676602,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ c782a59a82cdfb4d,https://c1.staticflickr.com/8/7118/26867449092_c44ec11a00_o.jpg,0.25,0.0,1.0,0.75,310,1,https://www.flickr.com/photos/78428166@N00/26867449092,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ 6862ec8595dc6c56,https://c1.staticflickr.com/2/1609/26747073465_95360c9138_o.jpg,0.0,0.0,0.5,0.75,976,652,https://www.flickr.com/photos/o_0/26747073465,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 3c561dbb76ca3ffa,https://c1.staticflickr.com/1/548/31803920303_0696c89603_o.jpg,0.0,0.25,0.5,1.0,516,485,https://www.flickr.com/photos/thejointstaff/31803920303/,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ bfc5f1a5f6095813,https://c1.staticflickr.com/9/8717/27575524434_b558a86463_o.jpg,0.28125,0.0,0.84375,0.75,448,929,https://www.flickr.com/photos/marknenadov/27575524434,https://creativecommons.org/licenses/by/2.0/,Mark Nenadov,https://www.flickr.com/people/marknenadov/ 801e83ace785d867,https://c1.staticflickr.com/9/8505/28935923203_71dbe1d802_o.jpg,0.0,0.0,0.75,1.0,662,400,https://www.flickr.com/photos/hugo90/28935923203,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 0ed1b476a8d35f07,https://c1.staticflickr.com/6/5721/30826042520_a612dbe37b_o.jpg,0.5,0.0,1.0,0.75,820,624,https://www.flickr.com/photos/worldskillsteamuk/30826042520/,https://creativecommons.org/licenses/by/2.0/,WorldSkills UK,https://www.flickr.com/people/worldskillsteamuk/ 12f384511bfaaebf,https://c1.staticflickr.com/9/8107/29268227970_d69dbbff82_o.jpg,0.252222222222,0.25,0.756666666667,1.0,905,534,https://flickr.com/55088466@N00/29268227970,https://creativecommons.org/licenses/by/2.0/,Daniel Davis,https://www.flickr.com/people/ourmaninjapan/ 31ee0a7a8beb6ac4,https://c1.staticflickr.com/6/5452/25330696409_3891d42cf5_o.jpg,0.0,0.25,0.561328125,1.0,673,875,https://www.flickr.com/photos/85264217@N04/25330696409,https://creativecommons.org/licenses/by/2.0/,Retis,https://www.flickr.com/people/85264217@N04/ 27a61180fabb7637,https://c1.staticflickr.com/6/5623/30315995793_a463f4bdd8_o.jpg,0.28125,0.0,0.84375,0.75,582,874,https://flickr.com/93356413@N08/30315995793,https://creativecommons.org/licenses/by/2.0/,Darren765,https://www.flickr.com/people/darrencole/ 23de0d55027dc7a3,https://c1.staticflickr.com/9/8898/28738065486_c04e50b144_o.jpg,0.421177266576,0.25,0.842354533153,1.0,739,627,https://flickr.com/131880272@N06/28738065486,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/ 737b6e38658695f2,https://c1.staticflickr.com/9/8677/28419314086_3e21638e9f_o.jpg,0.5,0.0,1.0,0.75,484,982,https://www.flickr.com/photos/tipsfortravellers/28419314086,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 610d60be726ca6d1,https://c1.staticflickr.com/9/8505/28866246713_4f0a8ca496_o.jpg,0.528969957082,0.25,1.0,1.0,566,416,https://www.flickr.com/photos/kansasscanner/28866246713/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 401febd3655dda02,https://c1.staticflickr.com/8/7779/29416214475_39b8239209_o.jpg,0.0,0.118644067797,1.0,1.0,151,266,https://www.flickr.com/photos/dierkschaefer/29416214475/,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/ 176760ed7ff20bd7,https://c1.staticflickr.com/8/7537/30136372641_b2485a1db1_o.jpg,0.0,0.25,0.5625,1.0,975,966,https://www.flickr.com/photos/jsjgeology/30136372641,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ eaf713ec585a2754,https://c1.staticflickr.com/9/8295/29519151446_c697798142_o.jpg,0.501840942563,0.0,1.0,0.75,973,755,https://www.flickr.com/photos/jsjgeology/29519151446,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 47e0c9ee4ed42ee3,https://c1.staticflickr.com/9/8206/27841878953_437fa16780_o.jpg,0.299878836834,0.25,0.899636510501,1.0,23,225,https://www.flickr.com/photos/andymorffew/27841878953,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ 881340c29c88014c,https://c1.staticflickr.com/6/5329/30794856046_f6ac274e01_o.jpg,0.0,0.0,0.75,0.710456942004,702,922,https://www.flickr.com/photos/texaus1/30794856046/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ d0109fa6612128b0,https://c1.staticflickr.com/9/8469/29131834663_f11987e2a4_o.jpg,0.0,0.0,0.496696035242,0.75,323,939,https://flickr.com/25733107@N04/29131834663,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/ 0a81921bed16cd9c,https://c1.staticflickr.com/8/7542/27300912264_fe44ed9a0f_o.jpg,0.335787923417,0.0,1.0,1.0,228,386,https://www.flickr.com/photos/janette990/27300912264,https://creativecommons.org/licenses/by/2.0/,janette990,https://www.flickr.com/people/janette990/ 0ef885f82d06ffca,https://c1.staticflickr.com/9/8652/30043967940_501b3de162_o.jpg,0.0,0.0,0.516116941529,0.75,760,580,https://flickr.com/25797459@N06/30043967940,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/ 7dad6bb45fecb59a,https://c1.staticflickr.com/9/8291/29003730704_c09ca28d81_o.jpg,0.225,0.25,0.675,1.0,100,267,https://www.flickr.com/photos/edenpictures/29003730704,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ 8bc3dad95f98fe11,https://c1.staticflickr.com/9/8439/29149924172_38fa37cc50_o.jpg,0.28125,0.0,0.84375,0.75,875,586,https://www.flickr.com/photos/27665395@N05/29149924172,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ d8559b3f24b2cc69,https://c1.staticflickr.com/1/350/32272607015_5ef144a6cf_o.jpg,0.0,0.0,0.666666666667,1.0,348,159,https://flickr.com/51986662@N05/32272607015,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ cb98933bedefe9db,https://c1.staticflickr.com/8/7012/26213386434_c865cc0876_o.jpg,0.0,0.0,1.0,1.0,480,796,https://www.flickr.com/photos/eurosporttuning/26213386434,https://creativecommons.org/licenses/by/2.0/,Frank Derks,https://www.flickr.com/people/eurosporttuning/ 8627963eacfe4668,https://c1.staticflickr.com/9/8735/28106799374_ec166f6dd5_o.jpg,0.249079528719,0.0,0.747238586156,0.75,310,859,https://www.flickr.com/photos/usfwsmtnprairie/28106799374,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ fb24259468b0b124,https://c1.staticflickr.com/9/8275/30188082226_3dc1c4a49f_o.jpg,0.248348017621,0.0,0.745044052863,0.75,407,610,https://www.flickr.com/photos/pedrocaetano/30188082226,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/ 2e208d34ebec0c44,https://c1.staticflickr.com/6/5322/31322799915_be8b36bee4_o.jpg,0.249631811487,0.25,0.748895434462,1.0,868,903,https://www.flickr.com/photos/76969036@N02/31322799915/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ bb200415131927ef,https://c1.staticflickr.com/6/5577/30536544566_ff5db59f54_o.jpg,0.480855855856,0.25,1.0,1.0,975,570,https://flickr.com/47445767@N05/30536544566,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e2b54379f6c404d8,https://c1.staticflickr.com/6/5474/30281570564_4ecba92b00_o.jpg,0.332106038292,0.0,0.996318114875,1.0,712,730,https://flickr.com/145363040@N07/30281570564,https://creativecommons.org/licenses/by/2.0/,Aisha Choudhry,https://www.flickr.com/people/145363040@N07/ b1269b46204045b6,https://c1.staticflickr.com/6/5703/30947011335_2196f2de97_o.jpg,0.501840942563,0.0,1.0,0.75,669,91,https://flickr.com/29585346@N07/30947011335,https://creativecommons.org/licenses/by/2.0/,Stefan Karpiniec,https://www.flickr.com/people/29585346@N07/ bc15ebf673a00d0f,https://c1.staticflickr.com/9/8517/29252422732_b510bbce56_o.jpg,0.0,0.25,0.5625,1.0,966,557,https://www.flickr.com/photos/isfullofcrap/29252422732,https://creativecommons.org/licenses/by/2.0/,R. Crap Mariner,https://www.flickr.com/people/isfullofcrap/ 994a4b6f71154556,https://c1.staticflickr.com/8/7263/27408953582_de6b68faa3_o.jpg,0.502573529412,0.0,1.0,0.75,666,228,https://www.flickr.com/photos/sg2012/27408953582/,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/ 1cb76eb4560d7bd4,https://c1.staticflickr.com/6/5692/31041586391_9cebc2c511_o.jpg,0.0,0.25,0.499263622975,1.0,625,535,https://www.flickr.com/photos/usnavyresearch/31041586391,https://creativecommons.org/licenses/by/2.0/,Office of Naval Research,https://www.flickr.com/people/usnavyresearch/ 5205a1f46cba0dbe,https://c1.staticflickr.com/9/8287/29165755435_1dce1d02b2_o.jpg,0.0,0.25,0.362751256281,1.0,971,989,https://www.flickr.com/photos/mondo79/29165755435,https://creativecommons.org/licenses/by/2.0/,Mondo79,https://www.flickr.com/people/mondo79/ 08ace6c0f876e995,https://c1.staticflickr.com/8/7287/28000559881_d1612ab423_o.jpg,0.5,0.25,1.0,1.0,295,213,https://www.flickr.com/photos/janitors/28000559881,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ b8c15598b35b2097,https://c1.staticflickr.com/8/7437/28168972922_656f6381fd_o.jpg,0.4375,0.25,1.0,1.0,874,211,https://www.flickr.com/photos/maximeraphael/28168972922,https://creativecommons.org/licenses/by/2.0/,Maxime Bober,https://www.flickr.com/people/maximeraphael/ e67bc976a1e69a81,https://c1.staticflickr.com/8/7302/27830501441_5babb851c9_o.jpg,0.310344827586,0.0,1.0,1.0,484,456,https://www.flickr.com/photos/jdlasica/27830501441,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 9c10b0031c416eab,https://c1.staticflickr.com/1/492/31350394054_d7c8300db7_o.jpg,0.328205128205,0.0,1.0,0.75,644,606,https://flickr.com/10390868@N07/31350394054,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ b58de66e5b6c48fb,https://c1.staticflickr.com/8/7754/27089392201_af098b639e_o.jpg,0.202689243028,0.0,0.608067729084,0.75,780,102,https://www.flickr.com/photos/thoseguys119/27089392201,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 761c81309e376a42,https://c1.staticflickr.com/1/324/31582424873_00a0d11619_o.jpg,0.25,0.25,1.0,1.0,540,323,https://www.flickr.com/photos/58558794@N07/31582424873,https://creativecommons.org/licenses/by/2.0/,POP,https://www.flickr.com/people/58558794@N07/ 439f8f89eccccb69,https://c1.staticflickr.com/6/5458/30411450492_26a433eab7_o.jpg,0.5,0.0,1.0,0.75,431,752,https://www.flickr.com/photos/lauraanddave/30411450492,https://creativecommons.org/licenses/by/2.0/,Dave n Laura,https://www.flickr.com/people/lauraanddave/ dc871f6ccacea74a,https://c1.staticflickr.com/8/7538/27273338061_6b2be936c3_o.jpg,0.5,0.0,1.0,0.75,820,828,https://www.flickr.com/photos/jus10h/27273338061,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 55e190b917b6f461,https://c1.staticflickr.com/6/5672/30431138402_063361b64f_o.jpg,0.0,0.25,0.642140468227,1.0,537,921,https://www.flickr.com/photos/a_little_brighter/30431138402/,https://creativecommons.org/licenses/by/2.0/,Harold Litwiler,https://www.flickr.com/people/a_little_brighter/ 3c6461e82de23815,https://c1.staticflickr.com/8/7447/27792831236_2c66352883_o.jpg,0.58040201005,0.0,0.81256281407,0.75,780,397,https://www.flickr.com/photos/thoseguys119/27792831236/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ ac89d159b97cc8e5,https://c1.staticflickr.com/6/5679/30710418905_16a3507fd1_o.jpg,0.5,0.25,1.0,1.0,830,161,https://flickr.com/56537760@N03/30710418905,https://creativecommons.org/licenses/by/2.0/,Th\303\251o Paul,https://www.flickr.com/people/theopaul/ 23719fda32d3c31a,https://c1.staticflickr.com/9/8255/28979744361_b0405b1ece_o.jpg,0.526542324247,0.0,1.0,0.75,563,661,https://www.flickr.com/photos/51764518@N02/28979744361,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 687dc375e7a10804,https://c1.staticflickr.com/9/8620/28093988020_8e5a60c19e_o.jpg,0.0,0.0,0.75,0.75,914,817,https://www.flickr.com/photos/rapidtravelchai/28093988020/,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/ f6a5c0b776c3117a,https://c1.staticflickr.com/8/7294/26233433814_0c3409e01f_o.jpg,0.0,0.0,0.75,0.5625,518,426,https://www.flickr.com/photos/mtacc-esa/26233433814,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/ 990fcbea1389c21a,https://c1.staticflickr.com/6/5677/30796311156_efd0b4b9d4_o.jpg,0.0,0.25,0.593499197432,1.0,146,292,https://www.flickr.com/photos/pandora_6666/30796311156,https://creativecommons.org/licenses/by/2.0/,Jo Naylor,https://www.flickr.com/people/pandora_6666/ b33c0003b4b57bab,https://c1.staticflickr.com/9/8188/29099527184_039d609370_o.jpg,0.25,0.0,1.0,0.75,480,44,https://www.flickr.com/photos/96774554@N03/29099527184,https://creativecommons.org/licenses/by/2.0/,Wheels ON,https://www.flickr.com/people/96774554@N03/ 174cbab4303eb662,https://c1.staticflickr.com/8/7231/26852395522_91cd577794_o.jpg,0.0,0.0,0.504444444444,0.75,896,660,https://www.flickr.com/photos/13476480@N07/26852395522,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 34642c10afe5b668,https://c1.staticflickr.com/8/7088/27400722246_cdfa0c325a_o.jpg,0.0,0.0,0.561569688769,1.0,991,737,https://www.flickr.com/photos/131880272@N06/27400722246,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/ cd49b70577371e58,https://c1.staticflickr.com/9/8512/28660474013_a544a299a4_o.jpg,0.28125,0.0,0.84375,0.75,975,125,https://www.flickr.com/photos/jsjgeology/28660474013,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d22fe979979e6929,https://c1.staticflickr.com/6/5499/29844324183_55ca536efe_o.jpg,0.188470066519,0.0,0.565410199557,1.0,896,513,https://www.flickr.com/photos/8782469@N05/29844324183/,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/ 0893ada7694f1d7d,https://c1.staticflickr.com/3/2816/32982369791_a264397127_o.jpg,0.333333333333,0.0,1.0,1.0,25,462,https://www.flickr.com/photos/79452129@N02/32982369791,https://creativecommons.org/licenses/by/2.0/,Fyn Kynd Photography,https://www.flickr.com/people/79452129@N02/ ab20d0352c9a4071,https://c1.staticflickr.com/8/7140/26824721496_6fd64dbdb5_o.jpg,0.0,0.25,1.0,1.0,913,128,https://www.flickr.com/photos/fsnorthernregion/26824721496,https://creativecommons.org/licenses/by/2.0/,Forest Service Northern Region,https://www.flickr.com/people/fsnorthernregion/ 583cef7e46f2d7f9,https://c1.staticflickr.com/8/7307/27828990750_bd1c109bcf_o.jpg,0.42174796748,0.25,0.843495934959,1.0,761,926,https://www.flickr.com/photos/33398884@N03/27828990750/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 2589a2e8badc8523,https://c1.staticflickr.com/6/5622/29271598544_2f7fb35834_o.jpg,0.580971659919,0.0,1.0,0.75,456,31,https://www.flickr.com/photos/j_regan/29271598544,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/ 3ae13528c36f5149,https://c1.staticflickr.com/8/7353/27653574931_69257d47fb_o.jpg,0.0,0.25,0.5,1.0,896,411,https://www.flickr.com/photos/faceme/27653574931,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ 27018a94efb8a53d,https://c1.staticflickr.com/9/8631/28359419373_68a72aa3d3_o.jpg,0.0,0.0,0.501846381093,0.75,489,700,https://www.flickr.com/photos/nekudo/28359419373/,https://creativecommons.org/licenses/by/2.0/,Simon Samtleben,https://www.flickr.com/people/nekudo/ a3194139bd8a5223,https://c1.staticflickr.com/9/8649/28297979531_293f53e516_o.jpg,0.333,0.0,0.999,1.0,338,639,https://www.flickr.com/photos/kjfnjy/28297979531/,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/ 5f5a8e248e949893,https://c1.staticflickr.com/1/657/32562857566_c0634c3595_o.jpg,0.2946,0.25,0.8838,1.0,426,404,http://www.flickr.com/photos/laurelrusswurm/32562857566/,https://creativecommons.org/licenses/by/2.0/,Laurel L. Russwurm,https://www.flickr.com/people/laurelrusswurm/ a8cfe84bfbb905b1,https://c1.staticflickr.com/8/7338/27564665926_9f16421c18_o.jpg,0.0,0.25,0.531155015198,1.0,405,136,https://www.flickr.com/photos/levien66/27564665926/,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/ daf2aff043808df2,https://c1.staticflickr.com/9/8599/28973539905_f37980b963_o.jpg,0.0,0.4375,0.75,1.0,323,504,https://www.flickr.com/photos/chaz_pics/28973539905,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 61716ea3da29278d,https://c1.staticflickr.com/3/2936/33158217522_eb268ac14b_o.jpg,0.0,0.0,0.75,0.456981664316,70,956,https://flickr.com/47445767@N05/33158217522,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ db170c5fd6b66050,https://c1.staticflickr.com/1/397/31584612401_fef60895b1_o.jpg,0.4375,0.25,1.0,1.0,875,355,https://www.flickr.com/photos/aswans1234567/31584612401/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston's Bus Photos,https://www.flickr.com/people/aswans1234567/ 1efec3aff39e2bbc,https://c1.staticflickr.com/2/1514/26153940013_280846a935_o.jpg,0.315396113602,0.0,1.0,1.0,680,763,https://www.flickr.com/photos/martius/26153940013,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 6269269e08fda904,https://c1.staticflickr.com/8/7326/27021604744_3d2f64937d_o.jpg,0.0,0.0,0.75,0.75,704,590,https://www.flickr.com/photos/carlchristian/27021604744,https://creativecommons.org/licenses/by/2.0/,Carl Christian Gr\303\270ndahl,https://www.flickr.com/people/carlchristian/ 18771bcd1284d995,https://c1.staticflickr.com/8/7702/27788486740_dc5964a4dc_o.jpg,0.574489795918,0.25,1.0,1.0,908,724,https://www.flickr.com/photos/jdlasica/27788486740,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ bb54947f9fd207bd,https://c1.staticflickr.com/1/712/31908547584_555dc6093f_o.jpg,0.0,0.0,0.710806697108,1.0,101,980,https://www.flickr.com/photos/wildreturn/31908547584,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ eaa88f936210e51d,https://c1.staticflickr.com/9/8279/29608950481_f9b4577e4a_o.jpg,0.0,0.0,0.5,0.75,398,953,https://www.flickr.com/photos/raita/29608950481,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/ 279818e08074054f,https://c1.staticflickr.com/9/8276/28608195851_197743033a_o.jpg,0.25,0.25,1.0,1.0,58,385,https://www.flickr.com/photos/thart2009/28608195851,https://creativecommons.org/licenses/by/2.0/,Tom Hart,https://www.flickr.com/people/thart2009/ 80dcecc8754e64d2,https://c1.staticflickr.com/6/5573/31287999516_6ec02a7642_o.jpg,0.25,0.0,1.0,1.0,336,286,https://www.flickr.com/photos/9750464@N02/31287999516/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ 0444eecab827d9b0,https://c1.staticflickr.com/9/8189/28490896596_bc91176623_o.jpg,0.4375,0.25,1.0,1.0,441,545,https://www.flickr.com/photos/34739556@N04/28490896596,https://creativecommons.org/licenses/by/2.0/,rawdonfox,https://www.flickr.com/people/34739556@N04/ 1c285f4c1f59d391,https://c1.staticflickr.com/8/7061/26880954302_9d3a03c991_o.jpg,0.234308131241,0.25,0.702924393723,1.0,37,364,https://www.flickr.com/photos/140214426@N06/26880954302,https://creativecommons.org/licenses/by/2.0/,Lihoman...,https://www.flickr.com/people/140214426@N06/ 5920b1edf2f3fb33,https://c1.staticflickr.com/9/8304/28969393671_2c57610b0d_o.jpg,0.28125,0.25,0.84375,1.0,966,520,https://www.flickr.com/photos/jeepersmedia/28969393671,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ d29e6048ebffacbb,https://c1.staticflickr.com/8/7743/26863028052_eaf9d1f20b_o.jpg,0.25,0.0,1.0,0.499263622975,562,488,https://www.flickr.com/photos/unicefecu/26863028052/,https://creativecommons.org/licenses/by/2.0/,UNICEF Ecuador,https://www.flickr.com/people/unicefecu/ 06434ecc3ee92cab,https://c1.staticflickr.com/9/8291/28672079040_9a51442780_o.jpg,0.5,0.25,1.0,1.0,699,7,https://www.flickr.com/photos/o_0/28672079040/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 6e755ba1d50ea586,https://c1.staticflickr.com/1/424/30811297673_5e23536d37_o.jpg,0.0,0.0,0.75,0.75,906,863,https://www.flickr.com/photos/72283508@N00/30811297673/,https://creativecommons.org/licenses/by/2.0/,Rookuzz..,https://www.flickr.com/people/72283508@N00/ 64d4bf0ee1ff07d4,https://c1.staticflickr.com/9/8024/27891699514_6b7bcb6357_o.jpg,0.210588633288,0.0,0.631765899865,0.75,820,655,https://www.flickr.com/photos/ultrakml/27891699514,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/ a2b1102ab528f653,https://c1.staticflickr.com/6/5630/30467628134_e1af38e13e_o.jpg,0.4375,0.25,1.0,1.0,840,381,https://www.flickr.com/photos/woodhead/30467628134,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/ 49c44b8586d3a013,https://c1.staticflickr.com/9/8267/28935595442_98fa118a43_o.jpg,0.4375,0.0,1.0,0.75,974,931,https://www.flickr.com/photos/127226743@N02/28935595442,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 6234bb935bdfa67a,https://c1.staticflickr.com/6/5622/31325933655_01aa62c019_o.jpg,0.0,0.0,0.5,0.75,981,880,https://www.flickr.com/photos/myneur/31325933655/,https://creativecommons.org/licenses/by/2.0/,Petr Meissner,https://www.flickr.com/people/myneur/ 45317bc9b4752ecd,https://c1.staticflickr.com/9/8052/29300057441_a89022d7bd_o.jpg,0.249079528719,0.25,0.747238586156,1.0,909,66,https://www.flickr.com/photos/dlr_de/29300057441,https://creativecommons.org/licenses/by/2.0/,DLR German Aerospace Center,https://www.flickr.com/people/dlr_de/ acf33f6f612f72ba,https://c1.staticflickr.com/8/7657/26887791375_1dea874b1a_o.jpg,0.0,0.0,0.75,0.63875,602,903,https://www.flickr.com/photos/140473922@N07/26887791375/,https://creativecommons.org/licenses/by/2.0/,malnasfalu,https://www.flickr.com/people/140473922@N07/ 58c0464d894e860d,https://c1.staticflickr.com/9/8729/30061850401_aa07c74f06_o.jpg,0.25,0.0,1.0,0.75,613,464,https://www.flickr.com/photos/togawanderings/30061850401,https://creativecommons.org/licenses/by/2.0/,Thomas Galvez,https://www.flickr.com/people/togawanderings/ 789eca750611fbea,https://c1.staticflickr.com/9/8626/29644007673_8f0b5ff270_o.jpg,0.0,0.25,0.567503924647,1.0,325,68,https://www.flickr.com/photos/dany13/29644007673,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/ 28b3817e7a1f79e9,https://c1.staticflickr.com/3/2674/32766398956_c2d1a0c71d_o.jpg,0.0,0.0,0.701966717095,1.0,977,465,https://www.flickr.com/photos/jordiver/32766398956/,https://creativecommons.org/licenses/by/2.0/,Jordi Verdugo,https://www.flickr.com/people/jordiver/ 536378d6ceae5752,https://c1.staticflickr.com/6/5462/30647908266_3f28c142e1_o.jpg,0.25,0.0,0.75,0.75,662,615,https://flickr.com/10013573@N05/30647908266,https://creativecommons.org/licenses/by/2.0/,Willem van Valkenburg,https://www.flickr.com/people/wfvanvalkenburg/ 73d4e85fa5b59f29,https://c1.staticflickr.com/6/5488/30316948464_17de01b64f_o.jpg,0.25,0.25,0.75,1.0,519,986,https://www.flickr.com/photos/box_repsol/30316948464,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ c6a45271363e7f04,https://c1.staticflickr.com/9/8123/29842387891_501d877c25_o.jpg,0.0,0.0,0.666666666667,1.0,662,844,https://www.flickr.com/photos/77492252@N05/29842387891,https://creativecommons.org/licenses/by/2.0/,davocano,https://www.flickr.com/people/77492252@N05/ 2c46c711457c77ec,https://c1.staticflickr.com/1/315/31879403996_985f54c131_o.jpg,0.0,0.0,0.666666666667,1.0,558,774,https://www.flickr.com/photos/ministeriodedefensaperu/31879403996,https://creativecommons.org/licenses/by/2.0/,Galeria del Ministerio de Defensa del Per\303\272,https://www.flickr.com/people/ministeriodedefensaperu/ b3b7fbf89b0a7556,https://c1.staticflickr.com/9/8137/29249933864_7275736729_o.jpg,0.25,0.0,1.0,0.739247311828,800,486,https://www.flickr.com/photos/zaneology/29249933864,https://creativecommons.org/licenses/by/2.0/,Zaneology,https://www.flickr.com/people/zaneology/ c086851283a7aacc,https://c1.staticflickr.com/8/7665/26313610194_dc87b14b5a_o.jpg,0.0,0.25,0.5,1.0,723,966,https://www.flickr.com/photos/jsenniko/26313610194,https://creativecommons.org/licenses/by/2.0/,Juris Se\305\206\305\206ikovs,https://www.flickr.com/people/jsenniko/ e25e97b4da4dca11,https://c1.staticflickr.com/6/5601/31193975172_669d041215_o.jpg,0.25,0.0,1.0,1.0,981,126,https://www.flickr.com/photos/blmoregon/31193975172,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 60551ce10f562a2f,https://c1.staticflickr.com/9/8616/28201270866_77169d2b43_o.jpg,0.0,0.25,0.5,1.0,699,605,https://www.flickr.com/photos/slapers/28201270866,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ fb97af3a43925ba9,https://c1.staticflickr.com/6/5805/30472669264_962c581540_o.jpg,0.5,0.0,1.0,0.75,916,235,http://www.flickr.com/photos/ajesplugues/30472669264/,https://creativecommons.org/licenses/by/2.0/,Ajuntament d'Esplugues de Llobregat,https://www.flickr.com/people/ajesplugues/ d34f7dee12182abe,https://c1.staticflickr.com/6/5737/31443843255_126f119dbd_o.jpg,0.5,0.25,1.0,1.0,561,905,https://www.flickr.com/photos/codnewsroom/31443843255/,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 213180dccb79dbab,https://c1.staticflickr.com/1/780/32266535531_914d1de4f8_o.jpg,0.0,0.0,0.421177266576,0.75,932,858,https://www.flickr.com/photos/ekigyuu/32266535531,https://creativecommons.org/licenses/by/2.0/,California Cow,https://www.flickr.com/people/ekigyuu/ eb3f60c3e0eb5675,https://c1.staticflickr.com/9/8537/28606389864_7a625438a9_o.jpg,0.0,0.0,0.5,0.75,405,442,https://www.flickr.com/photos/markyharky/28606389864/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ e3938807514f8af3,https://c1.staticflickr.com/8/7070/26876369605_1c0b58e022_o.jpg,0.0,0.0,0.5625,0.75,972,902,https://www.flickr.com/photos/ethanhein/26876369605,https://creativecommons.org/licenses/by/2.0/,Ethan Hein,https://www.flickr.com/people/ethanhein/ 11463c81b0f19280,https://c1.staticflickr.com/8/7409/27194030834_587632b7aa_o.jpg,0.0,0.0,0.5625,0.75,826,468,https://www.flickr.com/photos/jsjgeology/27194030834,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d46bda0f98ffd223,https://c1.staticflickr.com/1/717/31805621711_da0f339f2a_o.jpg,0.25,0.541313559322,1.0,1.0,888,933,https://www.flickr.com/photos/dalbera/31805621711,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 7c2bad6bd8baab07,https://c1.staticflickr.com/9/8254/29380005704_83b348ea96_o.jpg,0.0,0.0,0.7484375,1.0,874,909,https://flickr.com/146689017@N06/29380005704,https://creativecommons.org/licenses/by/2.0/,Omar Salvatierra Gracida,https://www.flickr.com/people/omarsg/ 8933d2aabaf4dfaf,https://c1.staticflickr.com/6/5614/30551743646_f5241b75cb_o.jpg,0.287671232877,0.0,0.86301369863,1.0,780,467,https://www.flickr.com/photos/thoseguys119/30551743646,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 6cc3b846932214d3,https://c1.staticflickr.com/1/307/30908389114_09f4d6d259_o.jpg,0.28125,0.0,0.84375,0.75,976,624,https://www.flickr.com/photos/auntylaurie/30908389114,https://creativecommons.org/licenses/by/2.0/,Laurie Avocado,https://www.flickr.com/people/auntylaurie/ 755ad78ea92cb11f,https://c1.staticflickr.com/1/536/32823412236_e11f9dd6a3_o.jpg,0.0,0.0,0.5,0.75,355,632,https://www.flickr.com/photos/cmichel67/32823412236,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/ 5b55f8116ca730aa,https://c1.staticflickr.com/9/8138/28755052770_ed159a3a94_o.jpg,0.28125,0.25,0.84375,1.0,709,392,https://www.flickr.com/photos/127226743@N02/28755052770,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ d2186fe6529885bf,https://c1.staticflickr.com/9/8516/29300966580_e3628e21ba_o.jpg,0.498153618907,0.25,1.0,1.0,361,216,https://www.flickr.com/photos/bottesini/29300966580/,https://creativecommons.org/licenses/by/2.0/,Carl Hinde,https://www.flickr.com/people/bottesini/ 5c9d17909af242f1,https://c1.staticflickr.com/9/8310/29439863240_94936370d8_o.jpg,0.0,0.281690140845,0.75,0.845070422535,998,446,https://www.flickr.com/photos/treegrow/29439863240,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 14608181de580cd1,https://c1.staticflickr.com/8/7693/26685191040_c344a00d79_o.jpg,0.0,0.0,0.5625,0.75,738,799,https://www.flickr.com/photos/jeepersmedia/26685191040,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 0eef2b93e7c79a50,https://c1.staticflickr.com/6/5622/29912896226_6dafcd621b_o.jpg,0.25,0.25,0.75,1.0,680,441,https://www.flickr.com/photos/slgc/29912896226,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ a02ea721a8e22a81,https://c1.staticflickr.com/9/8163/29006650060_719fec9008_o.jpg,0.299878836834,0.25,0.899636510501,1.0,441,799,https://www.flickr.com/photos/edenpictures/29006650060/,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ 45f25eb5cf5e1817,https://c1.staticflickr.com/8/7083/27083758675_ca01de522e_o.jpg,0.0,0.0,0.666666666667,1.0,782,630,https://www.flickr.com/photos/deniwlp84/27083758675,https://creativecommons.org/licenses/by/2.0/,Deni Williams,https://www.flickr.com/people/deniwlp84/ 037605e380e74b3d,https://c1.staticflickr.com/8/7316/27535047834_84be398e92_o.jpg,0.496696035242,0.25,0.993392070485,1.0,980,94,https://www.flickr.com/photos/peuplier/27535047834/,https://creativecommons.org/licenses/by/2.0/,peuplier,https://www.flickr.com/people/peuplier/ 4608535c5f81bf16,https://c1.staticflickr.com/8/7719/27861554981_6e505299e7_o.jpg,0.0,0.265577507599,0.75,0.796732522796,755,825,https://www.flickr.com/photos/51764518@N02/27861554981,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ a603cbb7f45040e6,https://c1.staticflickr.com/6/5559/30982399701_4555e35818_o.jpg,0.25,0.25,1.0,1.0,936,8,https://flickr.com/89575217@N00/30982399701,https://creativecommons.org/licenses/by/2.0/,Sean Hackbarth,https://www.flickr.com/people/seanhackbarth/ abff9a4488c6e34a,https://c1.staticflickr.com/8/7216/26599258800_48d8040e17_o.jpg,0.0,0.0,0.75,0.75,885,779,https://www.flickr.com/photos/pagedooley/26599258800,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/ 8a20fba052c91fef,https://c1.staticflickr.com/6/5631/30713916761_f72ee66eea_o.jpg,0.0,0.440540540541,1.0,1.0,518,219,https://flickr.com/34034435@N00/30713916761,https://creativecommons.org/licenses/by/2.0/,charlene mcbride,https://www.flickr.com/people/ursonate/ be41bd184b764bf9,https://c1.staticflickr.com/1/357/32195526361_11bd66c116_o.jpg,0.330871491876,0.0,1.0,1.0,507,607,http://www.flickr.com/photos/byzantiumbooks/32195526361/,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ 4f3f8aad1011d96b,https://c1.staticflickr.com/9/8191/29494467880_92c889fef9_o.jpg,0.0424028268551,0.0,1.0,1.0,310,759,https://www.flickr.com/photos/gails_pictures/29494467880/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 705436bd09b51c8a,https://c1.staticflickr.com/8/7541/28102794341_3cd2ce0b73_o.jpg,0.350925925926,0.0,0.701851851852,0.75,348,979,https://www.flickr.com/photos/dennisredfield/28102794341/,https://creativecommons.org/licenses/by/2.0/,cloud2013,https://www.flickr.com/people/dennisredfield/ a409f86891d38546,https://c1.staticflickr.com/9/8141/28672318593_e6ebce766e_o.jpg,0.0,0.25,0.5625,1.0,944,189,https://www.flickr.com/photos/sakena/28672318593,https://creativecommons.org/licenses/by/2.0/,Sakena,https://www.flickr.com/people/sakena/ 0131e33e1fb8e4de,https://c1.staticflickr.com/6/5513/30392703730_5b17ceef76_o.jpg,0.0,0.0,1.0,0.805510534846,683,130,http://www.flickr.com/photos/socsci/30392703730/,https://creativecommons.org/licenses/by/2.0/,Mr. Gray,https://www.flickr.com/people/socsci/ 3eeaf2616d093b3b,https://c1.staticflickr.com/8/7394/27048842461_c128a19fb2_o.jpg,0.4375,0.0,1.0,0.75,110,60,https://www.flickr.com/photos/132646954@N02/27048842461/,https://creativecommons.org/licenses/by/2.0/,dronepicr,https://www.flickr.com/people/132646954@N02/ 769693c4690e455e,https://c1.staticflickr.com/9/8745/28344168252_7701492f98_o.jpg,0.0,0.25,0.5,1.0,985,603,https://www.flickr.com/photos/silkebaron/28344168252/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ dc9bd10190ea94fe,https://c1.staticflickr.com/6/5542/30728276060_666cebb8c5_o.jpg,0.0,0.0,1.0,0.773015873016,573,568,https://www.flickr.com/photos/zeevveez/30728276060/,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ 62836d9f411d3e4e,https://c1.staticflickr.com/8/7413/27480747053_17bf037e80_o.jpg,0.5,0.25,1.0,1.0,512,3,https://www.flickr.com/photos/u07ch/27480747053,https://creativecommons.org/licenses/by/2.0/,Chris Hoare,https://www.flickr.com/people/u07ch/ 586bc62010e36052,https://c1.staticflickr.com/9/8544/29533915266_73b21578b8_o.jpg,0.496696035242,0.0,0.993392070485,0.75,484,863,https://www.flickr.com/photos/sybarite48/29533915266,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 2bd761902ddc0465,https://c1.staticflickr.com/9/8323/29234492521_15421294e1_o.jpg,0.0,0.0,0.666666666667,1.0,426,519,https://www.flickr.com/photos/60712129@N06/29234492521/,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/ 518b92fced5b37c0,https://c1.staticflickr.com/6/5789/30029731443_b72cfcb099_o.jpg,0.25,0.499263622975,1.0,0.99852724595,443,492,https://www.flickr.com/photos/_pavan_/30029731443/,https://creativecommons.org/licenses/by/2.0/,_paVan_,https://www.flickr.com/people/_pavan_/ cbc94e0ed022e3f7,https://c1.staticflickr.com/2/1484/26171544903_cc6f95bcec_o.jpg,0.25,0.0,1.0,0.75,986,823,https://www.flickr.com/photos/clairity/26171544903,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 3e80d889502d35ec,https://c1.staticflickr.com/6/5328/29922029184_a4c33e19cc_o.jpg,0.0,0.0,0.5,0.75,428,220,https://flickr.com/32916425@N04/29922029184,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ 467f986653331c23,https://c1.staticflickr.com/8/7376/27237214941_a7b34764bd_o.jpg,0.0,0.0,0.666666666667,1.0,976,491,https://www.flickr.com/photos/wm_archiv/27237214941,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 69024468d3f55fe5,https://c1.staticflickr.com/9/8222/28762319423_7ffbe8506d_o.jpg,0.248348017621,0.0,0.745044052863,0.75,484,702,https://www.flickr.com/photos/sybarite48/28762319423,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 8441b479f7e09fa8,https://c1.staticflickr.com/8/7278/27724505412_da1d61a874_o.jpg,0.333333333333,0.0,1.0,1.0,320,887,http://www.flickr.com/photos/10459174@N03/27724505412/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/ c58a10f77aa98ddb,https://c1.staticflickr.com/8/7449/26842767434_6e9e22ec4c_o.jpg,0.25,0.0,1.0,0.75,818,878,https://www.flickr.com/photos/moto_club4ag/26842767434,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ f21635f78f294334,https://c1.staticflickr.com/1/586/31273448830_c991a21a24_o.jpg,0.0,0.25,0.5,1.0,147,468,https://www.flickr.com/photos/blachswan/31273448830,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ d4136db90952dbc5,https://c1.staticflickr.com/9/8268/28777773716_7f7cc40dbc_o.jpg,0.486899563319,0.25,0.973799126638,1.0,752,106,https://www.flickr.com/photos/8269539@N04/28777773716,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ e1db6c0ddd408559,https://c1.staticflickr.com/8/7665/27446274476_bb5105c6da_o.jpg,0.5,0.0,1.0,0.75,976,656,https://www.flickr.com/photos/134741223@N04/27446274476,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/ ff403c29ed79f115,https://c1.staticflickr.com/8/7326/27568783281_3c1d7b407e_o.jpg,0.281690140845,0.0,0.845070422535,0.75,896,827,https://www.flickr.com/photos/28169156@N03/27568783281,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/ e3115a1ae84d4989,https://c1.staticflickr.com/1/592/33208479161_cf837d7dbe_o.jpg,0.0,0.0,0.75,0.684051724138,292,380,https://flickr.com/49399018@N00/33208479161,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ bb4ef961035d26ec,https://c1.staticflickr.com/8/7522/26275989454_f0232d8b1a_o.jpg,0.25,0.25,0.75,1.0,815,728,https://www.flickr.com/photos/usefulguy/26275989454,https://creativecommons.org/licenses/by/2.0/,Daren,https://www.flickr.com/people/usefulguy/ cc6227957262c76f,https://c1.staticflickr.com/9/8722/29291665122_90ddd7f8e7_o.jpg,0.161983471074,0.0,1.0,1.0,725,845,https://www.flickr.com/photos/mypubliclands/29291665122,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 1a0c8fa341b4a37c,https://c1.staticflickr.com/9/8664/29044209355_684f07b964_o.jpg,0.302066450567,0.0,0.906199351702,0.75,309,953,https://www.flickr.com/photos/35142635@N05/29044209355,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 8172f0fdfb6fb9b8,https://c1.staticflickr.com/8/7344/27238563335_9d773f7a7c_o.jpg,0.0,0.0,0.666666666667,1.0,59,326,https://www.flickr.com/photos/quinet/27238563335,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 4338f8cd922c074f,https://c1.staticflickr.com/8/7156/26535332614_d72af19ac9_o.jpg,0.0,0.112244897959,1.0,1.0,923,718,https://www.flickr.com/photos/djquietstorm/26535332614,https://creativecommons.org/licenses/by/2.0/,DJ Quietstorm,https://www.flickr.com/people/djquietstorm/ 59031e05dbbc3f52,https://c1.staticflickr.com/8/7559/28797948012_f0de374436_o.jpg,0.254086181278,0.25,0.762258543834,1.0,144,20,https://www.flickr.com/photos/mypubliclands/28797948012,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ b4415c65baed7516,https://c1.staticflickr.com/8/7460/27416443420_160df9300e_o.jpg,0.25,0.0,0.75,0.75,405,856,https://www.flickr.com/photos/alessandroambrosetti/27416443420,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ 54f7c8c5af370662,https://c1.staticflickr.com/6/5718/30987348636_8b1ebd1173_o.jpg,0.276744186047,0.25,0.83023255814,1.0,854,904,https://www.flickr.com/photos/13476480@N07/30987348636,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 92c199c38dbc2802,https://c1.staticflickr.com/9/8321/29216321204_94b1532d99_o.jpg,0.4375,0.0,1.0,0.75,407,809,https://www.flickr.com/photos/davidwilson1949/29216321204/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ f103ec5f8357c447,https://c1.staticflickr.com/1/313/31913141411_edc733f89d_o.jpg,0.25,0.4375,1.0,1.0,108,945,https://www.flickr.com/photos/jimg944/31913141411/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 1c3f91ef1f361819,https://c1.staticflickr.com/8/7464/27903634184_202525d0ef_o.jpg,0.0,0.0,1.0,1.0,310,785,https://www.flickr.com/photos/62720583@N06/27903634184/,https://creativecommons.org/licenses/by/2.0/,Kelly Parker McPherson,https://www.flickr.com/people/kellymcpherson/ 0f83fac8ce824ddd,https://c1.staticflickr.com/1/665/31833889074_a9ed658ce2_o.jpg,0.0,0.25,0.598790322581,1.0,879,169,https://www.flickr.com/photos/stevendepolo/31833889074,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 0a5db53c7286f8ab,https://c1.staticflickr.com/9/8129/30203486926_ebb34a4e75_o.jpg,0.326939291737,0.0,0.980817875211,0.75,980,777,https://www.flickr.com/photos/vastateparksstaff/30203486926/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ ff679db22657fe1c,https://c1.staticflickr.com/3/2076/32046560293_5feb85b55b_o.jpg,0.249079528719,0.0,0.747238586156,0.75,311,434,http://www.flickr.com/photos/mikehawkwind/32046560293/,https://creativecommons.org/licenses/by/2.0/,Mike Smith,https://www.flickr.com/people/mikehawkwind/ 278bb871aaf429b9,https://c1.staticflickr.com/9/8310/29798300156_0d39313c57_o.jpg,0.5,0.0,1.0,0.75,651,557,https://www.flickr.com/photos/agriculturasp/29798300156/,https://creativecommons.org/licenses/by/2.0/,Secretaria de Agricultura e Abastecimento,https://www.flickr.com/people/agriculturasp/ 499ab46642b7c8e8,https://c1.staticflickr.com/8/7753/27455889495_5e7ecc7ec3_o.jpg,0.0,0.0,0.75786163522,1.0,31,298,https://www.flickr.com/photos/28242319@N03/27455889495/,https://creativecommons.org/licenses/by/2.0/,Dennis Heller,https://www.flickr.com/people/28242319@N03/ 58bedbc44c1d3279,https://c1.staticflickr.com/8/7382/26947350914_10dca1c24f_o.jpg,0.4375,0.0,1.0,0.75,305,679,https://www.flickr.com/photos/dhobern/26947350914/,https://creativecommons.org/licenses/by/2.0/,Donald Hobern,https://www.flickr.com/people/dhobern/ 12f8ccfb229bfab4,https://c1.staticflickr.com/8/7455/26669167474_3f8211e2f4_o.jpg,0.0,0.25,0.5,1.0,321,826,https://www.flickr.com/photos/52450054@N04/26669167474,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 2c8632e077d08768,https://c1.staticflickr.com/8/7713/27761158160_0f86b286b7_o.jpg,0.248348017621,0.0,0.745044052863,0.75,702,797,https://www.flickr.com/photos/sterlic/27761158160,https://creativecommons.org/licenses/by/2.0/,Scott Akerman,https://www.flickr.com/people/sterlic/ 0bf52174bd593307,https://c1.staticflickr.com/9/8244/28141665420_9d90e80539_o.jpg,0.0,0.0,0.5625,0.75,975,269,https://www.flickr.com/photos/jsjgeology/28141665420,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 41576c6c2a85cceb,https://c1.staticflickr.com/8/7284/28072330396_708b7ef791_o.jpg,0.25,0.25,0.75,1.0,548,472,https://www.flickr.com/photos/belurashok/28072330396,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ 058fcadc77642930,https://c1.staticflickr.com/8/7790/27969356691_6c65125966_o.jpg,0.0,0.0,0.666666666667,1.0,896,283,https://www.flickr.com/photos/clemensv/27969356691,https://creativecommons.org/licenses/by/2.0/,Clemens Vasters,https://www.flickr.com/people/clemensv/ 36d189bc2a99ccaf,https://c1.staticflickr.com/3/2520/32729382131_f4e1177e1c_o.jpg,0.0,0.0,0.75,1.0,553,320,https://www.flickr.com/photos/marsupilami92/32729382131,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ ddd2025eb6b6a931,https://c1.staticflickr.com/6/5568/30168416874_247e2af36d_o.jpg,0.333333333333,0.0,1.0,1.0,971,106,https://flickr.com/20980483@N04/30168416874,https://creativecommons.org/licenses/by/2.0/,Ed Ogle,https://www.flickr.com/people/20980483@N04/ e193bcfccec4dbc6,https://c1.staticflickr.com/9/8806/29481984513_2eff7c2f51_o.jpg,0.279203539823,0.0,1.0,0.75,304,399,https://www.flickr.com/photos/33398884@N03/29481984513,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ acd617ee5f3f23a0,https://c1.staticflickr.com/6/5494/29995539834_b98dc5da0f_o.jpg,0.0,0.0,0.45,0.75,98,392,https://www.flickr.com/photos/atoach/29995539834/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 916a04ddc8731c46,https://c1.staticflickr.com/6/5536/30660371276_db25dd9373_o.jpg,0.438671875,0.25,1.0,1.0,808,85,https://flickr.com/68132273@N00/30660371276,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/ 209a178bfb1091e8,https://c1.staticflickr.com/6/5780/31286927062_c01607b9a4_o.jpg,0.322436849926,0.0,1.0,1.0,934,899,http://www.flickr.com/photos/playamongfriends/31286927062/,https://creativecommons.org/licenses/by/2.0/,Play Among Friends Paf,https://www.flickr.com/people/playamongfriends/ 822758c7af4d8b7b,https://c1.staticflickr.com/8/7458/28069567296_b94851cec3_o.jpg,0.25,0.0,1.0,1.0,512,529,https://www.flickr.com/photos/daveseven/28069567296,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ 9b00a102463c1ad1,https://c1.staticflickr.com/6/5572/31662101102_dd08fec03d_o.jpg,0.249079528719,0.25,0.747238586156,1.0,875,474,https://www.flickr.com/photos/didbygraham/31662101102,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 0cb2feb744266fd0,https://c1.staticflickr.com/1/238/31631328665_5e73ddf5a7_o.jpg,0.0,0.0,0.556376360809,0.75,719,561,https://www.flickr.com/photos/telecastered/31631328665,https://creativecommons.org/licenses/by/2.0/,C. J. Lee,https://www.flickr.com/people/telecastered/ 0791499bcccabe52,https://c1.staticflickr.com/6/5831/30542504142_1929d64178_o.jpg,0.421177266576,0.0,0.842354533153,0.75,699,431,https://www.flickr.com/photos/erikkristensen/30542504142/,https://creativecommons.org/licenses/by/2.0/,Erik Cleves Kristensen,https://www.flickr.com/people/erikkristensen/ d575d34d10aeb7e5,https://c1.staticflickr.com/9/8742/28232027000_2bbe5e89f8_o.jpg,0.25,0.25,0.75,1.0,449,632,https://www.flickr.com/photos/o_0/28232027000,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 94c8d6071e8e0881,https://c1.staticflickr.com/1/434/32270312545_5ae81bc3db_o.jpg,0.25,0.5,1.0,1.0,609,998,https://www.flickr.com/photos/markusspiske/32270312545/,https://creativecommons.org/licenses/by/2.0/,Markus Spiske,https://www.flickr.com/people/markusspiske/ f05b4dd9abfa8fd2,https://c1.staticflickr.com/9/8122/29155178825_742da07639_o.jpg,0.0,0.0,0.75,0.570472440945,885,675,https://www.flickr.com/photos/dakone2k/29155178825/,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/ 57689c97605feac9,https://c1.staticflickr.com/1/471/31991763546_5c22639fe6_o.jpg,0.284198113208,0.0,0.852594339623,0.75,933,706,https://www.flickr.com/photos/dierkschaefer/31991763546/,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/ 82731c5828cb765e,https://c1.staticflickr.com/9/8230/29701176162_fff3e110d2_o.jpg,0.455384615385,0.25,1.0,1.0,310,223,https://www.flickr.com/photos/gails_pictures/29701176162/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ e80e79c24965c1c4,https://c1.staticflickr.com/9/8450/29078155744_bb4b4b7052_o.jpg,0.4375,0.25,1.0,1.0,484,613,https://www.flickr.com/photos/garryknight/29078155744,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ 59be20b9e3e5bff8,https://c1.staticflickr.com/9/8809/28361911572_4b0f0125d5_o.jpg,0.258164852255,0.0,1.0,1.0,976,147,https://www.flickr.com/photos/29780474@N02/28361911572,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/ 9920295723999e88,https://c1.staticflickr.com/1/383/32382765811_d88c81ddfa_o.jpg,0.4375,0.25,1.0,1.0,971,866,http://www.flickr.com/photos/dlnorman/32382765811/,https://creativecommons.org/licenses/by/2.0/,D'Arcy Norman,https://www.flickr.com/people/dlnorman/ 73cfc43f614e9a7d,https://c1.staticflickr.com/1/777/32368474241_d7b6000fb7_o.jpg,0.244897959184,0.0,1.0,1.0,574,952,https://www.flickr.com/photos/hugo90/32368474241,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 075ef6f6e5a662c8,https://c1.staticflickr.com/9/8879/28447740005_93cd42414b_o.jpg,0.0,0.0,1.0,0.68005952381,539,933,https://www.flickr.com/photos/duncanh1/28447740005/,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 769591275a3ce53a,https://c1.staticflickr.com/8/7617/27165103061_786b79b4f4_o.jpg,0.207382550336,0.25,0.622147651007,1.0,986,931,https://www.flickr.com/photos/nordique/27165103061/,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ 6334ed4e7576b0ce,https://c1.staticflickr.com/9/8336/28779067996_7a08d9387f_o.jpg,0.163782816229,0.25,0.491348448687,1.0,815,960,https://www.flickr.com/photos/watts_photos/28779067996/,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ 634a907608769906,https://c1.staticflickr.com/9/8351/29797714791_196e00f076_o.jpg,0.0,0.25,0.53506097561,1.0,780,636,https://www.flickr.com/photos/thoseguys119/29797714791,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 9322abcfde22c582,https://c1.staticflickr.com/1/682/32440530263_32a0e585b8_o.jpg,0.297768479777,0.0,0.893305439331,1.0,973,401,https://flickr.com/47445767@N05/32440530263,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 6ed60a4ef590f818,https://c1.staticflickr.com/8/7259/27353806003_e1ec2e55c9_o.jpg,0.308073654391,0.0,0.924220963173,1.0,896,572,https://www.flickr.com/photos/hisgett/27353806003/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 8ef45f7fd1349e5e,https://c1.staticflickr.com/9/8450/29274193644_83a359ea05_o.jpg,0.297226688103,0.25,0.891680064309,1.0,671,456,https://www.flickr.com/photos/hisgett/29274193644,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 65187b0210245a1a,https://c1.staticflickr.com/9/8817/28253135653_aaa7a4c09d_o.jpg,0.25,0.0,0.75,0.75,820,825,https://www.flickr.com/photos/oakfieldfestival/28253135653/,https://creativecommons.org/licenses/by/2.0/,Oakfield Festival,https://www.flickr.com/people/oakfieldfestival/ ce2bf4cb7697367d,https://c1.staticflickr.com/9/8091/29092250034_209b197b0e_o.jpg,0.0,0.333333333333,1.0,1.0,779,505,https://www.flickr.com/photos/quinet/29092250034,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ c96cd01115bc0d75,https://c1.staticflickr.com/6/5511/30434287803_d625d494c6_o.jpg,0.0,0.0,0.5,0.75,763,632,https://www.flickr.com/photos/jseita/30434287803,https://creativecommons.org/licenses/by/2.0/,Jun Seita,https://www.flickr.com/people/jseita/ 09d9e27638cfd149,https://c1.staticflickr.com/6/5569/30559613291_5fa48f672a_o.jpg,0.0,0.25,0.600969305331,1.0,702,758,https://www.flickr.com/photos/jlcernadas/30559613291,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ ebf67c819ecd79b0,https://c1.staticflickr.com/9/8020/28641898590_535c9e3022_o.jpg,0.503303964758,0.0,1.0,0.75,771,934,https://www.flickr.com/photos/spera-designerschuhe/28641898590,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ 38818dfe6c3d7f17,https://c1.staticflickr.com/3/2749/32849632742_3dc695bb90_o.jpg,0.0,0.0,0.75,0.572555205047,740,3,https://www.flickr.com/photos/archivesnz/32849632742,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/ db176954ac86b5de,https://c1.staticflickr.com/1/631/32225125016_01333c67be_o.jpg,0.0,0.25,0.497426470588,1.0,686,918,https://www.flickr.com/photos/agenciabrasilia/32225125016,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 672b81e790820689,https://c1.staticflickr.com/9/8501/29851837016_6e547ed3f2_o.jpg,0.0,0.0,0.75,0.75,672,313,https://www.flickr.com/photos/glorycycles/29851837016,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 43d75375c9dd3331,https://c1.staticflickr.com/4/3806/33050883126_0c5f49a3b5_o.jpg,0.0,0.0,0.659745762712,0.75,582,862,https://www.flickr.com/photos/andreboeni/33050883126,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 8b9e22fd818eedd1,https://c1.staticflickr.com/9/8045/29263007246_d555ab3dfc_o.jpg,0.334315169367,0.0,1.0,1.0,875,231,https://www.flickr.com/photos/76969036@N02/29263007246,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 201082ea98a3f4ad,https://c1.staticflickr.com/9/8365/28397101873_cf2e69e456_o.jpg,0.333333333333,0.0,1.0,1.0,618,165,https://www.flickr.com/photos/presidentialoffice/28397101873/,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ 4d5edc24f7e5730c,https://c1.staticflickr.com/8/7342/27329983715_fe7c660857_o.jpg,0.249631811487,0.0,0.748895434462,0.75,512,757,https://www.flickr.com/photos/greggjerdingen/27329983715,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 581715a637a8cb4c,https://c1.staticflickr.com/6/5553/30493046420_1bb6b3b694_o.jpg,0.25,0.25,0.75,1.0,747,515,https://www.flickr.com/photos/mindahaas/30493046420/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ f892160406f2ff91,https://c1.staticflickr.com/8/7496/27516720291_998fc9818c_o.jpg,0.0,0.0,0.663235294118,1.0,756,632,https://www.flickr.com/photos/pedrik/27516720291/,https://creativecommons.org/licenses/by/2.0/,pedrik,https://www.flickr.com/people/pedrik/ 18c4ea8fcb592141,https://c1.staticflickr.com/8/7518/26746692071_5cc62265ee_o.jpg,0.25,0.5,1.0,1.0,13,452,https://www.flickr.com/photos/quinet/26746692071,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ c1e771277b4d0541,https://c1.staticflickr.com/8/7404/26613570814_3f0701b636_o.jpg,0.28125,0.0,0.84375,0.75,979,624,https://www.flickr.com/photos/backbone_campaign/26613570814,https://creativecommons.org/licenses/by/2.0/,Backbone Campaign,https://www.flickr.com/people/backbone_campaign/ 675a51b2ea9bd4b1,https://c1.staticflickr.com/8/7067/27115230165_fd9bfacc7b_o.jpg,0.25,0.400242326333,1.0,1.0,85,984,https://www.flickr.com/photos/kellymcpherson/27115230165,https://creativecommons.org/licenses/by/2.0/,Kelly Parker McPherson,https://www.flickr.com/people/kellymcpherson/ 99f7551240ade96e,https://c1.staticflickr.com/9/8062/29124935683_d7639b44ec_o.jpg,0.0,0.25,0.5625,1.0,719,447,https://www.flickr.com/photos/conner395/29124935683,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/ 714c77cf3886ec6e,https://c1.staticflickr.com/9/8166/28980411972_c2df5fbc6c_o.jpg,0.0,0.0,0.96975088968,1.0,305,427,https://www.flickr.com/photos/gails_pictures/28980411972/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ c505df8155f1b395,https://c1.staticflickr.com/8/7466/29063982836_0147f8ba93_o.jpg,0.25,0.0,1.0,0.5625,631,618,https://www.flickr.com/photos/treevillage/29063982836/,https://creativecommons.org/licenses/by/2.0/,kimubert,https://www.flickr.com/people/treevillage/ cc7e3206cc2e9e07,https://c1.staticflickr.com/9/8279/28397640321_dae26e7250_o.jpg,0.48007518797,0.25,1.0,1.0,405,447,https://www.flickr.com/photos/erussell1984/28397640321/,https://creativecommons.org/licenses/by/2.0/,airbus777,https://www.flickr.com/people/erussell1984/ 5f5eeebd137e944d,https://c1.staticflickr.com/6/5793/31334694395_37fc326469_o.jpg,0.25,0.0,0.75,0.75,405,854,https://www.flickr.com/photos/janitors/31334694395,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 9da9b01db1ad7d5c,https://c1.staticflickr.com/6/5520/31022826954_00514ec7cf_o.jpg,0.28125,0.25,0.84375,1.0,204,256,https://www.flickr.com/photos/cosmicherb70/31022826954,https://creativecommons.org/licenses/by/2.0/,Chris Combe,https://www.flickr.com/people/cosmicherb70/ 6708845c27e55878,https://c1.staticflickr.com/6/5803/30984144345_228926d7c8_o.jpg,0.25,0.0,1.0,0.45,739,508,https://www.flickr.com/photos/sebilden/30984144345/,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/ f1ede6125f7961ae,https://c1.staticflickr.com/9/8090/29453485415_b70db26831_o.jpg,0.0,0.25,0.5,1.0,844,239,https://www.flickr.com/photos/jetheriot/29453485415,https://creativecommons.org/licenses/by/2.0/,J E Theriot,https://www.flickr.com/people/jetheriot/ cb30f24673a58ea7,https://c1.staticflickr.com/8/7552/27678728434_b5d07d9ec0_o.jpg,0.28125,0.25,0.84375,1.0,454,968,https://www.flickr.com/photos/serdal/27678728434,https://creativecommons.org/licenses/by/2.0/,Abdulla Al Muhairi,https://www.flickr.com/people/serdal/ 7f9994ebd0bfdaf0,https://c1.staticflickr.com/3/2706/32790667811_5de75a9833_o.jpg,0.0,0.25,0.5,1.0,405,830,https://flickr.com/65265630@N03/32790667811,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 9a1605b991c3f3a6,https://c1.staticflickr.com/8/7044/27015764431_c191dab476_o.jpg,0.0,0.0,0.666666666667,1.0,980,22,https://www.flickr.com/photos/davebloggs007/27015764431,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 7ae071239f7a5528,https://c1.staticflickr.com/8/7315/28107544656_f0593b8f27_o.jpg,0.0,0.25,0.5625,1.0,110,222,https://www.flickr.com/photos/131967103@N02/28107544656/,https://creativecommons.org/licenses/by/2.0/,Ryan McMinds,https://www.flickr.com/people/131967103@N02/ f9593ce618d910d1,https://c1.staticflickr.com/6/5563/31031386562_893033d841_o.jpg,0.0,0.5,0.75,1.0,273,254,https://www.flickr.com/photos/usdagov/31031386562,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 18b996ac3a3a73f3,https://c1.staticflickr.com/9/8039/29497816625_a4409030ae_o.jpg,0.334315169367,0.0,1.0,1.0,752,268,https://flickr.com/136709227@N02/29497816625,https://creativecommons.org/licenses/by/2.0/,m_momii,https://www.flickr.com/people/136709227@N02/ 2be29cc87e84c697,https://c1.staticflickr.com/1/279/32762996296_a87c27f895_o.jpg,0.333333333333,0.0,1.0,1.0,431,243,https://www.flickr.com/photos/codnewsroom/32762996296,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ fafeb5faebffec24,https://c1.staticflickr.com/1/661/31713411775_c7309be837_o.jpg,0.5,0.25,1.0,1.0,820,967,https://www.flickr.com/photos/stevendepolo/31713411775/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 7c4f51f4657f51a2,https://c1.staticflickr.com/9/8774/27922652264_32e3f5094e_o.jpg,0.25,0.0,1.0,0.75,780,654,https://www.flickr.com/photos/78428166@N00/27922652264,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ bb6d792f6abb5ca0,https://c1.staticflickr.com/8/7562/27496984413_a9ed59944a_o.jpg,0.46104815864,0.0,0.92209631728,0.75,672,78,https://www.flickr.com/photos/glorycycles/27496984413,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ e63f759e388ededb,https://c1.staticflickr.com/1/601/31943939430_45aba24a42_o.jpg,0.438430311231,0.0,1.0,1.0,490,62,https://flickr.com/144695422@N04/31943939430,https://creativecommons.org/licenses/by/2.0/,Th\317\265Ts\312\213nd\317\265r\317\265Dem\303\270n,https://www.flickr.com/people/144695422@N04/ dca9590ea4ed637c,https://c1.staticflickr.com/8/7551/26842648490_74d5185a86_o.jpg,0.0,0.0,0.5,0.75,100,287,https://www.flickr.com/photos/30478819@N08/26842648490/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 54680c73474e09e7,https://c1.staticflickr.com/6/5207/30148967406_9a99755637_o.jpg,0.4375,0.25,1.0,1.0,975,165,https://flickr.com/47445767@N05/30148967406,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 29a22db782d2fd6a,https://c1.staticflickr.com/6/5659/30657101871_a197dd1a00_o.jpg,0.0,0.0,0.5625,0.75,529,833,https://www.flickr.com/photos/mwichary/30657101871/,https://creativecommons.org/licenses/by/2.0/,Marcin Wichary,https://www.flickr.com/people/mwichary/ e35ccc6d5a39ae8d,https://c1.staticflickr.com/9/8505/28725082423_234b20f019_o.jpg,0.248713235294,0.0,0.746139705882,0.75,822,688,https://www.flickr.com/photos/usacehq/28725082423/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers,https://www.flickr.com/people/usacehq/ 8a5606fe892457f1,https://c1.staticflickr.com/6/5529/30360519474_a2b78e1e75_o.jpg,0.083044982699,0.0,1.0,1.0,539,436,https://www.flickr.com/photos/duncanh1/30360519474,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 29c35e11a1e141c4,https://c1.staticflickr.com/1/590/32020854563_237be539e1_o.jpg,0.333333333333,0.0,1.0,1.0,327,674,https://www.flickr.com/photos/patrick_k59/32020854563/,https://creativecommons.org/licenses/by/2.0/,patrickkavanagh,https://www.flickr.com/people/patrick_k59/ 078f21706b83641b,https://c1.staticflickr.com/6/5601/31476511485_0b0a25cd35_o.jpg,0.4375,0.25,1.0,1.0,855,743,https://www.flickr.com/photos/sixteenmilesofstring/31476511485,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/ 7c31443d709ab381,https://c1.staticflickr.com/6/5484/29918739171_18b9d7fcfa_o.jpg,0.0,0.0,0.505555555556,0.75,896,717,https://www.flickr.com/photos/13476480@N07/29918739171,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ e02d997b35e0b442,https://c1.staticflickr.com/9/8829/28875801295_6a5db65071_o.jpg,0.462962962963,0.0,1.0,1.0,704,835,https://www.flickr.com/photos/rooky_yootz/28875801295,https://creativecommons.org/licenses/by/2.0/,Rooky Yootz,https://www.flickr.com/people/rooky_yootz/ aaa4f3f9d6d61aa9,https://c1.staticflickr.com/1/340/31682668600_41752f303d_o.jpg,0.0,0.0,0.75,0.5625,442,583,https://flickr.com/10688882@N00/31682668600,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ fd141236af663861,https://c1.staticflickr.com/9/8262/29077105653_dea183b629_o.jpg,0.5,0.0,1.0,0.75,467,836,https://www.flickr.com/photos/86624586@N00/29077105653,https://creativecommons.org/licenses/by/2.0/,Kevin Walsh,https://www.flickr.com/people/86624586@N00/ 5d8b8eefc5c0e432,https://c1.staticflickr.com/8/7515/26696826553_5d59b2dc95_o.jpg,0.25,0.0,1.0,0.5625,683,511,https://www.flickr.com/photos/edenpictures/26696826553,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ 1b40881dc6a8432d,https://c1.staticflickr.com/9/8682/28536791495_fcee082121_o.jpg,0.500736377025,0.25,1.0,1.0,990,77,https://www.flickr.com/photos/kopyshev/28536791495/,https://creativecommons.org/licenses/by/2.0/,E.Kopyszew,https://www.flickr.com/people/kopyshev/ 95b222eee8a7dbbd,https://c1.staticflickr.com/6/5711/29990952485_a5624c590d_o.jpg,0.248713235294,0.25,0.746139705882,1.0,694,821,https://flickr.com/8598276@N07/29990952485,https://creativecommons.org/licenses/by/2.0/,St. George's School,https://www.flickr.com/people/stgeorgesschool/ e6a5beaa1fa36656,https://c1.staticflickr.com/9/8238/29224288344_65154fca8f_o.jpg,0.0,0.0,0.5,0.75,752,874,https://www.flickr.com/photos/janitors/29224288344,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ c57895292cecec98,https://c1.staticflickr.com/9/8541/28989012934_33cd25c9c8_o.jpg,0.0,0.00759493670886,1.0,1.0,979,402,https://www.flickr.com/photos/bethscupham/28989012934/,https://creativecommons.org/licenses/by/2.0/,Beth Scupham,https://www.flickr.com/people/bethscupham/ 8eaf4d45708d75bd,https://c1.staticflickr.com/6/5563/30913874193_f8f2373f42_o.jpg,0.333333333333,0.0,1.0,1.0,778,520,https://www.flickr.com/photos/quinet/30913874193,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ c596ed9fb2fee4ce,https://c1.staticflickr.com/1/491/31750724314_6f17e31706_o.jpg,0.25,0.0,1.0,0.5,499,764,https://www.flickr.com/photos/emilykneeter/31750724314/,https://creativecommons.org/licenses/by/2.0/,emilykneeter,https://www.flickr.com/people/emilykneeter/ 7143949bc3ad8c18,https://c1.staticflickr.com/8/7662/27294270804_381776b550_o.jpg,0.594621513944,0.0,1.0,0.75,317,561,https://www.flickr.com/photos/jsjgeology/27294270804,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1a3bb0bb352b223d,https://c1.staticflickr.com/9/8663/28931914290_2dd75e3a4b_o.jpg,0.0,0.0,0.75,1.0,818,761,https://www.flickr.com/photos/moto_club4ag/28931914290,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ f586ddfe0bb4f4eb,https://c1.staticflickr.com/9/8069/28945270681_65307a24f8_o.jpg,0.578822733424,0.0,1.0,0.75,820,800,https://www.flickr.com/photos/playamongfriends/28945270681,https://creativecommons.org/licenses/by/2.0/,Play Among Friends Paf,https://www.flickr.com/people/playamongfriends/ be8169acb356b8c4,https://c1.staticflickr.com/9/8338/28290206163_f6ce0f8480_o.jpg,0.0,0.0,0.5,0.75,986,123,https://www.flickr.com/photos/cogdog/28290206163/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ f2f23a36004eb557,https://c1.staticflickr.com/8/7536/28689212552_a32e91803e_o.jpg,0.5,0.0,1.0,0.75,550,524,https://flickr.com/133138807@N08/28689212552,https://creativecommons.org/licenses/by/2.0/,Historic Bremen,https://www.flickr.com/people/historicbremen/ 9dcd438de5967196,https://c1.staticflickr.com/8/7660/26648941734_ee43c8a571_o.jpg,0.279801324503,0.0,0.559602649007,0.75,780,213,https://www.flickr.com/photos/thoseguys119/26648941734,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 9e4c88faac7f0c2b,https://c1.staticflickr.com/9/8765/28381940401_4d0071e61a_o.jpg,0.0,0.0,0.666666666667,1.0,973,325,https://www.flickr.com/photos/clairity/28381940401,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 74fabf1e134c271f,https://c1.staticflickr.com/8/7435/26239306373_b4ca5cd42c_o.jpg,0.333333333333,0.0,1.0,1.0,981,853,https://www.flickr.com/photos/64933790@N00/26239306373,https://creativecommons.org/licenses/by/2.0/,Pato Novoa,https://www.flickr.com/people/64933790@N00/ a64251f6e28fad37,https://c1.staticflickr.com/9/8285/29511081261_9fea85d5a0_o.jpg,0.333333333333,0.0,1.0,1.0,566,219,https://flickr.com/28101583@N07/29511081261,https://creativecommons.org/licenses/by/2.0/,Drew Jacksich,https://www.flickr.com/people/28101583@N07/ 32e12d8a103a439b,https://c1.staticflickr.com/8/7424/27695645882_a02f95f495_o.jpg,0.28125,0.0,0.84375,0.75,418,841,https://www.flickr.com/photos/stevendepolo/27695645882,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ e0bb60dbb996bb51,https://c1.staticflickr.com/8/7306/27441406082_dbf935a198_o.jpg,0.0,0.0,0.75,1.0,991,419,https://flickr.com/29780474@N02/27441406082,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/ 3e88ded0184e1da6,https://c1.staticflickr.com/8/7288/28198881602_fd7ae2ac8a_o.jpg,0.0,0.0,0.5625,0.75,706,689,https://www.flickr.com/photos/brownpau/28198881602,https://creativecommons.org/licenses/by/2.0/,brownpau,https://www.flickr.com/people/brownpau/ a56287783b967908,https://c1.staticflickr.com/1/693/31719272195_30087b55c3_o.jpg,0.250923190547,0.0,0.75276957164,0.75,699,893,https://flickr.com/149503105@N07/31719272195,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ c163ddca3134248b,https://c1.staticflickr.com/6/5686/30896562702_e7a9d676fb_o.jpg,0.333333333333,0.0,1.0,1.0,981,326,https://www.flickr.com/photos/amslerpix/30896562702/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 4cd2891a67234792,https://c1.staticflickr.com/9/8001/29706605152_6566120f18_o.jpg,0.0,0.0,0.46875,0.75,739,874,https://flickr.com/97121495@N03/29706605152,https://creativecommons.org/licenses/by/2.0/,Tutto Giardinaggio,https://www.flickr.com/people/giardinaggioitalia/ 7ce92093adc792ae,https://c1.staticflickr.com/8/7775/28468263366_4e06033d75_o.jpg,0.0,0.0,0.522193211488,1.0,630,52,https://www.flickr.com/photos/cosdentbyslc/28468263366,https://creativecommons.org/licenses/by/2.0/,Sansern Kiattivejsoonthorn,https://www.flickr.com/people/cosdentbyslc/ 72bb08865292f257,https://c1.staticflickr.com/9/8267/30288769481_08099c71ae_o.jpg,0.0,0.25,0.5625,1.0,59,873,https://www.flickr.com/photos/treegrow/30288769481,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ a898c71911d849ac,https://c1.staticflickr.com/6/5833/30603905364_dc629d4578_o.jpg,0.0,0.0,0.423337856174,0.75,407,583,https://www.flickr.com/photos/eltb/30603905364,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 13f692e45aad3439,https://c1.staticflickr.com/8/7664/27109080771_106d18b888_o.jpg,0.438430311231,0.0,1.0,1.0,534,879,https://www.flickr.com/photos/annethelibrarian/27109080771,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ dc4ba9edda1e2a75,https://c1.staticflickr.com/6/5330/31024497612_503f07c3de_o.jpg,0.0,0.330871491876,1.0,1.0,407,637,https://www.flickr.com/photos/eltb/31024497612,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 98021ee63a92ccc4,https://c1.staticflickr.com/9/8879/28442080432_94aa5a289b_o.jpg,0.250923190547,0.25,0.75276957164,1.0,141,862,https://www.flickr.com/photos/25553993@N02/28442080432/,https://creativecommons.org/licenses/by/2.0/,Kev Chapman,https://www.flickr.com/people/25553993@N02/ dca89b06c4ffbc15,https://c1.staticflickr.com/6/5496/30222849782_bbf1a5c8b3_o.jpg,0.0,0.0,1.0,0.681073025335,885,392,http://www.flickr.com/photos/90692748@N04/30222849782,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/ a930d9874c433701,https://c1.staticflickr.com/8/7569/28787709541_2f346aab39_o.jpg,0.0,0.25,0.497426470588,1.0,467,977,https://www.flickr.com/photos/toomore/28787709541,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/ cba9c58bf6cddf57,https://c1.staticflickr.com/2/1538/26164372383_ed53df377a_o.jpg,0.276162790698,0.25,0.828488372093,1.0,22,846,https://www.flickr.com/photos/8269539@N04/26164372383,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 55cd954af11a1391,https://c1.staticflickr.com/6/5298/30123941021_be376bdc46_o.jpg,0.333333333333,0.0,1.0,1.0,561,292,https://www.flickr.com/photos/jill_carlson/30123941021,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 761868af156972e8,https://c1.staticflickr.com/8/7744/28020662230_ab0a84d9ab_o.jpg,0.33185840708,0.0,1.0,1.0,401,620,https://www.flickr.com/photos/manunimaths/28020662230,https://creativecommons.org/licenses/by/2.0/,Manchester University Maths,https://www.flickr.com/people/manunimaths/ 0bc3e3100208ad72,https://c1.staticflickr.com/8/7377/27562233120_65ffcec8fe_o.jpg,0.0,0.473571428571,0.75,0.947142857143,524,803,https://www.flickr.com/photos/135431875@N04/27562233120,https://creativecommons.org/licenses/by/2.0/,jackcast2015,https://www.flickr.com/people/135431875@N04/ ae9c0ecb71672968,https://c1.staticflickr.com/8/7562/26918785252_19d103b332_o.jpg,0.0,0.25,0.5,1.0,806,904,https://www.flickr.com/photos/claude_wians/26918785252,https://creativecommons.org/licenses/by/2.0/,Claude Wians,https://www.flickr.com/people/claude_wians/ d9a5854111e30c65,https://c1.staticflickr.com/1/383/30974094703_62880af999_o.jpg,0.28125,0.25,0.84375,1.0,875,474,https://www.flickr.com/photos/69203347@N03/30974094703,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 33d6e7cdca94542f,https://c1.staticflickr.com/8/7439/27569464966_f8b471ac72_o.jpg,0.312874251497,0.0,1.0,1.0,971,517,https://www.flickr.com/photos/tobinielsen/27569464966/,https://creativecommons.org/licenses/by/2.0/,Tobias Nielsen,https://www.flickr.com/people/tobinielsen/ 0b01ab8cf99dfbab,https://c1.staticflickr.com/8/7461/28261627474_eb047c1b7e_o.jpg,0.0,0.0,0.562330623306,1.0,971,759,https://www.flickr.com/photos/cristian_ibarra_santillan/28261627474,https://creativecommons.org/licenses/by/2.0/,Cristian Ibarra Santillan,https://www.flickr.com/people/cristian_ibarra_santillan/ 25c7e296f795b08e,https://c1.staticflickr.com/8/7322/27370359631_0264e691a4_o.jpg,0.0,0.0,0.5,0.75,706,911,https://www.flickr.com/photos/elsie/27370359631/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 04f10fd536f3e07f,https://c1.staticflickr.com/8/7462/27569220896_fe1acae550_o.jpg,0.0,0.25,0.5,1.0,662,679,https://www.flickr.com/photos/yavuzcan/27569220896,https://creativecommons.org/licenses/by/2.0/,John Y. Can,https://www.flickr.com/people/yavuzcan/ e8b38a1d7b60e6c6,https://c1.staticflickr.com/8/7302/27348447160_7bee20af71_o.jpg,0.0,0.25,0.5,1.0,875,484,https://www.flickr.com/photos/zigazou76/27348447160,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 5b279adcd2ec003f,https://c1.staticflickr.com/9/8526/28964407676_9395781cc8_o.jpg,0.25,0.28125,1.0,0.84375,739,618,https://www.flickr.com/photos/45909111@N00/28964407676,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams,https://www.flickr.com/people/45909111@N00/ ceb2f3c043943789,https://c1.staticflickr.com/6/5648/31181552702_511d80d972_o.jpg,0.0,0.0,1.0,0.729938271605,532,396,https://www.flickr.com/photos/51764518@N02/31181552702,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 8b4dff4c47bbf9b5,https://c1.staticflickr.com/1/585/31651368356_f5b0811e4d_o.jpg,0.25,0.457373271889,1.0,1.0,324,870,https://www.flickr.com/photos/usfws_pacificsw/31651368356/,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ 64e242996bb97f02,https://c1.staticflickr.com/9/8498/29496864004_ce8b1501ea_o.jpg,0.0,0.25,0.75,1.0,960,501,https://www.flickr.com/photos/naotakem/29496864004,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/ 444c1d7cdc1fa734,https://c1.staticflickr.com/6/5692/30908652785_a638b2b43c_o.jpg,0.438671875,0.25,1.0,1.0,971,883,https://flickr.com/28435100@N00/30908652785,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ 660d8f9f7e462b98,https://c1.staticflickr.com/1/481/32161070440_454711da70_o.jpg,0.249079528719,0.0,0.747238586156,0.75,752,873,https://www.flickr.com/photos/davehamster/32161070440,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 4220aef5af49487e,https://c1.staticflickr.com/6/5811/30537968012_75b06d5a12_o.jpg,0.0,0.0,0.75786163522,1.0,717,36,https://www.flickr.com/photos/benoit59/30537968012,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/ 125f61debb1abcf0,https://c1.staticflickr.com/8/7399/27589709090_6523758fbc_o.jpg,0.0,0.0,0.75,0.75,438,797,https://www.flickr.com/photos/mcleod/27589709090,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/ 113e0b0600756089,https://c1.staticflickr.com/1/426/31203834233_ab6fbffd99_o.jpg,0.0,0.0,0.666666666667,1.0,976,245,https://www.flickr.com/photos/mseeley1/31203834233,https://creativecommons.org/licenses/by/2.0/,Michael Seeley,https://www.flickr.com/people/mseeley1/ 8b1c711ecf5052a2,https://c1.staticflickr.com/1/270/32309116380_22a868035f_o.jpg,0.266552511416,0.25,0.799657534247,1.0,33,510,https://flickr.com/95098864@N08/32309116380,https://creativecommons.org/licenses/by/2.0/,S. Rohrlach,https://www.flickr.com/people/95098864@N08/ e17b93ee3cbe1f0c,https://c1.staticflickr.com/6/5540/31861199675_8fb2ac831b_o.jpg,0.0,0.415071770335,0.75,1.0,438,582,https://www.flickr.com/photos/telecastered/31861199675,https://creativecommons.org/licenses/by/2.0/,C. J. Lee,https://www.flickr.com/people/telecastered/ 3290f9013579708e,https://c1.staticflickr.com/9/8289/28481003462_d56fdea7b8_o.jpg,0.0,0.0,0.747269890796,1.0,520,815,https://www.flickr.com/photos/13476480@N07/28481003462,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 225a3247d50b337e,https://c1.staticflickr.com/6/5477/30503009703_1a96f88ef4_o.jpg,0.544126884422,0.25,0.906878140704,1.0,405,679,https://www.flickr.com/photos/hisgett/30503009703,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ a5d3dac18308ce56,https://c1.staticflickr.com/9/8249/28563027224_36acb53ed0_o.jpg,0.0,0.25,0.498159057437,1.0,402,579,https://www.flickr.com/photos/revenidas/28563027224/,https://creativecommons.org/licenses/by/2.0/,Festival Revenidas Vilaxo\303\241n - Vilagarc\303\255a de Arousa,https://www.flickr.com/people/revenidas/ 08becc57d8b4e09f,https://c1.staticflickr.com/8/7121/27190874346_d6f125af53_o.jpg,0.5,0.25,1.0,1.0,321,626,https://www.flickr.com/photos/markyharky/27190874346,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 9513eb11008f881b,https://c1.staticflickr.com/9/8727/28110642194_b054e181d2_o.jpg,0.0,0.25,0.5,1.0,984,894,https://www.flickr.com/photos/flowcomm/28110642194,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ c5a8c57a4182713e,https://c1.staticflickr.com/8/7498/29052466924_c816d86684_o.jpg,0.0,0.25,0.5,1.0,653,596,https://www.flickr.com/photos/agenciabrasilia/29052466924,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 46be04fec5396821,https://c1.staticflickr.com/9/8840/28397721992_5366cf2ab4_o.jpg,0.25,0.0,1.0,1.0,373,62,https://flickr.com/21822583@N08/28397721992,https://creativecommons.org/licenses/by/2.0/,Chuck Moravec,https://www.flickr.com/people/21822583@N08/ 53f943edb8b87a88,https://c1.staticflickr.com/1/719/30787951403_33d5430476_o.jpg,0.331130690162,0.0,0.993392070485,1.0,891,517,https://www.flickr.com/photos/inzingvolley/30787951403/,https://creativecommons.org/licenses/by/2.0/,inzingvolley,https://www.flickr.com/people/inzingvolley/ 76c5c3f0b1e42013,https://c1.staticflickr.com/8/7170/27462433602_b856145314_o.jpg,0.4108,0.25,1.0,1.0,976,918,http://www.flickr.com/photos/david_e_smith/27462433602/,https://creativecommons.org/licenses/by/2.0/,Dave_S.,https://www.flickr.com/people/david_e_smith/ 839486be1b6a3958,https://c1.staticflickr.com/1/656/32355061431_23c51ae2be_o.jpg,0.283163265306,0.0,0.849489795918,0.75,304,929,https://www.flickr.com/photos/33398884@N03/32355061431,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 95317842bb643029,https://c1.staticflickr.com/1/269/31690663903_3b564b163a_o.jpg,0.0,0.0,0.508928571429,0.75,699,805,https://www.flickr.com/photos/hisgett/31690663903/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ d64963a602d283d6,https://c1.staticflickr.com/9/8850/28474636751_6fe57426bb_o.jpg,0.5,0.0,1.0,0.75,512,796,http://www.flickr.com/photos/daveseven/28474636751/,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ d29d5de4b2500582,https://c1.staticflickr.com/3/2928/32889519271_f75f051fef_o.jpg,0.0,0.25,1.0,1.0,254,203,https://www.flickr.com/photos/70253321@N00/32889519271,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 4f757f02399f7557,https://c1.staticflickr.com/6/5828/31143216666_b9f9349c4a_o.jpg,0.0,0.0,0.5625,0.75,875,621,https://flickr.com/36548767@N08/31143216666,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/ 855e732b98135dc5,https://c1.staticflickr.com/9/8640/27615857214_76b77ca7f3_o.jpg,0.28125,0.0,0.84375,0.75,922,806,https://www.flickr.com/photos/13476480@N07/27615857214,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 52c3048559795aea,https://c1.staticflickr.com/6/5209/29437493514_1678c5b498_o.jpg,0.5,0.25,1.0,1.0,699,620,https://www.flickr.com/photos/dakone2k/29437493514,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/ d8e20d55405079b6,https://c1.staticflickr.com/6/5665/31350189855_51f5a4d267_o.jpg,0.25,0.0,1.0,0.468616262482,400,88,https://www.flickr.com/photos/abukij/31350189855,https://creativecommons.org/licenses/by/2.0/,Paolo Gamba,https://www.flickr.com/people/abukij/ dc6c693d02709dc7,https://c1.staticflickr.com/9/8757/28162619984_060ef8a7ef_o.jpg,0.333333333333,0.0,1.0,1.0,971,338,https://www.flickr.com/photos/kittysfotos/28162619984/,https://creativecommons.org/licenses/by/2.0/,Kitty Terwolbeck,https://www.flickr.com/people/kittysfotos/ 7701a1fab5ff274d,https://c1.staticflickr.com/8/7116/26195328093_f0a46639ea_o.jpg,0.0,0.0,0.666666666667,1.0,769,797,https://www.flickr.com/photos/132091501@N05/26195328093,https://creativecommons.org/licenses/by/2.0/,Saffar Abdalah,https://www.flickr.com/people/132091501@N05/ daa305a15b3b2bf6,https://c1.staticflickr.com/6/5488/31175178596_37396d227d_o.jpg,0.28125,0.25,0.84375,1.0,335,108,https://www.flickr.com/photos/lotzman/31175178596/,https://creativecommons.org/licenses/by/2.0/,Lotzman Katzman,https://www.flickr.com/people/lotzman/ 7dbee05936bc2af5,https://c1.staticflickr.com/9/8811/28768874571_682cf179ba_o.jpg,0.25,0.25,1.0,1.0,641,701,https://flickr.com/79121338@N05/28768874571,https://creativecommons.org/licenses/by/2.0/,molybdena,https://www.flickr.com/people/molybdena/ f5938c0ba2671127,https://c1.staticflickr.com/6/5832/30657356552_fff86def79_o.jpg,0.265174506829,0.25,0.795523520486,1.0,704,396,https://www.flickr.com/photos/fade_to_gray/30657356552/,https://creativecommons.org/licenses/by/2.0/,Steve Gray,https://www.flickr.com/people/fade_to_gray/ 2cf1890535bdfe45,https://c1.staticflickr.com/9/8244/29100529872_548883758d_o.jpg,0.25,0.5,1.0,1.0,341,569,https://www.flickr.com/photos/flowcomm/29100529872,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 3970125c7f3845c2,https://c1.staticflickr.com/2/1504/26498565700_f171b2fb50_o.jpg,0.0,0.0,0.666666666667,1.0,78,189,https://www.flickr.com/photos/scubabix/26498565700/,https://creativecommons.org/licenses/by/2.0/,Rob Bixby,https://www.flickr.com/people/scubabix/ 6b7268b84c3d1ff3,https://c1.staticflickr.com/8/7360/28042045755_1ab9c8e7bf_o.jpg,0.0,0.0,0.622507122507,1.0,437,652,https://www.flickr.com/photos/autohistorian/28042045755,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ a0ecb562faed7578,https://c1.staticflickr.com/6/5793/31288187911_686f8cfe36_o.jpg,0.0,0.0,1.0,1.0,986,866,https://www.flickr.com/photos/church4u2/31288187911,https://creativecommons.org/licenses/by/2.0/,Church Iglesia,https://www.flickr.com/people/church4u2/ bc9e06df87a9fd67,https://c1.staticflickr.com/6/5735/30124758512_9d0b4cff09_o.jpg,0.0,0.0,0.5625,0.75,294,34,http://www.flickr.com/photos/41173345@N03/30124758512/,https://creativecommons.org/licenses/by/2.0/,stuart Burns,https://www.flickr.com/people/41173345@N03/ 4a9b2d0b72843b1a,https://c1.staticflickr.com/6/5333/30022388233_d0b05760bd_o.jpg,0.0,0.0,0.5625,0.75,699,123,http://www.flickr.com/photos/viewpix69/30022388233/,https://creativecommons.org/licenses/by/2.0/,Torsten Scholz,https://www.flickr.com/people/viewpix69/ e3fb28cd64b13ed5,https://c1.staticflickr.com/6/5742/29926834175_394bee9b22_o.jpg,0.0,0.331771720613,0.75,1.0,595,759,https://www.flickr.com/photos/dalbera/29926834175/,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 9d664c2b5f04ebac,https://c1.staticflickr.com/8/7406/27927833412_5dcfcebcb7_o.jpg,0.0,0.0,0.666666666667,1.0,921,565,https://www.flickr.com/photos/dietertimmerman/27927833412,https://creativecommons.org/licenses/by/2.0/,dietertimmerman,https://www.flickr.com/people/dietertimmerman/ afdbbb7c7e048430,https://c1.staticflickr.com/9/8294/29813211935_24b0c3e629_o.jpg,0.0,0.0,1.0,1.0,942,327,https://www.flickr.com/photos/55229469@N07/29813211935,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ 988b109a1bcce5f5,https://c1.staticflickr.com/8/7321/27128939333_ba9e5df069_o.jpg,0.0,0.25,0.506305637982,1.0,133,122,https://www.flickr.com/photos/mark-gunn/27128939333,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ 3c542a0f17fe5a24,https://c1.staticflickr.com/8/7113/26487835633_159d4fdf55_o.jpg,0.0,0.0,0.5,0.75,100,372,https://www.flickr.com/photos/watts_photos/26487835633,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ a7216f09bce63dd1,https://c1.staticflickr.com/9/8223/28996170696_3f12744f92_o.jpg,0.333333333333,0.0,1.0,1.0,896,889,https://www.flickr.com/photos/markyharky/28996170696/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ cef05ec921473b84,https://c1.staticflickr.com/4/3936/33113926401_9f4286510b_o.jpg,0.0,0.25,0.5,1.0,613,886,https://www.flickr.com/photos/31029865@N06/33113926401/,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/ cf63d8a5d9d6d393,https://c1.staticflickr.com/9/8771/28268880026_aba3f8ed40_o.jpg,0.421177266576,0.0,0.842354533153,0.75,400,478,https://www.flickr.com/photos/anakbrunei/28268880026,https://creativecommons.org/licenses/by/2.0/,Reedz Malik,https://www.flickr.com/people/anakbrunei/ b301910b6e183645,https://c1.staticflickr.com/6/5598/30868276785_c936fd9735_o.jpg,0.5,0.0,1.0,0.75,747,507,https://www.flickr.com/photos/usarak/30868276785,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/ 17a41a693e97f9c6,https://c1.staticflickr.com/1/631/32284537270_083ebd8c88_o.jpg,0.0,0.0,0.499263622975,0.75,98,560,https://www.flickr.com/photos/markyharky/32284537270/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 648eea4c3f83d4c3,https://c1.staticflickr.com/8/7417/26989227990_21f257d6ee_o.jpg,0.280784844384,0.0,0.842354533153,1.0,580,481,https://www.flickr.com/photos/mujitra/26989227990,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/ f126713ff16704b1,https://c1.staticflickr.com/6/5558/30889292972_6bc38b4942_o.jpg,0.5,0.25,1.0,1.0,519,111,https://www.flickr.com/photos/box_repsol/30889292972,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 72ade9dab2795e3d,https://c1.staticflickr.com/9/8479/29020117825_0ebf1c0f37_o.jpg,0.28125,0.25,0.84375,1.0,498,926,https://www.flickr.com/photos/nh53/29020117825/,https://creativecommons.org/licenses/by/2.0/,NH53,https://www.flickr.com/people/nh53/ d089896392c68f10,https://c1.staticflickr.com/8/7676/27575473564_8a07db0c9f_o.jpg,0.0,0.0,0.663235294118,1.0,928,796,https://www.flickr.com/photos/theocrazzolara/27575473564,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ 736bde2d77ab76cf,https://c1.staticflickr.com/9/8657/28092660714_e2ed20c007_o.jpg,0.0,0.25,0.5,1.0,431,749,https://www.flickr.com/photos/fotosagenciabrasil/28092660714,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/ 590d117da8cecf09,https://c1.staticflickr.com/9/8178/28139411434_40ca93b550_o.jpg,0.711926091825,0.25,1.0,1.0,859,346,https://www.flickr.com/photos/zeevveez/28139411434,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ 5600931b0bc5e2ff,https://c1.staticflickr.com/8/7787/28643992233_072b3bc01c_o.jpg,0.0,0.0,0.75,0.503698224852,888,979,https://www.flickr.com/photos/eltb/28643992233,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 41de765272d2dd41,https://c1.staticflickr.com/8/7320/27288641451_aee0a9e29f_o.jpg,0.25,0.25,1.0,1.0,442,518,https://www.flickr.com/photos/byzantiumbooks/27288641451,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ 95df6185b3ae3155,https://c1.staticflickr.com/9/8640/29967406040_bdabba2067_o.jpg,0.248713235294,0.25,0.746139705882,1.0,758,531,https://www.flickr.com/photos/12463666@N03/29967406040,https://creativecommons.org/licenses/by/2.0/,Bob M ~,https://www.flickr.com/people/12463666@N03/ a82d167901459bcd,https://c1.staticflickr.com/6/5560/30883303462_a6ed36361c_o.jpg,0.25,0.0,1.0,1.0,818,774,https://www.flickr.com/photos/kbl_luccia/30883303462,https://creativecommons.org/licenses/by/2.0/,"K.B.L. Luccia Por ahora , descanso",https://www.flickr.com/people/kbl_luccia/ 5741a8c17c8ccced,https://c1.staticflickr.com/1/422/31743804854_e09252dd9a_o.jpg,0.421177266576,0.0,0.842354533153,0.75,953,72,https://www.flickr.com/photos/plants_of_russian_in_brazil/31743804854,https://creativecommons.org/licenses/by/2.0/,"Alex Popovkin, Bahia, Brazil",https://www.flickr.com/people/plants_of_russian_in_brazil/ 1b1a987b0254baa2,https://c1.staticflickr.com/8/7231/26354225584_cb3d0f65d4_o.jpg,0.4375,0.0,1.0,0.75,484,146,https://www.flickr.com/photos/ewolivera/26354225584,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ 09fab8b52e474cb8,https://c1.staticflickr.com/6/5489/30780404330_7267843fc4_o.jpg,0.0,0.0,0.666666666667,1.0,340,524,https://www.flickr.com/photos/effjohn/30780404330,https://creativecommons.org/licenses/by/2.0/,Hammerin Man,https://www.flickr.com/people/effjohn/ fbe31e931a5f5f3b,https://c1.staticflickr.com/8/7446/27844620366_ff816b2bf3_o.jpg,0.25,0.0,1.0,0.75,672,892,https://www.flickr.com/photos/glorycycles/27844620366,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ ca843c9c5c17f7e5,https://c1.staticflickr.com/9/8626/29490045166_6aac914572_o.jpg,0.249631811487,0.0,0.748895434462,0.75,880,114,https://www.flickr.com/photos/85264217@N04/29490045166,https://creativecommons.org/licenses/by/2.0/,Retis,https://www.flickr.com/people/85264217@N04/ f59a36bf29009362,https://c1.staticflickr.com/6/5504/30313485110_3160cef910_o.jpg,0.5,0.0,1.0,0.75,468,625,https://www.flickr.com/photos/dany13/30313485110,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/ e5a2371748adebab,https://c1.staticflickr.com/9/8357/27757009513_7f1c780ced_o.jpg,0.28125,0.0,0.84375,0.75,735,877,https://www.flickr.com/photos/27665395@N05/27757009513,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ d4b04154ee8a4bcb,https://c1.staticflickr.com/6/5547/30492629744_1436527d03_o.jpg,0.28125,0.0,0.84375,0.75,866,70,https://www.flickr.com/photos/r00s/30492629744/,https://creativecommons.org/licenses/by/2.0/,Ro\315\254\315\254\315\240\315\240\315\241\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240s\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240\315\240a\315\254\315\254\315\240\315\240\315\240\315\240\315\240\315\240\315\240 Menkman,https://www.flickr.com/people/r00s/ 310573b6fff96f0e,https://c1.staticflickr.com/9/8677/28011856750_2ae9f1e05a_o.jpg,0.25,0.25,0.75,1.0,618,630,https://www.flickr.com/photos/praxinoscope/28011856750/,https://creativecommons.org/licenses/by/2.0/,David Wagner,https://www.flickr.com/people/praxinoscope/ 7584feefb592d76c,https://c1.staticflickr.com/8/7786/27131835606_7a834e911f_o.jpg,0.25,0.0,0.75,0.75,914,536,https://www.flickr.com/photos/80901381@N04/27131835606,https://creativecommons.org/licenses/by/2.0/,A Guy Taking Pictures,https://www.flickr.com/people/80901381@N04/ dcd002b4437c9c41,https://c1.staticflickr.com/6/5474/30922908345_b205f0c3fd_o.jpg,0.25,0.5,1.0,1.0,341,491,https://www.flickr.com/photos/happymillerman/30922908345,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ 86f7a83daf4d76a2,https://c1.staticflickr.com/9/8251/29554135635_35275fe21b_o.jpg,0.0,0.25,0.510044642857,1.0,561,285,https://www.flickr.com/photos/jill_carlson/29554135635,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 15c16cd33dfde1e1,https://c1.staticflickr.com/9/8819/29346895372_4f8855895f_o.jpg,0.0,0.264758497317,0.75,1.0,511,470,http://www.flickr.com/photos/39410905@N06/29346895372,https://creativecommons.org/licenses/by/2.0/,LetNoun,https://www.flickr.com/people/lasuperlili/ 9953ce985663bdaf,https://c1.staticflickr.com/9/8223/29337902040_0005a3a69c_o.jpg,0.0,0.0,0.5625,0.75,826,820,https://www.flickr.com/photos/eamoncurry/29337902040/,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/ 765773377a788933,https://c1.staticflickr.com/6/5762/30010694073_19645072fe_o.jpg,0.381557377049,0.0,1.0,0.75,310,49,https://flickr.com/59324099@N02/30010694073,https://creativecommons.org/licenses/by/2.0/,joe m devereux,https://www.flickr.com/people/joe_devereux/ 9de01e91313544a4,https://c1.staticflickr.com/9/8078/29676826672_a122a792b1_o.jpg,0.25,0.0,0.75,0.75,570,711,https://www.flickr.com/photos/shankaronline/29676826672,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 0dfc61f215f7eeec,https://c1.staticflickr.com/9/8584/28742993973_7119246944_o.jpg,0.0,0.0,0.666666666667,1.0,480,626,https://www.flickr.com/photos/concavowheels/28742993973,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/ 2687739254a5129d,https://c1.staticflickr.com/8/7167/26579413503_e17338db9d_o.jpg,0.0,0.0,0.767405063291,1.0,820,759,https://www.flickr.com/photos/julioenriquez/26579413503,https://creativecommons.org/licenses/by/2.0/,Julio Enriquez,https://www.flickr.com/people/julioenriquez/ 3aec0246db973517,https://c1.staticflickr.com/6/5340/30294553360_7614ed3a96_o.jpg,0.210588633288,0.25,0.631765899865,1.0,977,577,https://flickr.com/38986305@N06/30294553360,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/ 6c878ddd0f6f0958,https://c1.staticflickr.com/6/5331/30493495430_48f246cd4e_o.jpg,0.25,0.0,1.0,0.75,979,850,https://www.flickr.com/photos/valerialaura/30493495430/,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/ 401b50207045097d,https://c1.staticflickr.com/8/7502/26591831144_741826ddb9_o.jpg,0.0,0.25,0.5625,1.0,964,842,https://www.flickr.com/photos/isfullofcrap/26591831144/,https://creativecommons.org/licenses/by/2.0/,R. Crap Mariner,https://www.flickr.com/people/isfullofcrap/ 8dd602811685ff81,https://c1.staticflickr.com/9/8386/29292009991_ae11c9561c_o.jpg,0.286971830986,0.0,1.0,0.75,324,964,https://www.flickr.com/photos/usfws_pacificsw/29292009991,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ 00e0c970bacdb5a6,https://c1.staticflickr.com/9/8379/29650047461_935c6027b3_o.jpg,0.0,0.0,0.75,0.75,672,513,https://www.flickr.com/photos/glorycycles/29650047461,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 0a8efb41714a2de5,https://c1.staticflickr.com/6/5787/30401929714_61ca8d97e9_o.jpg,0.0,0.0,0.411096256684,0.75,979,319,https://www.flickr.com/photos/walterpro/30401929714,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ e14b7963298b695b,https://c1.staticflickr.com/9/8554/29738031844_b0ab0c77a0_o.jpg,0.4375,0.25,1.0,1.0,270,422,https://www.flickr.com/photos/torsten-behrens/29738031844,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ 02627b4c9daac07a,https://c1.staticflickr.com/6/5786/30421357366_c9c2b3546d_o.jpg,0.238832853026,0.25,0.716498559078,1.0,821,791,https://www.flickr.com/photos/robalter/30421357366/,https://creativecommons.org/licenses/by/2.0/,Rob Alter,https://www.flickr.com/people/robalter/ f56006c1bcc52633,https://c1.staticflickr.com/8/7577/27091204584_1603d409f0_o.jpg,0.0,0.0,1.0,0.666666666667,702,773,https://www.flickr.com/photos/7armyjmtc/27091204584/,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 8b21342e13cfee01,https://c1.staticflickr.com/1/740/32388874626_01894de438_o.jpg,0.0,0.0,0.666666666667,1.0,897,771,https://www.flickr.com/photos/franganillo/32388874626,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo,https://www.flickr.com/people/franganillo/ 2c01bbf8f18cb741,https://c1.staticflickr.com/8/7425/27801100261_2dfa7f0042_o.jpg,0.25,0.0,1.0,1.0,476,498,https://www.flickr.com/photos/eekim/27801100261/,https://creativecommons.org/licenses/by/2.0/,Eugene Kim,https://www.flickr.com/people/eekim/ 6b2f7747b363c30a,https://c1.staticflickr.com/9/8003/29316372461_4b4e01e58f_o.jpg,0.498153618907,0.25,1.0,1.0,998,322,https://www.flickr.com/photos/frankdouwes/29316372461/,https://creativecommons.org/licenses/by/2.0/,Frank Douwes,https://www.flickr.com/people/frankdouwes/ 715e4536de9f5369,https://c1.staticflickr.com/6/5593/30047484064_774e7a2c7c_o.jpg,0.4375,0.0,1.0,0.75,874,574,https://flickr.com/43547009@N00/30047484064,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/ 605a84176c6c8a0c,https://c1.staticflickr.com/9/8184/29320183365_52da3e9f93_o.jpg,0.0,0.0,0.666666666667,1.0,735,619,https://www.flickr.com/photos/kecko/29320183365,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ f6ebb8d09dbdcaa5,https://c1.staticflickr.com/8/7109/26279538634_49a705183f_o.jpg,0.337738619677,0.0,1.0,1.0,980,243,https://www.flickr.com/photos/eguidetravel/26279538634/,https://creativecommons.org/licenses/by/2.0/,eGuide Travel,https://www.flickr.com/people/eguidetravel/ 6939eaa8c39f0522,https://c1.staticflickr.com/6/5820/30486735176_fd6438c9be_o.jpg,0.0,0.25,0.75,1.0,108,747,https://flickr.com/13939889@N07/30486735176,https://creativecommons.org/licenses/by/2.0/,Bodie Strain,https://www.flickr.com/people/pumpkinmook/ 123341246bb60f7f,https://c1.staticflickr.com/6/5600/30985472490_267649bea4_o.jpg,0.249079528719,0.25,0.747238586156,1.0,980,472,https://flickr.com/91171949@N06/30985472490,https://creativecommons.org/licenses/by/2.0/,Kyle Hartshorn,https://www.flickr.com/people/kylehartshorn/ cbf7967ec4655bff,https://c1.staticflickr.com/9/8642/28183893325_69a4b7e3c0_o.jpg,0.0,0.0,0.75,1.0,346,522,https://www.flickr.com/photos/pollybear/28183893325/,https://creativecommons.org/licenses/by/2.0/,Paula J Andrews,https://www.flickr.com/people/pollybear/ 885505ab0dd7ebe1,https://c1.staticflickr.com/1/381/31552945352_e2131d5e3b_o.jpg,0.0,0.0,0.526475037821,0.75,991,712,https://flickr.com/141324643@N05/31552945352,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ 3b66afbab247b85a,https://c1.staticflickr.com/6/5581/30789369671_c41ca1b33d_o.jpg,0.25,0.0,1.0,0.75,934,436,https://www.flickr.com/photos/lablasco/30789369671,https://creativecommons.org/licenses/by/2.0/,Lablascovegmenu,https://www.flickr.com/people/lablasco/ 00d3094857416925,https://c1.staticflickr.com/8/7194/26261734164_eed31f0632_o.jpg,0.28125,0.0,0.84375,0.75,821,691,https://www.flickr.com/photos/shankaronline/26261734164,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ d273531739675b8a,https://c1.staticflickr.com/6/5790/25327963819_b3bee7e712_o.jpg,0.0,0.0,0.75,1.0,577,971,https://www.flickr.com/photos/127226743@N02/25327963819,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ bdb527a37a5a1fe9,https://c1.staticflickr.com/6/5475/30284059325_548287ab94_o.jpg,0.0,0.318903318903,1.0,0.95670995671,93,391,https://www.flickr.com/photos/kkoshy/30284059325,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/ 622bc4c3996a2699,https://c1.staticflickr.com/8/7073/27050479131_eb8dff661d_o.jpg,0.187296416938,0.0,1.0,1.0,566,703,https://www.flickr.com/photos/jsjgeology/27050479131,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e50f8c658d6132e7,https://c1.staticflickr.com/8/7087/26993333580_bbe962f87e_o.jpg,0.0,0.0,0.868686868687,1.0,22,940,https://www.flickr.com/photos/lakeworth/26993333580,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/ f2de6d42f72a1600,https://c1.staticflickr.com/6/5484/30178740233_23de43eed5_o.jpg,0.0,0.0,0.5625,0.75,769,618,https://www.flickr.com/photos/stmunchins/30178740233/,https://creativecommons.org/licenses/by/2.0/,St Munchin's College,https://www.flickr.com/people/stmunchins/ 29a1066827fcfaca,https://c1.staticflickr.com/8/7035/26986322956_7b5f1678ab_o.jpg,0.333333333333,0.0,1.0,1.0,450,360,https://www.flickr.com/photos/gammaman/26986322956,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/ d69035d8ddf0c6c4,https://c1.staticflickr.com/1/736/31550457204_d8f481759a_o.jpg,0.524100719424,0.25,1.0,1.0,972,451,https://www.flickr.com/photos/jlcernadas/31550457204,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ 629dbc90ddc898c7,https://c1.staticflickr.com/6/5510/30483562636_229be5d554_o.jpg,0.333333333333,0.0,1.0,1.0,494,903,https://www.flickr.com/photos/quinet/30483562636,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ d8770dd36b042d91,https://c1.staticflickr.com/6/5591/31650977595_53dc0a2cbe_o.jpg,0.285496183206,0.0,1.0,1.0,461,739,https://www.flickr.com/photos/ruthanddave/31650977595,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 05f38bd1f0b31576,https://c1.staticflickr.com/6/5191/29462715614_a2ea879645_o.jpg,0.5,0.0,1.0,0.75,920,739,https://www.flickr.com/photos/phalinn/29462715614,https://creativecommons.org/licenses/by/2.0/,Phalinn Ooi,https://www.flickr.com/people/phalinn/ bdbb2bec25a83a24,https://c1.staticflickr.com/8/7301/28138669285_b4b3d4592a_o.jpg,0.4375,0.0,1.0,0.75,921,407,https://www.flickr.com/photos/nostri-imago/28138669285,https://creativecommons.org/licenses/by/2.0/,Cliff,https://www.flickr.com/people/nostri-imago/ 625fb77a09573694,https://c1.staticflickr.com/1/357/32049332851_3db63ae9d5_o.jpg,0.0,0.0,0.5,0.75,113,713,https://www.flickr.com/photos/30478819@N08/32049332851,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 830df6c646b6bd0f,https://c1.staticflickr.com/8/7569/26723298433_c9c7cc45f0_o.jpg,0.333333333333,0.0,1.0,1.0,519,61,https://www.flickr.com/photos/box_repsol/26723298433,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 44fe36c085b818f3,https://c1.staticflickr.com/6/5641/30470585256_5f73640eeb_o.jpg,0.333333333333,0.0,1.0,1.0,976,82,https://flickr.com/22539273@N00/30470585256,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 8a416ae789510724,https://c1.staticflickr.com/6/5344/30267876071_d23abec4c5_o.jpg,0.0,0.333333333333,1.0,1.0,662,832,https://www.flickr.com/photos/136315829@N03/30267876071,https://creativecommons.org/licenses/by/2.0/,Steven Penton,https://www.flickr.com/people/136315829@N03/ 6050642b5cfe714b,https://c1.staticflickr.com/1/574/32106171394_bdc35c3fbc_o.jpg,0.322931785196,0.0,0.968795355588,1.0,437,795,https://flickr.com/51811543@N08/32106171394,https://creativecommons.org/licenses/by/2.0/,FotoSleuth,https://www.flickr.com/people/51811543@N08/ d3937b9667d93809,https://c1.staticflickr.com/1/413/30787682764_b52b058206_o.jpg,0.5,0.25,1.0,1.0,974,814,https://flickr.com/39136124@N00/30787682764,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble,https://www.flickr.com/people/pauljill/ f76279266a6916d7,https://c1.staticflickr.com/8/7398/28053745062_2022a29ef6_o.jpg,0.331130690162,0.0,0.993392070485,1.0,391,873,https://www.flickr.com/photos/usfwsmidwest/28053745062,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 11c3e8529b2def7b,https://c1.staticflickr.com/1/322/31464098074_3c4e917dd4_o.jpg,0.0,0.25,0.5,1.0,760,738,https://www.flickr.com/photos/andrikoolme/31464098074/,https://creativecommons.org/licenses/by/2.0/,Andri Koolme,https://www.flickr.com/people/andrikoolme/ 6ef643e8694cd3ca,https://c1.staticflickr.com/9/8732/28090605564_53e043c41c_o.jpg,0.421177266576,0.0,0.842354533153,0.75,909,821,https://www.flickr.com/photos/mickaeltr/28090605564/,https://creativecommons.org/licenses/by/2.0/,Micka\303\253l T.,https://www.flickr.com/people/mickaeltr/ 3c6d10d940fe8dae,https://c1.staticflickr.com/1/498/31621281492_86e87aeb01_o.jpg,0.0,0.0,0.5,0.75,735,682,https://www.flickr.com/photos/andreastrojak/31621281492/,https://creativecommons.org/licenses/by/2.0/,Andreas Trojak,https://www.flickr.com/people/andreastrojak/ 45620678a9586d99,https://c1.staticflickr.com/1/282/31791435121_0150b5a858_o.jpg,0.28125,0.25,0.84375,1.0,670,145,https://www.flickr.com/photos/zeevveez/31791435121,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ 9c58d57a28c355aa,https://c1.staticflickr.com/6/5825/31259630645_87bd1af7d8_o.jpg,0.431603773585,0.0,1.0,0.75,881,699,https://www.flickr.com/photos/29233640@N07/31259630645,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ f120df4b3b09b289,https://c1.staticflickr.com/6/5480/30057646853_6fe3c055a2_o.jpg,0.491071428571,0.0,1.0,0.75,780,883,https://www.flickr.com/photos/thoseguys119/30057646853,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f941b668a6c3d49a,https://c1.staticflickr.com/1/469/31467759930_533c55f54d_o.jpg,0.0,0.0,0.87037037037,1.0,981,503,https://www.flickr.com/photos/shakespearesmonkey/31467759930/,https://creativecommons.org/licenses/by/2.0/,Shakespearesmonkey,https://www.flickr.com/people/shakespearesmonkey/ f7d47df278bcf02c,https://c1.staticflickr.com/9/8776/28835389986_9502897177_o.jpg,0.331617647059,0.0,0.994852941176,1.0,699,909,https://www.flickr.com/photos/13476480@N07/28835389986,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 5bb9b1b99c966d31,https://c1.staticflickr.com/8/7539/26290478514_1121af27f2_o.jpg,0.267938931298,0.25,0.803816793893,1.0,499,178,https://www.flickr.com/photos/jus10h/26290478514,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 66f0351d17fa2cd1,https://c1.staticflickr.com/6/5601/31340350990_67947d33b8_o.jpg,0.25,0.25,0.75,1.0,820,529,https://www.flickr.com/photos/stevendepolo/31340350990,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 9b1049873f0ab9f3,https://c1.staticflickr.com/8/7458/27587559942_b200c05823_o.jpg,0.28125,0.0,0.84375,0.75,611,818,https://www.flickr.com/photos/nazareth_college/27587559942,https://creativecommons.org/licenses/by/2.0/,Nazareth College,https://www.flickr.com/people/nazareth_college/ 86a083993a32fc75,https://c1.staticflickr.com/8/7397/27016363550_4ff8625113_o.jpg,0.0,0.0,0.75,1.0,539,631,https://www.flickr.com/photos/127226743@N02/27016363550/,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ f7d7f686b5d95aae,https://c1.staticflickr.com/8/7151/27113004365_42cb0fb79a_o.jpg,0.271172638436,0.25,0.542345276873,1.0,923,716,https://www.flickr.com/photos/stellahyc/27113004365,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/ 977016c8bea39636,https://c1.staticflickr.com/8/7265/26617705603_92f67e7199_o.jpg,0.421177266576,0.25,0.842354533153,1.0,845,591,https://www.flickr.com/photos/dentonpotter/26617705603,https://creativecommons.org/licenses/by/2.0/,Karen Cropper,https://www.flickr.com/people/dentonpotter/ eef937c8aa20ed76,https://c1.staticflickr.com/6/5633/30051440121_594aa67a5a_o.jpg,0.28125,0.25,0.84375,1.0,518,728,https://www.flickr.com/photos/massdep/30051440121/,https://creativecommons.org/licenses/by/2.0/,Massachusetts Dept. of Environmental Protection,https://www.flickr.com/people/massdep/ 0ba038ded83e661d,https://c1.staticflickr.com/6/5599/29693511873_a4618b5932_o.jpg,0.0,0.25,0.561328125,1.0,324,722,https://www.flickr.com/photos/mypubliclands/29693511873,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ cedae8d11071cac5,https://c1.staticflickr.com/8/7041/27244390333_634e03954d_o.jpg,0.0,0.0,0.666666666667,1.0,661,795,https://www.flickr.com/photos/eddiesfisheriesfws/27244390333,https://creativecommons.org/licenses/by/2.0/,USFWS Fish and Aquatic Conservation,https://www.flickr.com/people/eddiesfisheriesfws/ 68bc9458ed38ec6a,https://c1.staticflickr.com/6/5717/29767428694_4625be4356_o.jpg,0.0,0.0,0.75,1.0,802,314,https://www.flickr.com/photos/lgoub/29767428694,https://creativecommons.org/licenses/by/2.0/,Laila Goubran,https://www.flickr.com/people/lgoub/ 61ff1f478123c668,https://c1.staticflickr.com/8/7734/26527531874_c954c544ce_o.jpg,0.25,0.0,1.0,0.75,310,903,https://www.flickr.com/photos/orangeaurochs/26527531874/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/ 8454f7a45f0dd053,https://c1.staticflickr.com/9/8330/29733284941_94fa9c56ae_o.jpg,0.0,0.0,0.666666666667,1.0,704,65,https://www.flickr.com/photos/126337928@N05/29733284941,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ 8bbe22161f2e85b1,https://c1.staticflickr.com/8/7262/27628783521_5c4c8ddedf_o.jpg,0.5,0.25,1.0,1.0,702,767,https://www.flickr.com/photos/7armyjmtc/27628783521,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ fd3fd6e398f271b3,https://c1.staticflickr.com/8/7647/28107537083_1d9c4fb81f_o.jpg,0.493694362018,0.25,1.0,1.0,848,676,https://www.flickr.com/photos/13476480@N07/28107537083,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ e95f62ce9a2ee998,https://c1.staticflickr.com/8/7245/27014923936_e079e743d8_o.jpg,0.25,0.4375,1.0,1.0,864,371,https://www.flickr.com/photos/beaugiles/27014923936,https://creativecommons.org/licenses/by/2.0/,Beau Giles,https://www.flickr.com/people/beaugiles/ 92ed204124303bb2,https://c1.staticflickr.com/8/7401/26749845333_71e2df1668_o.jpg,0.260752688172,0.0,1.0,0.75,558,613,https://www.flickr.com/photos/jkirkhart35/26749845333,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/ 8d5b3dbded7a0595,https://c1.staticflickr.com/8/7439/27391182212_4cdda4f378_o.jpg,0.0,0.0,0.75,0.75,822,551,https://www.flickr.com/photos/vernieman/27391182212,https://creativecommons.org/licenses/by/2.0/,Vernon Chan,https://www.flickr.com/people/vernieman/ f216be07cebc16a3,https://c1.staticflickr.com/9/8171/29307622755_055cc1635b_o.jpg,0.248713235294,0.25,0.746139705882,1.0,555,818,https://www.flickr.com/photos/shankaronline/29307622755/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 2fc661ad755dc857,https://c1.staticflickr.com/8/7726/27090264692_0f375ec88d_o.jpg,0.410547396529,0.0,0.821094793057,0.75,780,504,https://www.flickr.com/photos/thoseguys119/27090264692,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 86bcad5ba380259f,https://c1.staticflickr.com/9/8179/28968182021_8525c9b65f_o.jpg,0.0,0.279141104294,1.0,1.0,437,460,https://www.flickr.com/photos/91591049@N00/28968182021,https://creativecommons.org/licenses/by/2.0/,SenseiAlan,https://www.flickr.com/people/91591049@N00/ dd1b0ef0a3c584a2,https://c1.staticflickr.com/8/7403/27499439816_bd20b40482_o.jpg,0.578822733424,0.0,1.0,0.75,979,903,https://www.flickr.com/photos/98675081@N00/27499439816,https://creativecommons.org/licenses/by/2.0/,Anna Oakley,https://www.flickr.com/people/98675081@N00/ c3f0f41bdfd36a82,https://c1.staticflickr.com/6/5549/30255848674_c49ecd778d_o.jpg,0.253152818991,0.25,0.759458456973,1.0,982,778,https://www.flickr.com/photos/mwlguide/30255848674,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/ 9791d11db5513795,https://c1.staticflickr.com/9/8696/29037019686_98def79ecd_o.jpg,0.0,0.0,0.805510534846,1.0,310,80,https://www.flickr.com/photos/gails_pictures/29037019686,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ f405dea69c780578,https://c1.staticflickr.com/8/7353/27129124166_81bc6ef230_o.jpg,0.28125,0.0,0.84375,0.75,979,767,https://www.flickr.com/photos/juliejordanscott/27129124166,https://creativecommons.org/licenses/by/2.0/,Julie Jordan Scott,https://www.flickr.com/people/juliejordanscott/ 42940e3f96359320,https://c1.staticflickr.com/6/5778/31314101442_d0bb3af055_o.jpg,0.0,0.0,0.75,0.75,592,582,https://www.flickr.com/photos/filterforge/31314101442,https://creativecommons.org/licenses/by/2.0/,Filter Forge,https://www.flickr.com/people/filterforge/ 81942894b7b3c115,https://c1.staticflickr.com/6/5780/30845236836_e025d239b5_o.jpg,0.0,0.0,0.857859531773,1.0,79,590,http://www.flickr.com/photos/43272765@N04/30845236836,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 062bf47af7f52604,https://c1.staticflickr.com/8/7424/26979411690_acb3ca9d17_o.jpg,0.0,0.0,0.419028340081,0.75,629,395,https://www.flickr.com/photos/jdlasica/26979411690,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ cf428c506eff7104,https://c1.staticflickr.com/6/5459/30289373942_87d4bb172f_o.jpg,0.28125,0.25,0.84375,1.0,973,720,https://flickr.com/34010087@N07/30289373942,https://creativecommons.org/licenses/by/2.0/,Christian Piatt,https://www.flickr.com/people/christianpiatt/ a30f360abc69dc12,https://c1.staticflickr.com/9/8440/29651032582_40602c17f3_o.jpg,0.0,0.0,0.692708333333,0.75,310,563,https://www.flickr.com/photos/gails_pictures/29651032582/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 33be82306df4c00c,https://c1.staticflickr.com/8/7507/28722621054_2152cb08a9_o.jpg,0.5,0.25,1.0,1.0,359,5,https://flickr.com/79183573@N08/28722621054,https://creativecommons.org/licenses/by/2.0/,Phil Fiddes,https://www.flickr.com/people/philjose1878/ 749373e842edd27b,https://c1.staticflickr.com/9/8362/30005817905_17ce4004d0_o.jpg,0.0,0.0,0.521837349398,0.75,404,356,https://www.flickr.com/photos/usnavy/30005817905,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 2ce6b7bdfdf5f96c,https://c1.staticflickr.com/9/8266/28889699014_4b6721712d_o.jpg,0.0,0.25,0.496696035242,1.0,437,652,https://www.flickr.com/photos/autohistorian/28889699014/,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 8b1855cf34eae35a,https://c1.staticflickr.com/1/782/32163037380_04dfc73b7b_o.jpg,0.0,0.25,0.5,1.0,561,819,https://www.flickr.com/photos/sfupamr/32163037380,https://creativecommons.org/licenses/by/2.0/,Simon Fraser University - University Communications,https://www.flickr.com/people/sfupamr/ 5cfff41bf415805f,https://c1.staticflickr.com/8/7605/26696558710_2180523bb6_o.jpg,0.25,0.25,0.75,1.0,662,729,https://www.flickr.com/photos/prayitnophotography/26696558710,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 3d0258aa3a8b32b1,https://c1.staticflickr.com/1/341/31807620256_0d15a8508c_o.jpg,0.0,0.0,0.5,0.75,704,377,https://www.flickr.com/photos/o_0/31807620256,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 4922e1444dc1385a,https://c1.staticflickr.com/8/7597/28685563825_b3303a19ee_o.jpg,0.0,0.0,0.666666666667,1.0,512,529,https://www.flickr.com/photos/greggjerdingen/28685563825,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 017bb07a4814ab6a,https://c1.staticflickr.com/9/8569/28113937623_12f3f6d2b1_o.jpg,0.539603960396,0.0,1.0,0.75,405,852,https://flickr.com/60911558@N04/28113937623,https://creativecommons.org/licenses/by/2.0/,Ian Gratton,https://www.flickr.com/people/ian_a_gratton/ f5ba5a70e11f20e9,https://c1.staticflickr.com/8/7495/28802345175_0155e4a49c_o.jpg,0.234308131241,0.0,0.702924393723,0.75,719,446,https://flickr.com/27656017@N02/28802345175,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ 2ba9c4307341325e,https://c1.staticflickr.com/6/5733/30284227376_4a3ce35991_o.jpg,0.0,0.0,0.5,0.75,539,851,https://www.flickr.com/photos/cafoscari/30284227376,https://creativecommons.org/licenses/by/2.0/,Universit\303\240 Ca' Foscari Venezia,https://www.flickr.com/people/cafoscari/ 2017ad9d93729323,https://c1.staticflickr.com/9/8630/28534030921_ee6f456746_o.jpg,0.0,0.25,0.561258278146,1.0,304,113,http://www.flickr.com/photos/9243304@N04/28534030921,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/ e0291acff90415c4,https://c1.staticflickr.com/9/8062/29469303750_b95f5bbc63_o.jpg,0.28125,0.25,0.84375,1.0,981,435,https://www.flickr.com/photos/moonlightbulb/29469303750,https://creativecommons.org/licenses/by/2.0/,Selena N. B. H.,https://www.flickr.com/people/moonlightbulb/ 7540cf61176c2e5d,https://c1.staticflickr.com/6/5548/30456492284_498ddd6882_o.jpg,0.5,0.25,1.0,1.0,407,713,https://www.flickr.com/photos/johnragai/30456492284/,https://creativecommons.org/licenses/by/2.0/,John Ragai,https://www.flickr.com/people/johnragai/ 9097ae5ddf38dfa7,https://c1.staticflickr.com/8/7162/26716026093_99be06ab4b_o.jpg,0.25,0.25,0.75,1.0,699,1000,https://www.flickr.com/photos/ian_d/26716026093,https://creativecommons.org/licenses/by/2.0/,Ian Dick,https://www.flickr.com/people/ian_d/ 2def3fa0f5a6ba73,https://c1.staticflickr.com/8/7097/27602560786_3c531a663a_o.jpg,0.25,0.0,0.75,0.75,861,411,https://flickr.com/53301297@N00/27602560786,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 0add4c212ed9dc80,https://c1.staticflickr.com/1/472/32543997391_6bf46cd743_o.jpg,0.0,0.0,0.611745513866,0.75,335,810,https://www.flickr.com/photos/usfwsmidwest/32543997391,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ d7e05de399d70c88,https://c1.staticflickr.com/9/8736/28233395290_1e619439b5_o.jpg,0.25,0.38379705401,1.0,1.0,442,552,https://www.flickr.com/photos/flikr/28233395290,https://creativecommons.org/licenses/by/2.0/,flikr,https://www.flickr.com/people/flikr/ d749af72ed0f0a11,https://c1.staticflickr.com/6/5449/29843745134_4d6fedba4d_o.jpg,0.0,0.0,1.0,0.75,443,638,https://www.flickr.com/photos/127226743@N02/29843745134,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 7236c8b9ab4975cb,https://c1.staticflickr.com/1/440/32462176115_e3b5908e10_o.jpg,0.405292479109,0.0,1.0,1.0,93,379,https://flickr.com/93242958@N00/32462176115,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 5c3c45a992401cba,https://c1.staticflickr.com/6/5554/30948339575_67375d482a_o.jpg,0.28125,0.0,0.84375,0.75,566,759,https://www.flickr.com/photos/railwayofaustralia/30948339575/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/ cfe7166100bff495,https://c1.staticflickr.com/9/8259/29868078442_eeacd410d5_o.jpg,0.0,0.0,0.663235294118,1.0,519,861,https://www.flickr.com/photos/box_repsol/29868078442,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 95f30065cebf3486,https://c1.staticflickr.com/6/5827/30798447586_4493a2624e_o.jpg,0.0,0.0,0.75,1.0,651,496,https://flickr.com/43851301@N02/30798447586,https://creativecommons.org/licenses/by/2.0/,tony_duell,https://www.flickr.com/people/tony_duell/ a2053e5e1279a9de,https://c1.staticflickr.com/6/5731/30684597062_9e5dfb124b_o.jpg,0.0,0.0,0.5,0.75,484,405,https://www.flickr.com/photos/renaud-camus/30684597062,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/ 95d22c402431c2db,https://c1.staticflickr.com/8/7282/27473132640_513ef8fb8d_o.jpg,0.5,0.25,1.0,1.0,558,958,https://www.flickr.com/photos/10459174@N03/27473132640/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/ 0697055bfec70334,https://c1.staticflickr.com/9/8036/29112922486_f75ae0ac88_o.jpg,0.0,0.0,0.5,0.75,561,721,https://www.flickr.com/photos/trainor/29112922486,https://creativecommons.org/licenses/by/2.0/,John Trainor,https://www.flickr.com/people/trainor/ 7921383e82316dc9,https://c1.staticflickr.com/6/5697/29657965284_24eb18bb64_o.jpg,0.330396475771,0.0,0.991189427313,1.0,548,472,https://www.flickr.com/photos/seraveenl/29657965284/,https://creativecommons.org/licenses/by/2.0/,Stefan Geertsen,https://www.flickr.com/people/seraveenl/ 704325129815cf96,https://c1.staticflickr.com/8/7395/27360421241_41cd000bc2_o.jpg,0.0,0.0,0.5625,0.75,719,786,https://www.flickr.com/photos/conner395/27360421241,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/ 37d0b8d3e70bb6bc,https://c1.staticflickr.com/9/8662/30384498016_706ef1ccfa_o.jpg,0.0,0.25,0.5,1.0,561,610,https://www.flickr.com/photos/116153846@N06/30384498016/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ e4d57580ed1bd5a2,https://c1.staticflickr.com/8/7411/27827702971_be7991bfb5_o.jpg,0.0,0.25,0.5,1.0,971,767,https://www.flickr.com/photos/paxson_woelber/27827702971,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/ 2f17f0487e864757,https://c1.staticflickr.com/6/5677/31045303180_c7f06a69f0_o.jpg,0.0,0.259009009009,0.75,0.777027027027,526,802,https://www.flickr.com/photos/88589253@N05/31045303180/,https://creativecommons.org/licenses/by/2.0/,lmbythesea,https://www.flickr.com/people/88589253@N05/ 5034d259fe9dd9e7,https://c1.staticflickr.com/4/3844/32892909231_d0cd48d7cc_o.jpg,0.0,0.248348017621,0.75,0.745044052863,536,709,https://www.flickr.com/photos/glorycycles/32892909231,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 27b9e505c9a5b3ba,https://c1.staticflickr.com/6/5332/31167303901_73e69516c0_o.jpg,0.333333333333,0.0,1.0,1.0,769,64,https://www.flickr.com/photos/istolethetv/31167303901,https://creativecommons.org/licenses/by/2.0/,istolethetv,https://www.flickr.com/people/istolethetv/ 8d68d99f89311645,https://c1.staticflickr.com/6/5761/31059182386_63bcc78c7b_o.jpg,0.332842415317,0.0,0.99852724595,1.0,971,738,https://www.flickr.com/photos/us_embassy_newzealand/31059182386/,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/ 63ee7db07226dd8d,https://c1.staticflickr.com/6/5829/30795744461_3252719e8d_o.jpg,0.0,0.0,0.75,0.674229452055,131,96,https://www.flickr.com/photos/pokerbrit/30795744461,https://creativecommons.org/licenses/by/2.0/,Steve Wilson - over 8 million views Thanks !!,https://www.flickr.com/people/pokerbrit/ 0b1198e99bc896dd,https://c1.staticflickr.com/6/5708/31449154875_e7c635c58f_o.jpg,0.25,0.0,1.0,0.535877862595,747,210,https://www.flickr.com/photos/cinqmars/31449154875/,https://creativecommons.org/licenses/by/2.0/,Pierre Cinq-Mars,https://www.flickr.com/people/cinqmars/ 1bdc93510c8175da,https://c1.staticflickr.com/8/7618/26896634526_e324402c8c_o.jpg,0.28125,0.0,0.84375,0.75,896,730,https://www.flickr.com/photos/51811543@N08/26896634526,https://creativecommons.org/licenses/by/2.0/,FotoSleuth,https://www.flickr.com/people/51811543@N08/ 71b36f834c4fe9ad,https://c1.staticflickr.com/9/8462/29435818381_9592a44734_o.jpg,0.0,0.0,0.5,0.75,411,21,https://www.flickr.com/photos/soso__1991/29435818381/,https://creativecommons.org/licenses/by/2.0/,SALoOM,https://www.flickr.com/people/soso__1991/ 4f26d0dd34a2128a,https://c1.staticflickr.com/1/589/31597452790_463cdcaae4_o.jpg,0.0,0.25,1.0,1.0,441,347,https://flickr.com/38488245@N00/31597452790,https://creativecommons.org/licenses/by/2.0/,Sam Cavenagh,https://www.flickr.com/people/cavenagh/ 5c9c84b07e6a0ba2,https://c1.staticflickr.com/9/8768/27790828624_71420c0e31_o.jpg,0.202689243028,0.25,0.608067729084,1.0,405,712,https://www.flickr.com/photos/hisgett/27790828624,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 96c07d57f5ab319a,https://c1.staticflickr.com/9/8431/28306541391_9350b8c291_o.jpg,0.25,0.25,1.0,1.0,302,469,https://www.flickr.com/photos/kqraaa/28306541391/,https://creativecommons.org/licenses/by/2.0/,Chris S,https://www.flickr.com/people/kqraaa/ d49d90866f3a46ed,https://c1.staticflickr.com/8/7423/27253810781_6d526373b4_o.jpg,0.210588633288,0.25,0.631765899865,1.0,707,805,https://www.flickr.com/photos/31176607@N05/27253810781/,https://creativecommons.org/licenses/by/2.0/,kuhnmi,https://www.flickr.com/people/31176607@N05/ 1fb90a36bb80d22d,https://c1.staticflickr.com/9/8458/29612595426_b6960aa3e7_o.jpg,0.0,0.0,0.75,1.0,113,805,https://www.flickr.com/photos/jsjgeology/29612595426,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 609b6273efd6adec,https://c1.staticflickr.com/1/521/31566671824_f43e430e03_o.jpg,0.25,0.0,1.0,1.0,719,800,https://www.flickr.com/photos/infrogmation/31566671824,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/ 2cba9e43beb4fd97,https://c1.staticflickr.com/8/7305/27735849832_aa4ba16532_o.jpg,0.25,0.0,1.0,0.75,932,37,https://www.flickr.com/photos/sfslim/27735849832,https://creativecommons.org/licenses/by/2.0/,Aaron Muszalski,https://www.flickr.com/people/sfslim/ 25aea50decd062f8,https://c1.staticflickr.com/8/7244/27165835960_a3756ec597_o.jpg,0.0,0.0,0.75,0.75,909,541,https://www.flickr.com/photos/tonycecala/27165835960,https://creativecommons.org/licenses/by/2.0/,Tony Cecala,https://www.flickr.com/people/tonycecala/ 71408d60417f0883,https://c1.staticflickr.com/9/8222/28979929986_cd3608d864_o.jpg,0.0,0.25,0.5,1.0,662,596,https://www.flickr.com/photos/greggjerdingen/28979929986,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ b98b0e34e3d9e381,https://c1.staticflickr.com/6/5657/31200495721_24cc544859_o.jpg,0.0,0.0,0.5,0.75,854,555,https://www.flickr.com/photos/jamesbradley/31200495721/,https://creativecommons.org/licenses/by/2.0/,Fr James Bradley,https://www.flickr.com/people/jamesbradley/ d01f359a941dd6bf,https://c1.staticflickr.com/9/8777/28916375241_34f3ff7deb_o.jpg,0.0,0.25,0.5,1.0,986,10,https://www.flickr.com/photos/cogdog/28916375241,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ d88d5813b2f1a82b,https://c1.staticflickr.com/6/5529/30157707413_7c86546963_o.jpg,0.25,0.5,1.0,1.0,993,17,https://flickr.com/59462388@N00/30157707413,https://creativecommons.org/licenses/by/2.0/,chiron3636,https://www.flickr.com/people/59462388@N00/ 01c0e6fbf97538ea,https://c1.staticflickr.com/1/351/31791191375_60171a90a9_o.jpg,0.201612903226,0.0,1.0,1.0,755,222,https://www.flickr.com/photos/51764518@N02/31791191375,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 31123c5bc8af86a9,https://c1.staticflickr.com/1/636/31652473345_b6935aaf69_o.jpg,0.0,0.0,1.0,0.662261380323,762,145,https://www.flickr.com/photos/zionfiction/31652473345,https://creativecommons.org/licenses/by/2.0/,r. nial bradshaw,https://www.flickr.com/people/zionfiction/ e32c057735faf1a7,https://c1.staticflickr.com/9/8539/29946036322_aaf1918bcd_o.jpg,0.0,0.0,1.0,0.96975088968,323,524,https://flickr.com/33398884@N03/29946036322,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 0e96ff091098f82a,https://c1.staticflickr.com/9/8410/30349540721_472050c417_o.jpg,0.0,0.25,0.75,1.0,920,894,https://www.flickr.com/photos/courtbean/30349540721/,https://creativecommons.org/licenses/by/2.0/,Courtney Boyd Myers,https://www.flickr.com/people/courtbean/ 53e8b5032fcbb2de,https://c1.staticflickr.com/9/8849/28600169140_180fe9f189_o.jpg,0.28125,0.25,0.84375,1.0,964,7,https://www.flickr.com/photos/cogdog/28600169140,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ f1d599dca5acb19e,https://c1.staticflickr.com/6/5478/31011617565_7fe68f7d9e_o.jpg,0.28125,0.25,0.84375,1.0,629,686,https://www.flickr.com/photos/sharonhahndarlin/31011617565,https://creativecommons.org/licenses/by/2.0/,Sharon Hahn Darlin,https://www.flickr.com/people/sharonhahndarlin/ 635c6bf4f8bcd077,https://c1.staticflickr.com/8/7795/28761312960_3f68475de8_o.jpg,0.25,0.0,1.0,0.75,274,717,https://www.flickr.com/photos/jenrobinson/28761312960/,https://creativecommons.org/licenses/by/2.0/,jen robinson,https://www.flickr.com/people/jenrobinson/ a4855965f0ee1892,https://c1.staticflickr.com/9/8104/29161920474_be9412c264_o.jpg,0.5,0.0,1.0,0.75,548,481,https://www.flickr.com/photos/shankaronline/29161920474,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ a35a30a62237a8a0,https://c1.staticflickr.com/9/8153/28907773382_ac9bbc1f4c_o.jpg,0.25,0.0,1.0,0.503698224852,646,611,https://flickr.com/12950131@N06/28907773382,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 2095797bdc1aa426,https://c1.staticflickr.com/1/548/31293109024_012160440b_o.jpg,0.210588633288,0.0,0.631765899865,0.75,848,581,https://www.flickr.com/photos/shankaronline/31293109024,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ d21a0c974022fa0f,https://c1.staticflickr.com/9/8812/28832221254_6761ed3159_o.jpg,0.333333333333,0.0,1.0,1.0,739,788,https://www.flickr.com/photos/sterlic/28832221254,https://creativecommons.org/licenses/by/2.0/,Scott Akerman,https://www.flickr.com/people/sterlic/ 4df435083af9a4e7,https://c1.staticflickr.com/9/8243/27780524793_3acdf6c7de_o.jpg,0.624125874126,0.0,0.936188811189,0.75,976,529,https://www.flickr.com/photos/chad_sparkes/27780524793,https://creativecommons.org/licenses/by/2.0/,Chad Sparkes,https://www.flickr.com/people/chad_sparkes/ 021b4cf0ac86d356,https://c1.staticflickr.com/6/5613/32068228285_b74d049d0c_o.jpg,0.421703296703,0.0,1.0,1.0,815,558,https://www.flickr.com/photos/walterpro/32068228285,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ 9b716a09c14f9b79,https://c1.staticflickr.com/1/698/32031478785_d3ec0e5283_o.jpg,0.333333333333,0.0,1.0,1.0,512,547,https://flickr.com/42220226@N07/32031478785,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ e373c220d13963c4,https://c1.staticflickr.com/8/7519/27260754646_63d7886040_o.jpg,0.211382113821,0.25,0.634146341463,1.0,704,535,https://www.flickr.com/photos/discoveroregon/27260754646/,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 41a80d706ef7edf0,https://c1.staticflickr.com/6/5447/31179835181_03bee90365_o.jpg,0.341370558376,0.25,1.0,1.0,310,767,https://www.flickr.com/photos/gails_pictures/31179835181,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 7e692e0e390b9b79,https://c1.staticflickr.com/6/5746/29798457144_ce55255572_o.jpg,0.0,0.25,0.524546827795,1.0,889,871,https://www.flickr.com/photos/sheila_sund/29798457144,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/ 4f6a453057497d30,https://c1.staticflickr.com/9/8139/29747036901_3af6edd308_o.jpg,0.249631811487,0.0,0.748895434462,0.75,820,64,https://www.flickr.com/photos/usafe/29747036901/,https://creativecommons.org/licenses/by/2.0/,USAFE AFAFRICA,https://www.flickr.com/people/usafe/ 557043e33f3d9cd3,https://c1.staticflickr.com/9/8505/29122062136_855c238dd9_o.jpg,0.0,0.0,0.666666666667,1.0,471,697,https://www.flickr.com/photos/dakone2k/29122062136/,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/ 47207907c465be67,https://c1.staticflickr.com/8/7608/26456720594_83b156b928_o.jpg,0.499263622975,0.0,0.99852724595,0.75,718,630,https://www.flickr.com/photos/greggjerdingen/26456720594,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 4d0900d4af0d62c0,https://c1.staticflickr.com/8/7469/30162157755_a6e46bbc9d_o.jpg,0.292867981791,0.0,1.0,1.0,657,263,https://www.flickr.com/photos/hugo90/30162157755,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 1a7dbfb5bceafa76,https://c1.staticflickr.com/9/8797/27918323460_131c1e9a9a_o.jpg,0.0,0.0,0.561569688769,1.0,980,355,https://www.flickr.com/photos/mypubliclands/27918323460,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ b906fb0529eba9b9,https://c1.staticflickr.com/8/7403/27410948676_c23d8ebcc0_o.jpg,0.578822733424,0.0,1.0,0.75,329,886,https://www.flickr.com/photos/jphotos/27410948676,https://creativecommons.org/licenses/by/2.0/,jeff~,https://www.flickr.com/people/jphotos/ fa6bae54bd5d8b13,https://c1.staticflickr.com/9/8701/29869312901_58c5874fe9_o.jpg,0.0,0.0,0.739130434783,1.0,806,609,https://www.flickr.com/photos/jamesboyes/29869312901/,https://creativecommons.org/licenses/by/2.0/,James Boyes,https://www.flickr.com/people/jamesboyes/ 065099b7ac9d9ac4,https://c1.staticflickr.com/6/5291/30056411952_8032975faa_o.jpg,0.156031468531,0.25,0.468094405594,1.0,459,348,https://flickr.com/131810676@N03/30056411952,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/ 4c9f8d9523ac6a84,https://c1.staticflickr.com/9/8729/29099570322_dfc0178c76_o.jpg,0.25,0.0,1.0,1.0,937,955,https://www.flickr.com/photos/scotnelson/29099570322,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 0b9f31fb286716b2,https://c1.staticflickr.com/9/8124/29761838330_29b733a1ae_o.jpg,0.0,0.0,0.75,0.56338028169,407,146,https://www.flickr.com/photos/eltb/29761838330,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ d74d464c3bb94dab,https://c1.staticflickr.com/9/8557/28449325394_75ec4bd407_o.jpg,0.0,0.248348017621,0.75,0.745044052863,672,812,https://www.flickr.com/photos/transitomedellin/28449325394,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ 4c15e269fe7c2e3d,https://c1.staticflickr.com/1/634/32178917860_920284d9f9_o.jpg,0.285496183206,0.0,1.0,1.0,971,108,https://www.flickr.com/photos/ruthanddave/32178917860/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 551d323118fb54d3,https://c1.staticflickr.com/8/7408/26252524554_a5b27529ba_o.jpg,0.249631811487,0.25,0.748895434462,1.0,896,746,https://www.flickr.com/photos/markyharky/26252524554,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 7a697e8aef963f7f,https://c1.staticflickr.com/8/7786/28379740245_cc1a2b42cd_o.jpg,0.0,0.25,0.75,1.0,761,124,https://www.flickr.com/photos/78428166@N00/28379740245,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ fc51851f4ac3ae08,https://c1.staticflickr.com/8/7577/27062589082_9b035cdbf0_o.jpg,0.244897959184,0.0,1.0,1.0,780,450,https://www.flickr.com/photos/thoseguys119/27062589082,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ ad563ec3390b141f,https://c1.staticflickr.com/8/7697/26223793944_637294d2c9_o.jpg,0.285496183206,0.0,1.0,1.0,820,817,https://www.flickr.com/photos/navcent/26223793944,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/ 56324fd47cabe469,https://c1.staticflickr.com/6/5479/30642699254_863593ae59_o.jpg,0.25,0.25,0.75,1.0,519,863,https://www.flickr.com/photos/box_repsol/30642699254,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 1387bd48d85a2c59,https://c1.staticflickr.com/9/8244/28804495004_ce1951a97c_o.jpg,0.0,0.0,0.666666666667,1.0,519,858,https://www.flickr.com/photos/box_repsol/28804495004/,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 5d6c2dd080e5c1e5,https://c1.staticflickr.com/9/8017/29248624862_3cda9dbcea_o.jpg,0.309221311475,0.25,0.927663934426,1.0,992,843,https://www.flickr.com/photos/ligthelm/29248624862,https://creativecommons.org/licenses/by/2.0/,Rick Ligthelm,https://www.flickr.com/people/ligthelm/ 4babfa35488d92cf,https://c1.staticflickr.com/9/8233/29485956555_0753b2a769_o.jpg,0.25,0.0,1.0,0.599757673667,324,765,https://www.flickr.com/photos/kpaulus/29485956555/,https://creativecommons.org/licenses/by/2.0/,Kristine Paulus,https://www.flickr.com/people/kpaulus/ ed30aa76cd2d284c,https://c1.staticflickr.com/8/7238/26271296103_ae90e20bde_o.jpg,0.2806640625,0.25,0.8419921875,1.0,922,183,https://www.flickr.com/photos/lenore-m/26271296103,https://creativecommons.org/licenses/by/2.0/,Lenore Edman,https://www.flickr.com/people/lenore-m/ 828d4f903e05e6f0,https://c1.staticflickr.com/9/8799/27677199993_f94c61f064_o.jpg,0.333333333333,0.0,1.0,1.0,971,377,https://www.flickr.com/photos/davebloggs007/27677199993,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ ed73eddb69f25ccb,https://c1.staticflickr.com/9/8701/28819142265_54eb1bae5c_o.jpg,0.28125,0.0,0.84375,0.75,635,983,https://www.flickr.com/photos/suncon/28819142265,https://creativecommons.org/licenses/by/2.0/,SunCon Photos,https://www.flickr.com/people/suncon/ 6087cb0f92f43db3,https://c1.staticflickr.com/8/7303/26738900854_5e7081c97e_o.jpg,0.337738619677,0.0,1.0,1.0,519,742,https://www.flickr.com/photos/seymour-pics/26738900854,https://creativecommons.org/licenses/by/2.0/,Mark Seymour,https://www.flickr.com/people/seymour-pics/ 11c4b54a964ff082,https://c1.staticflickr.com/1/505/31675351916_b4bb9bf8d0_o.jpg,0.330871491876,0.0,1.0,1.0,309,371,https://www.flickr.com/photos/42244964@N03/31675351916,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ 6eb88bb1279e92f9,https://c1.staticflickr.com/9/8758/28618213615_57a4e23a00_o.jpg,0.462765957447,0.25,0.925531914894,1.0,718,897,https://www.flickr.com/photos/daveseven/28618213615,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/ 7e9c6c3dd01bf1a7,https://c1.staticflickr.com/6/5832/31094839330_0a18e42eaf_o.jpg,0.0,0.0,0.498159057437,0.75,752,207,https://www.flickr.com/photos/davehamster/31094839330,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 703a0b79ba9ffb4c,https://c1.staticflickr.com/8/7774/26806215681_d5a47093e3_o.jpg,0.225,0.25,0.675,1.0,459,943,https://www.flickr.com/photos/atoach/26806215681,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 4fa2cad0c899eb41,https://c1.staticflickr.com/9/8233/28387591075_c68dede447_o.jpg,0.25,0.25,0.75,1.0,875,883,https://www.flickr.com/photos/kieransphotostream/28387591075,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/ 458ed56f7c7297d5,https://c1.staticflickr.com/1/605/30834214894_dddb4f9a40_o.jpg,0.470789074355,0.25,1.0,1.0,540,403,https://www.flickr.com/photos/45958601@N02/30834214894/,https://creativecommons.org/licenses/by/2.0/,joey zanotti,https://www.flickr.com/people/45958601@N02/ b67c95a6acb2f02b,https://c1.staticflickr.com/9/8716/30023250666_2dd2d23a80_o.jpg,0.336764705882,0.0,1.0,1.0,782,995,https://www.flickr.com/photos/channingsmith/30023250666,https://creativecommons.org/licenses/by/2.0/,Channing Smith,https://www.flickr.com/people/channingsmith/ adaf622244796430,https://c1.staticflickr.com/9/8413/30170200465_42e748ba7e_o.jpg,0.0,0.0,0.75,1.0,110,138,https://www.flickr.com/photos/148005384@N04/30170200465,https://creativecommons.org/licenses/by/2.0/,Editions Photoart,https://www.flickr.com/people/148005384@N04/ 73c353583783476f,https://c1.staticflickr.com/9/8610/29818492514_52e6502013_o.jpg,0.0,0.25,0.75,1.0,980,972,https://flickr.com/34803371@N02/29818492514,https://creativecommons.org/licenses/by/2.0/,Briles Takes Pictures,https://www.flickr.com/people/brilestakespictures/ 5e351af6e1cd3ce2,https://c1.staticflickr.com/8/7156/27494783335_7ca9db9125_o.jpg,0.0,0.25,0.75,1.0,566,837,https://www.flickr.com/photos/bowbrick/27494783335,https://creativecommons.org/licenses/by/2.0/,Steve Bowbrick,https://www.flickr.com/people/bowbrick/ 19eb49485b6e5015,https://c1.staticflickr.com/6/5604/30159632373_802808e2f1_o.jpg,0.281802120141,0.0,1.0,0.75,615,76,https://www.flickr.com/photos/publicresourceorg/30159632373/,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/ 95dda69567aaa13b,https://c1.staticflickr.com/1/363/31888298916_76241d118a_o.jpg,0.480855855856,0.0,1.0,0.75,336,137,https://flickr.com/52378535@N06/31888298916,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ f2a4ed91400f4aaf,https://c1.staticflickr.com/9/8372/29329694571_4304a18a22_o.jpg,0.346067134269,0.25,0.576778557114,1.0,880,99,https://www.flickr.com/photos/pyride/29329694571,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/ 17e615d63e051882,https://c1.staticflickr.com/8/7441/26486494613_d7e5563071_o.jpg,0.0,0.0,1.0,1.0,968,280,https://www.flickr.com/photos/journeyscoffee/26486494613,https://creativecommons.org/licenses/by/2.0/,Dan Lacher,https://www.flickr.com/people/journeyscoffee/ b3391a4cc5e10c01,https://c1.staticflickr.com/1/289/31999369380_b6752d02a0_o.jpg,0.0,0.25,0.5,1.0,971,459,https://www.flickr.com/photos/davebloggs007/31999369380,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 223bdf7f77e44be1,https://c1.staticflickr.com/8/7283/27201240734_3d3930778c_o.jpg,0.333333333333,0.0,1.0,1.0,461,741,http://www.flickr.com/photos/133488379@N08/27201240734,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ e1b5aab2028d990a,https://c1.staticflickr.com/8/7715/26878843412_bc0b1f2297_o.jpg,0.431603773585,0.25,1.0,1.0,321,122,https://www.flickr.com/photos/gails_pictures/26878843412,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ cb88fc99e5f3a57d,https://c1.staticflickr.com/6/5466/30531998210_45e98c8987_o.jpg,0.0,0.0,1.0,0.7484375,410,624,https://www.flickr.com/photos/arjanrichter/30531998210,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/ 63bfcdfc84fbf0a7,https://c1.staticflickr.com/6/5788/30871293190_c7f8bafe9c_o.jpg,0.0,0.0,0.75,0.75,935,757,https://www.flickr.com/photos/lachlanhardy/30871293190,https://creativecommons.org/licenses/by/2.0/,Lachlan Hardy,https://www.flickr.com/people/lachlanhardy/ a3d15a4d57c98093,https://c1.staticflickr.com/8/7418/27090299961_44369d50ea_o.jpg,0.549781181619,0.0,0.824671772429,0.75,780,85,https://www.flickr.com/photos/thoseguys119/27090299961,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ e2bfc8982f2857d7,https://c1.staticflickr.com/8/7621/28090174073_374097ded2_o.jpg,0.249079528719,0.0,0.747238586156,0.75,699,331,https://www.flickr.com/photos/christophsammer/28090174073,https://creativecommons.org/licenses/by/2.0/,Christoph Sammer,https://www.flickr.com/people/christophsammer/ 32014e1dcbcd9667,https://c1.staticflickr.com/9/8207/29638594705_bc4d85ce20_o.jpg,0.248713235294,0.25,0.746139705882,1.0,547,401,https://www.flickr.com/photos/mangakamaidenphotography/29638594705,https://creativecommons.org/licenses/by/2.0/,MangakaMaiden Photography,https://www.flickr.com/people/mangakamaidenphotography/ 1bfe3bd5bb6d6461,https://c1.staticflickr.com/8/7184/27441879452_d414df01a6_o.jpg,0.5,0.0,1.0,0.75,702,847,https://www.flickr.com/photos/7armyjmtc/27441879452,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 19106fcec4aa5edc,https://c1.staticflickr.com/6/5504/30325036203_275ce60af1_o.jpg,0.28125,0.25,0.84375,1.0,669,820,https://www.flickr.com/photos/96223380@N02/30325036203,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ 3737c579f8fcd381,https://c1.staticflickr.com/1/530/31912109384_d220aacc63_o.jpg,0.0,0.0,0.7484375,1.0,971,161,https://www.flickr.com/photos/snowboardguides/31912109384/,https://creativecommons.org/licenses/by/2.0/,SNOWBOARDGUIDES.COM,https://www.flickr.com/people/snowboardguides/ 279c74d94797c6ae,https://c1.staticflickr.com/2/1644/26715774676_fea10bedcf_o.jpg,0.477665706052,0.25,0.955331412104,1.0,971,825,https://www.flickr.com/photos/nordique/26715774676,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ f7f85c56122216e0,https://c1.staticflickr.com/8/7344/27503130195_fc23c31689_o.jpg,0.333333333333,0.0,1.0,1.0,524,352,https://www.flickr.com/photos/rockincast/27503130195,https://creativecommons.org/licenses/by/2.0/,4x4king10,https://www.flickr.com/people/rockincast/ b9949f9c2f3ccebf,https://c1.staticflickr.com/1/284/31789944763_0dcb472076_o.jpg,0.333333333333,0.0,1.0,1.0,24,178,https://flickr.com/22592971@N04/31789944763,https://creativecommons.org/licenses/by/2.0/,Mark Gunn,https://www.flickr.com/people/mark-gunn/ d58fcfdea2c4fe2a,https://c1.staticflickr.com/6/5445/30401489156_86521b2481_o.jpg,0.0,0.0089928057554,1.0,1.0,651,805,https://www.flickr.com/photos/johningb/30401489156/,https://creativecommons.org/licenses/by/2.0/,John Begalke,https://www.flickr.com/people/johningb/ 9fcf2c59ff0ff9b6,https://c1.staticflickr.com/9/8098/28516976536_3f929208b7_o.jpg,0.254464285714,0.0,0.763392857143,0.75,975,483,https://www.flickr.com/photos/jsjgeology/28516976536,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 32bd822fbc041589,https://c1.staticflickr.com/6/5689/30337601954_369f207eaa_o.jpg,0.43661971831,0.25,1.0,1.0,832,756,https://flickr.com/10373806@N05/30337601954,https://creativecommons.org/licenses/by/2.0/,Xavier Damman,https://www.flickr.com/people/xdamman/ 236f3abf63755e51,https://c1.staticflickr.com/1/706/31735168541_83771bc72c_o.jpg,0.242550872093,0.0,0.727652616279,0.75,975,786,https://www.flickr.com/photos/jsjgeology/31735168541,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 5216c0cab635d220,https://c1.staticflickr.com/9/8666/28478165335_f3f7ef5a01_o.jpg,0.175679851669,0.0,0.527039555006,0.75,975,757,https://www.flickr.com/photos/jsjgeology/28478165335,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 39f53cb1c128d893,https://c1.staticflickr.com/8/7484/29547882593_344301227d_o.jpg,0.25,0.4375,1.0,1.0,608,177,https://www.flickr.com/photos/annaustin/29547882593,https://creativecommons.org/licenses/by/2.0/,Anna Hanks,https://www.flickr.com/people/annaustin/ ab1b0fdece18272a,https://c1.staticflickr.com/8/7576/28116360546_7f8ddfcea2_o.jpg,0.31726618705,0.0,0.951798561151,1.0,971,143,https://www.flickr.com/photos/peuplier/28116360546,https://creativecommons.org/licenses/by/2.0/,peuplier,https://www.flickr.com/people/peuplier/ 76a2bbf100fcadde,https://c1.staticflickr.com/8/7320/27925241631_cfaaf24317_o.jpg,0.0,0.0,1.0,0.75,995,586,https://www.flickr.com/photos/scotnelson/27925241631,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ b9f2c3848fe3407b,https://c1.staticflickr.com/8/7190/27586654126_4a760fb6e5_o.jpg,0.0,0.0,0.670648464164,0.75,145,782,https://www.flickr.com/photos/ben124/27586654126,https://creativecommons.org/licenses/by/2.0/,Berit Watkin,https://www.flickr.com/people/ben124/ 233c35b0a46f0650,https://c1.staticflickr.com/9/8856/28270472106_bdd28ce6c2_o.jpg,0.4375,0.0,1.0,0.75,974,355,https://www.flickr.com/photos/noaaphotolib/28270472106,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 69940d6366b8a9c0,https://c1.staticflickr.com/6/5125/29544515263_1620526d79_o.jpg,0.0,0.318416523236,0.75,1.0,539,983,https://www.flickr.com/photos/budellison/29544515263,https://creativecommons.org/licenses/by/2.0/,Bud Ellison,https://www.flickr.com/people/budellison/ 3b901740be8a60fc,https://c1.staticflickr.com/9/8737/28418226135_3864a397c2_o.jpg,0.0,0.25,0.5625,1.0,31,761,https://www.flickr.com/photos/nature80020/28418226135,https://creativecommons.org/licenses/by/2.0/,nature80020,https://www.flickr.com/people/nature80020/ 5da6d6d3b4389389,https://c1.staticflickr.com/3/2068/32863788222_f83b55d5d6_o.jpg,0.248348017621,0.0,0.745044052863,0.75,672,319,https://www.flickr.com/photos/glorycycles/32863788222,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 43bb823efbd6a7a1,https://c1.staticflickr.com/9/8227/28361569183_bd19cf29a9_o.jpg,0.0,0.0,1.0,1.0,442,640,https://www.flickr.com/photos/alper/28361569183,https://creativecommons.org/licenses/by/2.0/,Alper \303\207u\304\237un,https://www.flickr.com/people/alper/ 87ef2b672d461f5b,https://c1.staticflickr.com/9/8706/29465792200_966086f08a_o.jpg,0.0,0.0,0.56338028169,0.75,507,530,https://www.flickr.com/photos/zongo/29465792200,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ d3cf0ce47b4ea472,https://c1.staticflickr.com/9/8306/29482445285_f2a9c9d5d5_o.jpg,0.306766917293,0.0,1.0,1.0,896,445,https://www.flickr.com/photos/8269539@N04/29482445285,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 69631aa30fb20981,https://c1.staticflickr.com/9/8835/28661400036_449ea08a6f_o.jpg,0.25,0.0,0.75,0.75,982,568,https://www.flickr.com/photos/usembassytokyo/28661400036,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tokyo,https://www.flickr.com/people/usembassytokyo/ 236f28c544ebd76e,https://c1.staticflickr.com/8/7558/27354993266_888cd610ae_o.jpg,0.421177266576,0.25,0.842354533153,1.0,699,58,https://www.flickr.com/photos/ankurp/27354993266,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ 05fe1ace8eecf93e,https://c1.staticflickr.com/8/7349/27235506583_8172423525_o.jpg,0.0,0.300604229607,1.0,1.0,808,481,https://www.flickr.com/photos/lge/27235506583,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 33e2a1137737fe19,https://c1.staticflickr.com/8/7310/27481466185_2df07379f5_o.jpg,0.25,0.0,1.0,1.0,848,708,http://www.flickr.com/photos/35334437@N05/27481466185/,https://creativecommons.org/licenses/by/2.0/,VanLap Ho\303\240ng,https://www.flickr.com/people/vanlaphoang1945/ d3fe594ab94ac801,https://c1.staticflickr.com/8/7061/26889596602_5747b96676_o.jpg,0.0,0.0,0.666666666667,1.0,848,866,https://www.flickr.com/photos/7armyjmtc/26889596602,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ d46ecc546b5424f2,https://c1.staticflickr.com/8/7402/27082317204_932f825601_o.jpg,0.468616262482,0.0,0.937232524964,0.75,95,107,https://www.flickr.com/photos/rockyraybell/27082317204,https://creativecommons.org/licenses/by/2.0/,Rocky Raybell,https://www.flickr.com/people/rockyraybell/ 833ab2c44f79e8ae,https://c1.staticflickr.com/9/8871/28210823271_2a9128b4d0_o.jpg,0.0,0.0,0.75,0.5,870,370,https://www.flickr.com/photos/gylesglover/28210823271,https://creativecommons.org/licenses/by/2.0/,Gyles Glover,https://www.flickr.com/people/gylesglover/ f049191158adf9ff,https://c1.staticflickr.com/8/7651/26510530204_1a2287b421_o.jpg,0.25,0.0,1.0,1.0,17,118,https://www.flickr.com/photos/9750464@N02/26510530204,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ 11de929e16ef2777,https://c1.staticflickr.com/6/5561/31643466182_d526d7d5a1_o.jpg,0.504405286344,0.0,1.0,0.75,548,157,https://www.flickr.com/photos/robdammers/31643466182,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ e6ed833eb6ed8761,https://c1.staticflickr.com/4/3152/3065021991_bfd932644e_o.jpg,0.499263622975,0.25,0.99852724595,1.0,931,677,https://www.flickr.com/photos/photofarmer/3065021991,https://creativecommons.org/licenses/by/2.0/,Dwight Sipler,https://www.flickr.com/people/photofarmer/ bffd3b358af9eb37,https://c1.staticflickr.com/8/7459/27155696693_3cba7c100e_o.jpg,0.334315169367,0.0,1.0,1.0,971,405,https://www.flickr.com/photos/104544784@N04/27155696693/,https://creativecommons.org/licenses/by/2.0/,Kevin Funk,https://www.flickr.com/people/104544784@N04/ 0d344499a7cec5a3,https://c1.staticflickr.com/8/7390/27264754735_73c458ba36_o.jpg,0.512008733624,0.0,1.0,0.75,318,870,https://www.flickr.com/photos/26138378@N03/27264754735,https://creativecommons.org/licenses/by/2.0/,Patrick Clement,https://www.flickr.com/people/26138378@N03/ 6ec9a8e619129d4a,https://c1.staticflickr.com/9/8830/28284956061_84e914c06e_o.jpg,0.0,0.0,0.5625,0.75,442,521,https://www.flickr.com/photos/kidayasuo/28284956061/,https://creativecommons.org/licenses/by/2.0/,Yasuo Kida,https://www.flickr.com/people/kidayasuo/ c05bd28b99c8cb4c,https://c1.staticflickr.com/3/2257/32690058362_744cc09823_o.jpg,0.5,0.0,1.0,0.75,116,373,https://www.flickr.com/photos/silkebaron/32690058362,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ 9d57650f90765950,https://c1.staticflickr.com/9/8567/28436805255_3b08ae85b7_o.jpg,0.0,0.0,0.5625,0.75,975,467,https://www.flickr.com/photos/jsjgeology/28436805255/?rb=1,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 8443ace4c1a96b02,https://c1.staticflickr.com/9/8448/29687551075_193edaef3f_o.jpg,0.0,0.0,0.496696035242,0.75,484,843,https://www.flickr.com/photos/34517490@N00/29687551075,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/ ad597652b035a9e8,https://c1.staticflickr.com/2/1581/26146502613_2c86c80ae2_o.jpg,0.4375,0.0,1.0,0.75,771,407,https://www.flickr.com/photos/wza/26146502613,https://creativecommons.org/licenses/by/2.0/,Warren R.M. Stuart,https://www.flickr.com/people/wza/ d16c914a6b4ca249,https://c1.staticflickr.com/9/8386/28769311134_7b78765846_o.jpg,0.475453172205,0.0,1.0,0.75,580,638,https://www.flickr.com/photos/fotosagenciabrasil/28769311134/,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/ 5f468c9a129383c4,https://c1.staticflickr.com/8/7350/27231547892_01dda93fd8_o.jpg,0.269908116386,0.0,0.809724349158,0.75,822,510,https://www.flickr.com/photos/johnkell/27231547892,https://creativecommons.org/licenses/by/2.0/,johnkell,https://www.flickr.com/people/johnkell/ f99913c57ac0de88,https://c1.staticflickr.com/6/5453/30783128830_89da72d013_o.jpg,0.0,0.0,0.485101744186,0.75,353,537,https://www.flickr.com/photos/kkoshy/30783128830,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/ 17989af4989cae2a,https://c1.staticflickr.com/8/7605/27090298831_90a81a7aa9_o.jpg,0.204227696405,0.0,0.612683089214,0.75,780,465,https://www.flickr.com/photos/thoseguys119/27090298831,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 3c9b88db5e066169,https://c1.staticflickr.com/6/5726/30285166324_3223b1d3e1_o.jpg,0.25,0.25,1.0,0.75,518,638,https://www.flickr.com/photos/elsie/30285166324/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 16975e74dfbd7402,https://c1.staticflickr.com/6/5345/30068832962_ae67543f73_o.jpg,0.0,0.25,0.5625,1.0,975,292,https://flickr.com/47445767@N05/30068832962,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e45f7f995e5a62d9,https://c1.staticflickr.com/8/7672/26707937963_3341f083af_o.jpg,0.503303964758,0.25,1.0,1.0,752,318,https://www.flickr.com/photos/seymour-pics/26707937963,https://creativecommons.org/licenses/by/2.0/,Mark Seymour,https://www.flickr.com/people/seymour-pics/ 63f59cc3cd6df3f0,https://c1.staticflickr.com/8/7683/28093467915_b1297bca78_o.jpg,0.234308131241,0.0,0.702924393723,0.75,606,462,https://www.flickr.com/photos/lge/28093467915,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 337e039b052d3566,https://c1.staticflickr.com/8/7304/28070536882_3a548f8f2d_o.jpg,0.0,0.0,0.497426470588,0.75,526,691,https://www.flickr.com/photos/usfwsmidwest/28070536882,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ df157b14ea171e02,https://c1.staticflickr.com/8/7533/26773587510_5999cba210_o.jpg,0.28125,0.0,0.84375,0.75,583,433,https://www.flickr.com/photos/wdm/26773587510,https://creativecommons.org/licenses/by/2.0/,Global Justice Now,https://www.flickr.com/people/wdm/ ecdab98dacbe3d58,https://c1.staticflickr.com/8/7320/28305777715_355e845db5_o.jpg,0.0,0.25,0.75,1.0,519,952,https://www.flickr.com/photos/cdorobek/28305777715,https://creativecommons.org/licenses/by/2.0/,cdorobek,https://www.flickr.com/people/cdorobek/ a0f9e48e416b9c5e,https://c1.staticflickr.com/9/8624/28626740361_c855b93286_o.jpg,0.28125,0.25,0.84375,1.0,978,603,https://www.flickr.com/photos/rubenholthuijsen/28626740361,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen,https://www.flickr.com/people/rubenholthuijsen/ 7857c2b2999b6b0d,https://c1.staticflickr.com/3/2906/32558384970_ceb24c1d54_o.jpg,0.278188180404,0.0,0.834564541213,0.75,672,556,https://www.flickr.com/photos/glorycycles/32558384970,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 030299994195bfce,https://c1.staticflickr.com/1/778/31882074812_e60fd2cf6f_o.jpg,0.0,0.4375,0.75,1.0,108,742,https://www.flickr.com/photos/jimg944/31882074812,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 83cda72183d07403,https://c1.staticflickr.com/1/442/31774644395_23edfde293_o.jpg,0.0,0.0,0.666666666667,1.0,662,272,https://flickr.com/52900873@N07/31774644395,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 66c944832f2dff9b,https://c1.staticflickr.com/9/8713/28072908740_31a0ed3822_o.jpg,0.37517831669,0.0,1.0,1.0,986,998,https://www.flickr.com/photos/tdlucas5000/28072908740,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ cbc736fa6c22c310,https://c1.staticflickr.com/9/8795/29006826755_35d62f18b9_o.jpg,0.279641185647,0.25,0.838923556942,1.0,672,814,https://www.flickr.com/photos/glorycycles/29006826755,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 3325c4a2925a340e,https://c1.staticflickr.com/1/771/32998643591_910b4b3beb_o.jpg,0.5,0.25,1.0,1.0,960,199,https://www.flickr.com/photos/nebulux/32998643591/in/pool-43256560@N00,https://creativecommons.org/licenses/by/2.0/,Luca Nebuloni,https://www.flickr.com/people/nebulux/ 1b8d39f69d5e8c3f,https://c1.staticflickr.com/6/5801/30290607124_72fa7250f1_o.jpg,0.0,0.25,0.501846381093,1.0,844,447,https://www.flickr.com/photos/79157069@N03/30290607124,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ 72fe8329bb9774c9,https://c1.staticflickr.com/8/7362/27440539410_a768de9340_o.jpg,0.4375,0.0,1.0,0.75,960,554,https://www.flickr.com/photos/garysoup/27440539410,https://creativecommons.org/licenses/by/2.0/,Gary Stevens,https://www.flickr.com/people/garysoup/ db81b88f999b32f6,https://c1.staticflickr.com/9/8231/29099596116_99fbcccbd1_o.jpg,0.25,0.0,1.0,0.75,312,548,https://www.flickr.com/photos/michperu/29099596116,https://creativecommons.org/licenses/by/2.0/,Manuel Iglesias,https://www.flickr.com/people/michperu/ 8c1296e3fc73bb1a,https://c1.staticflickr.com/9/8441/29179315444_06a54e7436_o.jpg,0.282874617737,0.0,1.0,1.0,361,386,https://www.flickr.com/photos/david_e_smith/29179315444,https://creativecommons.org/licenses/by/2.0/,Dave_S.,https://www.flickr.com/people/david_e_smith/ 70b0e2cc661a63f0,https://c1.staticflickr.com/9/8488/29104573545_a377f7e200_o.jpg,0.25,0.0,1.0,1.0,579,254,https://www.flickr.com/photos/jeanlouis_zimmermann/29104573545/,https://creativecommons.org/licenses/by/2.0/,jean-louis Zimmermann,https://www.flickr.com/people/jeanlouis_zimmermann/ 1b8260275b57ce4b,https://c1.staticflickr.com/3/2029/31970322924_372c8919ba_o.jpg,0.0,0.0,1.0,1.0,220,819,https://www.flickr.com/photos/neilconway/31970322924/,https://creativecommons.org/licenses/by/2.0/,Neil Conway,https://www.flickr.com/people/neilconway/ 679b40aa6d623f1f,https://c1.staticflickr.com/8/7419/27369234931_9fbf5366c3_o.jpg,0.0,0.0,0.75,1.0,278,549,https://www.flickr.com/photos/x1brett/27369234931,https://creativecommons.org/licenses/by/2.0/,brett jordan,https://www.flickr.com/people/x1brett/ 473fd74f857f489f,https://c1.staticflickr.com/9/8849/28177283111_a368e3a29f_o.jpg,0.0,0.25,0.56338028169,1.0,309,899,https://www.flickr.com/photos/treegrow/28177283111/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 13fa007af4c90377,https://c1.staticflickr.com/9/8114/28747696454_f816655fdf_o.jpg,0.5,0.25,1.0,1.0,480,114,https://www.flickr.com/photos/concavowheels/28747696454,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/ f583ebbd91c7d891,https://c1.staticflickr.com/8/7692/27208977994_f5e5309957_o.jpg,0.28125,0.0,0.84375,0.75,459,807,https://www.flickr.com/photos/24701549@N07/27208977994,https://creativecommons.org/licenses/by/2.0/,Spudgun67,https://www.flickr.com/people/24701549@N07/ 0c864e8f9f7216d0,https://c1.staticflickr.com/9/8542/29761231960_324c7a4c76_o.jpg,0.0,0.43661971831,0.75,1.0,407,465,https://www.flickr.com/photos/eltb/29761231960,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 5c2c04b0db771072,https://c1.staticflickr.com/1/264/31923137994_eafe8e62ec_o.jpg,0.486899563319,0.0,0.973799126638,0.75,548,689,https://www.flickr.com/photos/robdammers/31923137994,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 3cbf354dcd0b36e8,https://c1.staticflickr.com/8/7320/26224776183_07d754f1cd_o.jpg,0.0,0.0,0.5,0.75,968,435,https://www.flickr.com/photos/barnimages/26224776183,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ 004c8b201b15928f,https://c1.staticflickr.com/3/2286/32230204114_571f186095_o.jpg,0.5,0.0,1.0,0.75,568,665,https://www.flickr.com/photos/yourbestdigs/32230204114/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 0c3e91cefdad2428,https://c1.staticflickr.com/8/7659/26771331246_cbc82f8b7b_o.jpg,0.443623639191,0.25,1.0,1.0,614,487,https://www.flickr.com/photos/cinz/26771331246,https://creativecommons.org/licenses/by/2.0/,Shinji,https://www.flickr.com/people/cinz/ 96b1b786ac09a1ac,https://c1.staticflickr.com/9/8414/30276301361_eabd80eff1_o.jpg,0.0,0.0,0.69578313253,1.0,848,161,https://www.flickr.com/photos/13476480@N07/30276301361,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ dc0efd47be5140b1,https://c1.staticflickr.com/6/5195/30053789425_38e265540a_o.jpg,0.502573529412,0.0,1.0,0.75,347,115,https://www.flickr.com/photos/agenciabrasilia/30053789425,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 58530618c15ff420,https://c1.staticflickr.com/8/7300/27200571160_2b28c7a3a1_o.jpg,0.28125,0.25,0.84375,1.0,321,887,https://www.flickr.com/photos/12394349@N06/27200571160/,https://creativecommons.org/licenses/by/2.0/,Bryn Pinzgauer,https://www.flickr.com/people/12394349@N06/ 87877cf959f78732,https://c1.staticflickr.com/1/506/31605514081_7261f85462_o.jpg,0.25,0.0,1.0,1.0,99,759,https://www.flickr.com/photos/16801915@N06/31605514081,https://creativecommons.org/licenses/by/2.0/,Reading Tom,https://www.flickr.com/people/16801915@N06/ 45d73dda35861874,https://c1.staticflickr.com/3/2902/33062377700_13413c8ca8_o.jpg,0.0,0.0,1.0,1.0,672,364,https://www.flickr.com/photos/glorycycles/33062377700,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ d2ef8ec7dd167c76,https://c1.staticflickr.com/6/5586/30370381796_9d2a7b4181_o.jpg,0.0,0.0,0.5625,0.75,16,282,https://www.flickr.com/photos/mikeprince/30370381796,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/ 799da227df8b4e77,https://c1.staticflickr.com/1/575/31476000773_4fc5727559_o.jpg,0.25,0.0,1.0,0.47170487106,85,967,https://www.flickr.com/photos/amyn-design/31476000773/,https://creativecommons.org/licenses/by/2.0/,Amy Nelson,https://www.flickr.com/people/amyn-design/ 88f0980e97356399,https://c1.staticflickr.com/1/273/31817774171_eae4ec5b6f_o.jpg,0.24882629108,0.0,1.0,1.0,976,709,https://www.flickr.com/photos/kudumomo/31817774171,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/ db76bccee82f7f8f,https://c1.staticflickr.com/6/5711/30482708996_e96c060825_o.jpg,0.0,0.0,0.720858895706,1.0,325,169,https://www.flickr.com/photos/42244964@N03/30482708996,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ 1b77d21b74e2dc35,https://c1.staticflickr.com/8/7176/27262771224_303bfcdf9a_o.jpg,0.499263622975,0.0,0.99852724595,0.75,596,114,https://www.flickr.com/photos/inra_dist/27262771224/,https://creativecommons.org/licenses/by/2.0/,INRA DIST,https://www.flickr.com/people/inra_dist/ 703e9ef52c2e04bd,https://c1.staticflickr.com/9/8857/27752788674_fa4bc852ba_o.jpg,0.0,0.536576704545,0.75,1.0,407,544,https://www.flickr.com/photos/eltb/27752788674,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ d44afe32a7287d09,https://c1.staticflickr.com/8/7290/26961936063_7f09dc37b1_o.jpg,0.0,0.330871491876,1.0,1.0,407,971,https://www.flickr.com/photos/eltb/26961936063,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 65c6c3c590b66871,https://c1.staticflickr.com/9/8173/29046672406_7bd75f14a8_o.jpg,0.4375,0.25,1.0,1.0,920,761,https://www.flickr.com/photos/satguru/29046672406,https://creativecommons.org/licenses/by/2.0/,David Howard,https://www.flickr.com/people/satguru/ c6a4a4eca84a2e21,https://c1.staticflickr.com/6/5565/30593356672_bdd01715ac_o.jpg,0.200323101777,0.0,1.0,1.0,629,843,https://www.flickr.com/photos/prayitnophotography/30593356672,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ a8f2ebbeccc63abe,https://c1.staticflickr.com/1/483/31438856353_12ea40b059_o.jpg,0.5,0.25,1.0,1.0,546,570,https://www.flickr.com/photos/quinet/31438856353,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 3ff325032a8ab559,https://c1.staticflickr.com/8/7536/26963595501_eef8836169_o.jpg,0.502573529412,0.0,1.0,0.75,405,599,https://www.flickr.com/photos/levien66/26963595501,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/ 4d49879177e0eea6,https://c1.staticflickr.com/8/7341/26963890305_59e15c769c_o.jpg,0.57825203252,0.0,1.0,0.75,405,471,https://www.flickr.com/photos/n28307/26963890305,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ 5f144a84f5d75a9c,https://c1.staticflickr.com/6/5476/30112378190_854945314a_o.jpg,0.28125,0.0,0.84375,0.75,320,452,https://www.flickr.com/photos/mikeprince/30112378190,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/ dac06b10238a4a49,https://c1.staticflickr.com/3/2133/32131147354_94e2f50a17_o.jpg,0.497411242604,0.0,1.0,0.75,405,429,http://www.flickr.com/photos/barteq24/32131147354/,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/ 609cf244157cba54,https://c1.staticflickr.com/1/670/31654292734_c3d48747cf_o.jpg,0.25,0.0,1.0,0.75,91,353,https://www.flickr.com/photos/30478819@N08/31654292734,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 54fb3570cb5977a3,https://c1.staticflickr.com/9/8495/28953033861_2e516546db_o.jpg,0.0,0.0,0.5,0.75,896,979,https://www.flickr.com/photos/markyharky/28953033861,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ e2ef4b83d2de4828,https://c1.staticflickr.com/9/8045/28966409603_c77747ae7d_o.jpg,0.255402384501,0.25,0.766207153502,1.0,875,583,https://www.flickr.com/photos/bazzadarambler/28966409603,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 0be8905339fd536e,https://c1.staticflickr.com/9/8707/29057281054_cbb0122650_o.jpg,0.0,0.0,0.75,0.75,920,766,https://www.flickr.com/photos/ruthanddave/29057281054,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 7896d3b14fb5538d,https://c1.staticflickr.com/8/7484/27250922062_bd821b922d_o.jpg,0.0,0.0,0.75,0.5,558,837,https://www.flickr.com/photos/dfmagazine/27250922062,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/ 7ff9b7f8f29873c9,https://c1.staticflickr.com/9/8457/28607014944_91a3542f58_o.jpg,0.25,0.0,0.75,0.75,662,667,https://www.flickr.com/photos/sg2012/28607014944,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/ 41c3b2d9446bbaed,https://c1.staticflickr.com/9/8689/30107432471_d4c4c3930e_o.jpg,0.0,0.0,0.496696035242,0.75,896,280,https://www.flickr.com/photos/ganatlguard/30107432471/,https://creativecommons.org/licenses/by/2.0/,Georgia National Guard,https://www.flickr.com/people/ganatlguard/ d3b759942f8ab20c,https://c1.staticflickr.com/6/5831/30468139805_0f0765fb43_o.jpg,0.0,0.25,0.5,1.0,760,493,https://www.flickr.com/photos/janitors/30468139805,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 0b2ebcad9b6b04ed,https://c1.staticflickr.com/9/8618/29600991024_9d6581352e_o.jpg,0.25,0.0,0.75,0.75,252,706,https://flickr.com/36967498@N00/29600991024,https://creativecommons.org/licenses/by/2.0/,Stewart Black,https://www.flickr.com/people/s2ublack/ ac24675cc7fc5ccf,https://c1.staticflickr.com/1/711/32082259560_0ec4c89ee9_o.jpg,0.238832853026,0.25,0.716498559078,1.0,706,633,https://www.flickr.com/photos/robdammers/32082259560/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 529f436e2f35d426,https://c1.staticflickr.com/2/1610/26699474741_6e62f96180_o.jpg,0.25,0.0,1.0,1.0,459,748,https://www.flickr.com/photos/21022123@N04/26699474741,https://creativecommons.org/licenses/by/2.0/,Mike Steele,https://www.flickr.com/people/21022123@N04/ 62c135af8db76c3a,https://c1.staticflickr.com/6/5264/29447017183_28f447f3ae_o.jpg,0.0,0.0,0.75,0.599757673667,442,630,https://www.flickr.com/photos/bluemarleysabyss/29447017183,https://creativecommons.org/licenses/by/2.0/,Julia S.,https://www.flickr.com/people/bluemarleysabyss/ f72e3fd7f727c2a6,https://c1.staticflickr.com/6/5730/31178847936_b0c3a77627_o.jpg,0.25,0.25,0.75,1.0,971,584,https://www.flickr.com/photos/lwpkommunikacio/31178847936,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 30f328f660014029,https://c1.staticflickr.com/9/8439/28427979614_a1a0d819a2_o.jpg,0.46493902439,0.25,1.0,1.0,426,555,https://www.flickr.com/photos/aasenhistorie/28427979614,https://creativecommons.org/licenses/by/2.0/,\303\205sen Museum og Historielag,https://www.flickr.com/people/aasenhistorie/ b50533e1634a8943,https://c1.staticflickr.com/6/5519/30105715123_8f491caa5e_o.jpg,0.0,0.0,1.0,0.75117370892,407,901,https://www.flickr.com/photos/tracyhunter/30105715123,https://creativecommons.org/licenses/by/2.0/,Tracy Hunter,https://www.flickr.com/people/tracyhunter/ 81c07da07223ed89,https://c1.staticflickr.com/9/8730/28570210961_6d7733f1b8_o.jpg,0.25,0.0,0.75,0.75,555,269,https://www.flickr.com/photos/newsoresund/28570210961,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/ 3448804066f16c37,https://c1.staticflickr.com/9/8349/28946165353_336da3277a_o.jpg,0.475899280576,0.0,0.951798561151,0.75,512,434,https://www.flickr.com/photos/autohistorian/28946165353,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ a6c510df520914c6,https://c1.staticflickr.com/9/8506/28677341724_7cee37d92e_o.jpg,0.0,0.0,0.5,0.75,539,668,https://www.flickr.com/photos/eyeliam/28677341724/,https://creativecommons.org/licenses/by/2.0/,Jason Lander,https://www.flickr.com/people/eyeliam/ 78bb3a8208f47f7b,https://c1.staticflickr.com/3/2948/33000958675_e69128b8c5_o.jpg,0.0,0.0,0.666666666667,1.0,699,626,https://www.flickr.com/photos/markwatmough/33000958675/,https://creativecommons.org/licenses/by/2.0/,mark.watmough,https://www.flickr.com/people/markwatmough/ a78590cc28b07258,https://c1.staticflickr.com/6/5696/30634620062_38c9afa452_o.jpg,0.0,0.0,1.0,0.88926746167,611,496,https://flickr.com/128305985@N02/30634620062,https://creativecommons.org/licenses/by/2.0/,Varevo Designs,https://www.flickr.com/people/128305985@N02/ 7a30de2397718aa2,https://c1.staticflickr.com/8/7750/29099960354_0191f35723_o.jpg,0.0,0.25,0.5,1.0,973,768,https://www.flickr.com/photos/blmoregon/29099960354,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ 33adc352db08207f,https://c1.staticflickr.com/8/7335/26932729984_78b316ab0c_o.jpg,0.335459183673,0.0,1.0,0.75,309,759,https://www.flickr.com/photos/gails_pictures/26932729984,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 3bd230a5c748b967,https://c1.staticflickr.com/1/546/31693442786_5d260caf61_o.jpg,0.0,0.0,0.75,1.0,612,457,https://flickr.com/65490292@N04/31693442786,https://creativecommons.org/licenses/by/2.0/,Ralph Bean,https://www.flickr.com/people/65490292@N04/ d7150179f6c4fe3c,https://c1.staticflickr.com/3/2496/32790746532_1be412e76a_o.jpg,0.0,0.264758497317,0.75,1.0,512,863,https://www.flickr.com/photos/benoit59/32790746532/,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/ cf9d921917a6554c,https://c1.staticflickr.com/1/580/31661883220_3f8caab15a_o.jpg,0.0,0.0,0.5625,0.75,850,515,https://www.flickr.com/photos/dalbera/31661883220,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 0cf2914d57489e56,https://c1.staticflickr.com/8/7512/27082092650_0f9cc7f7b4_o.jpg,0.0,0.25,0.421177266576,1.0,26,857,https://www.flickr.com/photos/aries_tottle/27082092650,https://creativecommons.org/licenses/by/2.0/,Miltos Gikas,https://www.flickr.com/people/aries_tottle/ 175b1b150b013730,https://c1.staticflickr.com/9/8695/29523879682_7533c08fcb_o.jpg,0.491827637444,0.0,1.0,0.75,760,457,https://www.flickr.com/photos/25797459@N06/29523879682,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/ 1c425046c735e989,https://c1.staticflickr.com/1/745/32677244540_d6ff6400ae_o.jpg,0.522334293948,0.0,1.0,0.75,114,921,https://www.flickr.com/photos/gaby1/32677244540,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 1ac9e0c3d0e14268,https://c1.staticflickr.com/9/8709/29085635210_85c9c5714c_o.jpg,0.478162650602,0.25,1.0,1.0,437,795,https://www.flickr.com/photos/autohistorian/29085635210,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 4252ecd59afccd3f,https://c1.staticflickr.com/8/7481/27010291333_882a14eac4_o.jpg,0.5,0.25,1.0,1.0,820,167,https://www.flickr.com/photos/144048739@N03/27010291333/,https://creativecommons.org/licenses/by/2.0/,Welcome2 Stay,https://www.flickr.com/people/144048739@N03/ 15553549d8ba09db,https://c1.staticflickr.com/1/491/32622491025_bfc461fe60_o.jpg,0.531383737518,0.0,1.0,0.75,986,442,https://www.flickr.com/photos/tdlucas5000/32622491025,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ 61f540b31d01d04d,https://c1.staticflickr.com/6/5640/31291683871_81530936dc_o.jpg,0.0,0.25,0.5625,1.0,980,982,https://www.flickr.com/photos/amanderson/31291683871,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 3481a5377492c949,https://c1.staticflickr.com/1/561/31459916693_1fdedb7e70_o.jpg,0.25,0.25,1.0,1.0,605,641,https://flickr.com/137731904@N05/31459916693,https://creativecommons.org/licenses/by/2.0/,Natalia Medd,https://www.flickr.com/people/137731904@N05/ 7445dda526ef4e1a,https://c1.staticflickr.com/8/7348/27422909344_016e63cd7b_o.jpg,0.246162280702,0.25,0.738486842105,1.0,971,898,https://www.flickr.com/photos/67769979@N06/27422909344,https://creativecommons.org/licenses/by/2.0/,Robert J Heath,https://www.flickr.com/people/67769979@N06/ 4758e82e4d0eae1e,https://c1.staticflickr.com/8/7513/27440705685_948b30fa4c_o.jpg,0.421177266576,0.25,0.842354533153,1.0,792,546,https://www.flickr.com/photos/126337928@N05/27440705685,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ 2505e254190fe9d4,https://c1.staticflickr.com/1/290/32211735440_48219aa2e8_o.jpg,0.0,0.25,0.56338028169,1.0,309,245,https://www.flickr.com/photos/treegrow/32211735440,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ a96760eb484b75fb,https://c1.staticflickr.com/8/7490/29293364683_5668ef3b8d_o.jpg,0.0,0.0,1.0,0.666666666667,820,446,https://www.flickr.com/photos/danielecirillo/29293364683,https://creativecommons.org/licenses/by/2.0/,Daniele Cirillo,https://www.flickr.com/people/danielecirillo/ 938bea8b4ab594bd,https://c1.staticflickr.com/1/570/32266031296_27a364c086_o.jpg,0.394886363636,0.0,1.0,0.75,437,777,https://flickr.com/65344061@N06/32266031296,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ eb1856e56e61fab8,https://c1.staticflickr.com/9/8095/29161283935_536097e8b5_o.jpg,0.0,0.25,0.421177266576,1.0,625,617,https://www.flickr.com/photos/biblincoln/29161283935,https://creativecommons.org/licenses/by/2.0/,Biblioteca Centro Lincoln,https://www.flickr.com/people/biblincoln/ 0a15b5d1c46c744d,https://c1.staticflickr.com/6/5758/31148022711_c6bf92f9bc_o.jpg,0.4375,0.25,1.0,1.0,426,739,https://www.flickr.com/photos/dave_mcmt/31148022711/,https://creativecommons.org/licenses/by/2.0/,David Schott,https://www.flickr.com/people/dave_mcmt/ cf19139ce2adc82b,https://c1.staticflickr.com/1/392/32273907362_0741221913_o.jpg,0.419316375199,0.25,1.0,1.0,323,860,https://www.flickr.com/photos/gails_pictures/32273907362,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 13e7182ba061a3c4,https://c1.staticflickr.com/9/8589/28841296862_f840d0085b_o.jpg,0.0,0.0,0.666666666667,1.0,979,88,https://www.flickr.com/photos/byjpan/28841296862/,https://creativecommons.org/licenses/by/2.0/,Jack P.,https://www.flickr.com/people/byjpan/ 8dd5fbee4eb2386b,https://c1.staticflickr.com/9/8208/29852137561_e2e9180845_o.jpg,0.4375,0.0,1.0,0.75,891,886,https://www.flickr.com/photos/79649963@N05/29852137561,https://creativecommons.org/licenses/by/2.0/,Ian Smith,https://www.flickr.com/people/79649963@N05/ 3880e42cb2bfbb5b,https://c1.staticflickr.com/1/383/31462149674_2ee56fc772_o.jpg,0.25,0.25,1.0,1.0,970,983,https://flickr.com/7961680@N07/31462149674,https://creativecommons.org/licenses/by/2.0/,Per \303\205str\303\266m,https://www.flickr.com/people/perkovich/ 436e41e357a9a835,https://c1.staticflickr.com/9/8271/29684141221_a8435f2798_o.jpg,0.0,0.0,0.5625,0.75,672,847,https://www.flickr.com/photos/minnellium/29684141221,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/ 5aab23ea4c920648,https://c1.staticflickr.com/3/2077/32924780511_0acf6402dc_o.jpg,0.333333333333,0.0,1.0,1.0,822,487,https://www.flickr.com/photos/jafsegal/32924780511,https://creativecommons.org/licenses/by/2.0/,Juan Antonio F. Segal,https://www.flickr.com/people/jafsegal/ 9939c12d26d8ab14,https://c1.staticflickr.com/8/7270/27346074952_1ae70d0378_o.jpg,0.0,0.0,0.5625,0.75,489,40,https://www.flickr.com/photos/jeepersmedia/27346074952,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ c660ae3e8f58c5a3,https://c1.staticflickr.com/2/1562/26160109253_b3cce3ffc9_o.jpg,0.0,0.0,0.75,0.547453703704,901,532,https://www.flickr.com/photos/kansallisarkisto/26160109253/,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/ e5f0c68c9b17a3eb,https://c1.staticflickr.com/9/8587/27921604110_536872cda6_o.jpg,0.0,0.0,0.669128508124,1.0,407,10,https://www.flickr.com/photos/eltb/27921604110,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ a9968b7846f88291,https://c1.staticflickr.com/8/7455/27980114145_35b1d0cabe_o.jpg,0.0,0.25,0.599757673667,1.0,22,246,https://www.flickr.com/photos/andymorffew/27980114145,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ 930f631e3e4149be,https://c1.staticflickr.com/9/8553/29990415070_574c7905e3_o.jpg,0.0,0.0,0.75,1.0,336,183,https://www.flickr.com/photos/lisazins/29990415070,https://creativecommons.org/licenses/by/2.0/,Lisa Zins,https://www.flickr.com/people/lisazins/ 7127ae7a57a114d7,https://c1.staticflickr.com/8/7353/27534651771_77bf747d62_o.jpg,0.25,0.330508474576,1.0,0.991525423729,672,346,https://www.flickr.com/photos/dotcycling/27534651771,https://creativecommons.org/licenses/by/2.0/,Edward Madden,https://www.flickr.com/people/dotcycling/ f95073995e824c79,https://c1.staticflickr.com/8/7642/28271573451_59ca11a3d3_o.jpg,0.386138613861,0.0,1.0,1.0,31,657,https://www.flickr.com/photos/22711505@N05/28271573451,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 22aae574860f7707,https://c1.staticflickr.com/8/7665/27997660340_840a807eb2_o.jpg,0.0,0.0,0.666666666667,1.0,563,121,https://www.flickr.com/photos/harshlight/27997660340,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ 83e5531f7a7bf763,https://c1.staticflickr.com/9/8335/29071834671_4bf25f0f50_o.jpg,0.0,0.0,0.75,0.75,437,177,https://www.flickr.com/photos/moto_club4ag/29071834671/,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ d24b711676595550,https://c1.staticflickr.com/9/8602/28370802293_10265f8778_o.jpg,0.0,0.0,0.75,1.0,846,709,https://www.flickr.com/photos/kozemchuk/28370802293/,https://creativecommons.org/licenses/by/2.0/,Cat Branchman,https://www.flickr.com/people/kozemchuk/ ffbd496a3773f272,https://c1.staticflickr.com/6/5459/29898011053_2579ca21d2_o.jpg,0.43661971831,0.0,1.0,0.75,699,913,https://www.flickr.com/photos/arjanrichter/29898011053,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/ 13ae47106ae4c6eb,https://c1.staticflickr.com/6/5455/31318534216_ba4f34ae37_o.jpg,0.0,0.25,0.545454545455,1.0,322,20,https://www.flickr.com/photos/gails_pictures/31318534216,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 3308d968dc5088ba,https://c1.staticflickr.com/2/1483/26170739964_ee08c5de3c_o.jpg,0.28125,0.25,0.84375,1.0,920,318,https://www.flickr.com/photos/raver_mikey/26170739964/,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/ 761e179b569cbb65,https://c1.staticflickr.com/8/7310/27459603174_df7f2cfaab_o.jpg,0.385686528497,0.25,0.771373056995,1.0,976,85,https://www.flickr.com/photos/bryce_edwards/27459603174,https://creativecommons.org/licenses/by/2.0/,Bryce Edwards,https://www.flickr.com/people/bryce_edwards/ d55601ee34e61506,https://c1.staticflickr.com/1/732/32601252675_89d0ddb6a2_o.jpg,0.484397677794,0.0,0.968795355588,0.75,657,443,https://www.flickr.com/photos/nrmadriversseat/32601252675,https://creativecommons.org/licenses/by/2.0/,The NRMA,https://www.flickr.com/people/nrmadriversseat/ 4686354ec238f7fb,https://c1.staticflickr.com/1/264/31534645452_013364e969_o.jpg,0.496696035242,0.25,0.993392070485,1.0,699,383,https://www.flickr.com/photos/sybarite48/31534645452/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 943821e9d8495b9a,https://c1.staticflickr.com/1/547/31889107843_618ae4b2c6_o.jpg,0.0,0.299878836834,0.75,0.899636510501,714,586,https://flickr.com/89214878@N00/31889107843,https://creativecommons.org/licenses/by/2.0/,Mike P.,https://www.flickr.com/people/ncmichael2k3/ 0fd57e89e1f770a5,https://c1.staticflickr.com/8/7377/27802238295_88764abd6d_o.jpg,0.0,0.0,0.693233082707,1.0,556,2,https://www.flickr.com/photos/alan-light/27802238295/,https://creativecommons.org/licenses/by/2.0/,Alan Light,https://www.flickr.com/people/alan-light/ a3eb4aa2487253b8,https://c1.staticflickr.com/9/8156/29163978463_aa190b7c63_o.jpg,0.25,0.25,0.75,1.0,920,746,https://www.flickr.com/photos/shankaronline/29163978463,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 78f92d7dc8fefe9d,https://c1.staticflickr.com/9/8269/30167528292_da6c18aa78_o.jpg,0.0,0.0,0.75,0.56015625,429,146,https://www.flickr.com/photos/usfwsmtnprairie/30167528292,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 74a81b0154ea464c,https://c1.staticflickr.com/8/7020/26868558415_05d919684d_o.jpg,0.348396501458,0.0,1.0,1.0,822,570,https://www.flickr.com/photos/109484664@N04/26868558415,https://creativecommons.org/licenses/by/2.0/,\345\220\263\346\255\243\345\275\245,https://www.flickr.com/people/109484664@N04/ b95d98b194ffd652,https://c1.staticflickr.com/9/8654/28328913461_e88822fe56_o.jpg,0.467549476135,0.0,0.779249126892,0.75,405,888,https://www.flickr.com/photos/hisgett/28328913461/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 4b74a811cccfe27c,https://c1.staticflickr.com/6/5819/29487034154_bc83ff5ab8_o.jpg,0.0,0.25,0.5,1.0,909,190,https://www.flickr.com/photos/docsearls/29487034154/,https://creativecommons.org/licenses/by/2.0/,Doc Searls,https://www.flickr.com/people/docsearls/ 022464a6b73ac78f,https://c1.staticflickr.com/1/335/32308860330_9db300711d_o.jpg,0.400242326333,0.25,1.0,1.0,747,767,https://www.flickr.com/photos/mark6mauno/32308860330,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ 830f84f8ff5f8624,https://c1.staticflickr.com/8/7559/29572697533_022c278169_o.jpg,0.0,0.0,0.681583476764,0.75,739,789,https://flickr.com/33497841@N02/29572697533,https://creativecommons.org/licenses/by/2.0/,Andrey Zharkikh,https://www.flickr.com/people/zharkikh/ ee25ae4ed614485f,https://c1.staticflickr.com/9/8838/28758406970_66f6582fd4_o.jpg,0.25,0.25,1.0,1.0,986,727,https://www.flickr.com/photos/12463666@N03/28758406970,https://creativecommons.org/licenses/by/2.0/,Bob M ~,https://www.flickr.com/people/12463666@N03/ d1626847eb98b247,https://c1.staticflickr.com/6/5063/29568931484_b3c42d4148_o.jpg,0.0,0.0,0.5,0.75,297,667,https://www.flickr.com/photos/happymillerman/29568931484,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ 48bd18a61e43362e,https://c1.staticflickr.com/6/5540/31051504785_5a5359ab3d_o.jpg,0.0,0.0,0.75,0.695187165775,922,239,https://www.flickr.com/photos/puzzlemaster/31051504785,https://creativecommons.org/licenses/by/2.0/,Dave Miller,https://www.flickr.com/people/puzzlemaster/ df0a452152aefa20,https://c1.staticflickr.com/9/8553/30239978231_86d090f5ec_o.jpg,0.519869942197,0.0,1.0,0.75,780,219,https://www.flickr.com/photos/thoseguys119/30239978231,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ ab9e5f0b8cd457be,https://c1.staticflickr.com/8/7704/28201446563_2e0b0f516d_o.jpg,0.24882629108,0.0,1.0,1.0,324,371,https://www.flickr.com/photos/treegrow/28201446563/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 00f30b1ace5ae152,https://c1.staticflickr.com/6/5490/31088690622_9d19050fe4_o.jpg,0.443623639191,0.25,1.0,1.0,978,757,https://www.flickr.com/photos/paytonc/31088690622/,https://creativecommons.org/licenses/by/2.0/,Payton Chung,https://www.flickr.com/people/paytonc/ 624f4ad22b2a5bdd,https://c1.staticflickr.com/9/8191/29205519803_16fe3aa9e7_o.jpg,0.0,0.0,0.63184079602,0.75,998,127,https://www.flickr.com/photos/35142635@N05/29205519803,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ b829eb1561287f6f,https://c1.staticflickr.com/4/3950/32454933064_4df0afa09f_o.jpg,0.0,0.0,0.5,0.75,998,850,https://flickr.com/74747209@N05/32454933064,https://creativecommons.org/licenses/by/2.0/,David Lochlin,https://www.flickr.com/people/dlochlin/ fe72e21a5d16f001,https://c1.staticflickr.com/9/8203/28034675473_144f9e33c5_o.jpg,0.0,0.0,0.5,0.75,971,106,https://www.flickr.com/photos/sheila_sund/28034675473,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/ 1e02553088db06e3,https://c1.staticflickr.com/8/7291/27318215660_97391b6f8f_o.jpg,0.4375,0.0,1.0,0.75,909,658,https://www.flickr.com/photos/shankaronline/27318215660/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 0d370461dfbb6f78,https://c1.staticflickr.com/8/7204/27652338732_3cc9e7e348_o.jpg,0.0,0.0,0.662261380323,1.0,23,511,https://www.flickr.com/photos/robbertholf/27652338732/,https://creativecommons.org/licenses/by/2.0/,Rob Bertholf,https://www.flickr.com/people/robbertholf/ 92c8b80c0405671e,https://c1.staticflickr.com/6/5531/31038812965_4ca96063df_o.jpg,0.25,0.25,0.75,1.0,981,795,https://www.flickr.com/photos/amslerpix/31038812965/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 51b9093b57d20ebe,https://c1.staticflickr.com/6/5555/30544141035_c9959e867e_o.jpg,0.0,0.0,0.666666666667,1.0,512,318,https://www.flickr.com/photos/gee01/30544141035/,https://creativecommons.org/licenses/by/2.0/,Graeme Maclean,https://www.flickr.com/people/gee01/ 448c21b53f99400c,https://c1.staticflickr.com/9/8742/29102656201_0b787e2ca0_o.jpg,0.28125,0.25,0.84375,1.0,889,659,https://www.flickr.com/photos/fdecomite/29102656201/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ c209cb0358249ce7,https://c1.staticflickr.com/8/7368/26794305835_9e36031c97_o.jpg,0.328402366864,0.0,1.0,1.0,699,798,https://www.flickr.com/photos/lac-bac/26794305835,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/ ee3b28e75e65908a,https://c1.staticflickr.com/8/7298/27492883865_04c618b397_o.jpg,0.0,0.25,0.42174796748,1.0,4,334,https://www.flickr.com/photos/wilfred_hdez/27492883865/,https://creativecommons.org/licenses/by/2.0/,Wilfred Hdez,https://www.flickr.com/people/wilfred_hdez/ 388afbac9bd4e1b7,https://c1.staticflickr.com/9/8889/28101646034_15960cbc8c_o.jpg,0.25,0.25,0.75,1.0,699,482,https://www.flickr.com/photos/renaud-camus/28101646034,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/ ce6a112449ace122,https://c1.staticflickr.com/6/5338/30689455610_d4e8f21f57_o.jpg,0.25,0.0,0.75,0.75,840,852,https://www.flickr.com/photos/subharnab/30689455610/,https://creativecommons.org/licenses/by/2.0/,Subharnab Majumdar,https://www.flickr.com/people/subharnab/ 0bbf6087d1544642,https://c1.staticflickr.com/1/486/31615343902_c1f810ddef_o.jpg,0.4375,0.0,1.0,0.75,628,575,https://flickr.com/27665395@N05/31615343902,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 77bf5d409965f13c,https://c1.staticflickr.com/9/8118/29370307653_669bdf9f16_o.jpg,0.0,0.0,0.666666666667,1.0,406,580,https://flickr.com/49969498@N02/29370307653,https://creativecommons.org/licenses/by/2.0/,Robert Bell,https://www.flickr.com/people/roberttbell/ 31ace54344e225ec,https://c1.staticflickr.com/1/320/31213770534_06e172c749_o.jpg,0.0,0.0,1.0,1.0,441,663,https://flickr.com/125112383@N06/31213770534,https://creativecommons.org/licenses/by/2.0/,Shelby Bell,https://www.flickr.com/people/vwcampin/ a4877b3f0b5e4c64,https://c1.staticflickr.com/9/8480/28734303610_0109d83a82_o.jpg,0.28125,0.0,0.84375,0.75,763,576,https://www.flickr.com/photos/andrewmilligansumo/28734303610,https://creativecommons.org/licenses/by/2.0/,Andrew Milligan Sumo,https://www.flickr.com/people/andrewmilligansumo/ 2cd4f0f862b967ed,https://c1.staticflickr.com/6/5800/30170623111_3fe4f7d579_o.jpg,0.4375,0.0,1.0,0.75,570,543,https://www.flickr.com/photos/27665395@N05/30170623111,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 433d908574893a88,https://c1.staticflickr.com/8/7253/27448977372_9ce72750d8_o.jpg,0.5,0.0,1.0,0.75,405,416,https://www.flickr.com/photos/alessandroambrosetti/27448977372,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ 82dc0005f56c5499,https://c1.staticflickr.com/8/7655/27692948024_ae66e47c06_o.jpg,0.272727272727,0.0,1.0,1.0,548,831,https://www.flickr.com/photos/mtacc-esa/27692948024,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/ c32895e1183e0bcc,https://c1.staticflickr.com/6/5481/31308520082_f2fc661083_o.jpg,0.5,0.25,1.0,1.0,699,447,https://www.flickr.com/photos/shankaronline/31308520082,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ beab23c3bd78ee31,https://c1.staticflickr.com/9/8270/30100945556_52b57cc499_o.jpg,0.337738619677,0.0,1.0,1.0,763,155,https://www.flickr.com/photos/ilri/30100945556,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/ a188e7eecac298c9,https://c1.staticflickr.com/9/8759/27916461194_f9ae15ec67_o.jpg,0.25,0.2806640625,1.0,0.8419921875,106,843,https://www.flickr.com/photos/icte-uq/27916461194,https://creativecommons.org/licenses/by/2.0/,ICTE-UQ,https://www.flickr.com/people/icte-uq/ ee0ca63700e017cf,https://c1.staticflickr.com/6/5518/30876259314_7f62b073d5_o.jpg,0.28125,0.0,0.84375,0.75,469,685,https://www.flickr.com/photos/27665395@N05/30876259314,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ e753147a26dc7476,https://c1.staticflickr.com/1/575/31667531984_ebc2d85a0c_o.jpg,0.0,0.0,1.0,0.892491467577,314,297,https://www.flickr.com/photos/jsjgeology/31667531984,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 980bee466fe5c980,https://c1.staticflickr.com/6/5551/29766174040_1b52689746_o.jpg,0.4453125,0.25,0.890625,1.0,88,735,https://www.flickr.com/photos/usfwshq/29766174040,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/ d32f8fed46bda042,https://c1.staticflickr.com/9/8307/28566983863_0d4cfffb1c_o.jpg,0.25,0.0,1.0,1.0,664,556,https://www.flickr.com/photos/127226743@N02/28566983863,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 363cdf064b191be6,https://c1.staticflickr.com/9/8657/29734087243_771e4dee66_o.jpg,0.0,0.25,0.75,1.0,825,998,https://flickr.com/52066925@N00/29734087243,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ cab419eb5d18f714,https://c1.staticflickr.com/6/5491/31201579991_26064abfc9_o.jpg,0.0,0.0,0.714503816794,1.0,404,70,https://www.flickr.com/photos/usnavy/31201579991,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 7389c22c093b8d92,https://c1.staticflickr.com/8/7320/27196339156_9287fc2d41_o.jpg,0.0,0.280226209048,0.75,0.840678627145,498,463,https://www.flickr.com/photos/adonmetcalfe/27196339156/,https://creativecommons.org/licenses/by/2.0/,Adon Metcalfe,https://www.flickr.com/people/adonmetcalfe/ 3e9ff6fcffd8a215,https://c1.staticflickr.com/8/7257/27583687250_fde805472c_o.jpg,0.0,0.0,1.0,0.75,953,278,https://www.flickr.com/photos/scotnelson/27583687250,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 6bfac6c17b68514e,https://c1.staticflickr.com/6/5657/31200173845_dcfd9baab4_o.jpg,0.38379705401,0.25,1.0,1.0,402,743,https://www.flickr.com/photos/arbron/31200173845,https://creativecommons.org/licenses/by/2.0/,Jeff Hitchcock,https://www.flickr.com/people/arbron/ 7feb0e015d912a52,https://c1.staticflickr.com/1/400/31689010341_9d4c68311b_o.jpg,0.249079528719,0.0,0.747238586156,0.75,768,542,https://www.flickr.com/photos/fukapon/31689010341,https://creativecommons.org/licenses/by/2.0/,Ryo FUKAsawa,https://www.flickr.com/people/fukapon/ 1c0a194ed36b0d9b,https://c1.staticflickr.com/1/564/32372194010_2a90b203e8_o.jpg,0.28125,0.0,0.84375,0.75,12,227,https://www.flickr.com/photos/9750464@N02/32372194010/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ c4e68fafdab6b9fe,https://c1.staticflickr.com/1/439/31737271212_bfec6aa02f_o.jpg,0.25,0.0,0.75,0.75,788,808,https://www.flickr.com/photos/hinnosaar/31737271212/,https://creativecommons.org/licenses/by/2.0/,Marit & Toomas Hinnosaar,https://www.flickr.com/people/hinnosaar/ bf962faabe206781,https://c1.staticflickr.com/9/8514/29112927886_0fcb140c97_o.jpg,0.25,0.0,0.75,0.75,561,282,https://www.flickr.com/photos/trainor/29112927886,https://creativecommons.org/licenses/by/2.0/,John Trainor,https://www.flickr.com/people/trainor/ 1a6271e261fdfdf9,https://c1.staticflickr.com/9/8883/27906130124_49051d6888_o.jpg,0.25,0.0,1.0,1.0,983,798,https://flickr.com/87308807@N02/27906130124,https://creativecommons.org/licenses/by/2.0/,Iv\303\241n G\303\266ldner,https://www.flickr.com/people/goldnerivan/ c585e06197b8c84a,https://c1.staticflickr.com/6/5453/30756196555_de7fdbc963_o.jpg,0.0,0.0,0.75,1.0,789,482,https://www.flickr.com/photos/southbeachcars/30756196555,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ e0d9092114d277ec,https://c1.staticflickr.com/8/7265/26598960830_999907788f_o.jpg,0.0,0.0,0.75,1.0,441,915,https://www.flickr.com/photos/adactio/26598960830,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/ 1e8904b120e1f284,https://c1.staticflickr.com/9/8207/29915403766_aaae2f6871_o.jpg,0.0,0.25,0.5,1.0,696,396,https://www.flickr.com/photos/ratsiola/29915403766/,https://creativecommons.org/licenses/by/2.0/,Carole Ratcliffe,https://www.flickr.com/people/ratsiola/ daa831434205f3c3,https://c1.staticflickr.com/6/5481/30585811573_a82004afbb_o.jpg,0.486146095718,0.0,0.972292191436,1.0,514,490,https://flickr.com/7660730@N08/30585811573,https://creativecommons.org/licenses/by/2.0/,Jeremy Sutcliffe,https://www.flickr.com/people/jmts/ f867b767f6b245cb,https://c1.staticflickr.com/6/5700/22845875308_0d921bb472_o.jpg,0.25578358209,0.0,0.767350746269,0.75,848,770,https://www.flickr.com/photos/13476480@N07/22845875308,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ aab252999b9b9014,https://c1.staticflickr.com/8/7259/26837019160_c030da6fe2_o.jpg,0.333333333333,0.0,1.0,1.0,440,317,https://www.flickr.com/photos/agenciabrasilia/26837019160,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 1a4a654761add5b3,https://c1.staticflickr.com/9/8835/27592931573_0760985b65_o.jpg,0.0,0.25,0.5625,1.0,970,634,https://www.flickr.com/photos/28655296@N05/27592931573,https://creativecommons.org/licenses/by/2.0/,Daniel Zemans,https://www.flickr.com/people/28655296@N05/ a0d5fed0fea4b616,https://c1.staticflickr.com/8/7449/27146181675_730600ae0b_o.jpg,0.248713235294,0.0,0.746139705882,0.75,536,894,https://flickr.com/41819313@N02/27146181675,https://creativecommons.org/licenses/by/2.0/,Kullez,https://www.flickr.com/people/kullez/ 9d243db2a0bf7869,https://c1.staticflickr.com/9/8119/28282479934_09da66c0e9_o.jpg,0.305872756933,0.25,0.917618270799,1.0,935,258,https://www.flickr.com/photos/personalcreations/28282479934,https://creativecommons.org/licenses/by/2.0/,Personal Creations,https://www.flickr.com/people/personalcreations/ 3a7bc8ed4b6dc324,https://c1.staticflickr.com/8/7216/27992528095_e4bf69b603_o.jpg,0.0,0.0,0.549459041731,0.75,672,216,https://www.flickr.com/photos/glorycycles/27992528095,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 008406d8927fdbcc,https://c1.staticflickr.com/6/5478/31105278941_fa9e75b0e4_o.jpg,0.0,0.0,1.0,1.0,734,397,https://www.flickr.com/photos/stoneysteiner/31105278941,https://creativecommons.org/licenses/by/2.0/,Urs Steiner,https://www.flickr.com/people/stoneysteiner/ ebeebcaa29004e3e,https://c1.staticflickr.com/6/5794/30525253662_7a30a520c3_o.jpg,0.400242326333,0.0,1.0,0.75,760,730,https://www.flickr.com/photos/29233640@N07/30525253662,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ 0a99995ddb1867f3,https://c1.staticflickr.com/8/7403/28077883525_2bd2dcbca1_o.jpg,0.4375,0.0,1.0,0.75,728,167,https://www.flickr.com/photos/sansebastian2016/28077883525,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/ f379d6c61b7a04ac,https://c1.staticflickr.com/8/7432/27059543105_d8e13c9f7a_o.jpg,0.0,0.25,0.347358722359,1.0,798,662,https://www.flickr.com/photos/22711505@N05/27059543105,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 31a1725470c1488a,https://c1.staticflickr.com/9/8411/30029130861_7b54ea1d60_o.jpg,0.0,0.0,0.657393850659,1.0,561,935,https://www.flickr.com/photos/codnewsroom/30029130861,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 3fadb3547b49e42b,https://c1.staticflickr.com/1/329/30762790953_28b393240e_o.jpg,0.25,0.0,1.0,0.75,873,875,https://www.flickr.com/photos/brickset/30762790953,https://creativecommons.org/licenses/by/2.0/,Brickset,https://www.flickr.com/people/brickset/ bb96c34e00d38548,https://c1.staticflickr.com/9/8415/29737698241_f8cf12c2b9_o.jpg,0.271313364055,0.25,0.813940092166,1.0,672,799,https://www.flickr.com/photos/minnellium/29737698241,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/ 80c585c5254c437e,https://c1.staticflickr.com/9/8697/27905149733_516f45a4e3_o.jpg,0.530714285714,0.0,1.0,0.75,890,370,https://www.flickr.com/photos/130531732@N06/27905149733,https://creativecommons.org/licenses/by/2.0/,blake martin,https://www.flickr.com/people/130531732@N06/ 0930b8ffd43f34b1,https://c1.staticflickr.com/6/5519/30039197060_c1e5faa34e_o.jpg,0.333333333333,0.0,1.0,1.0,854,118,https://www.flickr.com/photos/slapers/30039197060,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ c63cc3767c524369,https://c1.staticflickr.com/6/5468/31128860712_23523a37a2_o.jpg,0.249631811487,0.0,0.748895434462,0.75,405,473,https://www.flickr.com/photos/ronmacphotos/31128860712,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 0afba967c45abe04,https://c1.staticflickr.com/9/8548/29339278920_8609ec36b7_o.jpg,0.25,0.25,0.75,1.0,437,887,https://www.flickr.com/photos/greggjerdingen/29339278920,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 6981ca9d69e64abd,https://c1.staticflickr.com/6/5603/30480823370_46686876a0_o.jpg,0.279641185647,0.0,0.838923556942,0.75,566,926,https://www.flickr.com/photos/loshak/30480823370,https://creativecommons.org/licenses/by/2.0/,Daniel ............,https://www.flickr.com/people/loshak/ caddbedf7c8f6773,https://c1.staticflickr.com/2/1481/26682525762_24842d3ede_o.jpg,0.277173913043,0.25,0.83152173913,1.0,896,258,https://www.flickr.com/photos/watts_photos/26682525762/,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ f3a7808e587dfa4b,https://c1.staticflickr.com/9/8068/29607892536_c32a3c9625_o.jpg,0.0,0.0,0.710456942004,0.75,982,426,https://www.flickr.com/photos/apardavila/29607892536,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 4a79f29049b0a1f9,https://c1.staticflickr.com/8/7708/27426104300_1476f7bf87_o.jpg,0.0,0.0,0.665684830633,1.0,702,396,https://www.flickr.com/photos/7armyjmtc/27426104300/,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ f2649bdb297c53a9,https://c1.staticflickr.com/8/7634/28075098296_a1161927d4_o.jpg,0.4435,0.25,1.0,1.0,338,451,https://www.flickr.com/photos/usdagov/28075098296,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 43c64978d0fbb6b8,https://c1.staticflickr.com/8/7214/26944572074_a2764006f3_o.jpg,0.4375,0.25,1.0,1.0,485,405,https://www.flickr.com/photos/mike_on_maui/26944572074,https://creativecommons.org/licenses/by/2.0/,Mike On Maui,https://www.flickr.com/people/mike_on_maui/ aa7bdaac048582b6,https://c1.staticflickr.com/6/5349/30840873650_452a29ab39_o.jpg,0.0,0.0,0.346012269939,0.75,780,866,https://www.flickr.com/photos/thoseguys119/30840873650/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 93935ce715ae7fbb,https://c1.staticflickr.com/6/5779/30658908161_ef8145c265_o.jpg,0.25,0.0,1.0,0.5625,973,509,https://www.flickr.com/photos/jsjgeology/30658908161,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 87eb904de9b971b6,https://c1.staticflickr.com/9/8708/29230988931_1fa482f1cd_o.jpg,0.333333333333,0.0,1.0,1.0,548,866,https://www.flickr.com/photos/rhemkes/29230988931,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ d043e3efb7bec65b,https://c1.staticflickr.com/1/409/32368343910_00c1869788_o.jpg,0.25,0.0,0.75,0.75,324,79,https://www.flickr.com/photos/usfws_pacificsw/32368343910/,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ 2d0db6d4241331e5,https://c1.staticflickr.com/8/7427/27202888920_8c18eebd4d_o.jpg,0.0,0.0,0.663235294118,1.0,583,285,https://www.flickr.com/photos/agenciabrasilia/27202888920,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ d58141fef36305cc,https://c1.staticflickr.com/8/7183/27128807654_41bb42e10d_o.jpg,0.25,0.0,0.75,0.75,367,449,https://www.flickr.com/photos/tiborbkovacs/27128807654,https://creativecommons.org/licenses/by/2.0/,Tibor Kovacs,https://www.flickr.com/people/tiborbkovacs/ 5f2a8fc47dfdcb89,https://c1.staticflickr.com/3/2246/31996755134_c6f0bcb556_o.jpg,0.346121416526,0.0,1.0,0.75,304,660,https://www.flickr.com/photos/33398884@N03/31996755134/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 7c70bfac0d9e87f6,https://c1.staticflickr.com/8/7423/27409898083_7637e62431_o.jpg,0.25,0.0,1.0,0.599757673667,524,340,https://www.flickr.com/photos/jeffmarquis/27409898083/,https://creativecommons.org/licenses/by/2.0/,Jeff Marquis,https://www.flickr.com/people/jeffmarquis/ 52793d6197d6aa0f,https://c1.staticflickr.com/6/5499/30755112636_8d002b7c0f_o.jpg,0.25,0.0,0.75,0.75,760,385,http://www.flickr.com/photos/ronaldc5/30755112636/,https://creativecommons.org/licenses/by/2.0/,Ronald van der Graaf,https://www.flickr.com/people/ronaldc5/ c5a8ac6184d5c69f,https://c1.staticflickr.com/9/8719/28884591926_fbc5cd67a9_o.jpg,0.28125,0.25,0.84375,1.0,896,739,https://www.flickr.com/photos/codnewsroom/28884591926,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ b47f9e26e1ec653b,https://c1.staticflickr.com/9/8624/27623886903_bb07e068ea_o.jpg,0.25,0.0,0.75,0.75,905,60,https://www.flickr.com/photos/ben_salter/27623886903,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 1f6f48e7c81f5e25,https://c1.staticflickr.com/9/8186/28956447210_fb9b378044_o.jpg,0.333333333333,0.0,1.0,1.0,979,81,https://www.flickr.com/photos/steve_in_atlanta/28956447210,https://creativecommons.org/licenses/by/2.0/,Steve,https://www.flickr.com/people/steve_in_atlanta/ 13a6c001cdcc1c70,https://c1.staticflickr.com/9/8847/27880411473_b599b38056_o.jpg,0.0,0.0,0.666666666667,1.0,407,903,https://www.flickr.com/photos/larry1732/27880411473/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ c9a443a5cc1acfdf,https://c1.staticflickr.com/9/8431/29010176581_6da873f60e_o.jpg,0.248348017621,0.25,0.745044052863,1.0,498,768,https://www.flickr.com/photos/sybarite48/29010176581,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ ac360a84897a9bd5,https://c1.staticflickr.com/9/8303/29752226911_d87a3448c3_o.jpg,0.0,0.0,1.0,1.0,704,873,https://www.flickr.com/photos/mpclemens/29752226911,https://creativecommons.org/licenses/by/2.0/,mpclemens,https://www.flickr.com/people/mpclemens/ e05d35da9e624c73,https://c1.staticflickr.com/9/8587/28595409065_2e029b5172_o.jpg,0.0,0.267938931298,0.75,0.803816793893,279,8,https://www.flickr.com/photos/blmidaho/28595409065,https://creativecommons.org/licenses/by/2.0/,BLMIdaho,https://www.flickr.com/people/blmidaho/ b8f16a207bf4bbc4,https://c1.staticflickr.com/8/7477/27909350633_4c12522e42_o.jpg,0.25,0.25,0.75,1.0,820,97,https://www.flickr.com/photos/mtnorton/27909350633,https://creativecommons.org/licenses/by/2.0/,Mike Norton,https://www.flickr.com/people/mtnorton/ 3b6295b6cca8f76b,https://c1.staticflickr.com/6/5097/29423061494_de8a7f66d4_o.jpg,0.4375,0.25,1.0,1.0,941,65,https://www.flickr.com/photos/krossbow/29423061494,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/ f25c33076f4bd633,https://c1.staticflickr.com/9/8506/29978737455_88f9cd0cb4_o.jpg,0.500736377025,0.25,1.0,1.0,875,511,https://www.flickr.com/photos/brisbanecitycouncil/29978737455,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/ 4ad26f8dec139f8a,https://c1.staticflickr.com/6/5648/30596701323_8aee729710_o.jpg,0.25,0.272307692308,1.0,0.816923076923,431,424,https://www.flickr.com/photos/klemencic/30596701323/,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/ a01282c9feab6368,https://c1.staticflickr.com/3/2745/32942643125_0c8f6c79f4_o.jpg,0.25,0.0,1.0,1.0,973,710,https://www.flickr.com/photos/woodhead/32942643125/,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/ 60af2cce23d19d1e,https://c1.staticflickr.com/9/8085/29345609630_2cc66ba555_o.jpg,0.25,0.502573529412,1.0,1.0,920,801,https://www.flickr.com/photos/slgc/29345609630,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ c04f67393c22131f,https://c1.staticflickr.com/8/7327/26670688254_b6bbc5680d_o.jpg,0.4375,0.25,1.0,1.0,780,58,https://www.flickr.com/photos/thoseguys119/26670688254,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c6471a50c7d67adb,https://c1.staticflickr.com/1/558/32159828690_5d79cce558_o.jpg,0.249631811487,0.0,0.748895434462,0.75,526,329,https://flickr.com/94132145@N04/32159828690,https://creativecommons.org/licenses/by/2.0/,Arjan,https://www.flickr.com/people/94132145@N04/ 204972369ced810e,https://c1.staticflickr.com/9/8885/28678093464_23e92d78fb_o.jpg,0.0,0.304782608696,0.75,1.0,707,698,https://www.flickr.com/photos/peterhess/28678093464,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/ 9066202fcefbca71,https://c1.staticflickr.com/8/7406/27401837481_87a1de8737_o.jpg,0.5,0.0,1.0,0.75,874,906,https://www.flickr.com/photos/o_0/27401837481,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ fb0092e7515cc5ea,https://c1.staticflickr.com/9/8700/29506539155_471666c5a8_o.jpg,0.25,0.25,0.75,1.0,896,438,https://www.flickr.com/photos/ronmacphotos/29506539155,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ acee4c464ce69a1b,https://c1.staticflickr.com/6/5345/29225997854_2b6f804054_o.jpg,0.0,0.0,0.75,1.0,699,618,https://www.flickr.com/photos/davidstanleytravel/29225997854,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ ca71835f0e94262f,https://c1.staticflickr.com/6/5313/30078258712_607bf4b9a3_o.jpg,0.333333333333,0.0,1.0,1.0,704,731,https://www.flickr.com/photos/120663298@N03/30078258712/,https://creativecommons.org/licenses/by/2.0/,Gabriel Cabral,https://www.flickr.com/people/120663298@N03/ 3a6fdb1fd754242b,https://c1.staticflickr.com/9/8429/28645788784_bd0b30acfe_o.jpg,0.0,0.0,0.75,0.75,986,614,https://www.flickr.com/photos/atoach/28645788784,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 2138d0c3f771a3ea,https://c1.staticflickr.com/8/7210/27200101776_5aab37cda3_o.jpg,0.25,0.25,0.75,1.0,477,372,https://www.flickr.com/photos/houserockr/27200101776,https://creativecommons.org/licenses/by/2.0/,Frank Meffert,https://www.flickr.com/people/houserockr/ fdf5aaf12ca3a826,https://c1.staticflickr.com/1/614/31450822432_cedbb905a2_o.jpg,0.499263622975,0.25,0.99852724595,1.0,820,473,https://www.flickr.com/photos/7armyjmtc/31450822432/,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 707aaa7ea7229969,https://c1.staticflickr.com/9/8746/28387810034_cbae424600_o.jpg,0.500736377025,0.25,1.0,1.0,356,459,https://www.flickr.com/photos/markyharky/28387810034,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ badccceef4df3cd4,https://c1.staticflickr.com/6/5658/29990241343_e59f1a0c02_o.jpg,0.0,0.330871491876,1.0,1.0,498,587,https://www.flickr.com/photos/quinet/29990241343,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ ef48a3c4d4c1aebe,https://c1.staticflickr.com/9/8471/28939285881_8557e7cb0a_o.jpg,0.5,0.25,1.0,1.0,662,701,https://www.flickr.com/photos/greggjerdingen/28939285881,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 146a662dab4e1136,https://c1.staticflickr.com/6/5011/30033414011_123935b028_o.jpg,0.27032208589,0.25,0.810966257669,1.0,885,445,https://www.flickr.com/photos/dalbera/30033414011,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 5f94856814c2d6d8,https://c1.staticflickr.com/8/7547/26956803836_fd7ff54f2f_o.jpg,0.5,0.25,1.0,1.0,699,757,https://www.flickr.com/photos/quinet/26956803836/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 2a486b3d640e9352,https://c1.staticflickr.com/3/2089/32757850831_5d5f1e1fdd_o.jpg,0.0,0.25,0.5625,1.0,735,517,https://www.flickr.com/photos/27665395@N05/32757850831,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 19ae72975d9b23e8,https://c1.staticflickr.com/9/8134/29339188186_264ebc8f71_o.jpg,0.0,0.0,0.75,0.75,402,539,https://www.flickr.com/photos/142129088@N03/29339188186,https://creativecommons.org/licenses/by/2.0/,Paul Bischoff,https://www.flickr.com/people/142129088@N03/ 26ebae87051d30b4,https://c1.staticflickr.com/8/7368/26873141942_186eb38b69_o.jpg,0.0,0.25,0.5,1.0,818,976,https://www.flickr.com/photos/jaguarcarsmena/26873141942/,https://creativecommons.org/licenses/by/2.0/,Jaguar MENA,https://www.flickr.com/people/jaguarcarsmena/ 2fd6612a2097bdc0,https://c1.staticflickr.com/6/5655/29692093420_e8d0892705_o.jpg,0.0,0.0,0.5,0.75,560,476,https://www.flickr.com/photos/auburnalumniassociation/29692093420,https://creativecommons.org/licenses/by/2.0/,Auburn Alumni Association,https://www.flickr.com/people/auburnalumniassociation/ fe1e574cec7ca19f,https://c1.staticflickr.com/9/8415/29056638823_f12e5a242f_o.jpg,0.25,0.0,1.0,0.5,88,163,https://www.flickr.com/photos/usfwshq/29056638823,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/ deb2311cdf19a0d4,https://c1.staticflickr.com/6/5722/30174629172_4eca1fff94_o.jpg,0.332842415317,0.0,0.99852724595,1.0,820,273,https://www.flickr.com/photos/agenciabrasilia/30174629172/,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 8b2e77f4c3e29b95,https://c1.staticflickr.com/9/8318/29472078206_9ff67af178_o.jpg,0.0,0.0,0.5,0.75,896,376,https://www.flickr.com/photos/ronmacphotos/29472078206,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 22011cb97c752dac,https://c1.staticflickr.com/8/7108/26380756034_280dcf12f0_o.jpg,0.25,0.0,1.0,0.5,422,778,https://www.flickr.com/photos/cohenvandervelde/26380756034,https://creativecommons.org/licenses/by/2.0/,Cohen Van der Velde,https://www.flickr.com/people/cohenvandervelde/ d13fca34f5207720,https://c1.staticflickr.com/6/5762/30386317111_91f9155463_o.jpg,0.0,0.0,0.7484375,1.0,948,564,https://www.flickr.com/photos/vermazeren/30386317111/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Arend,https://www.flickr.com/people/vermazeren/ 46bf6c496ff2d429,https://c1.staticflickr.com/8/7145/28268880796_8943906645_o.jpg,0.210588633288,0.0,0.631765899865,0.75,400,164,https://www.flickr.com/photos/anakbrunei/28268880796,https://creativecommons.org/licenses/by/2.0/,Reedz Malik,https://www.flickr.com/people/anakbrunei/ 15e7b277cdea5985,https://c1.staticflickr.com/8/7375/27733231050_345e4ae385_o.jpg,0.462155963303,0.0,1.0,0.75,133,383,https://www.flickr.com/photos/taylar/27733231050,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/ 6319d8a3f0340262,https://c1.staticflickr.com/8/7276/27089952992_ff499217a8_o.jpg,0.43661971831,0.0,1.0,0.75,309,300,https://www.flickr.com/photos/treegrow/27089952992/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 7fbb8fd74193ec21,https://c1.staticflickr.com/8/7132/27607256635_151ffa151f_o.jpg,0.400242326333,0.0,1.0,0.75,986,781,https://www.flickr.com/photos/143049688@N08/27607256635/,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ 42037326706ff094,https://c1.staticflickr.com/1/562/31118615674_e994602beb_o.jpg,0.25,0.0,1.0,1.0,539,949,https://www.flickr.com/photos/127226743@N02/31118615674/,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ e1d0a5989d08d8d9,https://c1.staticflickr.com/6/5788/30435125102_25b0d745cf_o.jpg,0.2515625,0.0,1.0,1.0,976,49,https://www.flickr.com/photos/docentjoyce/30435125102,https://creativecommons.org/licenses/by/2.0/,docentjoyce,https://www.flickr.com/people/docentjoyce/ 5f7bac93f275858e,https://c1.staticflickr.com/1/744/31730099583_ace5e9ed02_o.jpg,0.0,0.25,0.442094313454,1.0,561,926,https://www.flickr.com/photos/sfupamr/31730099583,https://creativecommons.org/licenses/by/2.0/,Simon Fraser University - University Communications,https://www.flickr.com/people/sfupamr/ 8487e1e6c56c0744,https://c1.staticflickr.com/8/7360/26557446393_32d960f375_o.jpg,0.333333333333,0.0,1.0,1.0,437,147,https://www.flickr.com/photos/greggjerdingen/26557446393,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ ec00b250649db024,https://c1.staticflickr.com/1/615/32618222115_31f2f95243_o.jpg,0.0,0.25,0.5,1.0,898,86,https://www.flickr.com/photos/lge/32618222115,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ aa80dc6c1115e998,https://c1.staticflickr.com/9/8269/28527436475_12327283e3_o.jpg,0.0,0.25,0.5,1.0,405,470,https://www.flickr.com/photos/jamesabbott1963/28527436475,https://creativecommons.org/licenses/by/2.0/,James Abbott,https://www.flickr.com/people/jamesabbott1963/ d39d55a48261734f,https://c1.staticflickr.com/9/8220/28523020533_a73b2d8acf_o.jpg,0.25,0.0,1.0,0.5,558,957,https://flickr.com/87533529@N00/28523020533,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/ 9f7ee96eb0d4f98a,https://c1.staticflickr.com/1/282/31584711634_8551e59e07_o.jpg,0.4108,0.0,1.0,0.75,511,594,https://www.flickr.com/photos/armymaterielcommand/31584711634/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/ ef1846af3e7a330b,https://c1.staticflickr.com/9/8644/27862254563_08bcf26a1b_o.jpg,0.0,0.25,0.533105022831,1.0,95,89,https://www.flickr.com/photos/usfwsmtnprairie/27862254563,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 94d48df37fbc104a,https://c1.staticflickr.com/8/7046/27192748371_ca86d857bd_o.jpg,0.25,0.267938931298,1.0,0.803816793893,611,600,https://www.flickr.com/photos/spreadshirt/27192748371,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/ 80a131e73a3c8cf7,https://c1.staticflickr.com/9/8111/28067149344_17906865d9_o.jpg,0.0,0.0,0.666666666667,1.0,662,923,https://www.flickr.com/photos/greggjerdingen/28067149344,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ f754f9bf19b69b3f,https://c1.staticflickr.com/8/7292/26702521944_0a1f6d242b_o.jpg,0.0,0.0,0.473457675753,0.75,100,399,https://flickr.com/7138083@N04/26702521944,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/ a959719b8ad773bb,https://c1.staticflickr.com/6/5739/30062522396_b0c32fb59e_o.jpg,0.258620689655,0.25,0.775862068966,1.0,830,236,https://www.flickr.com/photos/robdammers/30062522396/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 307a646d5907399b,https://c1.staticflickr.com/8/7439/27802389360_68e7ee2011_o.jpg,0.0,0.0,0.5,0.75,718,275,https://www.flickr.com/photos/greggjerdingen/27802389360/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 3e69002b10ae1ac2,https://c1.staticflickr.com/9/8170/29385452862_73f8628514_o.jpg,0.498153618907,0.25,1.0,1.0,566,424,https://www.flickr.com/photos/28101583@N07/29385452862,https://creativecommons.org/licenses/by/2.0/,Drew Jacksich,https://www.flickr.com/people/28101583@N07/ d1a47e5b24283cbf,https://c1.staticflickr.com/8/7697/26831428854_09debea7b8_o.jpg,0.25,0.25,0.75,1.0,739,571,http://www.flickr.com/photos/blumenbiene/26831428854/,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ ac81b69c57b36643,https://c1.staticflickr.com/9/8777/29553052506_abf6154dde_o.jpg,0.25,0.25,0.75,1.0,577,816,https://www.flickr.com/photos/24326549@N04/29553052506,https://creativecommons.org/licenses/by/2.0/,Alan Farhadi,https://www.flickr.com/people/24326549@N04/ 901d0ef47db97d24,https://c1.staticflickr.com/1/198/30723885964_9eb35f498e_o.jpg,0.0,0.25,0.75,1.0,634,993,https://www.flickr.com/photos/church4u2/30723885964,https://creativecommons.org/licenses/by/2.0/,Church Iglesia,https://www.flickr.com/people/church4u2/ ab98e77562b54546,https://c1.staticflickr.com/6/5682/31219758961_971bb9d3ee_o.jpg,0.0,0.0,0.5,0.75,405,351,https://www.flickr.com/photos/janitors/31219758961,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 623b2e5402d57bee,https://c1.staticflickr.com/9/8129/29400877184_87a8ae4e33_o.jpg,0.25,0.25,1.0,0.75,709,365,https://www.flickr.com/photos/cwpt/29400877184,https://creativecommons.org/licenses/by/2.0/,Civil War Trust,https://www.flickr.com/people/cwpt/ 1916f530c6d2d9e4,https://c1.staticflickr.com/8/7472/27937780372_d6b5209ab5_o.jpg,0.249079528719,0.25,0.747238586156,1.0,407,911,https://www.flickr.com/photos/eltb/27937780372,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ ae6d7204c6a7bf9f,https://c1.staticflickr.com/6/5514/30437523714_6c268d73ea_o.jpg,0.0,0.0,0.666666666667,1.0,979,962,https://www.flickr.com/photos/markwatmough/30437523714/,https://creativecommons.org/licenses/by/2.0/,mark.watmough,https://www.flickr.com/people/markwatmough/ f7fb7eec15f029c4,https://c1.staticflickr.com/9/8751/28206568651_b4f618383b_o.jpg,0.25,0.25,0.75,1.0,918,664,https://www.flickr.com/photos/inucara/28206568651,https://creativecommons.org/licenses/by/2.0/,Kentaro Ohno,https://www.flickr.com/people/inucara/ 9e9121bdae2c27ad,https://c1.staticflickr.com/8/7176/26995500171_5bba705a27_o.jpg,0.0,0.0,0.75,1.0,886,687,https://flickr.com/95259583@N07/26995500171,https://creativecommons.org/licenses/by/2.0/,Luna Tick,https://www.flickr.com/people/gryffindorhermione/ ca0319c371bebe83,https://c1.staticflickr.com/6/5530/31192976426_a85bb45c64_o.jpg,0.0,0.25,0.5,1.0,719,348,https://www.flickr.com/photos/asiandevelopmentbank/31192976426,https://creativecommons.org/licenses/by/2.0/,Asian Development Bank,https://www.flickr.com/people/asiandevelopmentbank/ dc7426826012c210,https://c1.staticflickr.com/1/596/32628983432_1cd51300fa_o.jpg,0.330871491876,0.0,1.0,1.0,24,916,https://www.flickr.com/photos/usfwsmidwest/32628983432,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 2757ae4fe8cbd972,https://c1.staticflickr.com/6/5040/30009355305_c3b41316c5_o.jpg,0.0,0.0,0.75,1.0,990,965,https://www.flickr.com/photos/104342908@N08/30009355305,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/ 355a44797aab094f,https://c1.staticflickr.com/6/5660/31839329502_e4074fe69f_o.jpg,0.25,0.0,0.75,0.75,706,651,https://www.flickr.com/photos/126337928@N05/31839329502,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ 54b2ba38ef3afa24,https://c1.staticflickr.com/9/8111/28503803912_d92ecb56e7_o.jpg,0.482608695652,0.0,0.965217391304,0.75,780,352,https://www.flickr.com/photos/thoseguys119/28503803912,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ b8b9c72bfbce7c69,https://c1.staticflickr.com/2/1447/26152597154_570c522764_o.jpg,0.25,0.4375,1.0,1.0,323,409,https://www.flickr.com/photos/chaz_pics/26152597154,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ f3115d87f72e548d,https://c1.staticflickr.com/3/2603/32886440142_197d8d41e4_o.jpg,0.25,0.0,0.75,0.75,706,689,https://www.flickr.com/photos/126337928@N05/32886440142/,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ 3e095a43e7443694,https://c1.staticflickr.com/9/8894/29732005106_9dc78bf27a_o.jpg,0.0,0.0,0.5,0.75,699,456,https://www.flickr.com/photos/o_0/29732005106/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 95d9b51b721cddd7,https://c1.staticflickr.com/8/7245/26856729915_9fe9b57534_o.jpg,0.333333333333,0.0,1.0,1.0,512,655,https://www.flickr.com/photos/42220226@N07/26856729915,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 6c46143971987fc2,https://c1.staticflickr.com/8/7301/27465602125_57f6085011_o.jpg,0.501840942563,0.0,1.0,0.75,820,481,https://www.flickr.com/photos/136804067@N08/27465602125/,https://creativecommons.org/licenses/by/2.0/,austin Lan,https://www.flickr.com/people/136804067@N08/ b472c12a56756eb7,https://c1.staticflickr.com/1/717/31766109604_6e79bd5edd_o.jpg,0.28125,0.0,0.84375,0.75,644,138,https://www.flickr.com/photos/garryknight/31766109604,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ fa66718eb93baaab,https://c1.staticflickr.com/6/5619/30582869910_dc84cf08ba_o.jpg,0.318416523236,0.0,1.0,0.75,650,728,https://www.flickr.com/photos/gruenemann/30582869910,https://creativecommons.org/licenses/by/2.0/,John W. Schulze,https://www.flickr.com/people/gruenemann/ 419a316206121b96,https://c1.staticflickr.com/8/7114/26281651903_e44a9a1536_o.jpg,0.5,0.0,1.0,0.75,405,763,https://www.flickr.com/photos/km30192002/26281651903,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/ 7fe904ea203ca17c,https://c1.staticflickr.com/9/8084/29739894401_623d5d2c36_o.jpg,0.0,0.333333333333,1.0,1.0,459,895,https://www.flickr.com/photos/daveynin/29739894401,https://creativecommons.org/licenses/by/2.0/,daveynin,https://www.flickr.com/people/daveynin/ 4bc3c70084c781d4,https://c1.staticflickr.com/8/7465/27073285610_327a271aaf_o.jpg,0.424446202532,0.0,1.0,0.75,653,566,https://www.flickr.com/photos/dfmagazine/27073285610,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/ 9d74c0605512a0a8,https://c1.staticflickr.com/8/7377/27687844380_448207c3a0_o.jpg,0.320534223706,0.25,0.961602671119,1.0,896,46,https://www.flickr.com/photos/hisgett/27687844380/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ c63383968413f24b,https://c1.staticflickr.com/8/7165/27369877691_eea8c23530_o.jpg,0.214651639344,0.0,0.643954918033,0.75,780,872,https://www.flickr.com/photos/thoseguys119/27369877691,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 6ce6140a490806e8,https://c1.staticflickr.com/9/8159/27802218013_dd9872e273_o.jpg,0.25,0.0,1.0,0.5625,922,665,https://www.flickr.com/photos/58558794@N07/27802218013/,https://creativecommons.org/licenses/by/2.0/,POP,https://www.flickr.com/people/58558794@N07/ 4c51277a353a059a,https://c1.staticflickr.com/9/8067/29087524365_3dc1651954_o.jpg,0.0,0.25,0.5625,1.0,954,87,https://www.flickr.com/photos/rusty_clark/29087524365,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 368fdd8d9aae2dd1,https://c1.staticflickr.com/8/7492/27253982663_461d471d6d_o.jpg,0.25,0.28125,1.0,0.84375,755,414,https://www.flickr.com/photos/jeepersmedia/27253982663,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ b5e514d487628ebb,https://c1.staticflickr.com/8/7707/27403849115_e4154dcb28_o.jpg,0.210588633288,0.0,0.631765899865,0.75,889,342,https://www.flickr.com/photos/dullhunk/27403849115,https://creativecommons.org/licenses/by/2.0/,Duncan Hull,https://www.flickr.com/people/dullhunk/ 57ba4da971ad416a,https://c1.staticflickr.com/1/657/31596158335_ef1ee49e49_o.jpg,0.0,0.0,0.5625,0.75,848,725,http://www.flickr.com/photos/mohit_s/31596158335/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ 9bc2d85b65e15d25,https://c1.staticflickr.com/8/7561/28712646042_3c4130b767_o.jpg,0.28125,0.25,0.84375,1.0,947,92,https://www.flickr.com/photos/herry/28712646042/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/ b037ebf0ef784c2d,https://c1.staticflickr.com/9/8492/29906041891_073f990f20_o.jpg,0.0,0.25,1.0,1.0,826,169,https://www.flickr.com/photos/54084906@N04/29906041891,https://creativecommons.org/licenses/by/2.0/,Gilbert-No\303\253l Sfeir Mont-Liban,https://www.flickr.com/people/54084906@N04/ 77a1541f0ef4d328,https://c1.staticflickr.com/9/8820/29945265936_d4be6b8c32_o.jpg,0.0,0.0,0.5625,0.75,735,859,https://www.flickr.com/photos/27665395@N05/29945265936,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 10990baed92440ef,https://c1.staticflickr.com/8/7429/27554603131_750b64dc5c_o.jpg,0.25,0.0,1.0,0.634136212625,566,683,https://www.flickr.com/photos/nowlearn/27554603131/,https://creativecommons.org/licenses/by/2.0/,Jeff Martin - CAU and J&S Maritime Ltd,https://www.flickr.com/people/nowlearn/ 3bedd25b5a1dad51,https://c1.staticflickr.com/8/7569/29304925624_0e9747f7f1_o.jpg,0.0,0.299878836834,0.75,0.899636510501,982,242,https://www.flickr.com/photos/slgc/29304925624/,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ 568bc38f3ca1e354,https://c1.staticflickr.com/6/5821/30103756603_88b875b8fc_o.jpg,0.25,0.25,1.0,1.0,680,849,https://www.flickr.com/photos/27353377@N04/30103756603/,https://creativecommons.org/licenses/by/2.0/,Carrie A.,https://www.flickr.com/people/27353377@N04/ 42ad77983e246cca,https://c1.staticflickr.com/8/7025/26407952433_6ae7d784ed_o.jpg,0.333333333333,0.0,1.0,1.0,830,342,https://www.flickr.com/photos/transitomedellin/26407952433,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ a12f6199b2c667d5,https://c1.staticflickr.com/6/5645/29605699993_bb50407790_o.jpg,0.0,0.0,0.666666666667,1.0,848,729,https://www.flickr.com/photos/kecko/29605699993,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/ a95f9e82901ab8c9,https://c1.staticflickr.com/1/633/33152660395_650e4ab9a0_o.jpg,0.421177266576,0.25,0.842354533153,1.0,971,445,https://www.flickr.com/photos/kostas-limitsios/33152660395/,https://creativecommons.org/licenses/by/2.0/,Kostas Limitsios,https://www.flickr.com/people/kostas-limitsios/ c04dba1c30396f33,https://c1.staticflickr.com/9/8440/29091456221_a027a53968_o.jpg,0.25,0.267938931298,1.0,0.803816793893,411,503,https://www.flickr.com/photos/oakleyoriginals/29091456221,https://creativecommons.org/licenses/by/2.0/,OakleyOriginals,https://www.flickr.com/people/oakleyoriginals/ d480b61578fa74a4,https://c1.staticflickr.com/6/5574/30165301924_3b567fc7dd_o.jpg,0.4375,0.0,1.0,0.75,12,443,https://www.flickr.com/photos/9750464@N02/30165301924/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ 8d21497598f9c54b,https://c1.staticflickr.com/6/5610/31815129672_3cda2c0f12_o.jpg,0.248348017621,0.0,0.745044052863,0.75,826,467,https://www.flickr.com/photos/sybarite48/31815129672,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 10e4d986f4bbfe6a,https://c1.staticflickr.com/9/8751/28922184676_fb6c0ce644_o.jpg,0.221875,0.25,0.665625,1.0,320,161,https://www.flickr.com/photos/gaby1/28922184676,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ e0fde6c71ffc5dc1,https://c1.staticflickr.com/8/7728/27634291804_2779b6ba62_o.jpg,0.0,0.25,0.75,0.75,820,436,https://www.flickr.com/photos/lza_axlwd/27634291804,https://creativecommons.org/licenses/by/2.0/,Liza Agsalud,https://www.flickr.com/people/lza_axlwd/ 79077d06b543c5cf,https://c1.staticflickr.com/1/478/32252587246_fd3d242805_o.jpg,0.0,0.0,1.0,1.0,25,961,https://flickr.com/93057803@N06/32252587246,https://creativecommons.org/licenses/by/2.0/,Colby Stopa,https://www.flickr.com/people/photographybycolby/ 909f0c7a73750bef,https://c1.staticflickr.com/9/8843/28507915340_0ba2798efd_o.jpg,0.0,0.0,0.75,1.0,868,270,https://www.flickr.com/photos/jeepersmedia/28507915340,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 2f8c16f6142539c8,https://c1.staticflickr.com/8/7078/26901099741_0cb824b728_o.jpg,0.0,0.25,0.486191860465,1.0,976,802,https://flickr.com/34608255@N08/26901099741,https://creativecommons.org/licenses/by/2.0/,The City of Toronto,https://www.flickr.com/people/cityoftoronto/ dcf6ae375b14e62f,https://c1.staticflickr.com/6/5344/30611253866_f2abf5769d_o.jpg,0.28125,0.0,0.84375,0.75,702,658,https://www.flickr.com/photos/jlcernadas/30611253866/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ dd372ed75e49a8ce,https://c1.staticflickr.com/9/8698/27934635143_a0fa80b923_o.jpg,0.25,0.0,1.0,1.0,686,97,https://www.flickr.com/photos/merfam/27934635143/,https://creativecommons.org/licenses/by/2.0/,Jason Meredith,https://www.flickr.com/people/merfam/ 510c2df6eeb585ad,https://c1.staticflickr.com/9/8066/29093727944_a9388aed93_o.jpg,0.0,0.0,0.421177266576,0.75,950,518,https://www.flickr.com/photos/danielmee/29093727944,https://creativecommons.org/licenses/by/2.0/,Daniel Mee,https://www.flickr.com/people/danielmee/ 8a11c8622b2678f7,https://c1.staticflickr.com/8/7747/26727111141_d8c99bc87a_o.jpg,0.25,0.25,1.0,1.0,558,885,https://www.flickr.com/photos/thenationalguard/26727111141,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ 80005e21c8a8e217,https://c1.staticflickr.com/9/8297/28695694754_e3f20672b8_o.jpg,0.264758497317,0.0,1.0,0.75,456,666,https://www.flickr.com/photos/34739556@N04/28695694754/,https://creativecommons.org/licenses/by/2.0/,rawdonfox,https://www.flickr.com/people/34739556@N04/ bc41c2f5094ab5e7,https://c1.staticflickr.com/1/323/31617512960_c867ceef2d_o.jpg,0.0,0.0,0.666666666667,1.0,611,700,https://www.flickr.com/photos/aloha75/31617512960/,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/ cdd8abc6793962de,https://c1.staticflickr.com/8/7350/27093155493_93f90ba402_o.jpg,0.0,0.0,0.5,0.75,702,797,https://www.flickr.com/photos/7armyjmtc/27093155493,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 8f00068bfa273349,https://c1.staticflickr.com/9/8395/29161263610_72158f8308_o.jpg,0.0,0.25,0.5,1.0,718,862,https://www.flickr.com/photos/greggjerdingen/29161263610,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ f6c3b02f6a8b042a,https://c1.staticflickr.com/6/5730/30527016340_bed8e823a8_o.jpg,0.0,0.0,0.75,0.5625,459,177,https://www.flickr.com/photos/davidwilson1949/30527016340/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 0e5b6760664ca045,https://c1.staticflickr.com/8/7085/27787175441_97a9d0dd7c_o.jpg,0.25,0.307291666667,1.0,1.0,618,154,https://www.flickr.com/photos/presidenciamx/27787175441,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\303\272blica Mexicana,https://www.flickr.com/people/presidenciamx/ 2c42804370532894,https://c1.staticflickr.com/8/7501/26478351773_ae9a210ba1_o.jpg,0.25,0.0,1.0,0.5,826,417,https://www.flickr.com/photos/drumminhands/26478351773,https://creativecommons.org/licenses/by/2.0/,Chris Evans,https://www.flickr.com/people/drumminhands/ ac3e90067e79542f,https://c1.staticflickr.com/8/7427/27174031464_3172a46b8a_o.jpg,0.28125,0.0,0.84375,0.75,718,666,https://www.flickr.com/photos/daveparker/27174031464,https://creativecommons.org/licenses/by/2.0/,Dave Parker,https://www.flickr.com/people/daveparker/ 49b87b7372212580,https://c1.staticflickr.com/9/8845/29161737252_a456a57084_o.jpg,0.0,0.282719435737,0.75,0.84815830721,407,529,https://www.flickr.com/photos/eltb/29161737252,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 2f10e44665917d99,https://c1.staticflickr.com/8/7418/27271771523_ba4ee103a6_o.jpg,0.471590909091,0.25,1.0,1.0,407,713,https://www.flickr.com/photos/martius/27271771523,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ eac352a0c1b0b1e5,https://c1.staticflickr.com/9/8472/29756357101_5f9d8a02f2_o.jpg,0.5,0.0,1.0,0.75,312,519,https://www.flickr.com/photos/gaby1/29756357101/,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 6466852837ac322a,https://c1.staticflickr.com/9/8257/29695988410_2baef05910_o.jpg,0.0,0.200323101777,1.0,1.0,884,637,https://flickr.com/41645374@N04/29695988410,https://creativecommons.org/licenses/by/2.0/,-Ebelien-,https://www.flickr.com/people/-ebelien-/ d423e96d69d1c214,https://c1.staticflickr.com/8/7305/26976656566_e1ba2ca946_o.jpg,0.0,0.28125,0.75,0.84375,402,428,https://www.flickr.com/photos/alessandrogalantucci/26976656566,https://creativecommons.org/licenses/by/2.0/,Alessandro Galantucci,https://www.flickr.com/people/alessandrogalantucci/ 41c70c3afeb54d03,https://c1.staticflickr.com/6/5686/30573995365_fb8d5748c5_o.jpg,0.332106038292,0.0,0.996318114875,1.0,820,474,https://www.flickr.com/photos/zigazou76/30573995365/,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 94bcb98ebdec94d0,https://c1.staticflickr.com/8/7619/27394295464_3c9f427d41_o.jpg,0.0,0.0,0.5625,0.75,875,714,https://www.flickr.com/photos/69203347@N03/27394295464,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ d0380db027ab1ada,https://c1.staticflickr.com/6/5491/30520385950_13d1ceae4b_o.jpg,0.5,0.0,1.0,0.75,565,267,https://www.flickr.com/photos/schaerer/30520385950,https://creativecommons.org/licenses/by/2.0/,Walter Sch\303\244rer,https://www.flickr.com/people/schaerer/ c6e86a4417e2573c,https://c1.staticflickr.com/8/7441/27851648801_b1d9294508_o.jpg,0.522334293948,0.0,1.0,0.75,979,963,https://www.flickr.com/photos/106896789@N08/27851648801,https://creativecommons.org/licenses/by/2.0/,Chris Hood,https://www.flickr.com/people/106896789@N08/ 231ff35ddc2e3552,https://c1.staticflickr.com/9/8770/28175549182_a796964e54_o.jpg,0.0,0.0,0.666666666667,1.0,693,879,https://www.flickr.com/photos/130075348@N08/28175549182,https://creativecommons.org/licenses/by/2.0/,Rokok Indonesia,https://www.flickr.com/people/130075348@N08/ 8a6b72ebdc3c524b,https://c1.staticflickr.com/9/8732/28329388192_78b22818a6_o.jpg,0.212755102041,0.0,0.638265306122,0.75,896,434,https://www.flickr.com/photos/usnavy/28329388192,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 8973cc874509375d,https://c1.staticflickr.com/6/5459/30454863711_85efce5db4_o.jpg,0.0,0.0,0.5,0.75,982,584,https://www.flickr.com/photos/armymaterielcommand/30454863711/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/ 488c8126ce45b354,https://c1.staticflickr.com/8/7711/26838679665_9908602e5e_o.jpg,0.28125,0.0,0.84375,0.75,442,49,https://www.flickr.com/photos/squirrel02/26838679665,https://creativecommons.org/licenses/by/2.0/,squirrel83,https://www.flickr.com/people/squirrel02/ d90a377775ac7b4d,https://c1.staticflickr.com/8/7116/27368589265_72303cec5c_o.jpg,0.25,0.25,1.0,1.0,405,753,https://www.flickr.com/photos/changyisheng/27368589265,https://creativecommons.org/licenses/by/2.0/,Blowing Puffer Fish,https://www.flickr.com/people/changyisheng/ b34cecc8defdc40c,https://c1.staticflickr.com/8/7447/26750827574_19b7f640f0_o.jpg,0.0,0.4375,0.75,1.0,895,900,https://www.flickr.com/photos/quinet/26750827574,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 2f39565faa7939e8,https://c1.staticflickr.com/6/5816/31423201746_8b268d2958_o.jpg,0.25,0.0,0.75,0.75,562,758,https://www.flickr.com/photos/zero_org/31423201746/,https://creativecommons.org/licenses/by/2.0/,Zero Emission Resource Organisation,https://www.flickr.com/people/zero_org/ c2d8eb67b5902e00,https://c1.staticflickr.com/9/8315/29578948420_fba72dae55_o.jpg,0.578822733424,0.0,1.0,0.75,650,666,https://www.flickr.com/photos/stonehenge-stone-circle/29578948420,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/ d256a4bba52eabfa,https://c1.staticflickr.com/8/7004/26872692972_0a7d0a9d50_o.jpg,0.0,0.0,0.513452914798,0.75,756,793,https://www.flickr.com/photos/13476480@N07/26872692972,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 1cfaab4663107b32,https://c1.staticflickr.com/9/8515/29191985621_a089def60a_o.jpg,0.25,0.434561128527,1.0,1.0,407,827,https://www.flickr.com/photos/eltb/29191985621,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 7c6571d95eb491fc,https://c1.staticflickr.com/9/8121/28473158694_a729f82e07_o.jpg,0.248713235294,0.25,0.746139705882,1.0,978,596,https://www.flickr.com/photos/vialbost/28473158694,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251rique Voisin-Demery,https://www.flickr.com/people/vialbost/ 9949334d8edeaf04,https://c1.staticflickr.com/8/7552/26978734142_b9624f1dd1_o.jpg,0.0,0.0,0.745709828393,1.0,706,555,https://www.flickr.com/photos/jsjgeology/26978734142,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 017c2614bea347c2,https://c1.staticflickr.com/9/8121/28143708583_8bb74d8a59_o.jpg,0.0,0.281690140845,0.75,0.845070422535,826,267,https://flickr.com/64337707@N07/28143708583,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/ eb3637dd97f1c4b7,https://c1.staticflickr.com/8/7505/29900074791_9c6df6e9c7_o.jpg,0.43661971831,0.25,1.0,1.0,32,108,https://www.flickr.com/photos/usfwsmidwest/29900074791,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ a4a883dba7e08feb,https://c1.staticflickr.com/9/8587/27925696413_4ba7957f92_o.jpg,0.0,0.0,0.625,1.0,686,419,https://www.flickr.com/photos/automobileitalia/27925696413,https://creativecommons.org/licenses/by/2.0/,Automobile Italia,https://www.flickr.com/people/automobileitalia/ 9ebba1495870c71a,https://c1.staticflickr.com/6/5471/30682327145_b83e2bc4e8_o.jpg,0.0354609929078,0.0,1.0,1.0,310,914,https://flickr.com/148662629@N08/30682327145,https://creativecommons.org/licenses/by/2.0/,Dirk Pons,https://www.flickr.com/people/148662629@N08/ 4268c10b52f44ba7,https://c1.staticflickr.com/8/7459/27590337182_fc1a343f92_o.jpg,0.28125,0.0,0.84375,0.75,550,843,https://www.flickr.com/photos/rusty_clark/27590337182,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 5ead095bf5abbeef,https://c1.staticflickr.com/8/7423/27620536711_246133847e_o.jpg,0.4375,0.0,1.0,0.75,608,333,https://www.flickr.com/photos/fdecomite/27620536711,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ befcda5d74032d37,https://c1.staticflickr.com/6/5604/29991010606_95ecbdce22_o.jpg,0.0,0.333333333333,1.0,1.0,653,429,http://www.flickr.com/photos/quinet/29991010606/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 5e44641cb22233ce,https://c1.staticflickr.com/6/5819/30299857341_b494a91410_o.jpg,0.25,0.25,0.75,1.0,519,68,https://www.flickr.com/photos/box_repsol/30299857341,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 235fc31903c86566,https://c1.staticflickr.com/8/7409/27759748700_a68130e51e_o.jpg,0.5,0.25,1.0,1.0,407,660,https://www.flickr.com/photos/eltb/27759748700,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ acf4220d2fca61a7,https://c1.staticflickr.com/9/8610/28149371951_76fac93eec_o.jpg,0.0,0.0,0.5,0.75,338,731,https://www.flickr.com/photos/kj-an/28149371951,https://creativecommons.org/licenses/by/2.0/,Kevin Jones,https://www.flickr.com/people/kj-an/ ac2a1bfa0ce9cf58,https://c1.staticflickr.com/6/5214/30108604641_2365066e36_o.jpg,0.25,0.25,0.75,1.0,404,471,https://www.flickr.com/photos/usnavy/30108604641,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 3194a4c7c666e443,https://c1.staticflickr.com/9/8250/29625062766_a27a976c88_o.jpg,0.0,0.25,0.512686567164,1.0,848,227,https://www.flickr.com/photos/zachievenor/29625062766/,https://creativecommons.org/licenses/by/2.0/,Zachi Evenor,https://www.flickr.com/people/zachievenor/ b4921bbd1e5f5906,https://c1.staticflickr.com/9/8866/29657161405_44f2076e15_o.jpg,0.292867981791,0.0,1.0,1.0,699,779,https://www.flickr.com/photos/stefanjurca/29657161405,https://creativecommons.org/licenses/by/2.0/,\310\230tefan Jurc\304\203,https://www.flickr.com/people/stefanjurca/ c9c6985172ec4afa,https://c1.staticflickr.com/9/8463/27928710194_43dc85409d_o.jpg,0.0,0.0,1.0,0.75,441,491,https://flickr.com/38488245@N00/27928710194,https://creativecommons.org/licenses/by/2.0/,Sam Cavenagh,https://www.flickr.com/people/cavenagh/ bab00c4c30935179,https://c1.staticflickr.com/8/7568/27729578026_1cae86e505_o.jpg,0.5,0.0,1.0,0.75,431,504,https://www.flickr.com/photos/usarjnco/27729578026,https://creativecommons.org/licenses/by/2.0/,USARJ NCO CORPS,https://www.flickr.com/people/usarjnco/ 744fa984f0a7cf3d,https://c1.staticflickr.com/9/8729/27737681764_5a96582d54_o.jpg,0.421177266576,0.0,0.842354533153,0.75,437,458,https://www.flickr.com/photos/117096107@N03/27737681764,https://creativecommons.org/licenses/by/2.0/,Kieran White,https://www.flickr.com/people/117096107@N03/ b09a2051d9ce8673,https://c1.staticflickr.com/9/8445/29486674715_79a41542cc_o.jpg,0.25,0.423337856174,1.0,0.846675712347,443,892,https://www.flickr.com/photos/eltb/29486674715/,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 74cc8f7eb50b5c8c,https://c1.staticflickr.com/6/5456/31194915425_b774b63d64_o.jpg,0.374521072797,0.25,0.749042145594,1.0,971,3,https://www.flickr.com/photos/127130111@N06/31194915425,https://creativecommons.org/licenses/by/2.0/,john mcsporran,https://www.flickr.com/people/127130111@N06/ e1eb18e3c44ac514,https://c1.staticflickr.com/1/706/32327357611_e6d8c969f0_o.jpg,0.4375,0.25,1.0,1.0,875,608,https://www.flickr.com/photos/69203347@N03/32327357611/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 6e71074210b14311,https://c1.staticflickr.com/9/8138/29557058646_e9ce6ea45f_o.jpg,0.31726618705,0.0,0.951798561151,1.0,821,861,https://www.flickr.com/photos/robdammers/29557058646,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 70c1ef3568b3679c,https://c1.staticflickr.com/6/5587/31407169076_edb2c229b0_o.jpg,0.0,0.0,0.5,0.75,561,964,https://www.flickr.com/photos/codnewsroom/31407169076,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 829c775eeed836fd,https://c1.staticflickr.com/1/511/32535140296_69891b5c62_o.jpg,0.333333333333,0.0,1.0,1.0,405,535,http://www.flickr.com/photos/alessandroambrosetti/32535140296/,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ e35f59f712f7264e,https://c1.staticflickr.com/8/7231/27048186341_884f252f48_o.jpg,0.5,0.25,1.0,1.0,548,199,https://www.flickr.com/photos/rhemkes/27048186341,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ 90aff731f3c23326,https://c1.staticflickr.com/6/5340/30870134946_9583ab4bcc_o.jpg,0.0,0.0,0.5,0.75,558,593,https://www.flickr.com/photos/leeco/30870134946,https://creativecommons.org/licenses/by/2.0/,Lee Coursey,https://www.flickr.com/people/leeco/ 8a439737928eca5a,https://c1.staticflickr.com/1/750/32778356176_0719af3dc9_o.jpg,0.0,0.0,1.0,0.752351097179,498,210,https://flickr.com/15558944@N00/32778356176,https://creativecommons.org/licenses/by/2.0/,Bill Showalter,https://www.flickr.com/people/wrshow/ 8f7aea5334a1c175,https://c1.staticflickr.com/6/5689/30469942780_e63c7c1cd6_o.jpg,0.25,0.25,0.75,1.0,744,145,https://www.flickr.com/photos/lwpkommunikacio/30469942780,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 8c72b6de257893ea,https://c1.staticflickr.com/1/751/31862015772_5cfc92cc5a_o.jpg,0.333333333333,0.0,1.0,1.0,973,597,https://www.flickr.com/photos/larry1732/31862015772/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ 42b036f1d2d7caaa,https://c1.staticflickr.com/8/7505/27524712033_317aef63c3_o.jpg,0.2515625,0.0,1.0,1.0,80,33,https://www.flickr.com/photos/treegrow/27524712033,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ e6291351de0db95f,https://c1.staticflickr.com/1/295/31919399845_43fdfc8ca2_o.jpg,0.22009569378,0.0,1.0,1.0,70,852,https://www.flickr.com/photos/jsjgeology/31919399845,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ af2d226ebe750c36,https://c1.staticflickr.com/8/7280/27005396566_c03cdae50e_o.jpg,0.0,0.0,0.592295345104,0.75,22,482,https://www.flickr.com/photos/78428166@N00/27005396566,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ f29cfc6cff019a05,https://c1.staticflickr.com/9/8099/29661311005_6fa52938b4_o.jpg,0.4375,0.25,1.0,1.0,699,550,https://www.flickr.com/photos/westher/29661311005,https://creativecommons.org/licenses/by/2.0/,Esther Westerveld,https://www.flickr.com/people/westher/ e7ed3360bfd141be,https://c1.staticflickr.com/9/8049/29776095146_f45b9b8d0c_o.jpg,0.0,0.0,0.5625,0.75,821,315,https://flickr.com/28682774@N00/29776095146,https://creativecommons.org/licenses/by/2.0/,FotoGuy 49057,https://www.flickr.com/people/fotoguy49057/ acfee3a2e85fa407,https://c1.staticflickr.com/1/659/31760075203_37a1e3fb54_o.jpg,0.363112391931,0.0,1.0,1.0,885,876,https://www.flickr.com/photos/fusion_of_horizons/31760075203,https://creativecommons.org/licenses/by/2.0/,fusion-of-horizons,https://www.flickr.com/people/fusion_of_horizons/ af47658929e9e020,https://c1.staticflickr.com/1/577/31967366991_58798baeaa_o.jpg,0.333333333333,0.0,1.0,1.0,815,797,https://www.flickr.com/photos/yamahawatercraft/31967366991,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/ fe92e5551b34f1c5,https://c1.staticflickr.com/1/702/32352488230_2b73a684c1_o.jpg,0.5,0.25,1.0,1.0,706,630,https://www.flickr.com/photos/126337928@N05/32352488230,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ 164966eefc92c694,https://c1.staticflickr.com/1/354/31449575194_9845e57517_o.jpg,0.25,0.25,0.75,1.0,484,661,https://www.flickr.com/photos/big-ashb/31449575194,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/ 1affe53c24b027f1,https://c1.staticflickr.com/6/5466/30765889565_c646c9529a_o.jpg,0.0,0.25,0.498159057437,1.0,973,755,https://www.flickr.com/photos/jsjgeology/30765889565,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 675a4b8b7af6106a,https://c1.staticflickr.com/6/5588/31333559071_3f6cffdf73_o.jpg,0.481144343303,0.0,1.0,1.0,815,930,https://www.flickr.com/photos/presidenciamx/31333559071,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\303\272blica Mexicana,https://www.flickr.com/people/presidenciamx/ 74adf7af9ec2061d,https://c1.staticflickr.com/9/8865/28327014811_00b5b075fc_o.jpg,0.0,0.5,0.75,1.0,859,759,https://www.flickr.com/photos/66755335@N05/28327014811,https://creativecommons.org/licenses/by/2.0/,Geneva Vanderzeil apairandasparediy.com,https://www.flickr.com/people/66755335@N05/ a03e75c9b79f8555,https://c1.staticflickr.com/8/7559/28000932813_3e92668dcd_o.jpg,0.4375,0.25,1.0,1.0,423,597,https://www.flickr.com/photos/paulosena/28000932813,https://creativecommons.org/licenses/by/2.0/,Paulo Sena,https://www.flickr.com/people/paulosena/ 1391997e4493b593,https://c1.staticflickr.com/6/5772/29674747743_ab1d3c5123_o.jpg,0.515602322206,0.25,1.0,1.0,407,886,https://www.flickr.com/photos/13476480@N07/29674747743,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 45f677941f8ac69e,https://c1.staticflickr.com/1/594/31686072453_a4ae47f52a_o.jpg,0.5,0.25,1.0,1.0,416,621,https://www.flickr.com/photos/30478819@N08/31686072453/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 30d3d719e61e2072,https://c1.staticflickr.com/9/8468/29637624805_48467d46ca_o.jpg,0.280784844384,0.0,0.842354533153,1.0,322,524,https://www.flickr.com/photos/postmanpetecoluk/29637624805/,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ ec03f2e34af2ddbd,https://c1.staticflickr.com/8/7314/27595115836_357ff1bcbd_o.jpg,0.281690140845,0.25,0.845070422535,1.0,896,445,https://www.flickr.com/photos/28169156@N03/27595115836/,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/ b1eb3f59c3692f57,https://c1.staticflickr.com/9/8097/28653696183_60b7f67f1c_o.jpg,0.0,0.25,0.5,1.0,561,513,https://www.flickr.com/photos/jill_carlson/28653696183,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 346580ba3d8e02a9,https://c1.staticflickr.com/8/7709/27686852390_59392af4d3_o.jpg,0.377884615385,0.0,0.755769230769,0.75,896,972,https://www.flickr.com/photos/hisgett/27686852390/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 8d85544963a43b69,https://c1.staticflickr.com/9/8898/29489485226_d150ebf0e4_o.jpg,0.0,0.0,0.75,0.75,820,803,https://www.flickr.com/photos/vuarnet/29489485226,https://creativecommons.org/licenses/by/2.0/,Raul Ramirez,https://www.flickr.com/people/vuarnet/ 9078599081607fe1,https://c1.staticflickr.com/8/7673/26721329371_06c1f2d17c_o.jpg,0.25,0.25,0.75,1.0,806,520,https://www.flickr.com/photos/immergutrocken/26721329371/,https://creativecommons.org/licenses/by/2.0/,Immergut Festival,https://www.flickr.com/people/immergutrocken/ a11c084117146f12,https://c1.staticflickr.com/8/7563/28643840043_c9820e02dd_o.jpg,0.0,0.0,0.714503816794,1.0,830,402,https://www.flickr.com/photos/prayitnophotography/28643840043,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ e842142a00e888b5,https://c1.staticflickr.com/8/7576/28179611191_7846edf099_o.jpg,0.4375,0.0,1.0,0.75,920,454,https://www.flickr.com/photos/cogdog/28179611191,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 86b35699d93b0e1f,https://c1.staticflickr.com/8/7655/29353113395_b162766c12_o.jpg,0.0,0.25,0.5625,1.0,792,762,https://www.flickr.com/photos/juliejordanscott/29353113395/,https://creativecommons.org/licenses/by/2.0/,Julie Jordan Scott,https://www.flickr.com/people/juliejordanscott/ b7649740b8d2fed4,https://c1.staticflickr.com/6/5705/30148393994_a934f72eb6_o.jpg,0.0,0.0,0.427111716621,0.75,780,532,https://www.flickr.com/photos/thoseguys119/30148393994,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c548155c68fc31d4,https://c1.staticflickr.com/6/5542/30500459720_e6d9bdcaa2_o.jpg,0.4375,0.25,1.0,1.0,913,545,https://www.flickr.com/photos/llstalteri/30500459720/,https://creativecommons.org/licenses/by/2.0/,Lori L. Stalteri,https://www.flickr.com/people/llstalteri/ 1b7509773259af3c,https://c1.staticflickr.com/9/8890/29360152820_f6d26a3465_o.jpg,0.0,0.0,0.662261380323,1.0,915,60,https://www.flickr.com/photos/regattajugend/29360152820,https://creativecommons.org/licenses/by/2.0/,Felix Somm,https://www.flickr.com/people/regattajugend/ b4f745516df9099b,https://c1.staticflickr.com/6/5345/30204127300_04b6170fcc_o.jpg,0.5,0.25,1.0,1.0,806,380,https://www.flickr.com/photos/stevendepolo/30204127300,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 4ed47c104d2238d5,https://c1.staticflickr.com/6/5684/31235817595_cb3b080fe1_o.jpg,0.248936170213,0.0,1.0,1.0,437,224,https://flickr.com/65843623@N02/31235817595,https://creativecommons.org/licenses/by/2.0/,Alberto from Spain,https://www.flickr.com/people/65843623@N02/ 34a5f4d37ac36c16,https://c1.staticflickr.com/9/8394/29228351141_bb891902ab_o.jpg,0.415322580645,0.0,0.83064516129,0.75,702,788,https://www.flickr.com/photos/texaus1/29228351141/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ d41b2a2d4d0f53cb,https://c1.staticflickr.com/6/5343/30535910711_bf7b798298_o.jpg,0.333333333333,0.0,1.0,1.0,960,306,https://www.flickr.com/photos/o_0/30535910711,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 641577c50b8633ed,https://c1.staticflickr.com/9/8831/28522457480_07891fdb5e_o.jpg,0.475899280576,0.0,0.951798561151,0.75,574,145,https://www.flickr.com/photos/8269539@N04/28522457480,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ a4e2e1f6635dcc3b,https://c1.staticflickr.com/8/7056/27479626916_13e4ac79f8_o.jpg,0.0,0.25,0.5,1.0,625,540,https://www.flickr.com/photos/jeremylevinedesign/27479626916,https://creativecommons.org/licenses/by/2.0/,Jeremy Levine,https://www.flickr.com/people/jeremylevinedesign/ 13b271083da464a9,https://c1.staticflickr.com/4/3874/32273070114_97a9c5f849_o.jpg,0.25,0.28125,1.0,0.84375,985,517,https://www.flickr.com/photos/conifer/32273070114/,https://creativecommons.org/licenses/by/2.0/,coniferconifer,https://www.flickr.com/people/conifer/ 449c8886e3986a46,https://c1.staticflickr.com/8/7238/26863824635_a3cb9c29b7_o.jpg,0.25,0.25,0.75,1.0,820,315,https://www.flickr.com/photos/jus10h/26863824635,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 3ea9d08d84186ec4,https://c1.staticflickr.com/8/7698/26655404210_d2f08a1d28_o.jpg,0.28125,0.25,0.84375,1.0,924,3,https://www.flickr.com/photos/68147320@N02/26655404210,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ 0c7aae4cbca2f522,https://c1.staticflickr.com/8/7549/26271766943_3e9c633f0f_o.jpg,0.0,0.25,0.495594713656,1.0,72,408,https://www.flickr.com/photos/amslerpix/26271766943,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ b54f7ef1f66c047d,https://c1.staticflickr.com/9/8330/29655755141_3655e7d0a4_o.jpg,0.0,0.0,0.75,1.0,141,682,https://www.flickr.com/photos/15016964@N02/29655755141,https://creativecommons.org/licenses/by/2.0/,Marie Hale,https://www.flickr.com/people/15016964@N02/ 74637a7b643ab194,https://c1.staticflickr.com/8/7356/26807511285_ed8ba40aff_o.jpg,0.4375,0.25,1.0,1.0,459,970,https://www.flickr.com/photos/cabanillas2012/26807511285,https://creativecommons.org/licenses/by/2.0/,Juan Cabanillas,https://www.flickr.com/people/cabanillas2012/ ca6ad83e69143e79,https://c1.staticflickr.com/6/5757/31123726885_3a8dea4924_o.jpg,0.0,0.0,0.666666666667,1.0,806,284,https://www.flickr.com/photos/stevendepolo/31123726885/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 15bce12814b6e4cc,https://c1.staticflickr.com/8/7287/27326496343_fc929927fc_o.jpg,0.274729520866,0.25,0.824188562597,1.0,875,512,https://www.flickr.com/photos/97934454@N06/27326496343,https://creativecommons.org/licenses/by/2.0/,danielhak,https://www.flickr.com/people/97934454@N06/ 57118088b4317074,https://c1.staticflickr.com/6/5345/30735776551_24b8489cdc_o.jpg,0.4375,0.0,1.0,0.75,499,494,https://www.flickr.com/photos/davidberkowitz/30735776551/,https://creativecommons.org/licenses/by/2.0/,David Berkowitz,https://www.flickr.com/people/davidberkowitz/ ea97ab7e4697a529,https://c1.staticflickr.com/9/8365/27823532723_212c933e75_o.jpg,0.0,0.25,0.75,1.0,978,159,https://www.flickr.com/photos/rapidtravelchai/27823532723,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/ ae575cd3e22a6865,https://c1.staticflickr.com/9/8414/28288685530_fd7e7b7bfc_o.jpg,0.4375,0.25,1.0,1.0,459,246,https://www.flickr.com/photos/rheba/28288685530,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/ d1d0311a9272deb4,https://c1.staticflickr.com/6/5654/29420480034_241847dd09_o.jpg,0.43661971831,0.25,1.0,1.0,407,886,https://www.flickr.com/photos/eltb/29420480034,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 0c4219f2a19b5dc3,https://c1.staticflickr.com/8/7285/26942499112_a27fcfc6e9_o.jpg,0.0,0.0,0.922010398614,1.0,459,236,https://www.flickr.com/photos/discoveroregon/26942499112,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 264621e12ba00a08,https://c1.staticflickr.com/8/7384/27699103315_858f35751a_o.jpg,0.25,0.0,1.0,0.599757673667,888,509,https://www.flickr.com/photos/tatlongmaria/27699103315,https://creativecommons.org/licenses/by/2.0/,Vin Sotto,https://www.flickr.com/people/tatlongmaria/ b2332b90769a75da,https://c1.staticflickr.com/9/8251/28927941210_70d19d5ed0_o.jpg,0.180225281602,0.0,0.540675844806,0.75,971,515,https://www.flickr.com/photos/nordique/28927941210,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ 5c2232293e164671,https://c1.staticflickr.com/9/8470/29581274652_8fe413e5d6_o.jpg,0.0,0.25,0.566326530612,1.0,115,252,https://www.flickr.com/photos/marknenadov/29581274652,https://creativecommons.org/licenses/by/2.0/,Mark Nenadov,https://www.flickr.com/people/marknenadov/ adfbd490615460cd,https://c1.staticflickr.com/8/7391/27829320260_055300b7e7_o.jpg,0.313471502591,0.25,1.0,1.0,851,778,https://www.flickr.com/photos/archier/27829320260,https://creativecommons.org/licenses/by/2.0/,Archie,https://www.flickr.com/people/archier/ e20bc9f95c411494,https://c1.staticflickr.com/8/7557/27519562064_b1460fff21_o.jpg,0.25,0.25,0.75,1.0,818,679,https://www.flickr.com/photos/thecarspy/27519562064,https://creativecommons.org/licenses/by/2.0/,The Car Spy,https://www.flickr.com/people/thecarspy/ e5215b5d4cd82cbf,https://c1.staticflickr.com/9/8657/28705646522_de6ed7800d_o.jpg,0.332106038292,0.0,0.996318114875,1.0,976,112,https://www.flickr.com/photos/zigazou76/28705646522,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ ad7086670219e564,https://c1.staticflickr.com/9/8556/29776514680_6f29e9ab44_o.jpg,0.0,0.0,1.0,0.669128508124,459,503,https://www.flickr.com/photos/eltb/29776514680,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 177502506a526672,https://c1.staticflickr.com/6/5530/22832510208_7ba877334c_o.jpg,0.5,0.0,1.0,0.75,273,979,https://www.flickr.com/photos/larry1732/22832510208/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ 2d8ed6f718970a3e,https://c1.staticflickr.com/9/8771/27633978383_eacd8b4a21_o.jpg,0.0,0.0,0.75,1.0,459,488,https://flickr.com/72756774@N00/27633978383,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/ abbe78acf1622947,https://c1.staticflickr.com/6/5745/31076781051_5a5c2b8b98_o.jpg,0.267938931298,0.0,0.803816793893,0.75,138,47,https://flickr.com/143049688@N08/31076781051,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ 30c6878430e6cdf6,https://c1.staticflickr.com/6/5746/30768321930_0a0fafa498_o.jpg,0.25,0.0,1.0,1.0,990,66,http://www.flickr.com/photos/torsten-behrens/30768321930/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ 0266ecc7811833f2,https://c1.staticflickr.com/8/7211/27180762323_54ffeae169_o.jpg,0.25,0.25,1.0,1.0,929,136,https://www.flickr.com/photos/danielchownet/27180762323,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/ 3222f14dd1938ce2,https://c1.staticflickr.com/8/7524/27389743494_877a33f594_o.jpg,0.0,0.495594713656,0.75,0.991189427313,146,123,https://www.flickr.com/photos/noaaphotolib/27389743494,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 37f1e5313e0e0954,https://c1.staticflickr.com/8/7251/27987303076_c267353ab3_o.jpg,0.0,0.0,0.75,0.5625,995,582,https://www.flickr.com/photos/scotnelson/27987303076,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 61894431d41c4000,https://c1.staticflickr.com/6/5617/31024055500_ea956fc0a7_o.jpg,0.327407407407,0.0,1.0,1.0,821,739,https://www.flickr.com/photos/8269539@N04/31024055500,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ fe480382c631a180,https://c1.staticflickr.com/8/7728/27921270692_8bf89ff93f_o.jpg,0.0,0.25,0.718197879859,1.0,16,638,https://flickr.com/9494793@N06/27921270692,https://creativecommons.org/licenses/by/2.0/,shrikant rao,https://www.flickr.com/people/9494793@N06/ 83b622f9b15d6474,https://c1.staticflickr.com/9/8127/30048848135_6e90b46907_o.jpg,0.5,0.0,1.0,0.75,309,780,https://www.flickr.com/photos/pamas/30048848135,https://creativecommons.org/licenses/by/2.0/,Esin \303\234st\303\274n,https://www.flickr.com/people/pamas/ 8ce8787f64f14b53,https://c1.staticflickr.com/8/7688/27847610175_cbeea0dc26_o.jpg,0.333333333333,0.0,1.0,1.0,537,752,https://www.flickr.com/photos/pavdw/27847610175,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/ cf4a85abf1666800,https://c1.staticflickr.com/9/8582/30490693995_0c24607786_o.jpg,0.25,0.0,1.0,0.75,792,63,https://www.flickr.com/photos/rodrigoparedes/30490693995,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/ 40759c2d17fb6c94,https://c1.staticflickr.com/8/7343/27366674203_e1261fcc0f_o.jpg,0.578822733424,0.0,1.0,0.75,669,21,https://flickr.com/131810676@N03/27366674203,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/ 325789b40f7da9e0,https://c1.staticflickr.com/6/5828/30300835496_e419a1ab96_o.jpg,0.25,0.0,0.75,0.75,854,573,https://www.flickr.com/photos/slapers/30300835496,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 8fddc65ec86fce04,https://c1.staticflickr.com/1/543/32442267191_37e83c6ae8_o.jpg,0.25,0.0,1.0,0.75,760,584,https://www.flickr.com/photos/raneko/32442267191,https://creativecommons.org/licenses/by/2.0/,raneko,https://www.flickr.com/people/raneko/ 44b379bf815e1746,https://c1.staticflickr.com/6/5550/30477586123_85be15da2a_o.jpg,0.28125,0.25,0.84375,1.0,484,496,https://www.flickr.com/photos/davidstanleytravel/30477586123,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 516bc0104a91474a,https://c1.staticflickr.com/1/270/31435292163_1413ec34b7_o.jpg,0.376029654036,0.0,1.0,0.75,310,542,https://www.flickr.com/photos/gails_pictures/31435292163,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ f49ec243edd7f49d,https://c1.staticflickr.com/8/7420/27382495811_69422822ee_o.jpg,0.5,0.0,1.0,0.75,908,740,https://www.flickr.com/photos/34739556@N04/27382495811,https://creativecommons.org/licenses/by/2.0/,rawdonfox,https://www.flickr.com/people/34739556@N04/ 09e2a86d93e696c2,https://c1.staticflickr.com/9/8729/27645665963_17a51e5b5b_o.jpg,0.422764227642,0.0,0.845528455285,0.75,548,363,https://www.flickr.com/photos/ed_webster/27645665963,https://creativecommons.org/licenses/by/2.0/,Ed Webster,https://www.flickr.com/people/ed_webster/ 5bdcb6829f8f9132,https://c1.staticflickr.com/6/5343/30334617984_bb0a7b3a00_o.jpg,0.5,0.25,1.0,1.0,310,529,https://www.flickr.com/photos/dordrecht-holland/30334617984,https://creativecommons.org/licenses/by/2.0/,Paul van de Velde,https://www.flickr.com/people/dordrecht-holland/ 1d43c97815370034,https://c1.staticflickr.com/8/7536/27283005492_2b39c3252e_o.jpg,0.0,0.0,0.527272727273,0.75,780,680,https://www.flickr.com/photos/thoseguys119/27283005492/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ becef3a2170582bb,https://c1.staticflickr.com/8/7395/27503522300_f0297718ab_o.jpg,0.25,0.0,1.0,1.0,980,405,https://www.flickr.com/photos/jsjgeology/27503522300,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ ffea2ed2fcef0dd0,https://c1.staticflickr.com/9/8659/29238139265_4a79ddee01_o.jpg,0.0,0.493768328446,0.75,0.987536656891,699,461,https://www.flickr.com/photos/stefanjurca/29238139265,https://creativecommons.org/licenses/by/2.0/,\310\230tefan Jurc\304\203,https://www.flickr.com/people/stefanjurca/ 13bf676e06991bce,https://c1.staticflickr.com/9/8732/28326370375_230235317b_o.jpg,0.25,0.0,0.75,0.75,625,441,https://www.flickr.com/photos/transitomedellin/28326370375,https://creativecommons.org/licenses/by/2.0/,Secretar\303\255a de Movilidad de Medell\303\255n,https://www.flickr.com/people/transitomedellin/ 9526e7c0bd2fc81a,https://c1.staticflickr.com/6/5504/31108872031_07a6a32891_o.jpg,0.0,0.267938931298,0.75,0.803816793893,145,92,https://www.flickr.com/photos/walterpro/31108872031,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ cda202022420496e,https://c1.staticflickr.com/7/6136/6020181362_f2f76c8183_o.jpg,0.489195230999,0.25,1.0,1.0,875,184,https://www.flickr.com/photos/davidwilson1949/6020181362,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 727c9a66ec99a467,https://c1.staticflickr.com/6/5790/30942351326_987fbf8685_o.jpg,0.5,0.25,1.0,1.0,618,693,https://www.flickr.com/photos/itupictures/30942351326,https://creativecommons.org/licenses/by/2.0/,ITU Pictures,https://www.flickr.com/people/itupictures/ 3335e065145de529,https://c1.staticflickr.com/9/8226/29437478951_e39066951e_o.jpg,0.303094233474,0.0,0.909282700422,1.0,702,706,https://www.flickr.com/photos/texaus1/29437478951/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ 49d917b291a57947,https://c1.staticflickr.com/6/5771/30781442070_83f99e828a_o.jpg,0.0,0.0,0.669128508124,1.0,407,630,https://www.flickr.com/photos/eltb/30781442070,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 3e7e8fa4d177c7be,https://c1.staticflickr.com/8/7107/26268000374_d88c56c63c_o.jpg,0.502573529412,0.0,1.0,0.75,955,843,https://www.flickr.com/photos/ecristescu/26268000374,https://creativecommons.org/licenses/by/2.0/,Eva Cristescu,https://www.flickr.com/people/ecristescu/ a2dcc313d858bc7b,https://c1.staticflickr.com/1/466/32629095521_f3639f3e37_o.jpg,0.277173913043,0.0,0.83152173913,0.75,332,291,https://www.flickr.com/photos/usfwsmtnprairie/32629095521,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 66c62c878d251400,https://c1.staticflickr.com/1/301/32592336745_70f59500cc_o.jpg,0.5,0.0,1.0,0.75,753,913,https://flickr.com/95467082@N08/32592336745,https://creativecommons.org/licenses/by/2.0/,England Squash Masters,https://www.flickr.com/people/squashdev/ b5acd06ef02c5a28,https://c1.staticflickr.com/1/267/31465632643_9e5a84e0fd_o.jpg,0.318416523236,0.25,1.0,1.0,581,538,https://www.flickr.com/photos/55229469@N07/31465632643,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ f7e21aa5b89dc479,https://c1.staticflickr.com/6/5716/30454914174_39d30615ca_o.jpg,0.0,0.333333333333,1.0,1.0,611,48,https://www.flickr.com/photos/aloha75/30454914174,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/ fff5cd6df399473f,https://c1.staticflickr.com/9/8225/28835100212_71f39b2124_o.jpg,0.0,0.25,0.75,1.0,563,634,https://www.flickr.com/photos/cybrgrl/28835100212/,https://creativecommons.org/licenses/by/2.0/,cybrgrl,https://www.flickr.com/people/cybrgrl/ 4a1de381f4cce999,https://c1.staticflickr.com/3/2768/32550534510_7919a589f5_o.jpg,0.0,0.0,0.666666666667,1.0,532,978,https://www.flickr.com/photos/janitors/32550534510,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ f6ab199663a8f33d,https://c1.staticflickr.com/1/289/31663704593_1250e752c0_o.jpg,0.0,0.0,0.5625,0.75,735,523,https://www.flickr.com/photos/27665395@N05/31663704593,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 93f2a5812ca3241f,https://c1.staticflickr.com/9/8203/29412690446_fc09deb07c_o.jpg,0.29093799682,0.25,0.872813990461,1.0,980,472,https://flickr.com/54327644@N04/29412690446,https://creativecommons.org/licenses/by/2.0/,Robert Montgomery,https://www.flickr.com/people/rmonty119/ 17c4092d035bde96,https://c1.staticflickr.com/9/8662/28692072351_c5ed514d18_o.jpg,0.287776898734,0.25,0.863330696203,1.0,821,944,https://www.flickr.com/photos/56433265@N04/28692072351/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/ 4840dfe43ea37b95,https://c1.staticflickr.com/8/7656/27148870722_13641b0319_o.jpg,0.0,0.25,0.5,1.0,973,478,https://www.flickr.com/photos/gammaman/27148870722,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/ ffd985c4cf5478f7,https://c1.staticflickr.com/8/7333/27220237694_8a9334860c_o.jpg,0.248348017621,0.0,0.745044052863,0.75,979,392,https://www.flickr.com/photos/bensutherland/27220237694,https://creativecommons.org/licenses/by/2.0/,Ben Sutherland,https://www.flickr.com/people/bensutherland/ 7695d21604f149c8,https://c1.staticflickr.com/9/8270/29741307952_232b36fb12_o.jpg,0.0,0.0,1.0,0.666666666667,558,873,https://www.flickr.com/photos/dfmagazine/29741307952,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/ 7c286d90b45671b7,https://c1.staticflickr.com/6/5480/30720787031_b8dfa7860f_o.jpg,0.25,0.0,0.75,0.75,760,284,https://www.flickr.com/photos/30478819@N08/30720787031/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ a8b3dcdc20299873,https://c1.staticflickr.com/8/7476/27081615680_ee8e13c8ee_o.jpg,0.2515625,0.0,1.0,1.0,100,785,https://www.flickr.com/photos/flk/27081615680,https://creativecommons.org/licenses/by/2.0/,falkowata,https://www.flickr.com/people/flk/ be1b8285b79e828b,https://c1.staticflickr.com/8/7048/27229102475_6922f37ee0_o.jpg,0.0,0.0,0.75,1.0,880,401,https://www.flickr.com/photos/herry/27229102475/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/ ec193cf149b9fc18,https://c1.staticflickr.com/1/776/32301128931_9167c4fff9_o.jpg,0.200323101777,0.0,1.0,1.0,709,342,https://flickr.com/64018555@N03/32301128931,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/ 176d426593e9c926,https://c1.staticflickr.com/1/261/31921036984_b161453163_o.jpg,0.0,0.0,0.799676898223,1.0,582,146,https://www.flickr.com/photos/prayitnophotography/31921036984,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 5f65d30425e66456,https://c1.staticflickr.com/8/7388/27944256761_7fcbaca010_o.jpg,0.0,0.0,0.75,0.5625,995,6,https://www.flickr.com/photos/scotnelson/27944256761,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 0ef77c2553050c35,https://c1.staticflickr.com/8/7074/27662519362_8c920c2a06_o.jpg,0.4375,0.0,1.0,0.75,539,866,https://www.flickr.com/photos/cogdog/27662519362,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 5ffc4a696ce4a5e7,https://c1.staticflickr.com/8/7522/27802698000_13c988b321_o.jpg,0.0,0.0,1.0,0.669128508124,132,313,https://www.flickr.com/photos/92252798@N07/27802698000,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/ d5a9b43c6257b3ac,https://c1.staticflickr.com/6/5643/31158952182_09fca710fb_o.jpg,0.28125,0.25,0.84375,1.0,311,138,http://www.flickr.com/photos/_hq_/31158952182/,https://creativecommons.org/licenses/by/2.0/,_hq_,https://www.flickr.com/people/_hq_/ c0360639cfab955a,https://c1.staticflickr.com/1/407/32185311074_cbdbab65e4_o.jpg,0.297202797203,0.0,1.0,0.75,889,144,https://www.flickr.com/photos/iainmerchant/32185311074/,https://creativecommons.org/licenses/by/2.0/,Iain Merchant,https://www.flickr.com/people/iainmerchant/ 4cfbbed21f47e316,https://c1.staticflickr.com/9/8391/29333612546_5e8a07d994_o.jpg,0.0,0.0,1.0,0.666666666667,579,362,https://www.flickr.com/photos/quinet/29333612546,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 8a38e4b8439b15c1,https://c1.staticflickr.com/6/5338/31260856321_aebeb5a60a_o.jpg,0.0,0.0,0.75,0.75,625,493,https://www.flickr.com/photos/135302410@N02/31260856321/,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/ 8bd41e07bbd1ff71,https://c1.staticflickr.com/8/7121/26885021811_90519f0097_o.jpg,0.25,0.400242326333,1.0,1.0,498,134,https://www.flickr.com/photos/taymazvalley/26885021811,https://creativecommons.org/licenses/by/2.0/,Taymaz Valley,https://www.flickr.com/people/taymazvalley/ 581ca0ff906e8dae,https://c1.staticflickr.com/9/8208/29648449920_18b0d94def_o.jpg,0.0,0.25,0.5625,1.0,470,814,https://www.flickr.com/photos/asdsoupdsa/29648449920,https://creativecommons.org/licenses/by/2.0/,brett Vachon,https://www.flickr.com/people/asdsoupdsa/ a3ccc58e78fdf13f,https://c1.staticflickr.com/6/5810/30030758064_d83b51e6c1_o.jpg,0.0,0.0,0.5,0.75,561,711,https://flickr.com/53276480@N07/30030758064,https://creativecommons.org/licenses/by/2.0/,Maize & Blue Nation,https://www.flickr.com/people/maizenbluenation/ 52deba153ed4e0d2,https://c1.staticflickr.com/8/7546/27021893442_f881ac93c9_o.jpg,0.190882731959,0.0,0.572648195876,0.75,780,39,https://www.flickr.com/photos/thoseguys119/27021893442/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 0cb005f7eeccb80a,https://c1.staticflickr.com/8/7213/26898155986_aa8d3db608_o.jpg,0.0,0.25,0.75,1.0,868,370,https://www.flickr.com/photos/stevendepolo/26898155986,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 746cdec58e3555ba,https://c1.staticflickr.com/8/7507/27244044704_7af542878d_o.jpg,0.400242326333,0.0,1.0,0.75,556,682,https://www.flickr.com/photos/mdgovpics/27244044704,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/ 8eaa89fd0bb46b1f,https://c1.staticflickr.com/3/2618/32210749254_3e1c83c592_o.jpg,0.0,0.0,0.75,0.497426470588,760,500,https://www.flickr.com/photos/mdpettitt/32210749254,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/ 6e4e81bfd69686b9,https://c1.staticflickr.com/6/5598/30928947635_5812d0401e_o.jpg,0.25,0.0,1.0,1.0,975,757,http://www.flickr.com/photos/jsjgeology/30928947635/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 71683b3b80fcf92a,https://c1.staticflickr.com/9/8880/28862164822_5393446462_o.jpg,0.66188304721,0.0,0.926636266094,0.75,826,943,https://www.flickr.com/photos/anandajoti/28862164822,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/ 3423264d6c9b8baf,https://c1.staticflickr.com/1/258/31998508826_99facbcabd_o.jpg,0.309659090909,0.0,0.928977272727,1.0,437,776,https://www.flickr.com/photos/autohistorian/31998508826,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ fb3c12256f23989b,https://c1.staticflickr.com/8/7402/27118673643_0fdd3f89d9_o.jpg,0.0,0.25,0.75,1.0,810,513,https://www.flickr.com/photos/paleogrubs/27118673643,https://creativecommons.org/licenses/by/2.0/,Jess (Paleo Grubs),https://www.flickr.com/people/paleogrubs/ 0da13c7b05715592,https://c1.staticflickr.com/8/7054/27503912205_a9efe10e81_o.jpg,0.333333333333,0.0,1.0,1.0,519,318,https://www.flickr.com/photos/box_repsol/27503912205,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 4186e729dbcd65ad,https://c1.staticflickr.com/1/126/31586240016_9077ec5fdf_o.jpg,0.28125,0.0,0.84375,0.75,990,670,http://www.flickr.com/photos/torsten-behrens/31586240016/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ 951c95dc11b7431d,https://c1.staticflickr.com/9/8450/29170472241_5c555474f8_o.jpg,0.5,0.25,1.0,1.0,548,462,https://www.flickr.com/photos/rhemkes/29170472241,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ b58545f2b0d5d165,https://c1.staticflickr.com/8/7448/26724828724_eee9f4867b_o.jpg,0.0,0.0,1.0,1.0,671,714,https://www.flickr.com/photos/ronald_menti/26724828724,https://creativecommons.org/licenses/by/2.0/,Ronald Menti,https://www.flickr.com/people/ronald_menti/ bf5b8c9ce69cbb96,https://c1.staticflickr.com/8/7722/27925424645_05beaf3a3c_o.jpg,0.0,0.498153618907,0.75,1.0,888,155,https://www.flickr.com/photos/eltb/27925424645,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 29ccc9a7f7a5c7e9,https://c1.staticflickr.com/8/7485/27328874180_42fff8ed1b_o.jpg,0.0,0.28125,0.75,0.84375,909,151,https://www.flickr.com/photos/jorge-11/27328874180,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/ 25191e656692499e,https://c1.staticflickr.com/9/8220/29214416310_f61c9fa775_o.jpg,0.335787923417,0.0,1.0,1.0,347,222,https://www.flickr.com/photos/13476480@N07/29214416310,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ e4d94a69f8fafdd0,https://c1.staticflickr.com/1/741/31105681693_b87e102a3a_o.jpg,0.25,0.0,0.75,0.75,405,982,https://flickr.com/132004986@N08/31105681693,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ 001c4d1e70f7847d,https://c1.staticflickr.com/8/7483/26824988452_452302846f_o.jpg,0.495555555556,0.0,1.0,0.75,98,510,https://www.flickr.com/photos/usfwsmtnprairie/26824988452,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 8b661b3e287c2cf5,https://c1.staticflickr.com/8/7330/27213065113_cd19dfce23_o.jpg,0.25,0.0,0.75,0.75,896,558,https://www.flickr.com/photos/8269539@N04/27213065113,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ df914a8593278b9f,https://c1.staticflickr.com/1/588/32242349735_1402bfb74c_o.jpg,0.0,0.0,0.5,0.75,145,118,https://flickr.com/53454613@N06/32242349735,https://creativecommons.org/licenses/by/2.0/,Vikash Prasad,https://www.flickr.com/people/vikash_prasad/ 9217c179a59aa290,https://c1.staticflickr.com/1/744/31973559064_d39daf1f37_o.jpg,0.0,0.0,0.992805755396,1.0,499,506,http://www.flickr.com/photos/acsonline/31973559064/,https://creativecommons.org/licenses/by/2.0/,Regione Umbria News - Agenzia informazione istituzionale Assemblea legislativa,https://www.flickr.com/people/acsonline/ a4df17c393427e52,https://c1.staticflickr.com/6/5751/30885576092_0fb2da5d1d_o.jpg,0.0,0.0,0.75,1.0,548,833,https://www.flickr.com/photos/belurashok/30885576092/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/ 6dc31579f851ead0,https://c1.staticflickr.com/8/7449/27961024125_12aebe2bbf_o.jpg,0.25,0.25,1.0,1.0,40,334,https://www.flickr.com/photos/tatuaggi/27961024125,https://creativecommons.org/licenses/by/2.0/,Ettore Bechis,https://www.flickr.com/people/tatuaggi/ b677ba49b3e290df,https://c1.staticflickr.com/9/8315/29648630762_e9568c1cec_o.jpg,0.25,0.0,0.75,0.75,672,998,https://www.flickr.com/photos/swampa/29648630762/,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/ c4633134a9d9e7a1,https://c1.staticflickr.com/6/5322/30187971926_7e259dc9c6_o.jpg,0.333333333333,0.0,1.0,1.0,556,36,https://www.flickr.com/photos/grahammitchellphotography/30187971926/,https://creativecommons.org/licenses/by/2.0/,Graham Mitchell,https://www.flickr.com/people/grahammitchellphotography/ 1813f9d6e6e8fe6f,https://c1.staticflickr.com/8/7713/26894830826_a3bf6b1505_o.jpg,0.4375,0.0,1.0,0.75,709,598,https://flickr.com/24470821@N04/26894830826,https://creativecommons.org/licenses/by/2.0/,Andrew Milligan Sumo,https://www.flickr.com/people/andrewmilligansumo/ 20393f1b7875359b,https://c1.staticflickr.com/8/7449/27348974995_af9e6a0a59_o.jpg,0.333333333333,0.0,1.0,1.0,777,922,https://www.flickr.com/photos/devdsp/27348974995,https://creativecommons.org/licenses/by/2.0/,Adam Thomas,https://www.flickr.com/people/devdsp/ c8af18e5b7802daa,https://c1.staticflickr.com/1/467/32536056851_422bccdc83_o.jpg,0.0,0.0,0.606331168831,0.75,938,62,https://www.flickr.com/photos/30478819@N08/32536056851,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ d8e10d91ca06f8a5,https://c1.staticflickr.com/9/8515/29372466910_57aa97ac13_o.jpg,0.28125,0.0,0.84375,0.75,418,568,https://www.flickr.com/photos/ewolivera/29372466910,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ 0ababfda44ebb517,https://c1.staticflickr.com/8/7213/27525586092_578f80ffdb_o.jpg,0.25,0.25,1.0,1.0,923,771,https://www.flickr.com/photos/stellahyc/27525586092/in/dateposted-public/,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/ 89fba1b9f530ae70,https://c1.staticflickr.com/8/7574/27115480444_11f4c317a8_o.jpg,0.25,0.25,0.75,1.0,896,856,https://www.flickr.com/photos/faceme/27115480444,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ 5d587eaa33f6efec,https://c1.staticflickr.com/6/5753/30246020403_be930e6573_o.jpg,0.0,0.0,1.0,1.0,986,521,https://www.flickr.com/photos/32020964@N08/30246020403,https://creativecommons.org/licenses/by/2.0/,Ms. Phoenix,https://www.flickr.com/people/32020964@N08/ 245d9fddf4882422,https://c1.staticflickr.com/9/8492/29653146791_b10d08a7bc_o.jpg,0.25,0.0,1.0,0.75,558,949,https://www.flickr.com/photos/jeepersmedia/29653146791,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ bd6dc8bdbcb0b831,https://c1.staticflickr.com/6/5525/30235545433_95cbeaa40b_o.jpg,0.4375,0.25,1.0,1.0,88,272,https://www.flickr.com/photos/saiberiac/30235545433/,https://creativecommons.org/licenses/by/2.0/,saiberiac,https://www.flickr.com/people/saiberiac/ 22d1d72a1cc5785d,https://c1.staticflickr.com/9/8552/29033913772_15b3dc502c_o.jpg,0.0,0.0,0.5625,0.75,874,31,https://www.flickr.com/photos/ewolivera/29033913772,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ d3966ff1b248339d,https://c1.staticflickr.com/6/5627/30700166756_29f5f795f9_o.jpg,0.0,0.25,0.498159057437,1.0,752,690,https://www.flickr.com/photos/davehamster/30700166756,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ e4a52d140ec95442,https://c1.staticflickr.com/8/7438/27485835504_09b66c9d7d_o.jpg,0.25,0.0,1.0,1.0,459,483,https://www.flickr.com/photos/77175657@N00/27485835504,https://creativecommons.org/licenses/by/2.0/,Graham Tiller,https://www.flickr.com/people/77175657@N00/ f8a1d40087c108da,https://c1.staticflickr.com/8/7305/27403949490_e1057517fc_o.jpg,0.25,0.25,1.0,1.0,340,406,https://www.flickr.com/photos/imagesbywestfall/27403949490,https://creativecommons.org/licenses/by/2.0/,greg westfall,https://www.flickr.com/people/imagesbywestfall/ 4cf942f7c681656b,https://c1.staticflickr.com/9/8097/28588027803_26dc651bde_o.jpg,0.5,0.25,1.0,1.0,94,79,https://www.flickr.com/photos/flowcomm/28588027803,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 298df01e71810e92,https://c1.staticflickr.com/9/8062/28850621350_9a22040434_o.jpg,0.0,0.0,0.666666666667,1.0,820,465,https://www.flickr.com/photos/mwf2005/28850621350/,https://creativecommons.org/licenses/by/2.0/,muffinn,https://www.flickr.com/people/mwf2005/ 7c6dbdec07d0acf5,https://c1.staticflickr.com/9/8560/29503772490_ed22583915_o.jpg,0.333333333333,0.0,1.0,1.0,896,859,https://www.flickr.com/photos/cerdec/29503772490/,https://creativecommons.org/licenses/by/2.0/,U.S. Army CERDEC,https://www.flickr.com/people/cerdec/ 142e658c9367945b,https://c1.staticflickr.com/8/7549/30165158471_03f5960ba0_o.jpg,0.0,0.0,0.5,0.75,990,117,https://www.flickr.com/photos/jsorbie/30165158471,https://creativecommons.org/licenses/by/2.0/,Jim Sorbie,https://www.flickr.com/people/jsorbie/ 967f1a790c941a63,https://c1.staticflickr.com/6/5732/30388082743_78fedd2304_o.jpg,0.25,0.25,1.0,0.75,472,583,https://flickr.com/89965037@N07/30388082743,https://creativecommons.org/licenses/by/2.0/,Lee Russell,https://www.flickr.com/people/outpost51/ f7ddc4c989a9e4b5,https://c1.staticflickr.com/8/7416/27252602345_c945e3d8b1_o.jpg,0.475215517241,0.25,0.950431034483,1.0,980,404,http://www.flickr.com/photos/43931507@N00/27252602345,https://creativecommons.org/licenses/by/2.0/,minniemouseaunt,https://www.flickr.com/people/minniemouseaunt/ 43c8b56758e6b0c7,https://c1.staticflickr.com/8/7634/26604549764_e2f8eedf36_o.jpg,0.0,0.0,0.666666666667,1.0,416,667,https://www.flickr.com/photos/jdlasica/26604549764,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 1db62ba481fd1af8,https://c1.staticflickr.com/6/5761/30977743075_47af5c998b_o.jpg,0.25,0.0,1.0,0.720796460177,558,129,http://www.flickr.com/photos/davepotwin/30977743075/,https://creativecommons.org/licenses/by/2.0/,PleaseRomaineCalm,https://www.flickr.com/people/davepotwin/ 465f14c48a632760,https://c1.staticflickr.com/8/7237/26628163524_d1009c6dd2_o.jpg,0.0,0.0,0.342490842491,0.75,821,488,https://www.flickr.com/photos/jsjgeology/26628163524,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 5800f0555b4ad847,https://c1.staticflickr.com/9/8885/29659665666_313a59612f_o.jpg,0.0,0.25,0.5,1.0,981,462,https://www.flickr.com/photos/pinboke/29659665666,https://creativecommons.org/licenses/by/2.0/,pinboke_planet,https://www.flickr.com/people/pinboke/ 2811d9fb17320d92,https://c1.staticflickr.com/6/5598/30130313291_c434911558_o.jpg,0.0,0.0,0.666666666667,1.0,437,30,https://www.flickr.com/photos/sg2012/30130313291,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/ 5e0c4d4825aee892,https://c1.staticflickr.com/1/394/32500626382_729c3b9c1e_o.jpg,0.0,0.0,0.693233082707,1.0,821,739,https://www.flickr.com/photos/8269539@N04/32500626382,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 42eae55796d97d80,https://c1.staticflickr.com/9/8627/27801929884_e1a28543d7_o.jpg,0.25,0.0,1.0,0.75,934,1000,https://www.flickr.com/photos/personalcreations/27801929884,https://creativecommons.org/licenses/by/2.0/,Personal Creations,https://www.flickr.com/people/personalcreations/ 165f1657664921d2,https://c1.staticflickr.com/6/5520/30658638931_674c9b0472_o.jpg,0.0,0.0,0.652554744526,1.0,982,460,https://www.flickr.com/photos/apardavila/30658638931,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ db84ea60134f9620,https://c1.staticflickr.com/8/7793/26551537394_70c5d60a23_o.jpg,0.25,0.5,1.0,1.0,780,670,https://flickr.com/119921578@N08/26551537394,https://creativecommons.org/licenses/by/2.0/,Shauna Karren,https://www.flickr.com/people/119921578@N08/ e8b06b6a62a6ba8a,https://c1.staticflickr.com/9/8614/30555395836_bd793539b5_o.jpg,0.255402384501,0.0,0.766207153502,0.75,628,765,https://flickr.com/138532424@N02/30555395836,https://creativecommons.org/licenses/by/2.0/,Australian Embassy Jakarta,https://www.flickr.com/people/kedubesaustralia/ a8cfdf9c34e0a2d9,https://c1.staticflickr.com/8/7691/27087118310_696af659ea_o.jpg,0.25,0.0,1.0,0.56338028169,688,44,https://www.flickr.com/photos/xenocrates/27087118310/,https://creativecommons.org/licenses/by/2.0/,Shriram Rajagopalan,https://www.flickr.com/people/xenocrates/ cde1c3c60736172f,https://c1.staticflickr.com/1/723/31995310840_6e1bc09ab7_o.jpg,0.501840942563,0.0,1.0,0.75,763,769,https://flickr.com/45532942@N08/31995310840,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ d0d06d0b4adde069,https://c1.staticflickr.com/9/8282/29816630481_e333a2a194_o.jpg,0.25,0.281690140845,1.0,0.845070422535,407,224,https://www.flickr.com/photos/eltb/29816630481,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 2d1337e832e6fe6f,https://c1.staticflickr.com/9/8651/29182292624_e60247b542_o.jpg,0.25,0.0,0.75,0.75,699,889,https://www.flickr.com/photos/tipsfortravellers/29182292624,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 920ad3984ccec82f,https://c1.staticflickr.com/1/416/31606445890_7804e967b6_o.jpg,0.0,0.4375,0.75,1.0,883,416,https://flickr.com/60904035@N00/31606445890,https://creativecommons.org/licenses/by/2.0/,Ryan McBride,https://www.flickr.com/people/randomidea/ 808e9c7d014889d3,https://c1.staticflickr.com/9/8875/28734551356_0955dd5a2f_o.jpg,0.267938931298,0.25,0.803816793893,1.0,966,441,https://www.flickr.com/photos/ruthanddave/28734551356,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 8a49344047a5588b,https://c1.staticflickr.com/1/443/32132267962_1e28eaf5bc_o.jpg,0.25,0.28125,1.0,0.84375,650,757,https://www.flickr.com/photos/stonehenge-stone-circle/32132267962,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/ ed8e7a3d3c20f3d3,https://c1.staticflickr.com/1/504/31837345982_3baa01e3c8_o.jpg,0.0,0.0,0.75,0.469285714286,323,776,https://flickr.com/13497267@N04/31837345982,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ a9f3c1bde134189c,https://c1.staticflickr.com/8/7757/26883263780_13bfd4cd9f_o.jpg,0.0,0.0,1.0,0.666666666667,780,59,https://flickr.com/119921578@N08/26883263780,https://creativecommons.org/licenses/by/2.0/,Shauna Karren,https://www.flickr.com/people/119921578@N08/ 13d0357b6f74c9a1,https://c1.staticflickr.com/6/5465/30465251960_4f9a815547_o.jpg,0.0,0.25,0.498159057437,1.0,973,31,https://www.flickr.com/photos/jsjgeology/30465251960,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1f10c46a2add3154,https://c1.staticflickr.com/8/7493/27937773852_b7573a8ab7_o.jpg,0.0,0.0,0.732612055641,1.0,407,754,https://www.flickr.com/photos/eltb/27937773852,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ c45815b2680d4091,https://c1.staticflickr.com/8/7033/26847100771_f7975ee16c_o.jpg,0.433673469388,0.25,1.0,1.0,145,269,https://www.flickr.com/photos/lakeworth/26847100771/,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/ 4d6ea4a22304f6a3,https://c1.staticflickr.com/6/5765/30445790094_530ba6be7b_o.jpg,0.25,0.0,1.0,1.0,976,633,https://flickr.com/136319147@N08/30445790094,https://creativecommons.org/licenses/by/2.0/,Andrew Harvey,https://www.flickr.com/people/136319147@N08/ 5e193f640e7a14e8,https://c1.staticflickr.com/1/611/31582176402_97b2094baa_o.jpg,0.264204545455,0.25,0.792613636364,1.0,918,863,https://www.flickr.com/photos/13476480@N07/31582176402,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 6c7ade28cd53fb63,https://c1.staticflickr.com/9/8872/28508128535_94aa81cde1_o.jpg,0.0,0.0,0.75,0.75,820,843,https://www.flickr.com/photos/ultrakml/28508128535,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/ ca88af482ad8a06f,https://c1.staticflickr.com/8/7480/27302076643_050bb3431a_o.jpg,0.453219927096,0.0,0.906439854192,1.0,980,588,https://www.flickr.com/photos/nullawar/27302076643,https://creativecommons.org/licenses/by/2.0/,Mike Russell,https://www.flickr.com/people/nullawar/ 9b721117fc400fba,https://c1.staticflickr.com/8/7412/27027318824_1049060977_o.jpg,0.0,0.0,0.75,0.745945945946,450,586,https://www.flickr.com/photos/pussreboots/27027318824,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/ c0df62a82cafe1e9,https://c1.staticflickr.com/9/8502/28909144032_c39f154a89_o.jpg,0.281690140845,0.0,0.845070422535,0.75,309,873,https://www.flickr.com/photos/treegrow/28909144032,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ fedefb8996e29d17,https://c1.staticflickr.com/9/8482/28342708511_0616b54825_o.jpg,0.25,0.0,1.0,0.75,598,883,https://www.flickr.com/photos/78428166@N00/28342708511,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/ 9f4985797fa1d8ff,https://c1.staticflickr.com/9/8661/27816777924_23d5171937_o.jpg,0.0,0.0,0.75,0.423337856174,518,932,https://www.flickr.com/photos/ben_salter/27816777924,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ e40743c521088a46,https://c1.staticflickr.com/6/5814/30199467743_0356a2b7a4_o.jpg,0.249631811487,0.0,0.748895434462,0.75,558,467,https://www.flickr.com/photos/7armyjmtc/30199467743,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 7892e215793a52ba,https://c1.staticflickr.com/8/7543/26868867966_fb37f346dc_o.jpg,0.4375,0.0,1.0,0.75,336,201,https://www.flickr.com/photos/epector/26868867966/,https://creativecommons.org/licenses/by/2.0/,synspectrum,https://www.flickr.com/people/epector/ 1546e92bc6a7b022,https://c1.staticflickr.com/9/8409/29163039733_15b02066c8_o.jpg,0.28125,0.0,0.84375,0.75,430,646,https://www.flickr.com/photos/stevendepolo/29163039733,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 75a87ac21ad2e102,https://c1.staticflickr.com/4/3819/32404940724_d63f934fe5_o.jpg,0.25,0.25,0.75,1.0,563,105,http://www.flickr.com/photos/wendelinjacober/32404940724/,https://creativecommons.org/licenses/by/2.0/,Wendelin Jacober,https://www.flickr.com/people/wendelinjacober/ 0f045b490c3114d1,https://c1.staticflickr.com/2/1472/26739533465_54d714a5e7_o.jpg,0.2806640625,0.25,0.8419921875,1.0,145,150,https://www.flickr.com/photos/kpaulus/26739533465,https://creativecommons.org/licenses/by/2.0/,Kristine Paulus,https://www.flickr.com/people/kpaulus/ af9e74a075ac85af,https://c1.staticflickr.com/9/8877/28420485825_c05f70ef9a_o.jpg,0.25,0.5,1.0,1.0,418,659,https://www.flickr.com/photos/david_a_l/28420485825,https://creativecommons.org/licenses/by/2.0/,David \303\201lvarez L\303\263pez,https://www.flickr.com/people/david_a_l/ 2eb4e79648604ce8,https://c1.staticflickr.com/1/687/31689111765_9edb7e27b9_o.jpg,0.249079528719,0.0,0.747238586156,0.75,804,861,https://www.flickr.com/photos/oregondot/31689111765,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/ 894d73b393644096,https://c1.staticflickr.com/6/5640/30819180405_a10fce675d_o.jpg,0.321697324415,0.25,0.965091973244,1.0,651,727,https://www.flickr.com/photos/jus10h/30819180405,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ dbd5f5702c93d034,https://c1.staticflickr.com/6/5613/29951142783_3c84dbf4a5_o.jpg,0.25,0.25,1.0,1.0,884,279,https://www.flickr.com/photos/eeko/29951142783,https://creativecommons.org/licenses/by/2.0/,Easa Shamih,https://www.flickr.com/people/eeko/ 168d2537c53e700a,https://c1.staticflickr.com/8/7297/26898505771_a6e899cf76_o.jpg,0.5,0.25,1.0,1.0,752,952,https://www.flickr.com/photos/joe_labrie_photographe/26898505771/,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/ 20a0f33c27319e22,https://c1.staticflickr.com/6/5349/29914100011_df73f1e645_o.jpg,0.25,0.0,1.0,1.0,455,821,https://www.flickr.com/photos/43547009@N00/29914100011,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/ c68023eba7275883,https://c1.staticflickr.com/9/8516/29040164810_bdcb906ee2_o.jpg,0.25,0.0,1.0,0.5,304,235,https://www.flickr.com/photos/vahemart/29040164810,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 56c4132c88e2ed95,https://c1.staticflickr.com/6/5624/30343150400_da5e738a7d_o.jpg,0.25,0.25,1.0,1.0,922,794,https://flickr.com/64648244@N04/30343150400,https://creativecommons.org/licenses/by/2.0/,Ulf K,https://www.flickr.com/people/ulfk/ 4ddc5798f1064e63,https://c1.staticflickr.com/1/455/32798759792_39b67d5e08_o.jpg,0.0,0.2921875,0.75,0.8765625,254,270,http://www.flickr.com/photos/70253321@N00/32798759792/,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 77372caa2e431497,https://c1.staticflickr.com/3/2233/32810582941_4dc4d253b2_o.jpg,0.258620689655,0.25,0.775862068966,1.0,288,720,https://www.flickr.com/photos/56433265@N04/32810582941/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/ 3907155845aacc98,https://c1.staticflickr.com/1/725/32128693256_9ff9386c39_o.jpg,0.249079528719,0.25,0.747238586156,1.0,752,3,https://www.flickr.com/photos/davehamster/32128693256,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/ 5b163efae2531296,https://c1.staticflickr.com/6/5457/30527015730_0a47f991fa_o.jpg,0.0,0.0,0.75,0.5625,638,379,https://www.flickr.com/photos/davidwilson1949/30527015730,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 1e206ad4145c0550,https://c1.staticflickr.com/1/416/32543608055_15f03da798_o.jpg,0.500736377025,0.0,1.0,0.75,909,976,https://www.flickr.com/photos/wwworks/32543608055/,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/ ef2dd0a40f9eb549,https://c1.staticflickr.com/9/8596/28316352061_4101702259_o.jpg,0.4375,0.0,1.0,0.75,518,893,https://www.flickr.com/photos/zongo/28316352061,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ a88a23bb48fef5ab,https://c1.staticflickr.com/6/5649/31675014742_7bd1404bb5_o.jpg,0.25,0.25,1.0,1.0,699,524,https://www.flickr.com/photos/83015819@N00/31675014742,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/ cd40089255f3e954,https://c1.staticflickr.com/1/639/32597319832_fb1fae8a6e_o.jpg,0.256726457399,0.25,0.770179372197,1.0,921,912,https://flickr.com/139421366@N03/32597319832,https://creativecommons.org/licenses/by/2.0/,Chris Bee,https://www.flickr.com/people/139421366@N03/ fbda5ca921c03edd,https://c1.staticflickr.com/9/8524/29608377340_ce9b29e56f_o.jpg,0.0,0.0,0.501846381093,0.75,97,985,https://www.flickr.com/photos/amslerpix/29608377340/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 30389445f3947947,https://c1.staticflickr.com/6/5558/30981863726_345b0ee521_o.jpg,0.0,0.0,0.75,1.0,820,604,https://www.flickr.com/photos/j_regan/30981863726,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/ c606961aed093fc6,https://c1.staticflickr.com/6/5832/30705472991_32b2d24dbf_o.jpg,0.5,0.0,1.0,0.75,747,215,https://www.flickr.com/photos/mindahaas/30705472991/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ 5e6d3ce36813f328,https://c1.staticflickr.com/6/5577/30294594921_3896e83b14_o.jpg,0.248713235294,0.0,0.746139705882,0.75,950,58,https://www.flickr.com/photos/barnimages/30294594921,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ c1a578c938add7dd,https://c1.staticflickr.com/8/7527/26263014723_16931450f7_o.jpg,0.502573529412,0.0,1.0,0.75,459,847,https://www.flickr.com/photos/shankaronline/26263014723,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ b0b956df9bb694b5,https://c1.staticflickr.com/6/5748/31070607730_e3dbe9c896_o.jpg,0.210588633288,0.25,0.631765899865,1.0,875,522,http://www.flickr.com/photos/aswans1234567/31070607730/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston's Bus Photos,https://www.flickr.com/people/aswans1234567/ 7000bf5f979d6820,https://c1.staticflickr.com/9/8332/29873471852_7b0e3f52d9_o.jpg,0.4375,0.0,1.0,0.75,718,722,https://www.flickr.com/photos/truckhardware/29873471852,https://creativecommons.org/licenses/by/2.0/,Truck Hardware,https://www.flickr.com/people/truckhardware/ a58ddae3378df587,https://c1.staticflickr.com/8/7417/27305675741_e78da24597_o.jpg,0.25,0.0,0.75,0.75,51,393,https://www.flickr.com/photos/tipsfortravellers/27305675741,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 46a77a6a837577ae,https://c1.staticflickr.com/3/2534/32741715042_cf17efd441_o.jpg,0.438671875,0.0,1.0,0.75,889,85,http://www.flickr.com/photos/135123601@N08/32741715042,https://creativecommons.org/licenses/by/2.0/,Iain Merchant,https://www.flickr.com/people/iainmerchant/ 4a5952a5d4b57592,https://c1.staticflickr.com/9/8123/28370529884_392d7f31dd_o.jpg,0.572888283379,0.0,1.0,0.75,407,572,https://www.flickr.com/photos/eltb/28370529884,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ ff27bf6aa84e6259,https://c1.staticflickr.com/8/7550/26912267132_7293f9ec75_o.jpg,0.280784844384,0.0,0.842354533153,1.0,789,521,https://www.flickr.com/photos/sheilaellen/26912267132,https://creativecommons.org/licenses/by/2.0/,Sheila Thomson,https://www.flickr.com/people/sheilaellen/ 3fa5028cf4f8ba2c,https://c1.staticflickr.com/9/8280/27926586644_42a579895d_o.jpg,0.5,0.0,1.0,0.75,647,951,https://www.flickr.com/photos/unb_agencia/27926586644,https://creativecommons.org/licenses/by/2.0/,Secom UnB,https://www.flickr.com/people/unb_agencia/ 84ac2949eec4c848,https://c1.staticflickr.com/9/8541/30024614922_ae26962220_o.jpg,0.0763888888889,0.0,1.0,1.0,775,833,https://www.flickr.com/photos/atoach/30024614922,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 43692809404c2d2d,https://c1.staticflickr.com/9/8399/28809717223_c1f4ea19f3_o.jpg,0.180225281602,0.0,0.540675844806,0.75,780,784,https://www.flickr.com/photos/thoseguys119/28809717223/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ b6800449b18b4a4d,https://c1.staticflickr.com/6/5340/30068133376_2800644f3f_o.jpg,0.0,0.25,0.748646209386,1.0,809,545,https://www.flickr.com/photos/13476480@N07/30068133376,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 95decb1c7f103716,https://c1.staticflickr.com/9/8640/28451285815_dfd9901e94_o.jpg,0.267938931298,0.25,0.803816793893,1.0,563,634,https://www.flickr.com/photos/jpstjohn/28451285815,https://creativecommons.org/licenses/by/2.0/,John St John,https://www.flickr.com/people/jpstjohn/ d5a6d3ff26f5aee3,https://c1.staticflickr.com/8/7429/26702998642_b02d4c0f19_o.jpg,0.25,0.25,0.75,1.0,512,748,https://www.flickr.com/photos/135553449@N08/26702998642/,https://creativecommons.org/licenses/by/2.0/,Steve Ginn,https://www.flickr.com/people/135553449@N08/ eceb77cce5f6b545,https://c1.staticflickr.com/1/583/31465196773_814262f726_o.jpg,0.0,0.25,0.718197879859,1.0,52,633,https://www.flickr.com/photos/jsjgeology/31465196773,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 7608022af9de0911,https://c1.staticflickr.com/9/8669/28346022974_586470b74b_o.jpg,0.225,0.25,0.675,1.0,437,945,https://www.flickr.com/photos/51811543@N08/28346022974,https://creativecommons.org/licenses/by/2.0/,FotoSleuth,https://www.flickr.com/people/51811543@N08/ 6345939a69bbcd9f,https://c1.staticflickr.com/9/8878/28327476194_8048ba973e_o.jpg,0.25,0.299878836834,1.0,0.899636510501,982,265,https://www.flickr.com/photos/slgc/28327476194/,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ 35362d276b96493a,https://c1.staticflickr.com/9/8093/29140632692_d048e65eff_o.jpg,0.0,0.0,0.666666666667,1.0,820,399,http://www.flickr.com/photos/34203205@N00/29140632692,https://creativecommons.org/licenses/by/2.0/,michael dornbierer,https://www.flickr.com/people/ausnahmezustand/ 43fa7681ff455067,https://c1.staticflickr.com/1/604/32384468300_622ef05e1f_o.jpg,0.328696925329,0.0,0.986090775988,1.0,404,283,https://flickr.com/56594044@N06/32384468300,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ e3e48bbc18512d8b,https://c1.staticflickr.com/1/664/31944680043_994ed0ef67_o.jpg,0.0,0.25,0.5,1.0,752,756,https://www.flickr.com/photos/bpprice/31944680043,https://creativecommons.org/licenses/by/2.0/,brando.n,https://www.flickr.com/people/bpprice/ 729d9a32a3aed341,https://c1.staticflickr.com/9/8552/29685024330_47306c2d34_o.jpg,0.5,0.25,1.0,1.0,875,454,https://www.flickr.com/photos/brisbanecitycouncil/29685024330,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/ 9a4abb4f1c8b6a40,https://c1.staticflickr.com/9/8461/29333983472_50e8ff4499_o.jpg,0.57825203252,0.0,1.0,0.75,880,450,https://www.flickr.com/photos/danramarch/29333983472,https://creativecommons.org/licenses/by/2.0/,Daniel Ramirez,https://www.flickr.com/people/danramarch/ 62943f3ebd229c97,https://c1.staticflickr.com/1/509/31604986414_71d9dc6baf_o.jpg,0.28125,0.0,0.84375,0.75,875,162,https://www.flickr.com/photos/69203347@N03/31604986414,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ 176661d425ada84d,https://c1.staticflickr.com/9/8408/29017413622_62b8e6f79f_o.jpg,0.25,0.0,1.0,0.75,323,835,https://www.flickr.com/photos/jedrecord/29017413622,https://creativecommons.org/licenses/by/2.0/,Jed Record,https://www.flickr.com/people/jedrecord/ c3563115b7782179,https://c1.staticflickr.com/6/5808/29872632613_a8d3e09c4f_o.jpg,0.284198113208,0.0,0.852594339623,0.75,982,142,https://www.flickr.com/photos/apardavila/29872632613,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 4c9a630a85867657,https://c1.staticflickr.com/8/7746/27252116771_9ee431696f_o.jpg,0.297768479777,0.0,0.893305439331,1.0,699,813,https://www.flickr.com/photos/ian_d/27252116771,https://creativecommons.org/licenses/by/2.0/,Ian Dick,https://www.flickr.com/people/ian_d/ 376f72d7db053e97,https://c1.staticflickr.com/6/5588/29922613536_78a740046d_o.jpg,0.25,0.0,1.0,1.0,625,865,https://www.flickr.com/photos/tslac/29922613536,https://creativecommons.org/licenses/by/2.0/,Texas State Library and Archives Commission,https://www.flickr.com/people/tslac/ f65cdc11b6b64455,https://c1.staticflickr.com/6/5662/30630043532_1b75017d72_o.jpg,0.305722891566,0.0,1.0,1.0,982,532,https://www.flickr.com/photos/apardavila/30630043532/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ cc62a2cec0d7d24d,https://c1.staticflickr.com/9/8650/30420241085_24eafa244f_o.jpg,0.0,0.0,0.75,0.75,672,691,https://www.flickr.com/photos/glorycycles/30420241085,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 09ed6b229a742b79,https://c1.staticflickr.com/8/7408/27766557031_d39401b621_o.jpg,0.0,0.0,0.75,0.75,742,526,https://www.flickr.com/photos/el_cajon_yacht_club/27766557031,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/ 2d8d28903d67e4e9,https://c1.staticflickr.com/8/7561/26963610801_572e0ee4c7_o.jpg,0.232244318182,0.0,0.696732954545,0.75,405,576,https://flickr.com/34200064@N08/26963610801,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/ 4d10858914409bc3,https://c1.staticflickr.com/8/7483/26546059003_8bd6ecbc48_o.jpg,0.24882629108,0.0,1.0,1.0,111,83,https://flickr.com/70804987@N00/26546059003,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/ 28b8e5c3fc0fdc74,https://c1.staticflickr.com/8/7503/29473531483_406ed8a956_o.jpg,0.0,0.0,0.666666666667,1.0,623,326,https://flickr.com/23928430@N05/29473531483,https://creativecommons.org/licenses/by/2.0/,eduardo.ferron,https://www.flickr.com/people/23928430@N05/ 32581cf019042e32,https://c1.staticflickr.com/9/8630/29467085285_91879b00d6_o.jpg,0.5,0.0,1.0,0.75,986,883,https://www.flickr.com/photos/cogdog/29467085285,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ da9f4f268f299bfc,https://c1.staticflickr.com/9/8621/27633111553_4f11c06e3a_o.jpg,0.475899280576,0.0,0.951798561151,0.75,699,808,https://www.flickr.com/photos/67117584@N04/27633111553,https://creativecommons.org/licenses/by/2.0/,Aleah Phils,https://www.flickr.com/people/67117584@N04/ bb1471310a7905c9,https://c1.staticflickr.com/9/8314/29191758144_c44f945d59_o.jpg,0.197411003236,0.0,1.0,1.0,918,724,https://www.flickr.com/photos/chrstphre/29191758144/,https://creativecommons.org/licenses/by/2.0/,chrstphr\303\251 c\303\246mpb\303\253ll,https://www.flickr.com/people/chrstphre/ 9653a6a7de9efcc9,https://c1.staticflickr.com/9/8400/29498634994_1ed877e277_o.jpg,0.0,0.0,0.7484375,1.0,822,622,https://www.flickr.com/photos/linsinchen/29498634994,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/ 208a1e2ea402251f,https://c1.staticflickr.com/6/5443/30119348680_527172cd04_o.jpg,0.25,0.279205607477,1.0,0.83761682243,407,600,https://www.flickr.com/photos/eltb/30119348680,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ c74d247a0927c95f,https://c1.staticflickr.com/8/7747/26548563113_4776647bd8_o.jpg,0.333333333333,0.0,1.0,1.0,480,37,https://www.flickr.com/photos/luxurydesigner/26548563113,https://creativecommons.org/licenses/by/2.0/,Brandon Bailey,https://www.flickr.com/people/luxurydesigner/ caf2e98bf1caae20,https://c1.staticflickr.com/8/7458/27860791762_e671d93eb5_o.jpg,0.4375,0.25,1.0,1.0,820,965,https://www.flickr.com/photos/paulcarless/27860791762/,https://creativecommons.org/licenses/by/2.0/,Paul Carless,https://www.flickr.com/people/paulcarless/ 0fa46fff42d072a8,https://c1.staticflickr.com/8/7014/26218524153_5b1e86b08a_o.jpg,0.330871491876,0.0,1.0,1.0,27,409,https://www.flickr.com/photos/vastateparksstaff/26218524153,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ a579a2a0e34a70fe,https://c1.staticflickr.com/9/8306/27900114863_c826b3d227_o.jpg,0.503303964758,0.25,1.0,1.0,704,535,https://www.flickr.com/photos/mks_s2is/27900114863,https://creativecommons.org/licenses/by/2.0/,Manish Srivastava,https://www.flickr.com/people/mks_s2is/ 55cd7bd3ca55d413,https://c1.staticflickr.com/8/7537/28073649482_4ee00c28b4_o.jpg,0.252222222222,0.25,0.756666666667,1.0,405,416,https://www.flickr.com/photos/barteq24/28073649482,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/ 9ca2a73879f15f6b,https://c1.staticflickr.com/9/8207/28742793560_ff0a0ecc66_o.jpg,0.0,0.25,0.498159057437,1.0,826,795,https://www.flickr.com/photos/zigazou76/28742793560,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 75f15badd0ee2b81,https://c1.staticflickr.com/9/8728/28910624571_ac6b2e55a9_o.jpg,0.0,0.0,0.5,0.75,438,593,https://www.flickr.com/photos/bumeister/28910624571,https://creativecommons.org/licenses/by/2.0/,John Buie,https://www.flickr.com/people/bumeister/ b7fdc64ea8d656a7,https://c1.staticflickr.com/1/496/32119006770_3dca38ff55_o.jpg,0.25,0.25,1.0,1.0,91,111,https://www.flickr.com/photos/30478819@N08/32119006770,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 2eb27f0707abb813,https://c1.staticflickr.com/6/5827/30132402646_6a9d4b4ebf_o.jpg,0.25,0.25,0.75,1.0,536,563,https://www.flickr.com/photos/67338640@N04/30132402646,https://creativecommons.org/licenses/by/2.0/,Billy Meinke,https://www.flickr.com/people/67338640@N04/ 22b826285fdf981d,https://c1.staticflickr.com/1/408/31753241363_c65b7a19de_o.jpg,0.0,0.0,0.651603498542,1.0,292,143,https://www.flickr.com/photos/13476480@N07/31753241363,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ ff262013963d745a,https://c1.staticflickr.com/1/594/31944475485_707dd45b66_o.jpg,0.0,0.25,0.494868035191,1.0,499,678,https://www.flickr.com/photos/duncanh1/31944475485,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 7e67be74a6a84ae2,https://c1.staticflickr.com/9/8742/28322612182_356d5978f0_o.jpg,0.333333333333,0.0,1.0,1.0,806,734,https://www.flickr.com/photos/143135875@N03/28322612182,https://creativecommons.org/licenses/by/2.0/,Save the Dream,https://www.flickr.com/people/143135875@N03/ 2b431f2d4e46dd5b,https://c1.staticflickr.com/9/8806/29320944834_861d10ab03_o.jpg,0.25,0.0,0.75,0.75,340,217,https://www.flickr.com/photos/blmoregon/29320944834,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ d8be262e7018a4c5,https://c1.staticflickr.com/9/8559/29648194554_be791830c0_o.jpg,0.4375,0.25,1.0,1.0,820,295,https://flickr.com/126953417@N02/29648194554,https://creativecommons.org/licenses/by/2.0/,Philip Terry Graham,https://www.flickr.com/people/philipterrygraham/ b9e92b1fa6b249d0,https://c1.staticflickr.com/9/8086/29212850355_09e70e1ee0_o.jpg,0.4375,0.25,1.0,1.0,707,851,https://www.flickr.com/photos/davidwilson1949/29212850355,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ ea32dde60c4c2efc,https://c1.staticflickr.com/9/8188/29374608790_de510dc1aa_o.jpg,0.0,0.0,0.5625,0.75,986,134,https://www.flickr.com/photos/swallowtailgardenseeds/29374608790,https://creativecommons.org/licenses/by/2.0/,Swallowtail Garden Seeds,https://www.flickr.com/people/swallowtailgardenseeds/ d9d151273d6ded24,https://c1.staticflickr.com/9/8104/28400865306_a6b9d8cdb8_o.jpg,0.25,0.25,0.75,1.0,518,703,https://www.flickr.com/photos/ben_salter/28400865306,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ 5e18d65c2e4175d4,https://c1.staticflickr.com/1/404/31651307103_e78e74a17d_o.jpg,0.5,0.25,1.0,1.0,875,1000,https://www.flickr.com/photos/didbygraham/31651307103,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 51fd398284ce6523,https://c1.staticflickr.com/9/8673/28077722833_fe82806df9_o.jpg,0.0,0.25,0.5,1.0,982,634,https://www.flickr.com/photos/usembassytokyo/28077722833,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tokyo,https://www.flickr.com/people/usembassytokyo/ ab37fcb40fbd9661,https://c1.staticflickr.com/8/7768/27120250072_f91393db94_o.jpg,0.304763843648,0.0,0.914291530945,0.75,254,921,https://www.flickr.com/photos/70253321@N00/27120250072,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 1422b69d5aeb4fef,https://c1.staticflickr.com/8/7515/27446869975_5162fa4871_o.jpg,0.5,0.0,1.0,0.75,854,814,https://www.flickr.com/photos/boblinsdell/27446869975,https://creativecommons.org/licenses/by/2.0/,Robert Linsdell,https://www.flickr.com/people/boblinsdell/ f345951b2d143381,https://c1.staticflickr.com/6/5648/30450489713_02f33ddc47_o.jpg,0.421177266576,0.0,0.842354533153,0.75,672,248,https://flickr.com/67338640@N04/30450489713,https://creativecommons.org/licenses/by/2.0/,Billy Meinke,https://www.flickr.com/people/67338640@N04/ 8c191e8a556be591,https://c1.staticflickr.com/8/7699/26262891823_27730e2a4e_o.jpg,0.28125,0.25,0.84375,1.0,548,973,https://www.flickr.com/photos/shankaronline/26262891823,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ b442981d75e8827c,https://c1.staticflickr.com/9/8552/29484516382_34ea047795_o.jpg,0.0,0.25,0.5,1.0,826,543,https://www.flickr.com/photos/mypubliclands/29484516382,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ ed42252ca0c0fca5,https://c1.staticflickr.com/9/8882/29637622941_a0525ba07e_o.jpg,0.0,0.0,1.0,0.666666666667,542,439,https://www.flickr.com/photos/fifeanddrum/29637622941/,https://creativecommons.org/licenses/by/2.0/,U. S. Army Old Guard Fife and Drum Corps,https://www.flickr.com/people/fifeanddrum/ 96b491f175b8cf59,https://c1.staticflickr.com/8/7461/27116998031_2a6938ac23_o.jpg,0.28125,0.0,0.84375,0.75,780,346,https://www.flickr.com/photos/thoseguys119/27116998031,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 1bdc84d77ef6eeb4,https://c1.staticflickr.com/9/8666/28872550855_8e61387f71_o.jpg,0.0,0.0,0.75,1.0,947,946,https://www.flickr.com/photos/herry/28872550855/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/ 6d04a7f9909af6f9,https://c1.staticflickr.com/8/7236/27249387145_d98251094c_o.jpg,0.0,0.0,0.590144230769,0.75,672,812,https://www.flickr.com/photos/glorycycles/27249387145,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 8ade41da3cce419e,https://c1.staticflickr.com/8/7356/28058022675_1b60877b5f_o.jpg,0.0,0.0,0.75,0.5,890,532,https://www.flickr.com/photos/harpgirl207/28058022675,https://creativecommons.org/licenses/by/2.0/,Daryne Rockett,https://www.flickr.com/people/harpgirl207/ 92e1e5bc406bc176,https://c1.staticflickr.com/6/5542/31132614095_a8beb6ea92_o.jpg,0.0,0.0,0.483695652174,0.75,822,119,https://www.flickr.com/photos/13476480@N07/31132614095,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 6c80a0c05a8801cb,https://c1.staticflickr.com/8/7760/26976115054_df1363f4b8_o.jpg,0.224162011173,0.25,0.67248603352,1.0,294,377,https://www.flickr.com/photos/dkeats/26976115054,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ bd7e87b9dd13f030,https://c1.staticflickr.com/9/8612/28274676694_1840f44362_o.jpg,0.25,0.28125,1.0,0.84375,526,510,https://www.flickr.com/photos/usfwsnortheast/28274676694,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Northeast Region,https://www.flickr.com/people/usfwsnortheast/ 08bf33bd0196b604,https://c1.staticflickr.com/9/8363/28483507140_8a98e2f2f4_o.jpg,0.0,0.0,0.75,0.75,922,741,https://www.flickr.com/photos/blmurch/28483507140,https://creativecommons.org/licenses/by/2.0/,Beatrice Murch,https://www.flickr.com/people/blmurch/ 95611cfe1e1e783d,https://c1.staticflickr.com/6/5706/30330860025_207ac529f1_o.jpg,0.0,0.0,0.5,0.75,302,793,https://www.flickr.com/photos/133415851@N08/30330860025,https://creativecommons.org/licenses/by/2.0/,Federico Ettlin,https://www.flickr.com/people/ettlin/ 5dc0418b00b6801a,https://c1.staticflickr.com/8/7519/26825284972_26239c59fa_o.jpg,0.421177266576,0.0,0.842354533153,0.75,605,272,https://www.flickr.com/photos/serdal/26825284972,https://creativecommons.org/licenses/by/2.0/,Abdulla Al Muhairi,https://www.flickr.com/people/serdal/ 250a4e78694d57b2,https://c1.staticflickr.com/8/7412/27882769711_d05842dbe1_o.jpg,0.0,0.0,0.75,1.0,114,824,https://www.flickr.com/photos/eddiesfisheriesfws/27882769711/,https://creativecommons.org/licenses/by/2.0/,USFWS Fish and Aquatic Conservation,https://www.flickr.com/people/eddiesfisheriesfws/ 28e7a2f7b78f10d4,https://c1.staticflickr.com/8/7283/28045851021_f26efcff08_o.jpg,0.486899563319,0.25,0.973799126638,1.0,323,764,https://www.flickr.com/photos/postmanpetecoluk/28045851021,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ 8271f93f3e75a983,https://c1.staticflickr.com/9/8073/29101100124_3ddd63b029_o.jpg,0.25,0.0,0.75,0.75,821,860,https://www.flickr.com/photos/60900612@N08/29101100124,https://creativecommons.org/licenses/by/2.0/,Thomas's Pics,https://www.flickr.com/people/60900612@N08/ 864681a079ae9c4a,https://c1.staticflickr.com/4/3665/33401371052_8da279ae97_o.jpg,0.299878836834,0.25,0.899636510501,1.0,747,658,https://flickr.com/98147195@N00/33401371052,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ 4e4629ba89c48e20,https://c1.staticflickr.com/8/7582/26861699723_58905c7e5c_o.jpg,0.5,0.25,1.0,1.0,348,377,https://www.flickr.com/photos/16725630@N00/26861699723/,https://creativecommons.org/licenses/by/2.0/,Matt Zimmerman,https://www.flickr.com/people/16725630@N00/ 7bf8a73c6a3e6f6e,https://c1.staticflickr.com/9/8553/29469226676_795a7000dc_o.jpg,0.0,0.0,0.666666666667,1.0,848,718,https://www.flickr.com/photos/13476480@N07/29469226676,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c9f6ade8fe7e47da,https://c1.staticflickr.com/8/7744/29895497901_2e3722e850_o.jpg,0.0,0.25,0.499263622975,1.0,875,111,https://www.flickr.com/photos/brisbanecitycouncil/29895497901,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/ 71661c85a5364f1c,https://c1.staticflickr.com/1/494/31278219683_25d9d5be39_o.jpg,0.0,0.4375,0.75,1.0,874,886,http://www.flickr.com/photos/mmmavocado/31278219683/,https://creativecommons.org/licenses/by/2.0/,Malcolm Manners,https://www.flickr.com/people/mmmavocado/ 02d6357b81a19f7a,https://c1.staticflickr.com/1/520/31587792501_0db6a658f5_o.jpg,0.0,0.0,0.5,0.75,208,224,http://www.flickr.com/photos/25168691@N06/31587792501/,https://creativecommons.org/licenses/by/2.0/,Franco Vannini,https://www.flickr.com/people/25168691@N06/ bdb3ac2bcadc18b7,https://c1.staticflickr.com/9/8084/29090403712_05914cf758_o.jpg,0.28125,0.25,0.84375,1.0,884,728,https://flickr.com/127226743@N02/29090403712,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 561bd73158765c4c,https://c1.staticflickr.com/1/492/31637173050_c5bd237641_o.jpg,0.273726851852,0.0,0.821180555556,0.75,866,843,https://www.flickr.com/photos/79157069@N03/31637173050/,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ 17117816e00663b1,https://c1.staticflickr.com/9/8701/29178739824_bc403d6d19_o.jpg,0.25,0.25,0.75,1.0,548,977,https://www.flickr.com/photos/136315829@N03/29178739824,https://creativecommons.org/licenses/by/2.0/,Steven Penton,https://www.flickr.com/people/136315829@N03/ e92cb3a7a3e7acd1,https://c1.staticflickr.com/9/8017/27795197394_009b984478_o.jpg,0.0,0.0,0.715608465608,0.75,426,865,https://www.flickr.com/photos/grassrootsgroundswell/27795197394,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/ 9c299f3d9437b395,https://c1.staticflickr.com/8/7509/29632773266_e12418eb3a_o.jpg,0.0,0.25,0.5,1.0,561,315,https://www.flickr.com/photos/jill_carlson/29632773266/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ f94f7c692f320d53,https://c1.staticflickr.com/9/8123/28807487474_9549d0fa65_o.jpg,0.0,0.25,0.5,1.0,959,438,https://www.flickr.com/photos/glenbowman/28807487474/,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 3b8c55210036a111,https://c1.staticflickr.com/9/8362/28773653415_e9cf008826_o.jpg,0.5,0.0,1.0,0.75,976,820,https://www.flickr.com/photos/mypubliclands/28773653415,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ b609ddb87e56efb9,https://c1.staticflickr.com/8/7718/27117514014_5b261bfa7f_o.jpg,0.0,0.0,0.669128508124,1.0,699,779,https://www.flickr.com/photos/jorge-11/27117514014,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/ 8c71fe2036787ecc,https://c1.staticflickr.com/1/564/31865098294_d4c342acdf_o.jpg,0.625956632653,0.25,1.0,1.0,980,803,https://www.flickr.com/photos/mpaulmd/31865098294,https://creativecommons.org/licenses/by/2.0/,"See1,Do1,Teach1",https://www.flickr.com/people/mpaulmd/ 69f7ca8a56bd02e1,https://c1.staticflickr.com/8/7663/28148115113_ea0dc499b8_o.jpg,0.333333333333,0.0,1.0,1.0,519,346,https://www.flickr.com/photos/janitors/28148115113,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 34cd73dae4d33894,https://c1.staticflickr.com/3/2459/32645460182_e6eb087e6c_o.jpg,0.0,0.25,0.496696035242,1.0,20,237,https://www.flickr.com/photos/sybarite48/32645460182/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 2d344176720d5113,https://c1.staticflickr.com/8/7313/27988711545_7e27d7c595_o.jpg,0.0,0.0,0.5,0.75,978,337,https://www.flickr.com/photos/mypubliclands/27988711545,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ d70af0d8b15c9049,https://c1.staticflickr.com/1/294/32050275290_1eaa9383d1_o.jpg,0.25,0.0,1.0,0.75,976,508,https://www.flickr.com/photos/neilconway/32050275290/,https://creativecommons.org/licenses/by/2.0/,Neil Conway,https://www.flickr.com/people/neilconway/ d92cfc146d9b3c62,https://c1.staticflickr.com/6/5775/31360565036_d17521125d_o.jpg,0.25,0.0,1.0,0.75,437,698,https://www.flickr.com/photos/vitofun/31360565036/,https://creativecommons.org/licenses/by/2.0/,Vito Fun,https://www.flickr.com/people/vitofun/ f493729343334619,https://c1.staticflickr.com/1/686/32630596735_7d75386fb3_o.jpg,0.25,0.256744604317,1.0,1.0,495,753,https://www.flickr.com/photos/pagedooley/32630596735,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/ 5ae100fdc51dfe53,https://c1.staticflickr.com/6/5603/31637845721_3fb25b5706_o.jpg,0.0,0.312283737024,0.75,1.0,746,454,https://www.flickr.com/photos/lge/31637845721,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 43ce20ed448debc8,https://c1.staticflickr.com/8/7493/26553609544_b032bfc9ed_o.jpg,0.299878836834,0.0,0.899636510501,0.75,882,370,https://www.flickr.com/photos/david_martin_foto/26553609544/,https://creativecommons.org/licenses/by/2.0/,David D,https://www.flickr.com/people/david_martin_foto/ 78ee388a64d86450,https://c1.staticflickr.com/8/7494/27158530492_fc78b95948_o.jpg,0.715833333333,0.0,1.0,0.75,780,148,https://www.flickr.com/photos/thoseguys119/27158530492,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ aecd74be9b2a3c11,https://c1.staticflickr.com/9/8636/28613835790_8156d52767_o.jpg,0.423259493671,0.0,1.0,0.75,135,255,https://www.flickr.com/photos/usfwsmtnprairie/28613835790,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 3590bef0978e22f6,https://c1.staticflickr.com/9/8337/29586455466_c3868fdb73_o.jpg,0.4375,0.0,1.0,0.75,455,865,https://www.flickr.com/photos/boscdanjou/29586455466/,https://creativecommons.org/licenses/by/2.0/,Bosc d'Anjou,https://www.flickr.com/people/boscdanjou/ ab7359c299f91d54,https://c1.staticflickr.com/1/298/31600597854_21ebc4bf7c_o.jpg,0.28125,0.25,0.84375,1.0,512,586,https://www.flickr.com/photos/27665395@N05/31600597854,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 2ef4afb5b9e236ce,https://c1.staticflickr.com/1/553/32609352821_93a1c4f1aa_o.jpg,0.0,0.0,0.5,0.75,980,705,https://flickr.com/133461395@N08/32609352821,https://creativecommons.org/licenses/by/2.0/,ian_woodhead1,https://www.flickr.com/people/133461395@N08/ 5c89f0eb592da419,https://c1.staticflickr.com/9/8328/28662281513_46751c45cc_o.jpg,0.0,0.25,0.75,1.0,93,797,https://www.flickr.com/photos/andymorffew/28662281513,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ 5e9bf4a72dc082d6,https://c1.staticflickr.com/1/683/32251942630_39f9bb533e_o.jpg,0.0,0.25,0.5625,1.0,469,314,https://www.flickr.com/photos/27665395@N05/32251942630,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 5e88f291092f01f2,https://c1.staticflickr.com/6/5453/30610573186_e81d93777d_o.jpg,0.23377318117,0.25,0.701319543509,1.0,120,622,https://www.flickr.com/photos/puliarfanita/30610573186,https://creativecommons.org/licenses/by/2.0/,Anita Ritenour,https://www.flickr.com/people/puliarfanita/ 32c431261eb28350,https://c1.staticflickr.com/6/5493/30963439266_1acac78138_o.jpg,0.222705146036,0.0,0.668115438108,0.75,604,259,https://www.flickr.com/photos/13476480@N07/30963439266,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ df0223e48056caf1,https://c1.staticflickr.com/3/2576/32913772002_c43a2d28fc_o.jpg,0.0,0.0,1.0,1.0,971,398,http://www.flickr.com/photos/chreegou/32913772002/,https://creativecommons.org/licenses/by/2.0/,Christian Scheidegger,https://www.flickr.com/people/chreegou/ 094024fbdaa5e05d,https://c1.staticflickr.com/9/8790/27693088764_0a78f351f8_o.jpg,0.5,0.25,1.0,1.0,896,484,https://www.flickr.com/photos/ronmacphotos/27693088764,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/ 8aacd37898e16d74,https://c1.staticflickr.com/9/8420/29516799382_31e27a091d_o.jpg,0.5,0.0,1.0,0.75,986,491,https://www.flickr.com/photos/aldenchadwick/29516799382,https://creativecommons.org/licenses/by/2.0/,Alden Chadwick,https://www.flickr.com/people/aldenchadwick/ ee80eba791d1f3e5,https://c1.staticflickr.com/8/7268/27444227902_12c1235f69_o.jpg,0.0,0.25,0.496696035242,1.0,976,658,https://www.flickr.com/photos/sybarite48/27444227902,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ d82621c4f54a5692,https://c1.staticflickr.com/9/8149/28649039143_4ab9d19f1f_o.jpg,0.25,0.282719435737,1.0,0.84815830721,407,592,https://www.flickr.com/photos/eltb/28649039143,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ c1405ddda82f64a0,https://c1.staticflickr.com/8/7029/26676407780_55d7898ec3_o.jpg,0.5,0.25,1.0,1.0,848,203,https://www.flickr.com/photos/7armyjmtc/26676407780/,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 42d97cc2d5f30194,https://c1.staticflickr.com/6/5577/31090918090_48b4824988_o.jpg,0.28125,0.25,0.84375,1.0,897,746,https://www.flickr.com/photos/49078795@N07/31090918090,https://creativecommons.org/licenses/by/2.0/,DuPont Surfaces,https://www.flickr.com/people/49078795@N07/ bffd8d313c3ddf01,https://c1.staticflickr.com/8/7513/27217563956_5d56ed383c_o.jpg,0.28125,0.0,0.84375,0.75,404,203,https://www.flickr.com/photos/apreche/27217563956,https://creativecommons.org/licenses/by/2.0/,Scott Rubin,https://www.flickr.com/people/apreche/ a25d6d151c52f190,https://c1.staticflickr.com/9/8881/28332021542_0462976846_o.jpg,0.4375,0.25,1.0,1.0,975,854,https://www.flickr.com/photos/jsjgeology/28332021542,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 3ec9ee64f4139b22,https://c1.staticflickr.com/9/8265/29109707465_ea591e45ec_o.jpg,0.0,0.0,0.75,0.565438871473,407,519,https://www.flickr.com/photos/eltb/29109707465,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 2f989dacfb8917ac,https://c1.staticflickr.com/9/8155/29380286205_5828d944af_o.jpg,0.0,0.25,0.5625,1.0,676,788,https://www.flickr.com/photos/27665395@N05/29380286205,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 81d98abfe5f68239,https://c1.staticflickr.com/6/5587/30880863674_02082fa52b_o.jpg,0.0,0.0,0.564263322884,0.75,580,571,https://www.flickr.com/photos/eebeephoto/30880863674/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/ 3a790519df1cf445,https://c1.staticflickr.com/8/7424/27170809691_0b0d4714f6_o.jpg,0.252730109204,0.0,1.0,1.0,484,801,https://www.flickr.com/photos/andreboeni/27170809691,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 783baac4919dbfdc,https://c1.staticflickr.com/9/8599/28246501132_7cf85a6595_o.jpg,0.0,0.0,0.75,0.494868035191,472,469,https://www.flickr.com/photos/mypubliclands/28246501132,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 222d963ec296ba85,https://c1.staticflickr.com/8/7403/27002667152_9c61e1534a_o.jpg,0.412939297125,0.25,1.0,1.0,982,715,https://www.flickr.com/photos/royluck/27002667152,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/ 6ead8e7bdc86de20,https://c1.staticflickr.com/1/387/31542908683_3487752baa_o.jpg,0.0,0.0,0.666666666667,1.0,861,231,https://www.flickr.com/photos/sebaso/31542908683,https://creativecommons.org/licenses/by/2.0/,sebaso,https://www.flickr.com/people/sebaso/ 1b2127870b62dae3,https://c1.staticflickr.com/8/7402/26753003614_915daa1311_o.jpg,0.0,0.25,0.5,1.0,780,437,https://www.flickr.com/photos/ufv/26753003614/,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ b4732f355fd2b5b3,https://c1.staticflickr.com/6/5552/29844074114_5f71079779_o.jpg,0.0,0.0,0.448324022346,0.75,848,3,https://www.flickr.com/photos/ministreiodadefesa/29844074114,https://creativecommons.org/licenses/by/2.0/,Minist\303\251rio da Defesa,https://www.flickr.com/people/ministreiodadefesa/ 597b8ad18ff252c6,https://c1.staticflickr.com/8/7312/27533218336_7071e03e77_o.jpg,0.2946,0.0,0.8838,0.75,653,780,https://flickr.com/50426192@N04/27533218336,https://creativecommons.org/licenses/by/2.0/,Virginia Department of Education,https://www.flickr.com/people/vdoe/ af5a6a757ef0acb0,https://c1.staticflickr.com/8/7554/29850590502_994f4b8eff_o.jpg,0.0,0.0,0.666666666667,1.0,629,591,https://www.flickr.com/photos/aotaro/29850590502,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/ 32b9a80dc976a368,https://c1.staticflickr.com/6/5487/29928209424_3ce2eafbd5_o.jpg,0.28125,0.0,0.84375,0.75,808,679,https://www.flickr.com/photos/usdagov/29928209424,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ ce8a7701855a2561,https://c1.staticflickr.com/6/5830/30675470066_5090bdbe8e_o.jpg,0.0,0.25,0.5625,1.0,985,667,https://www.flickr.com/photos/usdagov/30675470066,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 7d4a6a1713f78894,https://c1.staticflickr.com/8/7535/27149507485_4c871ddf91_o.jpg,0.497411242604,0.25,1.0,1.0,404,418,https://www.flickr.com/photos/13476480@N07/27149507485,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ bc1abd715b444c62,https://c1.staticflickr.com/8/7648/27055435895_8f7bae2717_o.jpg,0.25,0.281690140845,1.0,0.845070422535,840,230,https://www.flickr.com/photos/tobiasberchtold/27055435895/,https://creativecommons.org/licenses/by/2.0/,Tobias Berchtold,https://www.flickr.com/people/tobiasberchtold/ bd54ec9eb8d55c34,https://c1.staticflickr.com/8/7449/26946510591_e12b6ddc98_o.jpg,0.0,0.0,0.75,1.0,699,620,https://www.flickr.com/photos/ewolivera/26946510591,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ aedf6b0e9499dcb4,https://c1.staticflickr.com/8/7474/27946937835_713e1c3320_o.jpg,0.0,0.25,0.75,0.75,709,92,https://www.flickr.com/photos/dalbera/27946937835,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 7be6cc04e2a38ce2,https://c1.staticflickr.com/8/7289/27515222750_8316d647fc_o.jpg,0.25,0.440717628705,1.0,1.0,806,489,https://www.flickr.com/photos/usarjnco/27515222750,https://creativecommons.org/licenses/by/2.0/,USARJ NCO CORPS,https://www.flickr.com/people/usarjnco/ b5350cf7e4c962d3,https://c1.staticflickr.com/1/673/30712941753_223bb49917_o.jpg,0.0,0.0,0.5625,0.75,975,830,https://www.flickr.com/photos/jsjgeology/30712941753,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 0084cdbc80386c03,https://c1.staticflickr.com/9/8745/28860515581_0dab76f3e6_o.jpg,0.333333333333,0.0,1.0,1.0,484,393,https://www.flickr.com/photos/quinet/28860515581,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ af33866cff2fdc18,https://c1.staticflickr.com/8/7286/27148267714_98d7c58198_o.jpg,0.0,0.0,0.905498281787,1.0,332,201,https://www.flickr.com/photos/jkirkhart35/27148267714,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/ cfa458167126a6a4,https://c1.staticflickr.com/1/469/32123669275_3e405a4513_o.jpg,0.32332761578,0.0,1.0,0.75,310,21,https://www.flickr.com/photos/gails_pictures/32123669275,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 2fa68f7af7259361,https://c1.staticflickr.com/8/7422/27545136195_91ae4899be_o.jpg,0.457373271889,0.0,1.0,0.75,672,910,https://www.flickr.com/photos/glorycycles/27545136195,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ e36d0d9b34bb6f58,https://c1.staticflickr.com/6/5685/30728334372_3cb8615582_o.jpg,0.48007518797,0.25,1.0,1.0,702,761,https://www.flickr.com/photos/armymaterielcommand/30728334372/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/ c956f208fde26a4b,https://c1.staticflickr.com/9/8470/29116487944_daff479690_o.jpg,0.5,0.25,1.0,1.0,920,853,https://www.flickr.com/photos/o_0/29116487944,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ a0d4ee1135a5d361,https://c1.staticflickr.com/8/7784/26725162231_179f2de2de_o.jpg,0.4375,0.25,1.0,1.0,526,620,https://www.flickr.com/photos/kbl_luccia/26725162231,https://creativecommons.org/licenses/by/2.0/,"K.B.L. Luccia Por ahora , descanso",https://www.flickr.com/people/kbl_luccia/ 45a86dc3bd654366,https://c1.staticflickr.com/9/8536/29090279983_df67de66d3_o.jpg,0.0,0.0,0.75,0.713028169014,443,816,https://www.flickr.com/photos/michaelpollak/29090279983/,https://creativecommons.org/licenses/by/2.0/,Michael Pollak,https://www.flickr.com/people/michaelpollak/ ce9b28872b72e44d,https://c1.staticflickr.com/6/5649/30724838251_1f5f420165_o.jpg,0.333333333333,0.0,1.0,1.0,978,840,https://flickr.com/117403948@N03/30724838251,https://creativecommons.org/licenses/by/2.0/,Mark Vincent Aposaga,https://www.flickr.com/people/117403948@N03/ bc7267914a88b740,https://c1.staticflickr.com/8/7797/26929964411_4c8f7681b4_o.jpg,0.0,0.333333333333,1.0,1.0,573,728,https://www.flickr.com/photos/tbasilio/26929964411,https://creativecommons.org/licenses/by/2.0/,Tony Basilio,https://www.flickr.com/people/tbasilio/ 784f42c90503b81f,https://c1.staticflickr.com/1/512/32488273901_aa3f40f976_o.jpg,0.0,0.0,0.75,1.0,735,90,https://www.flickr.com/photos/27665395@N05/32488273901,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ e47838725351d9a2,https://c1.staticflickr.com/9/8052/29253715734_b15bf78fb9_o.jpg,0.0,0.0,0.531155015198,0.75,780,247,https://www.flickr.com/photos/thoseguys119/29253715734/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ d0eec007b7373a0d,https://c1.staticflickr.com/6/5664/30892480826_62bc9643eb_o.jpg,0.43661971831,0.25,1.0,1.0,980,352,https://www.flickr.com/photos/blmoregon/30892480826/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ bf97225b5998fde6,https://c1.staticflickr.com/9/8386/29773943985_5408330c2d_o.jpg,0.25,0.0,0.75,0.75,704,903,https://flickr.com/144204694@N04/29773943985,https://creativecommons.org/licenses/by/2.0/,philippe cotin,https://www.flickr.com/people/formes_et_couleurs/ 854ddb294e1fe61e,https://c1.staticflickr.com/9/8748/28421948532_2104108b9b_o.jpg,0.25,0.0,1.0,0.75,938,787,https://www.flickr.com/photos/joyosity/28421948532,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/ 1ca91b9d12409cea,https://c1.staticflickr.com/8/7096/27292799692_35257eafdb_o.jpg,0.210588633288,0.0,0.631765899865,0.75,979,82,https://www.flickr.com/photos/ankurp/27292799692,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ ebb320416ed271b1,https://c1.staticflickr.com/1/408/32296767052_f1f4d9b7e8_o.jpg,0.249631811487,0.25,0.748895434462,1.0,407,635,https://www.flickr.com/photos/martius/32296767052,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 7e868e34d22a1583,https://c1.staticflickr.com/8/7570/27597944483_8bb0edbe7b_o.jpg,0.25,0.25,0.75,1.0,699,456,https://www.flickr.com/photos/99092496@N00/27597944483,https://creativecommons.org/licenses/by/2.0/,Klim Levene,https://www.flickr.com/people/99092496@N00/ 3978244b78c9b4f1,https://c1.staticflickr.com/9/8679/29181962833_df1d5fb7e1_o.jpg,0.450540958269,0.25,1.0,1.0,426,522,https://www.flickr.com/photos/cmichel67/29181962833,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/ 68b005dd7d18b431,https://c1.staticflickr.com/9/8622/28555897732_129b6345ca_o.jpg,0.257009345794,0.0,1.0,1.0,326,179,https://www.flickr.com/photos/52450054@N04/28555897732/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ bff44e5ba0d28c5d,https://c1.staticflickr.com/8/7104/27011000256_314a201760_o.jpg,0.0,0.25,0.5625,1.0,407,465,https://www.flickr.com/photos/davidstanleytravel/27011000256,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ bbb5cd17bb4eacc7,https://c1.staticflickr.com/1/758/30909330293_3fdf8f4377_o.jpg,0.421177266576,0.0,0.842354533153,0.75,974,784,https://flickr.com/149503105@N07/30909330293,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ 269c7e4cf57800d5,https://c1.staticflickr.com/9/8556/29560871171_15a7c3a682_o.jpg,0.0,0.25,0.5625,1.0,921,757,https://www.flickr.com/photos/raver_mikey/29560871171,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/ 6c382691bec0c10b,https://c1.staticflickr.com/9/8607/27627123353_044805c3af_o.jpg,0.258620689655,0.0,0.775862068966,0.75,22,40,https://www.flickr.com/photos/wildreturn/27627123353,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ d56b5a8c1cd4ee6d,https://c1.staticflickr.com/9/8382/28818021894_170010d050_o.jpg,0.0,0.0,0.75,1.0,972,627,https://www.flickr.com/photos/shakespearesmonkey/28818021894,https://creativecommons.org/licenses/by/2.0/,Shakespearesmonkey,https://www.flickr.com/people/shakespearesmonkey/ e189d252b8295754,https://c1.staticflickr.com/8/7608/26894381016_e9471f8f16_o.jpg,0.25,0.0,1.0,1.0,968,678,https://flickr.com/68147320@N02/26894381016,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ 31e7031fe880f995,https://c1.staticflickr.com/6/5590/30642795614_5d4bf71828_o.jpg,0.0,0.25,0.5,1.0,629,673,https://www.flickr.com/photos/prayitnophotography/30642795614,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ 2e6aabd0b8acd7c6,https://c1.staticflickr.com/8/7595/29019426706_3764803aaf_o.jpg,0.0,0.25,0.75,0.75,893,894,https://www.flickr.com/photos/zigazou76/29019426706,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ cade077e78573e42,https://c1.staticflickr.com/9/8197/29680463372_e8760d231b_o.jpg,0.0,0.25,0.568396226415,1.0,470,504,https://www.flickr.com/photos/eoskins/29680463372,https://creativecommons.org/licenses/by/2.0/,Plum leaves,https://www.flickr.com/people/eoskins/ db3bf7e96f0b20fc,https://c1.staticflickr.com/8/7284/26595264580_925e393f40_o.jpg,0.0,0.0,0.561569688769,1.0,148,526,https://www.flickr.com/photos/vilipix/26595264580/,https://creativecommons.org/licenses/by/2.0/,Vilmos Vincze,https://www.flickr.com/people/vilipix/ 9643e0538c34d55c,https://c1.staticflickr.com/1/467/32192657610_27068e1bc1_o.jpg,0.363112391931,0.0,1.0,1.0,885,710,https://www.flickr.com/photos/fusion_of_horizons/32192657610,https://creativecommons.org/licenses/by/2.0/,fusion-of-horizons,https://www.flickr.com/people/fusion_of_horizons/ 3ad380edbfa892ea,https://c1.staticflickr.com/1/331/32977613111_dbf6e52412_o.jpg,0.0,0.0,0.5,0.75,418,41,https://www.flickr.com/photos/linvoyage/32977613111,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ b73beefdcd290af3,https://c1.staticflickr.com/8/7222/27823356811_5b3f8ea528_o.jpg,0.248348017621,0.0,0.745044052863,0.75,108,745,https://flickr.com/77742560@N06/27823356811,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 2b8aeb7eaf1efe31,https://c1.staticflickr.com/8/7574/27209556370_cdc99ae9fa_o.jpg,0.5,0.25,1.0,1.0,76,91,https://www.flickr.com/photos/dhobern/27209556370/,https://creativecommons.org/licenses/by/2.0/,Donald Hobern,https://www.flickr.com/people/dhobern/ 69eeb6a30ecc6b1f,https://c1.staticflickr.com/9/8025/29024257203_a8535c7d6b_o.jpg,0.4375,0.25,1.0,1.0,997,339,https://www.flickr.com/photos/jsjgeology/29024257203,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 7e881033e1b234cc,https://c1.staticflickr.com/8/7380/27419259762_5033e066d0_o.jpg,0.0,0.0,0.5,0.75,924,644,https://www.flickr.com/photos/janitors/27419259762,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ be9aaa2b5a32fe9b,https://c1.staticflickr.com/8/7657/27077246962_874156feaa_o.jpg,0.463423295455,0.0,0.926846590909,0.75,405,374,https://www.flickr.com/photos/oatsy40/27077246962,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/ 3f383b3561775231,https://c1.staticflickr.com/1/246/31613056515_379da189b8_o.jpg,0.28125,0.25,0.84375,1.0,780,102,https://www.flickr.com/photos/thoseguys119/31613056515,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 792b6efd553dd3cf,https://c1.staticflickr.com/9/8612/28549507635_7f05a3caa9_o.jpg,0.0,0.25,0.540644171779,1.0,975,825,https://www.flickr.com/photos/jsjgeology/28549507635,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ df852fb48bede2a9,https://c1.staticflickr.com/9/8256/28427788693_4829da65b0_o.jpg,0.4375,0.25,1.0,1.0,966,647,https://www.flickr.com/photos/jeepersmedia/28427788693/,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 6fcac250af31685f,https://c1.staticflickr.com/9/8276/29694691923_53aa715999_o.jpg,0.377884615385,0.0,0.755769230769,0.75,780,139,https://www.flickr.com/photos/thoseguys119/29694691923/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 575824ceabc98bcd,https://c1.staticflickr.com/9/8546/29953219172_1e90d7f9ff_o.jpg,0.478354978355,0.0,0.95670995671,0.75,426,778,https://www.flickr.com/photos/60712129@N06/29953219172,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/ 3b463373122c996a,https://c1.staticflickr.com/8/7169/27156803215_e35c790ece_o.jpg,0.25,0.0,1.0,1.0,780,504,https://www.flickr.com/photos/thoseguys119/27156803215,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 88df9e5e1ae459a7,https://c1.staticflickr.com/9/8117/29057355155_5e09753a15_o.jpg,0.0,0.0,0.75,1.0,548,512,https://www.flickr.com/photos/davidwilson1949/29057355155,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 0de2cadaaa0de6ef,https://c1.staticflickr.com/8/7506/26957596576_dfd67e64d0_o.jpg,0.248348017621,0.25,0.745044052863,1.0,484,465,https://www.flickr.com/photos/sybarite48/26957596576,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ c6b127ac8de0db8d,https://c1.staticflickr.com/9/8402/29652822520_fd1f223e3b_o.jpg,0.0,0.25,0.5,1.0,719,513,https://www.flickr.com/photos/97408942@N04/29652822520,https://creativecommons.org/licenses/by/2.0/,Chetiya Sahabandu,https://www.flickr.com/people/97408942@N04/ a55936fa9c0aa228,https://c1.staticflickr.com/1/608/32002428345_d2c10254af_o.jpg,0.0,0.4375,0.75,1.0,498,240,https://www.flickr.com/photos/faceme/32002428345,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ 55ef6e4f15698ca5,https://c1.staticflickr.com/9/8253/29194771176_f625f0b3f2_o.jpg,0.5,0.0,1.0,0.75,405,394,https://www.flickr.com/photos/markyharky/29194771176,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 5f10b5aa2522e092,https://c1.staticflickr.com/6/5510/30834692845_90e189de3c_o.jpg,0.25,0.25,1.0,1.0,980,894,https://www.flickr.com/photos/18614695@N00/30834692845,https://creativecommons.org/licenses/by/2.0/,Xavi,https://www.flickr.com/people/18614695@N00/ 0ba4d274b2d60b12,https://c1.staticflickr.com/6/5821/30118810995_41d8a59440_o.jpg,0.25,0.0,1.0,1.0,780,385,https://www.flickr.com/photos/thoseguys119/30118810995,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 440965de463fd5db,https://c1.staticflickr.com/6/5562/30007181413_5d01e67cba_o.jpg,0.0,0.0,0.501846381093,0.75,920,506,https://www.flickr.com/photos/79157069@N03/30007181413/,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ bccfb9266ed73fef,https://c1.staticflickr.com/9/8365/29300785871_52772251c8_o.jpg,0.0,0.0,0.666666666667,1.0,625,880,https://www.flickr.com/photos/ter-burg/29300785871,https://creativecommons.org/licenses/by/2.0/,Sebastiaan ter Burg,https://www.flickr.com/people/ter-burg/ bc9a92929bf09b9b,https://c1.staticflickr.com/1/731/31890720530_6bb72da71f_o.jpg,0.0,0.25,0.658629441624,1.0,311,49,https://www.flickr.com/photos/gails_pictures/31890720530,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ dfbd74d60056bae0,https://c1.staticflickr.com/8/7433/27009450954_092df2cf42_o.jpg,0.0,0.0,0.496696035242,0.75,950,654,https://www.flickr.com/photos/theocrazzolara/27009450954,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ 777c15a9f1bb7a0a,https://c1.staticflickr.com/9/8873/27986366240_408635acb0_o.jpg,0.210588633288,0.0,0.631765899865,0.75,706,149,https://www.flickr.com/photos/psd/27986366240,https://creativecommons.org/licenses/by/2.0/,Paul Downey,https://www.flickr.com/people/psd/ 26b01f31089459d0,https://c1.staticflickr.com/9/8128/28683417152_4f2fc6f7e3_o.jpg,0.0,0.25,0.360902255639,1.0,980,499,https://www.flickr.com/photos/vastateparksstaff/28683417152/in/photolist-cyLTp3-KGE1B3-JVmZPY-KGDG1A-JVmFTh-JVBa2X-JVmEG9-KK7WzD,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 53856a8157b05f90,https://c1.staticflickr.com/8/7533/29405687984_945f6ba351_o.jpg,0.333333333333,0.0,1.0,1.0,964,990,https://www.flickr.com/photos/earn31/29405687984,https://creativecommons.org/licenses/by/2.0/,Eugenio Rada,https://www.flickr.com/people/earn31/ e1a7288ef3c4fcd7,https://c1.staticflickr.com/8/7397/27256819761_f8780d065e_o.jpg,0.325327510917,0.0,0.975982532751,1.0,914,176,https://www.flickr.com/photos/13476480@N07/27256819761,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 50e5f9745773bb30,https://c1.staticflickr.com/8/7379/26428727033_73b68d0c0a_o.jpg,0.2806640625,0.25,0.8419921875,1.0,459,677,https://www.flickr.com/photos/slgc/26428727033,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/ 3c6166d16738ff8c,https://c1.staticflickr.com/9/8541/30173105805_6f6768688a_o.jpg,0.28125,0.25,0.84375,1.0,896,737,https://www.flickr.com/photos/thenationalguard/30173105805,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ d2a828e9b4d02942,https://c1.staticflickr.com/9/8631/28763409292_2c66af5d1c_o.jpg,0.302264808362,0.0,1.0,0.75,310,835,https://www.flickr.com/photos/gails_pictures/28763409292/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 69af2793a77c93db,https://c1.staticflickr.com/8/7365/26921795183_7fff86d53a_o.jpg,0.0,0.0,1.0,1.0,429,887,https://www.flickr.com/photos/sixmilliondollardan/26921795183,https://creativecommons.org/licenses/by/2.0/,danjo paluska,https://www.flickr.com/people/sixmilliondollardan/ deee1f1106038ed0,https://c1.staticflickr.com/9/8688/28357083891_46d3cb477f_o.jpg,0.0,0.0,0.5,0.75,723,569,https://www.flickr.com/photos/tsengphotos/28357083891,https://creativecommons.org/licenses/by/2.0/,Tony Tseng,https://www.flickr.com/people/tsengphotos/ cb41beb7a08a001a,https://c1.staticflickr.com/1/296/32560158336_692847da9e_o.jpg,0.0,0.25,0.5,1.0,865,30,https://flickr.com/53301297@N00/32560158336,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 0d9442cdca7cf0e0,https://c1.staticflickr.com/6/5482/30608431946_42712a931d_o.jpg,0.25,0.25,1.0,1.0,820,449,https://flickr.com/144874482@N06/30608431946,https://creativecommons.org/licenses/by/2.0/,Morrigan Penninck,https://www.flickr.com/people/144874482@N06/ 7eb0d09a0918698c,https://c1.staticflickr.com/8/7685/27694216640_2756043091_o.jpg,0.0,0.0,0.5625,0.75,964,330,https://www.flickr.com/photos/cogdog/27694216640,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 4d02246d1efeeeb7,https://c1.staticflickr.com/8/7294/27311380960_fef4b1da99_o.jpg,0.421177266576,0.0,0.842354533153,0.75,509,613,https://www.flickr.com/photos/143269811@N04/27311380960,https://creativecommons.org/licenses/by/2.0/,Karl Hols,https://www.flickr.com/people/143269811@N04/ 35e53f00caed5c09,https://c1.staticflickr.com/9/8010/28941495244_5c78bfa532_o.jpg,0.0,0.0,0.561569688769,1.0,771,887,https://www.flickr.com/photos/blondinrikard/28941495244,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fr\303\266berg,https://www.flickr.com/people/blondinrikard/ d75f78cdcdb9d285,https://c1.staticflickr.com/8/7171/26704450524_d6c04bc536_o.jpg,0.0,0.0,1.0,1.0,85,877,https://www.flickr.com/photos/icstefanescu/26704450524,https://creativecommons.org/licenses/by/2.0/,Cristian Iohan \305\236tef\304\203nescu,https://www.flickr.com/people/icstefanescu/ cb1b2242d46ffaec,https://c1.staticflickr.com/3/2528/31962752584_e285442eac_o.jpg,0.332842415317,0.0,0.99852724595,1.0,831,674,https://www.flickr.com/photos/13476480@N07/31962752584/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c32750a1b84530c2,https://c1.staticflickr.com/9/8809/28354240903_4f5340f7be_o.jpg,0.333333333333,0.0,1.0,1.0,467,808,https://www.flickr.com/photos/sodaigomi/28354240903,https://creativecommons.org/licenses/by/2.0/,sodai gomi,https://www.flickr.com/people/sodaigomi/ ad10a067473a6dec,https://c1.staticflickr.com/6/5699/29680168353_0ca00c5e80_o.jpg,0.289148351648,0.0,0.867445054945,1.0,821,872,https://www.flickr.com/photos/archivesnz/29680168353,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/ b174b02144086ff6,https://c1.staticflickr.com/1/405/31627292696_3105523a0e_o.jpg,0.0,0.0,0.5,0.75,23,249,https://www.flickr.com/photos/usfwsmidwest/31627292696,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 201b01e9636f1489,https://c1.staticflickr.com/8/7647/28644903536_29d5087074_o.jpg,0.503303964758,0.0,1.0,0.75,31,959,https://www.flickr.com/photos/longitudelatitude/28644903536/,https://creativecommons.org/licenses/by/2.0/,LongitudeLatitude,https://www.flickr.com/people/longitudelatitude/ 3b7596444ea0aa75,https://c1.staticflickr.com/8/7580/27820089130_4cb8a12668_o.jpg,0.28125,0.25,0.84375,1.0,459,148,https://www.flickr.com/photos/77175657@N00/27820089130,https://creativecommons.org/licenses/by/2.0/,Graham Tiller,https://www.flickr.com/people/77175657@N00/ 437cbb1ae069fc78,https://c1.staticflickr.com/9/8484/29500015272_fd5255ba11_o.jpg,0.333333333333,0.0,1.0,1.0,519,779,https://www.flickr.com/photos/box_repsol/29500015272,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 84c758b3135e0302,https://c1.staticflickr.com/6/5475/30968470430_37b763440e_o.jpg,0.0,0.318926974665,1.0,1.0,954,931,https://www.flickr.com/photos/biodivlibrary/30968470430/,https://creativecommons.org/licenses/by/2.0/,Biodiversity Heritage Library,https://www.flickr.com/people/biodivlibrary/ 9264110456876b6b,https://c1.staticflickr.com/9/8283/29630926285_6d5ae6b2fe_o.jpg,0.280226209048,0.25,0.840678627145,1.0,469,107,https://www.flickr.com/photos/andreboeni/29630926285,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 58bc3400a089c8a1,https://c1.staticflickr.com/9/8261/28507961393_5facb13b91_o.jpg,0.498153618907,0.25,1.0,1.0,547,745,https://www.flickr.com/photos/100739735@N06/28507961393,https://creativecommons.org/licenses/by/2.0/,interestedbystandr,https://www.flickr.com/people/100739735@N06/ 8d98c633aa35523b,https://c1.staticflickr.com/1/653/32522348120_b86629cbbd_o.jpg,0.5,0.0,1.0,0.75,404,79,https://flickr.com/46886434@N04/32522348120,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/ 5346c241e4a3db3e,https://c1.staticflickr.com/8/7442/27703112896_e7b2074923_o.jpg,0.25,0.0,0.75,0.75,818,559,https://www.flickr.com/photos/thecvf/27703112896,https://creativecommons.org/licenses/by/2.0/,Climate Vulnerable Forum (CVF),https://www.flickr.com/people/thecvf/ c712cc9afaa22a99,https://c1.staticflickr.com/6/5541/30446877326_e3f46cbf35_o.jpg,0.25,0.0,0.75,0.75,519,538,https://www.flickr.com/photos/box_repsol/30446877326,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ fcf19e03aa2008e4,https://c1.staticflickr.com/8/7280/27784553555_0b9fbf1071_o.jpg,0.25,0.0,0.75,0.75,512,685,https://www.flickr.com/photos/greggjerdingen/27784553555,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ c597ee71ab653ced,https://c1.staticflickr.com/1/680/32023247346_e5e4f88710_o.jpg,0.28125,0.25,0.84375,1.0,875,918,http://www.flickr.com/photos/aswans1234567/32023247346/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston's Bus Photos,https://www.flickr.com/people/aswans1234567/ ca097940a11c6de5,https://c1.staticflickr.com/6/5584/31657305175_f204e6bb4b_o.jpg,0.43661971831,0.25,1.0,1.0,702,366,https://www.flickr.com/photos/7armyjmtc/31657305175,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 0bee475ac8da9317,https://c1.staticflickr.com/9/8821/28841269416_30215dee2d_o.jpg,0.0,0.304654442877,1.0,0.913963328632,23,624,https://www.flickr.com/photos/mypubliclands/28841269416,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ d96010b74c910b62,https://c1.staticflickr.com/8/7713/26774992933_df01890394_o.jpg,0.0,0.0,1.0,0.75,883,724,https://www.flickr.com/photos/byzantiumbooks/26774992933,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ 7453af03daf0ad97,https://c1.staticflickr.com/6/5471/30886295245_37abf81bf5_o.jpg,0.0,0.0,0.75,1.0,437,621,https://www.flickr.com/photos/nzcarfreak/30886295245,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 7a59363114f0794d,https://c1.staticflickr.com/9/8811/27688525584_860a9320bb_o.jpg,0.28125,0.25,0.84375,1.0,984,590,https://www.flickr.com/photos/noaaphotolib/27688525584,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ a860af65a323ede5,https://c1.staticflickr.com/8/7476/28353011365_6f280587a6_o.jpg,0.0,0.0,0.75,1.0,854,697,https://flickr.com/95212304@N00/28353011365,https://creativecommons.org/licenses/by/2.0/,Ken Ratcliff,https://www.flickr.com/people/kenspix/ 4b116f872dd54eed,https://c1.staticflickr.com/8/7383/27564580095_febdace845_o.jpg,0.0,0.0,0.666666666667,1.0,36,697,https://www.flickr.com/photos/usfwsmidwest/27564580095,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 6c361399e24c419b,https://c1.staticflickr.com/1/676/32037217680_91257f4fe2_o.jpg,0.0,0.0,0.75,1.0,909,376,https://flickr.com/47514124@N02/32037217680,https://creativecommons.org/licenses/by/2.0/,Geoffrey Franklin,https://www.flickr.com/people/47514124@N02/ e212d738cc76c621,https://c1.staticflickr.com/9/8614/30304985301_f793b97cd8_o.jpg,0.0,0.25,0.572555205047,1.0,826,909,https://www.flickr.com/photos/redi-rock/30304985301/,https://creativecommons.org/licenses/by/2.0/,Redi-Rock International,https://www.flickr.com/people/redi-rock/ f9aad5d01a236f81,https://c1.staticflickr.com/8/7006/26526542504_274282fc0e_o.jpg,0.0,0.0,0.666666666667,1.0,519,442,https://www.flickr.com/photos/box_repsol/26526542504,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ c8caae14a8638107,https://c1.staticflickr.com/6/5447/31035252022_a63169f347_o.jpg,0.499263622975,0.0,0.99852724595,0.75,885,37,https://flickr.com/43714545@N06/31035252022,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/ 4041bedaba64e6fe,https://c1.staticflickr.com/9/8411/30078072080_a117444aa2_o.jpg,0.0,0.25,0.5625,1.0,59,41,https://www.flickr.com/photos/treegrow/30078072080,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 8919aa6ab76b8a13,https://c1.staticflickr.com/6/5498/31484833275_6e8c9d4998_o.jpg,0.333333333333,0.0,1.0,1.0,706,874,https://flickr.com/53301297@N00/31484833275,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 9583fea45a09016e,https://c1.staticflickr.com/8/7686/26834686306_b3f11d359e_o.jpg,0.0,0.0,0.798387096774,1.0,532,577,https://www.flickr.com/photos/janitors/26834686306,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ ccaa15b8875c1f4a,https://c1.staticflickr.com/6/5624/31240977195_4a56b25e3a_o.jpg,0.0,0.0,0.5625,0.75,437,685,https://www.flickr.com/photos/nzcarfreak/31240977195,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 3c9dc9c6e2bf704a,https://c1.staticflickr.com/3/2842/33135689682_6229485512_o.jpg,0.0,0.2515625,1.0,1.0,739,276,https://flickr.com/62295966@N07/33135689682,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 3b4ec3925667d5f7,https://c1.staticflickr.com/6/5710/30488712372_a417e5f49b_o.jpg,0.0,0.0,0.799676898223,1.0,653,976,https://www.flickr.com/photos/navfac/30488712372/,https://creativecommons.org/licenses/by/2.0/,NAVFAC,https://www.flickr.com/people/navfac/ 4fe72ed6fe5bd450,https://c1.staticflickr.com/9/8046/29749021231_f36d5a8055_o.jpg,0.393668831169,0.0,1.0,0.75,320,415,https://flickr.com/35142635@N05/29749021231,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 3fd42c4bb42750ab,https://c1.staticflickr.com/9/8648/29836407406_e82ba55f4b_o.jpg,0.249631811487,0.0,0.748895434462,0.75,322,70,https://www.flickr.com/photos/metay/29836407406/,https://creativecommons.org/licenses/by/2.0/,fidber,https://www.flickr.com/people/metay/ 6f6674f380c0614d,https://c1.staticflickr.com/8/7597/27723115991_d71d65224a_o.jpg,0.25,0.25,1.0,1.0,991,855,https://www.flickr.com/photos/woolgenie/27723115991,https://creativecommons.org/licenses/by/2.0/,Heather,https://www.flickr.com/people/woolgenie/ 8c02c0ff6bb5e052,https://c1.staticflickr.com/6/5679/30769980615_c83dc6b25e_o.jpg,0.0,0.0,0.75,1.0,875,473,https://www.flickr.com/photos/27665395@N05/30769980615,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 4e4cf49ec8861b2f,https://c1.staticflickr.com/8/7431/27725908611_95a155940f_o.jpg,0.318219633943,0.0,0.95465890183,0.75,309,563,https://www.flickr.com/photos/35142635@N05/27725908611,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 47daf63f216338fd,https://c1.staticflickr.com/9/8732/28364129093_f44d1b9604_o.jpg,0.0,0.28125,0.75,0.84375,540,651,https://www.flickr.com/photos/sebilden/28364129093,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/ 601e52be13b4578e,https://c1.staticflickr.com/9/8716/29535640101_589449d176_o.jpg,0.0,0.25,0.75,0.75,888,638,https://www.flickr.com/photos/quinet/29535640101/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 14c446b00e333eeb,https://c1.staticflickr.com/1/478/32804423766_f21eafed4f_o.jpg,0.333333333333,0.0,1.0,1.0,116,489,https://www.flickr.com/photos/silkebaron/32804423766,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/ 1ac22958b49228f2,https://c1.staticflickr.com/9/8676/29534026000_6366a5f344_o.jpg,0.293530351438,0.25,0.880591054313,1.0,18,308,https://flickr.com/7706348@N04/29534026000,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/ e2a477d6b7bc9197,https://c1.staticflickr.com/1/373/32840214286_4993d22320_o.jpg,0.25,0.0,1.0,1.0,977,364,https://www.flickr.com/photos/davidstanleytravel/32840214286,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 2ec28ff082dd9ddc,https://c1.staticflickr.com/9/8204/28853565856_2e73ab3f9e_o.jpg,0.25,0.25,0.75,1.0,986,199,https://www.flickr.com/photos/juggernautco/28853565856,https://creativecommons.org/licenses/by/2.0/,Daniel X. O'Neil,https://www.flickr.com/people/juggernautco/ 3a8a057da1d510ce,https://c1.staticflickr.com/8/7597/27209166915_26a794ac4b_o.jpg,0.530714285714,0.25,1.0,1.0,58,967,https://www.flickr.com/photos/gregthebusker/27209166915,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/ a2d746298fbd4acd,https://c1.staticflickr.com/9/8277/30028648140_dc7a7b5494_o.jpg,0.35861423221,0.0,0.717228464419,0.75,780,909,https://www.flickr.com/photos/thoseguys119/30028648140,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 7f71ff13debf3fb1,https://c1.staticflickr.com/9/8669/28894508901_a45158a6a3_o.jpg,0.5,0.0,1.0,0.75,662,487,https://www.flickr.com/photos/42220226@N07/28894508901,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 8cbd8ce73f487119,https://c1.staticflickr.com/1/268/31672453021_292d2351b5_o.jpg,0.18137254902,0.0,1.0,1.0,821,714,https://www.flickr.com/photos/45131642@N00/31672453021,https://creativecommons.org/licenses/by/2.0/,Phil Parker,https://www.flickr.com/people/45131642@N00/ 4a31c2b3e69d2231,https://c1.staticflickr.com/9/8574/29664426340_0b0c76022f_o.jpg,0.4375,0.0,1.0,0.75,865,162,https://flickr.com/27665395@N05/29664426340,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ d173ff3d2e9a8e40,https://c1.staticflickr.com/8/7685/26461065754_a2fe1dbc5a_o.jpg,0.0,0.0,0.666666666667,1.0,80,624,https://www.flickr.com/photos/quinet/26461065754,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 55432f696cdf4194,https://c1.staticflickr.com/9/8499/29877127275_43e254b348_o.jpg,0.0,0.25,0.75,1.0,680,902,https://www.flickr.com/photos/feeliz/29877127275/,https://creativecommons.org/licenses/by/2.0/,Jana Lehmann,https://www.flickr.com/people/feeliz/ 397791423a75a4cd,https://c1.staticflickr.com/9/8385/29195474363_0c7df11c70_o.jpg,0.28125,0.0,0.84375,0.75,459,29,https://www.flickr.com/photos/eamoncurry/29195474363,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/ 79ea5c288768456d,https://c1.staticflickr.com/6/5533/30525211896_0f1469362e_o.jpg,0.0,0.0,0.5625,0.75,669,189,https://www.flickr.com/photos/davidstanleytravel/30525211896,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ fc75ccf2e8873c0e,https://c1.staticflickr.com/6/5755/30186546880_512dfd4287_o.jpg,0.28125,0.25,0.84375,1.0,866,560,https://www.flickr.com/photos/tiseb/30186546880/,https://creativecommons.org/licenses/by/2.0/,S\303\251bastien Bertrand,https://www.flickr.com/people/tiseb/ e59c5712d92ba11b,https://c1.staticflickr.com/1/444/31331556080_b2fa2db56c_o.jpg,0.438430311231,0.0,1.0,1.0,459,998,https://www.flickr.com/photos/119886413@N05/31331556080,https://creativecommons.org/licenses/by/2.0/,Michel Curi,https://www.flickr.com/people/119886413@N05/ 4a023ebd4d3723c4,https://c1.staticflickr.com/3/2445/32629582630_208255690f_o.jpg,0.25,0.0,0.75,0.75,347,127,http://www.flickr.com/photos/124790945@N06/32629582630,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/ 06887ee9ae768ef5,https://c1.staticflickr.com/6/5745/29910058033_b02ee0e638_o.jpg,0.249631811487,0.0,0.748895434462,0.75,780,555,https://www.flickr.com/photos/thoseguys119/29910058033,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ a8863e5280101672,https://c1.staticflickr.com/9/8378/29701381952_540f2b6d06_o.jpg,0.5,0.0,1.0,0.75,604,863,https://www.flickr.com/photos/faceme/29701381952,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/ 0d017eaf9d87f850,https://c1.staticflickr.com/1/698/32077123330_b141d01b15_o.jpg,0.5,0.0,1.0,0.75,976,3,https://www.flickr.com/photos/gaby1/32077123330/,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\303\241lez,https://www.flickr.com/people/gaby1/ 75cf1a71613f680f,https://c1.staticflickr.com/8/7236/26990079665_6b0c8c980b_o.jpg,0.25,0.0,0.75,0.75,971,493,https://www.flickr.com/photos/90975693@N05/26990079665,https://creativecommons.org/licenses/by/2.0/,tommy@chau,https://www.flickr.com/people/90975693@N05/ ead99079711f1bdc,https://c1.staticflickr.com/9/8075/29364386676_c1f182916f_o.jpg,0.25,0.0,0.75,0.75,855,701,https://www.flickr.com/photos/presidentialoffice/29364386676/,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ c5c8119554ab6d40,https://c1.staticflickr.com/9/8719/28415695145_418e3a3205_o.jpg,0.0,0.0,0.666666666667,1.0,975,517,https://www.flickr.com/photos/jsjgeology/28415695145,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 3feb0fdcea7e02ad,https://c1.staticflickr.com/9/8305/29168872094_9498e22d59_o.jpg,0.0,0.25,0.5,1.0,909,720,https://www.flickr.com/photos/fun_flying/29168872094,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/ d9feb7ea8d9cfbef,https://c1.staticflickr.com/8/7513/29580546065_f2dfd74de0_o.jpg,0.391463414634,0.25,1.0,1.0,320,269,https://www.flickr.com/photos/47602497@N06/29580546065,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/ ecc0e8f17ae91854,https://c1.staticflickr.com/9/8300/29112354294_4c43811145_o.jpg,0.511297376093,0.25,1.0,1.0,699,288,https://www.flickr.com/photos/pavelcab/29112354294,https://creativecommons.org/licenses/by/2.0/,Pablo Cabezos,https://www.flickr.com/people/pavelcab/ e5d57ebd448af74e,https://c1.staticflickr.com/6/5568/30141750756_5a1dd3583e_o.jpg,0.247797356828,0.25,0.743392070485,1.0,875,425,https://www.flickr.com/photos/vitordias_/30141750756,https://creativecommons.org/licenses/by/2.0/,V\303\255tor Dias,https://www.flickr.com/people/vitordias_/ e523da536c95ebd8,https://c1.staticflickr.com/8/7437/26880197382_a25e04f8a2_o.jpg,0.0,0.0,0.5625,0.75,336,68,https://www.flickr.com/photos/peter-trimming/26880197382,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/ c67f05a920cf737b,https://c1.staticflickr.com/8/7015/26980673560_50608fed35_o.jpg,0.25,0.0,1.0,0.501846381093,836,676,https://www.flickr.com/photos/quinet/26980673560,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 93c7262b60ac6495,https://c1.staticflickr.com/6/5585/30807410480_aab1627005_o.jpg,0.25,0.0,0.75,0.75,820,927,https://www.flickr.com/photos/unfccc/30807410480/,https://creativecommons.org/licenses/by/2.0/,UNclimatechange,https://www.flickr.com/people/unfccc/ 01e8808fc4a0308b,https://c1.staticflickr.com/1/329/31808071892_8c99152900_o.jpg,0.0,0.0,0.75,1.0,820,463,https://www.flickr.com/photos/davidcjones/31808071892,https://creativecommons.org/licenses/by/2.0/,David Jones,https://www.flickr.com/people/davidcjones/ b5d3870d0d477956,https://c1.staticflickr.com/9/8751/29824845605_5ab78717de_o.jpg,0.0,0.267530487805,0.75,0.802591463415,412,495,https://www.flickr.com/photos/allanhenderson/29824845605/,https://creativecommons.org/licenses/by/2.0/,Allan Henderson,https://www.flickr.com/people/allanhenderson/ be6f9889835ebd58,https://c1.staticflickr.com/6/5764/30259404674_b82bcd795c_o.jpg,0.0,0.267410714286,0.75,1.0,348,34,https://flickr.com/49481946@N00/30259404674,https://creativecommons.org/licenses/by/2.0/,Ty Nigh,https://www.flickr.com/people/tynigh/ b28ac335e561c764,https://c1.staticflickr.com/8/7281/27055269902_963dede960_o.jpg,0.24882629108,0.0,1.0,1.0,15,966,https://www.flickr.com/photos/mikeprince/27055269902/,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/ cfdff9987d0051df,https://c1.staticflickr.com/3/2376/32646486092_968ffd379d_o.jpg,0.0,0.25,0.46688034188,1.0,889,808,https://www.flickr.com/photos/133461395@N08/32646486092/,https://creativecommons.org/licenses/by/2.0/,ian_woodhead1,https://www.flickr.com/people/133461395@N08/ 9d66180f12ebcdac,https://c1.staticflickr.com/9/8056/30012234655_7b571924bb_o.jpg,0.0,0.0,0.5,0.75,982,512,https://flickr.com/63704136@N00/30012234655,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 11c47f1a3ee71773,https://c1.staticflickr.com/3/2637/32762757636_62d3be3950_o.jpg,0.25,0.0,1.0,1.0,442,577,https://www.flickr.com/photos/gromin/32762757636/,https://creativecommons.org/licenses/by/2.0/,Nikolay Gromin,https://www.flickr.com/people/gromin/ a6bb7d44778cdc42,https://c1.staticflickr.com/6/5690/30238050171_30a44ed38a_o.jpg,0.0,0.400242326333,0.75,1.0,680,220,https://www.flickr.com/photos/kayadams/30238050171,https://creativecommons.org/licenses/by/2.0/,Kay Adams,https://www.flickr.com/people/kayadams/ 95b2017ab1f90452,https://c1.staticflickr.com/1/550/31959811195_85f3ca48ce_o.jpg,0.43661971831,0.25,1.0,1.0,459,998,https://www.flickr.com/photos/southbeachcars/31959811195,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ a4c9ad41dbba56e0,https://c1.staticflickr.com/9/8538/28650793644_02013c6c09_o.jpg,0.25,0.25,0.75,1.0,664,426,https://www.flickr.com/photos/wm_archiv/28650793644/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ fcc6e88fe224437e,https://c1.staticflickr.com/1/446/32445415926_21dab2884e_o.jpg,0.25,0.2806640625,1.0,0.8419921875,93,982,https://www.flickr.com/photos/dkeats/32445415926,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 0e5e8a2c5035f402,https://c1.staticflickr.com/9/8630/30427680371_56bd18bb51_o.jpg,0.25,0.0,1.0,0.630794701987,875,468,https://www.flickr.com/photos/didbygraham/30427680371,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/ 5f197075f483b809,https://c1.staticflickr.com/9/8005/29011424435_d9ca607669_o.jpg,0.0,0.0,0.666666666667,1.0,662,707,https://www.flickr.com/photos/greggjerdingen/29011424435,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 84eaa7c8e6f876fc,https://c1.staticflickr.com/9/8787/28255538194_7e1607ef39_o.jpg,0.210588633288,0.25,0.631765899865,1.0,960,543,https://www.flickr.com/photos/jeffreyww/28255538194,https://creativecommons.org/licenses/by/2.0/,jeffreyw,https://www.flickr.com/people/jeffreyww/ 861b455d7d006c22,https://c1.staticflickr.com/6/5321/30551374723_5673642632_o.jpg,0.404589371981,0.0,1.0,0.75,672,851,https://www.flickr.com/photos/glorycycles/30551374723,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 7978466c40c2a174,https://c1.staticflickr.com/6/5489/30920462645_7436820516_o.jpg,0.0,0.0,0.76062992126,1.0,20,242,https://www.flickr.com/photos/grant_subaru/30920462645/,https://creativecommons.org/licenses/by/2.0/,Grant.C,https://www.flickr.com/people/grant_subaru/ a893274232e3718f,https://c1.staticflickr.com/8/7761/30229577882_d6885b0180_o.jpg,0.0,0.0,0.782747603834,1.0,325,66,https://flickr.com/33398884@N03/30229577882,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ fe562d4c59491d3b,https://c1.staticflickr.com/8/7691/27302324302_a8be9d4d38_o.jpg,0.244351311953,0.25,0.73305393586,1.0,699,416,https://www.flickr.com/photos/glynlowe/27302324302,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ 87260733eda62b68,https://c1.staticflickr.com/6/5552/31535452072_f650c9b7b4_o.jpg,0.501840942563,0.0,1.0,0.75,580,765,https://www.flickr.com/photos/eaglebrook/31535452072/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ 92e524e48eb2e745,https://c1.staticflickr.com/8/7115/26661802563_db82afaf44_o.jpg,0.210588633288,0.25,0.631765899865,1.0,563,147,https://www.flickr.com/photos/thomasleuthard/26661802563,https://creativecommons.org/licenses/by/2.0/,Thomas Leuthard,https://www.flickr.com/people/thomasleuthard/ 0b428b3c371c490f,https://c1.staticflickr.com/8/7386/28027172462_693af72f43_o.jpg,0.0,0.25,0.535877862595,1.0,324,339,https://www.flickr.com/photos/usfwsmidwest/28027172462,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ f6c20d2b0ef80fef,https://c1.staticflickr.com/1/260/31676056622_6bd0e27bf7_o.jpg,0.557905686546,0.0,1.0,0.75,459,295,https://www.flickr.com/photos/summonedbyfells/31676056622/,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/ 79ed351fedfe7b1d,https://c1.staticflickr.com/8/7296/26634891254_2d3a262e95_o.jpg,0.25,0.25,0.75,1.0,971,613,https://www.flickr.com/photos/freaky_designz/26634891254/,https://creativecommons.org/licenses/by/2.0/,David Schiersner,https://www.flickr.com/people/freaky_designz/ 183cfabe5b28b34d,https://c1.staticflickr.com/1/328/32594930856_fb66f1c6b5_o.jpg,0.0,0.0,1.0,0.980322003578,830,540,https://www.flickr.com/photos/duncanh1/32594930856,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 8961930591589be6,https://c1.staticflickr.com/9/8388/28523176143_57a99da19d_o.jpg,0.48007518797,0.0,1.0,0.75,725,408,https://flickr.com/124793433@N06/28523176143,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/124793433@N06/ c1d4f8be5e3d36a4,https://c1.staticflickr.com/9/8593/28006305640_5a73612a69_o.jpg,0.0,0.0,0.5625,0.75,322,523,https://www.flickr.com/photos/nikonvscanon/28006305640/,https://creativecommons.org/licenses/by/2.0/,David Blaikie,https://www.flickr.com/people/nikonvscanon/ 85c5f8527f8641c2,https://c1.staticflickr.com/1/625/32331797566_1e8b24a8a3_o.jpg,0.25,0.0,1.0,1.0,780,340,https://www.flickr.com/photos/thoseguys119/32331797566,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 17f07a1a4674ccde,https://c1.staticflickr.com/1/521/32414981521_8f1deabf8f_o.jpg,0.0,0.0,0.666666666667,1.0,542,727,https://www.flickr.com/photos/fifeanddrum/32414981521/,https://creativecommons.org/licenses/by/2.0/,U. S. Army Old Guard Fife and Drum Corps,https://www.flickr.com/people/fifeanddrum/ ec222b5925c37fd9,https://c1.staticflickr.com/6/5560/30347376530_e8c0e9ea43_o.jpg,0.0,0.25,0.5,1.0,986,685,https://www.flickr.com/photos/syuu/30347376530/,https://creativecommons.org/licenses/by/2.0/,Takuya ASADA,https://www.flickr.com/people/syuu/ 23e2aac70e110c1c,https://c1.staticflickr.com/9/8307/28397929524_4085dd5875_o.jpg,0.0,0.0,0.58864265928,1.0,959,703,https://www.flickr.com/photos/sansebastian2016/28397929524,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/ a53d59cff2545efd,https://c1.staticflickr.com/9/8525/29633899796_747fca00ca_o.jpg,0.285496183206,0.0,1.0,1.0,340,368,https://flickr.com/40441865@N08/29633899796,https://creativecommons.org/licenses/by/2.0/,mitchell haindfield,https://www.flickr.com/people/40441865@N08/ a406058a14d88fe0,https://c1.staticflickr.com/9/8448/29510775121_d23bcbe711_o.jpg,0.0,0.25,0.5,1.0,874,967,https://www.flickr.com/photos/renaissancechambara/29510775121/,https://creativecommons.org/licenses/by/2.0/,Ged Carroll,https://www.flickr.com/people/renaissancechambara/ ef7c16e6bb2f2071,https://c1.staticflickr.com/8/7584/27192617901_cd6c602e1f_o.jpg,0.0,0.25,0.592295345104,1.0,564,740,https://www.flickr.com/photos/68704638@N04/27192617901,https://creativecommons.org/licenses/by/2.0/,M Dreibelbis,https://www.flickr.com/people/68704638@N04/ 9d999d84e8a019b3,https://c1.staticflickr.com/9/8523/29268594282_5ff202bc94_o.jpg,0.5,0.0,1.0,0.75,662,719,https://www.flickr.com/photos/vahemart/29268594282,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ f17337f9682d04b9,https://c1.staticflickr.com/6/5771/31345763525_14a3ee850d_o.jpg,0.25,0.0,0.75,0.75,952,222,https://www.flickr.com/photos/pedrik/31345763525,https://creativecommons.org/licenses/by/2.0/,pedrik,https://www.flickr.com/people/pedrik/ 0fc1d8174c68ba8c,https://c1.staticflickr.com/9/8718/28800342585_8067d311be_o.jpg,0.25,0.0,1.0,0.75,386,842,https://www.flickr.com/photos/pleia2/28800342585,https://creativecommons.org/licenses/by/2.0/,Elizabeth K. Joseph,https://www.flickr.com/people/pleia2/ c8c09c61bcd69de1,https://c1.staticflickr.com/1/370/32710903382_b680677460_o.jpg,0.0,0.0,0.666666666667,1.0,98,693,https://www.flickr.com/photos/russ-w/32710903382,https://creativecommons.org/licenses/by/2.0/,Russ,https://www.flickr.com/people/russ-w/ 4e87baa84a5467bd,https://c1.staticflickr.com/9/8355/28796146563_a46144a810_o.jpg,0.25,0.497411242604,1.0,1.0,32,747,https://www.flickr.com/photos/52450054@N04/28796146563,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 673cf06123470f89,https://c1.staticflickr.com/8/7380/26648708923_5eac53062e_o.jpg,0.249631811487,0.0,0.748895434462,0.75,512,766,https://www.flickr.com/photos/greggjerdingen/26648708923,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 78561cc1c31ca1f2,https://c1.staticflickr.com/8/7441/27529666561_f7ac25df65_o.jpg,0.0,0.5,0.75,1.0,407,340,https://www.flickr.com/photos/wm_archiv/27529666561/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/ 635086adcb51daf4,https://c1.staticflickr.com/8/7325/27736304942_cc5f4b7274_o.jpg,0.25,0.25,0.75,1.0,950,576,https://flickr.com/133488379@N08/27736304942,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ 7b2cdbb3c5396efa,https://c1.staticflickr.com/8/7451/27675344505_ab9f482951_o.jpg,0.494444444444,0.25,1.0,1.0,467,895,https://www.flickr.com/photos/robdammers/27675344505,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 6cb14870eaa6c645,https://c1.staticflickr.com/8/7354/26773108623_08fe876c4f_o.jpg,0.0,0.25,0.5625,1.0,341,759,https://www.flickr.com/photos/amanderson/26773108623,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 2d9c24b55f9f5600,https://c1.staticflickr.com/1/256/32435872790_9210f6c752_o.jpg,0.28125,0.25,0.84375,1.0,971,805,https://www.flickr.com/photos/ea1aer/32435872790,https://creativecommons.org/licenses/by/2.0/,Juan Carlos Llamazares,https://www.flickr.com/people/ea1aer/ 57361c2a80851ef5,https://c1.staticflickr.com/6/5518/30095827741_98c904cf2f_o.jpg,0.4375,0.25,1.0,1.0,973,589,https://www.flickr.com/photos/woodhead/30095827741/,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/ d1475e5f49a8a055,https://c1.staticflickr.com/9/8793/28191301701_28276a3d15_o.jpg,0.4375,0.25,1.0,1.0,880,740,https://www.flickr.com/photos/zongo/28191301701,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 86495a368aea25a3,https://c1.staticflickr.com/8/7245/26518368564_87a52c22f7_o.jpg,0.28125,0.0,0.84375,0.75,583,764,https://www.flickr.com/photos/cm_john/26518368564,https://creativecommons.org/licenses/by/2.0/,John Shedrick,https://www.flickr.com/people/cm_john/ f8fba0d3db0d5d2f,https://c1.staticflickr.com/8/7185/26442283653_9388d33b05_o.jpg,0.0,0.0,0.666666666667,1.0,739,578,https://www.flickr.com/photos/blumenbiene/26442283653/,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/ 27c5c50657f5faa7,https://c1.staticflickr.com/9/8213/28937552950_74cd83b239_o.jpg,0.28125,0.25,0.84375,1.0,459,774,https://www.flickr.com/photos/londonmatt/28937552950,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ f82e861fb16031d0,https://c1.staticflickr.com/8/7534/27823464091_6fc45562a7_o.jpg,0.496696035242,0.0,0.993392070485,0.75,974,555,https://www.flickr.com/photos/shankaronline/27823464091/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 7b1e8dddc4d3dd95,https://c1.staticflickr.com/8/7635/26353007433_eb53f1a1b7_o.jpg,0.22531512605,0.25,0.675945378151,1.0,143,287,https://www.flickr.com/photos/wildreturn/26353007433/,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ e6f13db7d1680531,https://c1.staticflickr.com/8/7463/26706688022_f9e1ec928f_o.jpg,0.349579831933,0.25,1.0,1.0,780,513,https://www.flickr.com/photos/thoseguys119/26706688022/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c3bf4ec302d53ef7,https://c1.staticflickr.com/6/5580/30908371675_ceb0986b93_o.jpg,0.4375,0.0,1.0,0.75,780,784,https://www.flickr.com/photos/thoseguys119/30908371675,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ a86acfa6207b308a,https://c1.staticflickr.com/6/5455/30996301646_a04c9cfda2_o.jpg,0.25,0.0,0.75,0.75,48,221,https://www.flickr.com/photos/ansk/30996301646,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/ 6c8fcaa13e251164,https://c1.staticflickr.com/8/7383/27090081584_1882baa432_o.jpg,0.0,0.250923190547,0.75,0.75276957164,443,308,https://www.flickr.com/photos/quinet/27090081584/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 53dc555cdd85abef,https://c1.staticflickr.com/1/277/32468089466_df257aeca3_o.jpg,0.0,0.25,0.499263622975,1.0,480,6,https://www.flickr.com/photos/nrmadriversseat/32468089466,https://creativecommons.org/licenses/by/2.0/,The NRMA,https://www.flickr.com/people/nrmadriversseat/ c3cc1fa93d4a2453,https://c1.staticflickr.com/9/8832/28146551543_a6892aeeab_o.jpg,0.210588633288,0.25,0.631765899865,1.0,562,723,https://www.flickr.com/photos/usnavy/28146551543,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 32befe5dc22bd051,https://c1.staticflickr.com/9/8889/28357952464_ea4f884dcb_o.jpg,0.333333333333,0.0,1.0,1.0,618,422,https://www.flickr.com/photos/joi/28357952464,https://creativecommons.org/licenses/by/2.0/,Joi Ito,https://www.flickr.com/people/joi/ ac9e647370a28e04,https://c1.staticflickr.com/8/7095/27196621386_239b7a036f_o.jpg,0.363112391931,0.0,1.0,1.0,556,944,https://www.flickr.com/photos/kansasscanner/27196621386,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ ba812f1941dad8e4,https://c1.staticflickr.com/1/545/31575903830_1a7c03c3bf_o.jpg,0.0,0.0,0.5625,0.75,985,111,https://flickr.com/73840284@N04/31575903830,https://creativecommons.org/licenses/by/2.0/,Harry Rose,https://www.flickr.com/people/macleaygrassman/ 7140c179d142da77,https://c1.staticflickr.com/6/5448/30478861881_4764d7599b_o.jpg,0.333333333333,0.0,1.0,1.0,511,449,https://flickr.com/22539273@N00/30478861881,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 209b8da99842fe37,https://c1.staticflickr.com/8/7350/27295268816_34d9fa5504_o.jpg,0.0,0.0,0.484397677794,0.75,699,428,https://www.flickr.com/photos/134758269@N08/27295268816,https://creativecommons.org/licenses/by/2.0/,Rajiv Bhuttan,https://www.flickr.com/people/134758269@N08/ f45206f28e07ec34,https://c1.staticflickr.com/4/3930/32498547130_ee1165444f_o.jpg,0.464122137405,0.25,1.0,1.0,404,81,https://www.flickr.com/photos/usnavy/32498547130,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 87f9358b5861dbbf,https://c1.staticflickr.com/9/8043/28396031325_ec2405a924_o.jpg,0.4375,0.0,1.0,0.75,975,622,https://www.flickr.com/photos/jsjgeology/28396031325,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ adfe2b59b8780bfb,https://c1.staticflickr.com/8/7490/28154852885_9898cab628_o.jpg,0.0,0.25,0.61620294599,1.0,536,216,https://www.flickr.com/photos/glorycycles/28154852885,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 810f62a554bfb7a5,https://c1.staticflickr.com/8/7363/27957544700_4b128efda0_o.jpg,0.333333333333,0.0,1.0,1.0,294,164,https://www.flickr.com/photos/flowcomm/27957544700/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ bc6b4fadf870b27e,https://c1.staticflickr.com/4/3827/14315035062_122bbd691b_o.jpg,0.447674418605,0.25,1.0,1.0,403,785,https://www.flickr.com/photos/24580165@N03/14315035062,https://creativecommons.org/licenses/by/2.0/,Tom Driggers,https://www.flickr.com/people/24580165@N03/ 521f0d5721da30fb,https://c1.staticflickr.com/6/5523/30579874132_71388d17e0_o.jpg,0.0,0.0,0.439226519337,0.75,34,92,https://www.flickr.com/photos/usfws_pacificsw/30579874132,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ ffe3277517ead6a4,https://c1.staticflickr.com/3/2186/32785407392_9a17961a13_o.jpg,0.464122137405,0.0,1.0,0.75,672,691,https://www.flickr.com/photos/glorycycles/32785407392,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 9c39596ac2e848e1,https://c1.staticflickr.com/9/8292/29153795893_c55984127a_o.jpg,0.28125,0.25,0.84375,1.0,336,23,https://www.flickr.com/photos/kirbyurner/29153795893,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/ 2f4f43114e7f1a50,https://c1.staticflickr.com/8/7392/26773675672_2f2bb77797_o.jpg,0.248713235294,0.0,0.746139705882,0.75,821,737,https://www.flickr.com/photos/shankaronline/26773675672,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ a74536baf84ffa47,https://c1.staticflickr.com/8/7433/27449716073_f300f0cf06_o.jpg,0.0,0.0,0.666666666667,1.0,655,320,https://www.flickr.com/photos/karen_roe/27449716073,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ 20af4ed230d2fa6d,https://c1.staticflickr.com/8/7393/28170477705_b273a32a02_o.jpg,0.28125,0.25,0.84375,1.0,443,837,https://www.flickr.com/photos/brighton/28170477705,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/ 8ebc8cec7101f303,https://c1.staticflickr.com/1/377/32141992950_567a87bb34_o.jpg,0.28125,0.0,0.84375,0.75,437,823,https://www.flickr.com/photos/moto_club4ag/32141992950,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ 80263724e6cdce6b,https://c1.staticflickr.com/8/7570/26498125284_c342337f37_o.jpg,0.0,0.0,0.494868035191,0.75,780,219,https://www.flickr.com/photos/thoseguys119/26498125284,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ af523031bd895ae8,https://c1.staticflickr.com/9/8600/28793857501_c0863b5e6a_o.jpg,0.0,0.0,0.561569688769,1.0,582,895,https://www.flickr.com/photos/lwpkommunikacio/28793857501,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 6122da83df7830ea,https://c1.staticflickr.com/6/5280/30055432155_c1bd11386d_o.jpg,0.0,0.24882629108,1.0,1.0,407,656,https://www.flickr.com/photos/eltb/30055432155,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 96d24344662221e3,https://c1.staticflickr.com/6/5517/30906480590_471cbb3712_o.jpg,0.249631811487,0.25,0.748895434462,1.0,402,486,https://flickr.com/26777097@N03/30906480590,https://creativecommons.org/licenses/by/2.0/,Jan Hammershaug,https://www.flickr.com/people/hammershaug/ 38bb1b6eaf964555,https://c1.staticflickr.com/8/7430/27393709643_ff6f6dd94f_o.jpg,0.0,0.25,0.5625,1.0,875,647,https://www.flickr.com/photos/69203347@N03/27393709643,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ d7174b9e051bcd3a,https://c1.staticflickr.com/6/5604/31129861554_456b3017a0_o.jpg,0.25,0.25,1.0,1.0,497,790,https://www.flickr.com/photos/rodrigoparedes/31129861554,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/ e1b5ee712df8da6e,https://c1.staticflickr.com/6/5349/29903541543_11f6d9e511_o.jpg,0.331130690162,0.0,0.993392070485,1.0,310,65,https://flickr.com/141324643@N05/29903541543,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ 0f456984116da83d,https://c1.staticflickr.com/6/5569/30472788684_c93eccc262_o.jpg,0.0,0.25,0.5,1.0,479,504,https://flickr.com/21178495@N06/30472788684,https://creativecommons.org/licenses/by/2.0/,Tiago Cassol Schvarstzhaupt,https://www.flickr.com/people/eletrosonico/ 2854711a9c3f6af3,https://c1.staticflickr.com/1/437/32606040886_96d990e698_o.jpg,0.323406040268,0.0,0.970218120805,0.75,204,742,https://flickr.com/10390868@N07/32606040886,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ d0e1684c86af2b7e,https://c1.staticflickr.com/9/8507/29618228806_b2b7b2e31d_o.jpg,0.172413793103,0.0,1.0,1.0,318,165,https://www.flickr.com/photos/gails_pictures/29618228806/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 2b5debaf5ede2df6,https://c1.staticflickr.com/9/8307/29147694073_c9066a082c_o.jpg,0.0,0.25,0.5,1.0,977,551,https://www.flickr.com/photos/cosmicherb70/29147694073,https://creativecommons.org/licenses/by/2.0/,Chris Combe,https://www.flickr.com/people/cosmicherb70/ 27e9d57623e1a427,https://c1.staticflickr.com/8/7348/27303616163_cdb7f436db_o.jpg,0.0,0.0,0.5,0.75,896,595,https://www.flickr.com/photos/armydre2008/27303616163,https://creativecommons.org/licenses/by/2.0/,frankieleon,https://www.flickr.com/people/armydre2008/ 12b9c1e328276b63,https://c1.staticflickr.com/1/283/30781645604_c07ca7beb6_o.jpg,0.0,0.0,0.662261380323,1.0,704,732,https://www.flickr.com/photos/sybarite48/30781645604,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ e35a62cecba4f329,https://c1.staticflickr.com/9/8707/29138838834_7237dfc169_o.jpg,0.28125,0.25,0.84375,1.0,131,498,https://www.flickr.com/photos/rainsong/29138838834/,https://creativecommons.org/licenses/by/2.0/,Ali - \330\271\331\204\331\212 from Riyadh - \331\205\331\206 \330\247\331\204\330\261\331\212\330\247\330\266,https://www.flickr.com/people/rainsong/ f631571777573628,https://c1.staticflickr.com/1/716/31783715436_e368df4fcb_o.jpg,0.25,0.0,1.0,1.0,309,122,https://flickr.com/86548370@N00/31783715436,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ ee79e46544264524,https://c1.staticflickr.com/1/595/32502011735_edfbc2a2cc_o.jpg,0.420238095238,0.0,1.0,0.75,760,445,https://www.flickr.com/photos/51764518@N02/32502011735,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 5a68669994383786,https://c1.staticflickr.com/6/5344/31176239492_26175d67de_o.jpg,0.0,0.25,0.5625,1.0,933,113,https://www.flickr.com/photos/qubodup/31176239492,https://creativecommons.org/licenses/by/2.0/,Iwan Gabovitch,https://www.flickr.com/people/qubodup/ 40fcc76e432b01fc,https://c1.staticflickr.com/8/7348/26492514804_df88f4402f_o.jpg,0.468844984802,0.25,1.0,1.0,459,819,https://www.flickr.com/photos/atoach/26492514804,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ d9771ae7f74f08d9,https://c1.staticflickr.com/8/7538/26220445614_2c9293e39f_o.jpg,0.501840942563,0.0,1.0,0.75,971,440,https://www.flickr.com/photos/bravenboer/26220445614,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/ f0e41c05fd793215,https://c1.staticflickr.com/9/8594/27720860714_308330cbc1_o.jpg,0.28125,0.25,0.84375,1.0,975,728,https://www.flickr.com/photos/jsjgeology/27720860714,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 3866d9b7432dbfc4,https://c1.staticflickr.com/8/7687/26333540933_2a3273b6fc_o.jpg,0.4375,0.0,1.0,0.75,981,832,https://www.flickr.com/photos/usdagov/26333540933,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ c5b76cf4305f173e,https://c1.staticflickr.com/9/8759/28422226950_1e746485e7_o.jpg,0.0,0.25,0.5625,1.0,699,541,https://www.flickr.com/photos/wlappe/28422226950,https://creativecommons.org/licenses/by/2.0/,Wilhelm Lappe,https://www.flickr.com/people/wlappe/ fe91741b82eba4ec,https://c1.staticflickr.com/8/7591/26984514731_f6161a2b74_o.jpg,0.27268683274,0.0,1.0,0.75,348,893,https://www.flickr.com/photos/lac-bac/26984514731,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/ 8895afed34028858,https://c1.staticflickr.com/9/8752/29854456230_c0a62d8b43_o.jpg,0.0,0.0,0.666666666667,1.0,561,624,https://flickr.com/100379608@N08/29854456230,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/ 3ffba53e459caaf0,https://c1.staticflickr.com/1/392/32227854771_97ebf12169_o.jpg,0.0,0.0,0.570472440945,0.75,760,561,https://www.flickr.com/photos/51764518@N02/32227854771,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ fc87ccf8b9ada033,https://c1.staticflickr.com/8/7322/28153022261_d3b6fff8bb_o.jpg,0.0,0.0,0.642140468227,0.75,761,162,https://www.flickr.com/photos/lge/28153022261,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 4b519a84a5a4c30e,https://c1.staticflickr.com/1/398/32183446082_fe56889da6_o.jpg,0.25,0.379310344828,1.0,1.0,95,132,http://www.flickr.com/photos/winnu/32183446082/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/ ea9f35646c8e9570,https://c1.staticflickr.com/9/8887/28306146124_218779fb16_o.jpg,0.497426470588,0.25,0.994852941176,1.0,820,978,https://www.flickr.com/photos/agenciabrasilia/28306146124,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 3cb4532bf414a515,https://c1.staticflickr.com/8/7450/27167741494_a38db3eefb_o.jpg,0.0,0.25,0.478354978355,1.0,821,402,https://www.flickr.com/photos/jsjgeology/27167741494,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ b675bbcced4c7bd8,https://c1.staticflickr.com/1/735/31769630380_fa3864b703_o.jpg,0.28125,0.0,0.84375,0.75,661,633,https://www.flickr.com/photos/oregondot/31769630380,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/ d5692729bde701c6,https://c1.staticflickr.com/9/8139/28497848343_72d335efb4_o.jpg,0.281690140845,0.0,0.845070422535,0.75,459,784,https://www.flickr.com/photos/22711505@N05/28497848343,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 9639607d0fed2e8c,https://c1.staticflickr.com/9/8743/28077310474_36d02b9b23_o.jpg,0.25,0.0,1.0,1.0,980,906,https://www.flickr.com/photos/dimsis/28077310474,https://creativecommons.org/licenses/by/2.0/,Dimitris Siskopoulos,https://www.flickr.com/people/dimsis/ 3956b14e795bc466,https://c1.staticflickr.com/8/7280/27238395594_48a46ae600_o.jpg,0.5,0.25,1.0,1.0,820,266,https://www.flickr.com/photos/newsoresund/27238395594,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/ 17fc25caafb04f5d,https://c1.staticflickr.com/3/2926/32052890643_0862b1e3e3_o.jpg,0.254464285714,0.0,0.763392857143,0.75,80,644,https://www.flickr.com/photos/52450054@N04/32052890643,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 86e2cc9ff257a089,https://c1.staticflickr.com/8/7565/27031249106_22ae20bcc3_o.jpg,0.0,0.0,0.5625,0.75,821,232,https://www.flickr.com/photos/jsjgeology/27031249106,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ a96da51ddd63adfb,https://c1.staticflickr.com/9/8309/29816474492_54dbf0451b_o.jpg,0.25,0.25,0.75,1.0,459,538,https://www.flickr.com/photos/discoveroregon/29816474492/,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 78f2d589ebd4366c,https://c1.staticflickr.com/9/8760/28248937781_7682c21dc7_o.jpg,0.498159057437,0.25,0.996318114875,1.0,50,933,https://www.flickr.com/photos/zigazou76/28248937781,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ d22af1dfeeb82555,https://c1.staticflickr.com/9/8491/29274401565_47e2e93c9f_o.jpg,0.0,0.25,0.645728643216,1.0,821,148,https://www.flickr.com/photos/60900612@N08/29274401565/,https://creativecommons.org/licenses/by/2.0/,Thomas's Pics,https://www.flickr.com/people/60900612@N08/ aa9ff9f26c5d938f,https://c1.staticflickr.com/9/8720/27576217074_2538cf4529_o.jpg,0.5,0.0,1.0,0.75,810,506,https://www.flickr.com/photos/o_0/27576217074,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ d19c8dfe7292aaf4,https://c1.staticflickr.com/9/8607/28004811134_46c4e6009f_o.jpg,0.4375,0.0,1.0,0.75,780,241,https://www.flickr.com/photos/thoseguys119/28004811134,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ fa3b98f68a4b7a37,https://c1.staticflickr.com/8/7376/27855995961_caa986046b_o.jpg,0.5,0.0,1.0,0.75,519,396,https://www.flickr.com/photos/box_repsol/27855995961,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ d56b109bb8dd4006,https://c1.staticflickr.com/8/7429/26441907504_d37123f1a3_o.jpg,0.28125,0.25,0.84375,1.0,437,897,https://www.flickr.com/photos/nzcarfreak/26441907504,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 173b3f63e7674dcc,https://c1.staticflickr.com/1/248/30675681254_a0975d6aa7_o.jpg,0.317068106312,0.0,0.951204318937,0.75,459,517,https://www.flickr.com/photos/22711505@N05/30675681254,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 85ec66858f670b92,https://c1.staticflickr.com/6/5771/30868515665_34b1b54cd2_o.jpg,0.0,0.333333333333,1.0,1.0,782,521,https://www.flickr.com/photos/usarak/30868515665,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/ 8c2c05db689e26d5,https://c1.staticflickr.com/6/5789/30302273482_0138e2e3d1_o.jpg,0.0,0.25,0.497426470588,1.0,379,349,https://flickr.com/38305988@N08/30302273482,https://creativecommons.org/licenses/by/2.0/,ilouque,https://www.flickr.com/people/ilouque/ 2576ac80d7c2a215,https://c1.staticflickr.com/8/7065/26234783973_a7aa088e9f_o.jpg,0.498159057437,0.25,0.996318114875,1.0,443,565,https://www.flickr.com/photos/ajhanson/26234783973/,https://creativecommons.org/licenses/by/2.0/,Alex Hanson,https://www.flickr.com/people/ajhanson/ 61cb5847bb51a894,https://c1.staticflickr.com/9/8070/28413609294_663087dccc_o.jpg,0.28125,0.25,0.84375,1.0,899,601,https://www.flickr.com/photos/jeepersmedia/28413609294,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 38e63155310eb242,https://c1.staticflickr.com/6/5569/30623556255_26e988b5d2_o.jpg,0.245614035088,0.0,0.736842105263,0.75,918,516,https://www.flickr.com/photos/chrstphre/30623556255/,https://creativecommons.org/licenses/by/2.0/,chrstphr\303\251 c\303\246mpb\303\253ll,https://www.flickr.com/people/chrstphre/ 7c8a0f9661c6d7bf,https://c1.staticflickr.com/9/8438/29248787301_32eb8b5100_o.jpg,0.25,0.5,1.0,1.0,304,34,https://www.flickr.com/photos/vahemart/29248787301,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 82996d5a78866f57,https://c1.staticflickr.com/8/7520/27663225994_7ebc3bc3b8_o.jpg,0.0,0.0,0.666666666667,1.0,563,569,https://www.flickr.com/photos/harshlight/27663225994,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ 7b2da05adcfd033f,https://c1.staticflickr.com/8/7354/27532748786_ccf1cc75a0_o.jpg,0.25,0.25,0.75,1.0,556,834,https://flickr.com/64000826@N08/27532748786,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/ 208d350e55a8e26a,https://c1.staticflickr.com/8/7083/27891386595_2e044e666f_o.jpg,0.275310834813,0.25,1.0,1.0,931,563,https://www.flickr.com/photos/70253321@N00/27891386595/,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 1980d25958fdcf64,https://c1.staticflickr.com/9/8623/30499709501_d68b8f14e1_o.jpg,0.25,0.25,0.75,1.0,992,983,https://www.flickr.com/photos/mpa/30499709501,https://creativecommons.org/licenses/by/2.0/,marissa anderson,https://www.flickr.com/people/mpa/ 800da7030f9f9460,https://c1.staticflickr.com/8/7020/26905189152_463ac81ab7_o.jpg,0.25,0.25,1.0,1.0,418,577,https://www.flickr.com/photos/inmobili-ariascamargo/26905189152,https://creativecommons.org/licenses/by/2.0/,Quelverd Arias Camargo,https://www.flickr.com/people/inmobili-ariascamargo/ f28750fef7ca6e6b,https://c1.staticflickr.com/1/564/32417091736_afa3720e68_o.jpg,0.25,0.350840336134,1.0,1.0,498,565,https://www.flickr.com/photos/iainmerchant/32417091736,https://creativecommons.org/licenses/by/2.0/,Iain Merchant,https://www.flickr.com/people/iainmerchant/ ac6e0c07c374d5d3,https://c1.staticflickr.com/9/8360/29038177971_c2f67450a5_o.jpg,0.4375,0.0,1.0,0.75,816,831,https://www.flickr.com/photos/fdecomite/29038177971,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ 5a62711d5e0f0adc,https://c1.staticflickr.com/6/5814/31208269065_c74e126cd2_o.jpg,0.28125,0.0,0.84375,0.75,145,102,https://www.flickr.com/photos/rickmccharles/31208269065/,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/ 8cbe44c97ed45f34,https://c1.staticflickr.com/6/5501/30759666341_3fe99784c2_o.jpg,0.25,0.25,0.75,1.0,702,864,https://www.flickr.com/photos/texaus1/30759666341/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ 9f9fc4d6c6c6fcfa,https://c1.staticflickr.com/9/8214/29925814991_2d4e3cb227_o.jpg,0.0,0.25,0.5625,1.0,975,353,https://www.flickr.com/photos/jsjgeology/29925814991,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 7287b9b362cc61a5,https://c1.staticflickr.com/6/5615/30584920006_a157ecd0b3_o.jpg,0.0,0.0,1.0,0.799676898223,664,467,https://www.flickr.com/photos/aforero/30584920006/,https://creativecommons.org/licenses/by/2.0/,Alejandro Forero Cuervo,https://www.flickr.com/people/aforero/ dd1560fbd6119b61,https://c1.staticflickr.com/8/7445/28073276775_e6edfd3eea_o.jpg,0.0,0.488702623907,0.75,0.977405247813,308,994,https://www.flickr.com/photos/52450054@N04/28073276775,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 12d50502e2fb1911,https://c1.staticflickr.com/8/7364/26690521483_fe62c1021e_o.jpg,0.28125,0.0,0.84375,0.75,931,89,https://www.flickr.com/photos/sixteenmilesofstring/26690521483,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/ 05b5f69b956e07ee,https://c1.staticflickr.com/8/7331/27718146426_acc324f39e_o.jpg,0.5,0.0,1.0,0.75,405,734,https://www.flickr.com/photos/zengame/27718146426,https://creativecommons.org/licenses/by/2.0/,Zengame,https://www.flickr.com/people/zengame/ 5e35a9a011f89f3b,https://c1.staticflickr.com/6/5801/30056220132_290c8bb742_o.jpg,0.25,0.25,1.0,1.0,479,946,https://www.flickr.com/photos/glorycycles/30056220132,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 0bd1babfde3be2ec,https://c1.staticflickr.com/8/7461/27449105252_fc95c9db86_o.jpg,0.0,0.0,0.822950819672,1.0,17,144,https://www.flickr.com/photos/nrgoodrum/27449105252,https://creativecommons.org/licenses/by/2.0/,nick goodrum,https://www.flickr.com/people/nrgoodrum/ f21fbc874dfea6b9,https://c1.staticflickr.com/8/7339/26410545204_5871fede9f_o.jpg,0.25,0.0,0.75,0.75,787,891,https://www.flickr.com/photos/heartfullofpoison/26410545204,https://creativecommons.org/licenses/by/2.0/,The Dark Veil \342\200\240,https://www.flickr.com/people/heartfullofpoison/ 998c0550e278f26c,https://c1.staticflickr.com/8/7473/30059928211_7dfebe4b5e_o.jpg,0.28125,0.25,0.84375,1.0,749,524,https://www.flickr.com/photos/leo_nghinphu/30059928211,https://creativecommons.org/licenses/by/2.0/,Leo Chu\341\273\221i,https://www.flickr.com/people/leo_nghinphu/ 003c056cf6b2aeae,https://c1.staticflickr.com/9/8769/29494200112_e7340ceec0_o.jpg,0.5,0.25,1.0,1.0,972,126,https://www.flickr.com/photos/136477533@N06/29494200112,https://creativecommons.org/licenses/by/2.0/,Thijs Paanakker,https://www.flickr.com/people/136477533@N06/ 02122859268d46a1,https://c1.staticflickr.com/8/7325/26815306694_a93f8fdb6a_o.jpg,0.0,0.0,0.663235294118,1.0,459,959,https://www.flickr.com/photos/agenciabrasilia/26815306694/,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ f318efdfc1370cef,https://c1.staticflickr.com/9/8379/29645869986_b72f6403b5_o.jpg,0.0,0.25,0.75,1.0,292,385,https://www.flickr.com/photos/usfwshq/29645869986,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/ 648eeec8e7b78aa2,https://c1.staticflickr.com/9/8305/29282103545_b2fc595083_o.jpg,0.4375,0.25,1.0,1.0,975,882,https://flickr.com/47445767@N05/29282103545,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 3b80464e9583378b,https://c1.staticflickr.com/9/8766/29236005783_3fdc7abf90_o.jpg,0.208445491252,0.25,0.625336473755,1.0,848,860,https://www.flickr.com/photos/22711505@N05/29236005783,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 4163f4caf249e8c4,https://c1.staticflickr.com/9/8376/29803639452_8bb391459a_o.jpg,0.0,0.25,0.421177266576,1.0,459,62,https://www.flickr.com/photos/mecklenburg/29803639452,https://creativecommons.org/licenses/by/2.0/,Thomas Kohler,https://www.flickr.com/people/mecklenburg/ 3a46c9b0fe7d0f79,https://c1.staticflickr.com/8/7431/26667704324_73456373fa_o.jpg,0.25,0.0,0.75,0.75,699,541,https://www.flickr.com/photos/estudiante/26667704324,https://creativecommons.org/licenses/by/2.0/,Dan,https://www.flickr.com/people/estudiante/ 1755ddf241af4505,https://c1.staticflickr.com/9/8754/28164380572_da2f005d20_o.jpg,0.0,0.25,0.496696035242,1.0,484,546,https://www.flickr.com/photos/sybarite48/28164380572,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ d934102016d20d52,https://c1.staticflickr.com/6/5039/29311889333_3d2d3c1e8b_o.jpg,0.250319284802,0.0,0.750957854406,1.0,405,838,https://www.flickr.com/photos/dosenphoto/29311889333,https://creativecommons.org/licenses/by/2.0/,DosenPhoto,https://www.flickr.com/people/dosenphoto/ 5d62e7027cfe4925,https://c1.staticflickr.com/9/8625/28712984370_3417f7b09c_o.jpg,0.484655688623,0.25,1.0,1.0,563,569,https://www.flickr.com/photos/governosp/28712984370/,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de S\303\243o Paulo,https://www.flickr.com/people/governosp/ a52b3d711260e805,https://c1.staticflickr.com/1/583/32388002131_01e25b39ef_o.jpg,0.0,0.0,0.75,1.0,650,935,https://www.flickr.com/photos/nat507/32388002131,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/ 94d0d06e8e109684,https://c1.staticflickr.com/9/8284/28947671403_93432a40db_o.jpg,0.578822733424,0.0,1.0,0.75,418,582,https://www.flickr.com/photos/blmnevada/28947671403/,https://creativecommons.org/licenses/by/2.0/,BLM Nevada,https://www.flickr.com/people/blmnevada/ 4aaf5c978d0bb204,https://c1.staticflickr.com/8/7288/27554544452_771239fc26_o.jpg,0.0,0.25,0.645728643216,1.0,672,170,https://www.flickr.com/photos/22711505@N05/27554544452,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 4fb6733e39dc9cfb,https://c1.staticflickr.com/6/5327/30092850412_50359bfc62_o.jpg,0.0,0.0,0.437586206897,0.75,816,257,https://www.flickr.com/photos/picturepursuit/30092850412,https://creativecommons.org/licenses/by/2.0/,ashish saswadkar,https://www.flickr.com/people/picturepursuit/ 5608f0c330dc494c,https://c1.staticflickr.com/6/5550/29931437273_4bf9a574a8_o.jpg,0.0,0.0,0.710806697108,1.0,512,696,https://www.flickr.com/photos/andreboeni/29931437273,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ a55b22ca0a780465,https://c1.staticflickr.com/8/7645/27723860481_2c970a78b6_o.jpg,0.256744604317,0.25,1.0,1.0,309,300,https://www.flickr.com/photos/35142635@N05/27723860481,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 72248dbfe2d1d1e8,https://c1.staticflickr.com/9/8490/28800314540_dff1cc6a56_o.jpg,0.28125,0.0,0.84375,0.75,826,111,https://www.flickr.com/photos/12394349@N06/28800314540,https://creativecommons.org/licenses/by/2.0/,Bryn Pinzgauer,https://www.flickr.com/people/12394349@N06/ 5389a1eead466376,https://c1.staticflickr.com/9/8357/28872219474_8fc245ebcc_o.jpg,0.248713235294,0.25,0.746139705882,1.0,570,707,https://www.flickr.com/photos/agenciabrasilia/28872219474,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 4b0428d9db2b4c9d,https://c1.staticflickr.com/6/5582/30804988505_d2bbba8f2b_o.jpg,0.278188180404,0.0,0.834564541213,0.75,20,605,https://www.flickr.com/photos/kjfnjy/30804988505,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/ 504df132be02269c,https://c1.staticflickr.com/8/7192/26711386690_df438beaa1_o.jpg,0.0,0.0,0.666666666667,1.0,848,837,https://www.flickr.com/photos/7armyjmtc/26711386690,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 67fca6cfaddf27a2,https://c1.staticflickr.com/9/8353/29273681124_4afe777c50_o.jpg,0.314256198347,0.0,0.942768595041,0.75,327,373,https://www.flickr.com/photos/jlcernadas/29273681124,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ c155b7769c861c84,https://c1.staticflickr.com/9/8720/28278086872_bee2b13d6c_o.jpg,0.0,0.0,0.5,0.75,976,248,https://www.flickr.com/photos/o_0/28278086872,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ eb05a6e535dc1fd2,https://c1.staticflickr.com/6/5497/29889387963_9e671b5095_o.jpg,0.5,0.0,1.0,0.75,405,632,https://www.flickr.com/photos/levien66/29889387963/,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/ d199ca1974153643,https://c1.staticflickr.com/1/674/32794109632_fc07f9fa12_o.jpg,0.0,0.0,0.666666666667,1.0,830,983,https://www.flickr.com/photos/andreastrojak/32794109632/,https://creativecommons.org/licenses/by/2.0/,Andreas Trojak,https://www.flickr.com/people/andreastrojak/ ac6fb643c41cc4ca,https://c1.staticflickr.com/8/7370/27290719733_f11530ee33_o.jpg,0.498153618907,0.25,1.0,1.0,407,870,https://www.flickr.com/photos/eltb/27290719733,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ c63221f76cec0a93,https://c1.staticflickr.com/8/7514/28487192012_67c3b07b59_o.jpg,0.217975206612,0.25,0.653925619835,1.0,542,798,https://www.flickr.com/photos/donaldjudge/28487192012,https://creativecommons.org/licenses/by/2.0/,Donald Judge,https://www.flickr.com/people/donaldjudge/ 72497df63e83f849,https://c1.staticflickr.com/8/7400/27985558622_3d5f02cfbf_o.jpg,0.0,0.121827411168,1.0,1.0,880,686,https://www.flickr.com/photos/fand_photography/27985558622,https://creativecommons.org/licenses/by/2.0/,Fan D,https://www.flickr.com/people/fand_photography/ 378695a059974e60,https://c1.staticflickr.com/6/5791/31129149785_65fc745f99_o.jpg,0.210588633288,0.0,0.631765899865,0.75,650,906,https://www.flickr.com/photos/enez35/31129149785/,https://creativecommons.org/licenses/by/2.0/,Jean-Michel Moullec,https://www.flickr.com/people/enez35/ 70f9b30de479eff7,https://c1.staticflickr.com/1/267/31246794594_e398ae6022_o.jpg,0.0,0.285496183206,1.0,1.0,442,746,https://www.flickr.com/photos/ruthanddave/31246794594,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 8625147470d9de41,https://c1.staticflickr.com/8/7182/26911591696_7a588e548a_o.jpg,0.5,0.0,1.0,0.75,982,879,https://www.flickr.com/photos/mindahaas/26911591696,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ dd437845995bde0e,https://c1.staticflickr.com/9/8169/29829179572_d8a4f02421_o.jpg,0.0,0.25,0.5625,1.0,707,855,https://www.flickr.com/photos/seattleparks/29829179572,https://creativecommons.org/licenses/by/2.0/,Seattle Parks,https://www.flickr.com/people/seattleparks/ 8d84bc4e09806502,https://c1.staticflickr.com/9/8800/28419050580_eef8d9a4ac_o.jpg,0.248713235294,0.0,0.746139705882,0.75,896,858,https://www.flickr.com/photos/thenationalguard/28419050580,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/ cbd9875f2249282e,https://c1.staticflickr.com/9/8726/28291254775_ba96651168_o.jpg,0.333333333333,0.0,1.0,1.0,548,422,https://www.flickr.com/photos/chaz_pics/28291254775/,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ fe5ee84e6897bc4c,https://c1.staticflickr.com/8/7784/28775568452_580f596543_o.jpg,0.0,0.25,0.497426470588,1.0,848,721,https://www.flickr.com/photos/oregonmildep/28775568452/,https://creativecommons.org/licenses/by/2.0/,Oregon National Guard,https://www.flickr.com/people/oregonmildep/ ffd75e49a6c6cb04,https://c1.staticflickr.com/1/606/31383944361_c628579db1_o.jpg,0.255395683453,0.25,1.0,1.0,638,946,https://www.flickr.com/photos/13476480@N07/31383944361,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ f91efff38d3c0cfe,https://c1.staticflickr.com/8/7253/26812232304_f1008402af_o.jpg,0.0,0.0,0.723502304147,1.0,635,164,https://www.flickr.com/photos/mtacc-esa/26812232304,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/ 61c2ed7c5aa4bda1,https://c1.staticflickr.com/9/8394/29963567071_b189048b9d_o.jpg,0.0,0.0,0.5625,0.75,410,494,https://www.flickr.com/photos/ands78/29963567071,https://creativecommons.org/licenses/by/2.0/,ands78,https://www.flickr.com/people/ands78/ f8d2a8a2cd0f3a0b,https://c1.staticflickr.com/9/8279/28317574234_27b5f730bd_o.jpg,0.0,0.0,0.75,0.75,979,850,https://www.flickr.com/photos/muraterturk/28317574234,https://creativecommons.org/licenses/by/2.0/,Murat Ert\303\274rk,https://www.flickr.com/people/muraterturk/ f2f9d5a3d8285aaa,https://c1.staticflickr.com/6/5448/29959463670_8b1be9965b_o.jpg,0.25,0.25,1.0,1.0,693,602,https://www.flickr.com/photos/mrsdkrebs/29959463670/,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/ e43946ff747a33b3,https://c1.staticflickr.com/6/5707/30270819836_bd9df436a0_o.jpg,0.25,0.237607758621,1.0,0.712823275862,918,565,https://www.flickr.com/photos/12832008@N04/30270819836,https://creativecommons.org/licenses/by/2.0/,Bryan Ward,https://www.flickr.com/people/12832008@N04/ b996815182342f86,https://c1.staticflickr.com/8/7600/28264012902_25bd77bf9f_o.jpg,0.25,0.25,0.75,1.0,405,554,https://www.flickr.com/photos/aphid00/28264012902/,https://creativecommons.org/licenses/by/2.0/,Dave Sizer,https://www.flickr.com/people/aphid00/ 56dd80dbd1fceb2b,https://c1.staticflickr.com/8/7386/27921034445_f14f8576bb_o.jpg,0.0,0.251353790614,0.75,1.0,290,411,https://flickr.com/37804979@N00/27921034445,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 8daad6acac9c637d,https://c1.staticflickr.com/1/405/32646439546_7f61719a2b_o.jpg,0.339207048458,0.0,1.0,1.0,480,704,https://www.flickr.com/photos/134741223@N04/32646439546,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/ 4bfcefcad83f0b72,https://c1.staticflickr.com/1/388/31927294034_424182e511_o.jpg,0.25,0.0,0.75,0.75,868,257,https://www.flickr.com/photos/76969036@N02/31927294034,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 69002cbe14c5cc6c,https://c1.staticflickr.com/8/7492/27496341713_bbd60a8234_o.jpg,0.500736377025,0.0,1.0,0.75,434,22,https://www.flickr.com/photos/familymwr/27496341713,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/ 5982d677296085ef,https://c1.staticflickr.com/8/7372/26784300650_b171ec4a7e_o.jpg,0.362193362193,0.0,1.0,1.0,309,418,https://www.flickr.com/photos/42244964@N03/26784300650,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/ 9a809d620d80929e,https://c1.staticflickr.com/9/8013/28715757904_4440ee78f1_o.jpg,0.0,0.0,0.433722527473,0.75,830,461,https://www.flickr.com/photos/robdammers/28715757904,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 5b3de4b8bf838dc7,https://c1.staticflickr.com/9/8468/28976195970_a2fd8c51db_o.jpg,0.0,0.0,0.439520958084,1.0,416,306,https://flickr.com/77551055@N00/28976195970,https://creativecommons.org/licenses/by/2.0/,Nick Hubbard,https://www.flickr.com/people/nickhubbard/ 08d0efde3accd444,https://c1.staticflickr.com/1/328/31708424581_ab48beb40e_o.jpg,0.0,0.0,1.0,0.666666666667,956,931,https://flickr.com/64586261@N02/31708424581,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 9955f022d4ee93c4,https://c1.staticflickr.com/1/605/31884150595_ec27e4c2c2_o.jpg,0.0,0.0,0.560452418097,0.75,970,948,https://www.flickr.com/photos/theocrazzolara/31884150595/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/ b7dc7340063f7b69,https://c1.staticflickr.com/8/7607/26998711456_d9309964d2_o.jpg,0.491071428571,0.25,1.0,1.0,405,960,https://flickr.com/34200064@N08/26998711456,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/ 2188f85066df06cf,https://c1.staticflickr.com/9/8428/28734323122_3ed894966c_o.jpg,0.288292253521,0.0,1.0,0.75,133,238,https://www.flickr.com/photos/navaneethkn/28734323122,https://creativecommons.org/licenses/by/2.0/,Navaneeth KN,https://www.flickr.com/people/navaneethkn/ 41f32af105cda09e,https://c1.staticflickr.com/9/8687/28783232052_2e1c281cde_o.jpg,0.0,0.0,0.5625,0.75,459,586,https://www.flickr.com/photos/londonmatt/28783232052,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ f718eba111750d6b,https://c1.staticflickr.com/8/7596/27194747033_75665e3472_o.jpg,0.0,0.0,0.75,1.0,826,865,https://www.flickr.com/photos/jsjgeology/27194747033,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ b4b986457511f4e1,https://c1.staticflickr.com/4/3892/33151541576_ae00b19406_o.jpg,0.0,0.25,0.5,1.0,348,477,https://www.flickr.com/photos/usfwsmtnprairie/33151541576/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 09e5dcdfcd57f556,https://c1.staticflickr.com/9/8657/29449199776_b68b34c62f_o.jpg,0.273978685613,0.0,1.0,0.75,402,606,https://flickr.com/146566355@N07/29449199776,https://creativecommons.org/licenses/by/2.0/,Reid Pinkham,https://www.flickr.com/people/reidpinkham/ 8eebfed494c53072,https://c1.staticflickr.com/8/7429/26261772924_d405e76b13_o.jpg,0.0,0.0,0.75,1.0,496,413,https://www.flickr.com/photos/shankaronline/26261772924,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ bda6cc14029884ab,https://c1.staticflickr.com/8/7798/27687355726_5f4099ecf2_o.jpg,0.0,0.0,0.5625,0.75,821,737,https://www.flickr.com/photos/jsjgeology/27687355726,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 8a7eb981c4fc0228,https://c1.staticflickr.com/6/5684/30299328084_1e944f5043_o.jpg,0.0,0.0,0.75,1.0,973,364,https://www.flickr.com/photos/jsjgeology/30299328084,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1d58f139878c4c69,https://c1.staticflickr.com/1/635/30791620033_15f57a9056_o.jpg,0.486547085202,0.0,1.0,0.75,973,406,https://www.flickr.com/photos/guldem/30791620033,https://creativecommons.org/licenses/by/2.0/,G\303\274ldem \303\234st\303\274n,https://www.flickr.com/people/guldem/ 57f28dc94726d941,https://c1.staticflickr.com/8/7317/27617413431_3cbde473cd_o.jpg,0.258620689655,0.0,0.775862068966,0.75,459,991,https://www.flickr.com/photos/mtaphotos/27617413431,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/ 347569208b3ed636,https://c1.staticflickr.com/9/8188/28576830912_61e0c27c6f_o.jpg,0.25,0.25,1.0,1.0,699,7,https://www.flickr.com/photos/eaviles/28576830912/,https://creativecommons.org/licenses/by/2.0/,Edgardo Avil\303\251s-L\303\263pez,https://www.flickr.com/people/eaviles/ 83d13b8d51027bf4,https://c1.staticflickr.com/8/7250/26951359202_8047412582_o.jpg,0.438671875,0.0,1.0,0.75,968,462,https://www.flickr.com/photos/133267756@N03/26951359202,https://creativecommons.org/licenses/by/2.0/,GastroyPolitica By FB,https://www.flickr.com/people/133267756@N03/ 72734737ec7c8fe7,https://c1.staticflickr.com/8/7053/26571375504_a6d21e97b5_o.jpg,0.4375,0.25,1.0,1.0,950,903,https://www.flickr.com/photos/alfreddiem/26571375504,https://creativecommons.org/licenses/by/2.0/,weisserstier,https://www.flickr.com/people/alfreddiem/ d070268f5a91fe9f,https://c1.staticflickr.com/9/8365/29475149362_82abccc4a4_o.jpg,0.25,0.0,0.75,0.75,973,614,https://www.flickr.com/photos/quinet/29475149362,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 71e8af9d2a1988bc,https://c1.staticflickr.com/8/7247/27267615940_656c0741ec_o.jpg,0.351794554455,0.0,0.703589108911,0.75,780,532,https://www.flickr.com/photos/thoseguys119/27267615940,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 7033d6df6bbaa215,https://c1.staticflickr.com/9/8651/27902480084_fe52febff6_o.jpg,0.281690140845,0.25,0.845070422535,1.0,313,391,https://www.flickr.com/photos/treegrow/27902480084/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 13e483428d2745b5,https://c1.staticflickr.com/9/8569/28363679020_bd9477018b_o.jpg,0.25,0.400242326333,1.0,1.0,443,31,https://flickr.com/24429508@N00/28363679020,https://creativecommons.org/licenses/by/2.0/,Ricardo Ricote Rodr\303\255guez,https://www.flickr.com/people/ricote/ a3867bee6ce78597,https://c1.staticflickr.com/8/7357/26848886496_86e9425b73_o.jpg,0.0,0.0,0.75117370892,1.0,490,809,https://www.flickr.com/photos/cogdog/26848886496/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 4e1753b82eb653f0,https://c1.staticflickr.com/6/5537/29760461864_f5d01fd478_o.jpg,0.286277602524,0.25,0.858832807571,1.0,536,409,https://www.flickr.com/photos/glorycycles/29760461864/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 4327b7433fba451e,https://c1.staticflickr.com/6/5685/29881432846_dd785fb0c1_o.jpg,0.578822733424,0.25,1.0,1.0,418,940,https://www.flickr.com/photos/pavdw/29881432846/,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/ 8b6f5223270a700a,https://c1.staticflickr.com/6/5466/30219527350_cf570c56ae_o.jpg,0.0,0.28125,0.75,0.84375,997,440,https://flickr.com/8558643@N06/30219527350,https://creativecommons.org/licenses/by/2.0/,Christophe Delaere,https://www.flickr.com/people/delaere/ 77c3221737498807,https://c1.staticflickr.com/1/548/30753625814_4f671ca952_o.jpg,0.0,0.440717628705,0.75,1.0,842,476,https://www.flickr.com/photos/spreadshirt/30753625814/,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/ 05572755761528f6,https://c1.staticflickr.com/6/5748/30899068750_0303b03d96_o.jpg,0.306766917293,0.0,1.0,1.0,512,249,https://www.flickr.com/photos/91807507@N03/30899068750/,https://creativecommons.org/licenses/by/2.0/,GPS 56,https://www.flickr.com/people/91807507@N03/ ce9c92ebce809cba,https://c1.staticflickr.com/9/8306/29931317495_dc2ceb9cf5_o.jpg,0.25,0.384217335058,1.0,0.768434670116,898,423,https://www.flickr.com/photos/lge/29931317495,https://creativecommons.org/licenses/by/2.0/,LG\354\240\204\354\236\220,https://www.flickr.com/people/lge/ 9b709088a2f03110,https://c1.staticflickr.com/6/5661/30813023595_f7a855839d_o.jpg,0.25,0.25,1.0,1.0,672,559,https://www.flickr.com/photos/glorycycles/30813023595,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ c6a60dc9c86aadfd,https://c1.staticflickr.com/8/7319/27003333941_63eb2c5b46_o.jpg,0.0,0.0,0.741835147745,1.0,448,607,https://www.flickr.com/photos/kurdishstruggle/27003333941,https://creativecommons.org/licenses/by/2.0/,Kurdishstruggle,https://www.flickr.com/people/kurdishstruggle/ deec01858c086bda,https://c1.staticflickr.com/8/7552/26835726151_37be564abb_o.jpg,0.0,0.0,0.75,1.0,934,767,https://www.flickr.com/photos/jeepersmedia/26835726151,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ fe9abe86e0d88fda,https://c1.staticflickr.com/8/7423/27896777831_65214843c7_o.jpg,0.4375,0.0,1.0,0.75,964,501,https://www.flickr.com/photos/68147320@N02/27896777831,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ d0b89e10cecb7aa0,https://c1.staticflickr.com/6/5546/30428322001_72cf79eeb2_o.jpg,0.333333333333,0.0,1.0,1.0,821,651,https://www.flickr.com/photos/robdammers/30428322001/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ d25f61e1ea150da9,https://c1.staticflickr.com/8/7457/26914158412_6d19225acb_o.jpg,0.322436849926,0.0,1.0,1.0,986,725,https://www.flickr.com/photos/postmanpetecoluk/26914158412,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ 1be6ad048381c5c3,https://c1.staticflickr.com/8/7408/27389872095_09583ac9a2_o.jpg,0.701539338655,0.25,1.0,1.0,699,854,https://www.flickr.com/photos/springfeld/27389872095,https://creativecommons.org/licenses/by/2.0/,Udo Springfeld,https://www.flickr.com/people/springfeld/ 38d2d4a051c4efe3,https://c1.staticflickr.com/8/7059/27198260930_b1bfaf65f4_o.jpg,0.0,0.0,0.671794871795,0.75,507,452,https://www.flickr.com/photos/ipdegirl/27198260930,https://creativecommons.org/licenses/by/2.0/,Jenni C,https://www.flickr.com/people/ipdegirl/ 8f1441c5170fca94,https://c1.staticflickr.com/6/5727/31853067675_6005f4e27a_o.jpg,0.0,0.0,0.75,1.0,844,419,https://flickr.com/42814909@N00/31853067675,https://creativecommons.org/licenses/by/2.0/,notnef,https://www.flickr.com/people/fentonetal/ d7c5128807020c2a,https://c1.staticflickr.com/1/636/32313145852_892cd2a4e6_o.jpg,0.346121416526,0.25,1.0,1.0,786,222,https://www.flickr.com/photos/izik/32313145852,https://creativecommons.org/licenses/by/2.0/,Isaac Wedin,https://www.flickr.com/people/izik/ 5f5e6433287436ac,https://c1.staticflickr.com/9/8636/28553423952_5c6d9e1361_o.jpg,0.0,0.0,0.508928571429,0.75,635,905,https://www.flickr.com/photos/rich701/28553423952,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/ d65932969a9e8803,https://c1.staticflickr.com/9/8016/28801988160_5c61d684dd_o.jpg,0.0,0.310344827586,1.0,1.0,310,914,https://www.flickr.com/photos/steve_childs/28801988160,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/ 51baf5e5f90f810c,https://c1.staticflickr.com/6/5457/30145431863_d316145b7d_o.jpg,0.0,0.0,0.254731861199,0.75,405,201,https://www.flickr.com/photos/hisgett/30145431863,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 53a2a10b08046bdd,https://c1.staticflickr.com/8/7424/27913666531_72b983437e_o.jpg,0.28125,0.0,0.84375,0.75,738,571,https://www.flickr.com/photos/jeepersmedia/27913666531,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ cbfe39911750e709,https://c1.staticflickr.com/9/8582/30212230582_9326b0e59a_o.jpg,0.263416815742,0.25,1.0,1.0,739,568,https://www.flickr.com/photos/pagedooley/30212230582,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/ 3144b9b78f859d84,https://c1.staticflickr.com/9/8071/29613871671_a0719dd53c_o.jpg,0.25,0.25,0.75,1.0,972,230,https://www.flickr.com/photos/trocaire/29613871671/,https://creativecommons.org/licenses/by/2.0/,Trocaire,https://www.flickr.com/people/trocaire/ d9e987a5da26eabf,https://c1.staticflickr.com/6/5805/31095472086_3e62d3f89b_o.jpg,0.28125,0.0,0.84375,0.75,669,654,https://www.flickr.com/photos/96223380@N02/31095472086,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/ 8e1f0785633f79cf,https://c1.staticflickr.com/8/7368/26952205554_83edefc43d_o.jpg,0.25,0.28125,1.0,0.84375,981,993,https://www.flickr.com/photos/usdagov/26952205554,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 595bc900aed081eb,https://c1.staticflickr.com/9/8780/28396201165_15d4dd4f48_o.jpg,0.475453172205,0.25,1.0,1.0,975,696,https://www.flickr.com/photos/jsjgeology/28396201165,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ b533bbcb401f917a,https://c1.staticflickr.com/6/5325/30568210361_161210d896_o.jpg,0.25,0.25,0.75,1.0,662,562,https://www.flickr.com/photos/42220226@N07/30568210361,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 5ae47e362a9b8981,https://c1.staticflickr.com/1/571/32144012890_15d90da862_o.jpg,0.0,0.267938931298,0.75,0.803816793893,292,300,https://www.flickr.com/photos/happymillerman/32144012890,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ 571e5770023c1fbf,https://c1.staticflickr.com/1/87/30785181093_ed769fd36c_o.jpg,0.0,0.25,0.75,1.0,644,365,https://www.flickr.com/photos/home_of_chaos/30785181093/,https://creativecommons.org/licenses/by/2.0/,thierry ehrmann,https://www.flickr.com/people/home_of_chaos/ 69703e94581c4bbb,https://c1.staticflickr.com/1/88/31518437085_c2c7aaf1be_o.jpg,0.0,0.175409836066,1.0,1.0,948,642,https://www.flickr.com/photos/ewolivera/31518437085,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/ e748441c5edb53f1,https://c1.staticflickr.com/9/8216/29697785962_2a37130207_o.jpg,0.0,0.25,0.5,1.0,363,833,https://flickr.com/95230066@N07/29697785962,https://creativecommons.org/licenses/by/2.0/,British Pest Control Association,https://www.flickr.com/people/95230066@N07/ e211bee025d645b7,https://c1.staticflickr.com/6/5751/31214702724_3138cdf75c_o.jpg,0.0,0.0,0.666666666667,1.0,706,683,https://www.flickr.com/photos/126337928@N05/31214702724,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ c8c7c057fc99c1e7,https://c1.staticflickr.com/9/8484/29100969591_bafd541d85_o.jpg,0.28125,0.25,0.84375,1.0,920,801,https://www.flickr.com/photos/fdecomite/29100969591/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/ a48e5f86b258c6da,https://c1.staticflickr.com/9/8309/29189128341_9473877e3f_o.jpg,0.0,0.25,0.561328125,1.0,875,412,https://www.flickr.com/photos/dariuspinkston/29189128341/,https://creativecommons.org/licenses/by/2.0/,Darius Pinkston,https://www.flickr.com/people/dariuspinkston/ 146738934b811e79,https://c1.staticflickr.com/6/5598/30291340334_b6a21fd38c_o.jpg,0.0,0.0,1.0,0.666666666667,980,683,https://www.flickr.com/photos/yahl/30291340334/,https://creativecommons.org/licenses/by/2.0/,Keith Yahl,https://www.flickr.com/people/yahl/ cd7adb9c241f3645,https://c1.staticflickr.com/8/7489/27064481800_085a40270a_o.jpg,0.0,0.25,0.5,1.0,558,353,https://www.flickr.com/photos/greggjerdingen/27064481800,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 5806b424ac9725d4,https://c1.staticflickr.com/9/8562/28418299406_a47453b751_o.jpg,0.249079528719,0.25,0.747238586156,1.0,737,779,http://www.flickr.com/photos/oliver_clarke/28418299406/,https://creativecommons.org/licenses/by/2.0/,Oliver Clarke,https://www.flickr.com/people/oliver_clarke/ 953c5a4e009dee96,https://c1.staticflickr.com/6/5714/30166822763_bcc9331952_o.jpg,0.25,0.0,1.0,0.499263622975,402,725,https://flickr.com/96656936@N06/30166822763,https://creativecommons.org/licenses/by/2.0/,Ken Srail,https://www.flickr.com/people/srail/ 415fd08b8c01f727,https://c1.staticflickr.com/6/5833/30633649165_20bc29181e_o.jpg,0.258620689655,0.0,0.775862068966,0.75,662,831,https://www.flickr.com/photos/autohistorian/30633649165,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ 06d494302ee4db6d,https://c1.staticflickr.com/6/5333/31178749265_bce3ee01a5_o.jpg,0.4375,0.0,1.0,0.75,875,714,https://www.flickr.com/photos/pics-by-mpd/31178749265,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/ 86a230447f7cf26e,https://c1.staticflickr.com/8/7791/26619767854_59e265449d_o.jpg,0.5,0.0,1.0,0.75,985,131,https://www.flickr.com/photos/cosmicherb70/26619767854,https://creativecommons.org/licenses/by/2.0/,Chris Combe,https://www.flickr.com/people/cosmicherb70/ 63e3c3a5f22bf329,https://c1.staticflickr.com/9/8275/30284786161_6a846c3d2c_o.jpg,0.273726851852,0.0,0.821180555556,0.75,539,342,https://www.flickr.com/photos/22711505@N05/30284786161,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 64abe707b275f393,https://c1.staticflickr.com/8/7022/26786139643_cce5fb31a1_o.jpg,0.5,0.0,1.0,0.75,821,736,https://www.flickr.com/photos/ben_salter/26786139643/,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/ de8f1ffffbc2df44,https://c1.staticflickr.com/6/5486/30607905945_2edab25ed0_o.jpg,0.25,0.0,1.0,0.75,499,277,https://www.flickr.com/photos/pasa/30607905945/,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 11d005a268fd88ba,https://c1.staticflickr.com/9/8114/28659243534_82234bd854_o.jpg,0.28125,0.0,0.84375,0.75,975,786,https://www.flickr.com/photos/jsjgeology/28659243534,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 0f47efde6dd91f2c,https://c1.staticflickr.com/8/7401/26795524443_94e1db1ddf_o.jpg,0.248348017621,0.25,0.745044052863,1.0,26,420,https://www.flickr.com/photos/aah-yeah/26795524443/,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/ 938fa87cabe4e761,https://c1.staticflickr.com/6/5455/30341869553_da042ec292_o.jpg,0.250923190547,0.25,0.75276957164,1.0,407,736,https://www.flickr.com/photos/eltb/30341869553,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ e8fa2ab28c6c1ea6,https://c1.staticflickr.com/8/7396/28016693425_b21de8076d_o.jpg,0.5,0.25,1.0,1.0,874,926,https://www.flickr.com/photos/120106679@N03/28016693425,https://creativecommons.org/licenses/by/2.0/,Wirsinda Llefreaks,https://www.flickr.com/people/120106679@N03/ 108ffa60f554773b,https://c1.staticflickr.com/9/8283/28992131264_0f2fdc7fe3_o.jpg,0.43661971831,0.25,1.0,1.0,932,315,https://www.flickr.com/photos/joyosity/28992131264,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/ cbcaa587c96b599b,https://c1.staticflickr.com/1/737/31479454161_2f79c92e03_o.jpg,0.0,0.0,0.75,0.5,777,430,https://www.flickr.com/photos/itupictures/31479454161/,https://creativecommons.org/licenses/by/2.0/,ITU Pictures,https://www.flickr.com/people/itupictures/ 76fb8c847f49c306,https://c1.staticflickr.com/8/7531/30021707680_4c9d179dc0_o.jpg,0.0,0.0,0.421177266576,0.75,405,662,https://www.flickr.com/photos/dlr_de/30021707680,https://creativecommons.org/licenses/by/2.0/,DLR German Aerospace Center,https://www.flickr.com/people/dlr_de/ 788c1d25cd754a0d,https://c1.staticflickr.com/6/5548/31013354062_662fd907a7_o.jpg,0.0,0.0,0.671794871795,0.75,538,105,https://www.flickr.com/photos/usfwshq/31013354062,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/ b668baac594faa38,https://c1.staticflickr.com/9/8340/28520762406_0d2979980f_o.jpg,0.25,0.0,0.75,0.75,971,983,https://www.flickr.com/photos/davebloggs007/28520762406,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ b4dc104497190b6e,https://c1.staticflickr.com/9/8128/28888836620_f9b56a54ba_o.jpg,0.25,0.25,0.75,1.0,835,565,https://www.flickr.com/photos/31029865@N06/28888836620,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/ e5098db03fc02a79,https://c1.staticflickr.com/6/5630/30605394902_3f09e28475_o.jpg,0.0,0.0,0.666666666667,1.0,100,493,https://flickr.com/22539273@N00/30605394902,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ 0bdc3c04749c45d0,https://c1.staticflickr.com/6/5736/30488992510_5fe16b3ee5_o.jpg,0.25,0.254086181278,1.0,0.762258543834,725,66,https://flickr.com/37804979@N00/30488992510,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ a73d3d29520b1712,https://c1.staticflickr.com/8/7381/26985745404_73c9d3554e_o.jpg,0.498153618907,0.25,1.0,1.0,699,907,https://www.flickr.com/photos/jorge-11/26985745404,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/ 4c0e68bdcbbacce4,https://c1.staticflickr.com/6/5701/30438346713_a4438530ce_o.jpg,0.28125,0.25,0.84375,1.0,699,607,https://www.flickr.com/photos/davidstanleytravel/30438346713,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ f80300f5bf40e2d7,https://c1.staticflickr.com/9/8038/29227020654_507848bce1_o.jpg,0.28125,0.25,0.84375,1.0,699,265,https://www.flickr.com/photos/davidstanleytravel/29227020654,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 60343acbb6bcfaea,https://c1.staticflickr.com/9/8561/27776427244_025e1761eb_o.jpg,0.0,0.0,0.566326530612,0.75,878,806,https://www.flickr.com/photos/mtaphotos/27776427244,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/ f4e292f525995b23,https://c1.staticflickr.com/9/8553/28429103321_4ee38161c8_o.jpg,0.4375,0.25,1.0,1.0,920,430,https://www.flickr.com/photos/cogdog/28429103321,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 5bec01749b815c47,https://c1.staticflickr.com/1/686/31913197024_fdcfa8db76_o.jpg,0.0,0.351744186047,1.0,1.0,550,565,https://www.flickr.com/photos/archivesnz/31913197024,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/ fda4e25b87f5b5da,https://c1.staticflickr.com/8/7599/27133304130_ef2c5445e4_o.jpg,0.263636363636,0.0,0.790909090909,0.75,672,398,https://www.flickr.com/photos/28521130@N02/27133304130/,https://creativecommons.org/licenses/by/2.0/,Chris Crook,https://www.flickr.com/people/28521130@N02/ ba4b493ff7d68164,https://c1.staticflickr.com/8/7535/27682537101_346b014495_o.jpg,0.4375,0.25,1.0,1.0,644,106,https://www.flickr.com/photos/jdlasica/27682537101,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 13cd5034357cbe65,https://c1.staticflickr.com/9/8576/28740181022_d642a5f729_o.jpg,0.549090909091,0.0,1.0,1.0,815,52,https://www.flickr.com/photos/watts_photos/28740181022,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ b510f33fae2f9400,https://c1.staticflickr.com/9/8700/29042405395_39c138e7ca_o.jpg,0.0,0.25,0.601941747573,1.0,510,785,https://www.flickr.com/photos/56041749@N02/29042405395/,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/ d42e528c08041e23,https://c1.staticflickr.com/8/7426/27725918656_7b03c99843_o.jpg,0.25,0.25,1.0,1.0,909,679,https://www.flickr.com/photos/upsticksngo/27725918656,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew,https://www.flickr.com/people/upsticksngo/ 29d771df4d8ff3d5,https://c1.staticflickr.com/9/8530/29144030334_70c81c07d5_o.jpg,0.314256198347,0.0,0.942768595041,0.75,309,563,https://www.flickr.com/photos/35142635@N05/29144030334,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/ 18ce1a3099ee3dac,https://c1.staticflickr.com/6/5525/30134863003_7e48ecb9b8_o.jpg,0.25,0.25,0.75,1.0,629,600,https://www.flickr.com/photos/prayitnophotography/30134863003,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/ f4581d9d59df389a,https://c1.staticflickr.com/1/414/32162742470_48de3815b2_o.jpg,0.28125,0.25,0.84375,1.0,471,778,https://flickr.com/98302443@N00/32162742470,https://creativecommons.org/licenses/by/2.0/,Shalu Sharma,https://www.flickr.com/people/98302443@N00/ 89c95e9fd2627a1b,https://c1.staticflickr.com/9/8427/29225569961_f9298baf1b_o.jpg,0.5,0.0,1.0,0.75,664,454,https://flickr.com/129665369@N02/29225569961,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 78ff5f2c96e44f1e,https://c1.staticflickr.com/6/5531/30783189196_c16415aec8_o.jpg,0.25,0.0,0.75,0.75,556,236,https://www.flickr.com/photos/grahammitchellphotography/30783189196,https://creativecommons.org/licenses/by/2.0/,Graham Mitchell,https://www.flickr.com/people/grahammitchellphotography/ 20ecc8cb65aa2020,https://c1.staticflickr.com/9/8379/28969019944_1e1c84d082_o.jpg,0.0,0.25,0.5,1.0,512,837,https://www.flickr.com/photos/greggjerdingen/28969019944,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 8e08a9b7438577a5,https://c1.staticflickr.com/9/8580/30141256612_d584a7bc99_o.jpg,0.333333333333,0.0,1.0,1.0,629,808,https://www.flickr.com/photos/tipsfortravellers/30141256612,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ e97f8f90bb7a6a98,https://c1.staticflickr.com/8/7398/27195102153_3f6db208fc_o.jpg,0.0,0.25,0.5,1.0,986,607,https://www.flickr.com/photos/leandromartinez/27195102153/,https://creativecommons.org/licenses/by/2.0/,Leandro Martinez,https://www.flickr.com/people/leandromartinez/ 14d7d18ea74f2130,https://c1.staticflickr.com/6/5741/30207778941_a5fdd276ef_o.jpg,0.0,0.0,0.75,0.75,686,678,https://www.flickr.com/photos/vernieman/30207778941,https://creativecommons.org/licenses/by/2.0/,Vernon Chan,https://www.flickr.com/people/vernieman/ a5dd43e48b5d29f3,https://c1.staticflickr.com/8/7621/26292015064_7e0642dfe0_o.jpg,0.37517831669,0.0,1.0,1.0,781,73,https://www.flickr.com/photos/mmichaelis/26292015064,https://creativecommons.org/licenses/by/2.0/,Mark Michaelis,https://www.flickr.com/people/mmichaelis/ 42e919a86440eb84,https://c1.staticflickr.com/2/1473/26708830161_2a5ca65c4b_o.jpg,0.0,0.0,0.499263622975,0.75,404,250,https://www.flickr.com/photos/usnavy/26708830161,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ ce128dca3dc000a2,https://c1.staticflickr.com/6/5531/30571417641_c9e2880fae_o.jpg,0.31098615917,0.0,1.0,0.75,309,55,http://www.flickr.com/photos/130093583@N04/30571417641/,https://creativecommons.org/licenses/by/2.0/,Janet Graham,https://www.flickr.com/people/130093583@N04/ 2144bc7e66913d11,https://c1.staticflickr.com/6/5745/31279509622_59aac261ea_o.jpg,0.0,0.0,1.0,0.75,806,6,https://www.flickr.com/photos/8136496@N05/31279509622,https://creativecommons.org/licenses/by/2.0/,terren in Virginia,https://www.flickr.com/people/8136496@N05/ 9b681ef3ebf922a3,https://c1.staticflickr.com/9/8432/28598969353_edf48de69a_o.jpg,0.0,0.0,0.5625,0.75,367,364,https://flickr.com/64997835@N08/28598969353,https://creativecommons.org/licenses/by/2.0/,Mark Jordahl,https://www.flickr.com/people/conservationconcepts/ 63dd73566b9d3056,https://c1.staticflickr.com/6/5586/31114557706_61bb13175d_o.jpg,0.28125,0.25,0.84375,1.0,469,561,https://www.flickr.com/photos/27665395@N05/31114557706,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ 7315c5eb1b1d24a5,https://c1.staticflickr.com/9/8127/29041878946_6ae5d6492d_o.jpg,0.0,0.25,0.499263622975,1.0,328,675,https://www.flickr.com/photos/scanudas/29041878946,https://creativecommons.org/licenses/by/2.0/,scanudas,https://www.flickr.com/people/scanudas/ a4e57dcec71c1ca5,https://c1.staticflickr.com/6/5451/30203075730_024cc1d5a5_o.jpg,0.211267605634,0.0,0.633802816901,0.75,980,806,https://flickr.com/28435100@N00/30203075730,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/ 4204788f288f0a3f,https://c1.staticflickr.com/9/8548/30380542766_9b4cdae0e4_o.jpg,0.0,0.0,0.664212076583,1.0,556,637,https://www.flickr.com/photos/chicagofd1996/30380542766,https://creativecommons.org/licenses/by/2.0/,Arvell Dorsey Jr.,https://www.flickr.com/people/chicagofd1996/ 56cd087311fc7aa3,https://c1.staticflickr.com/9/8526/28279673710_a5ff61f9c6_o.jpg,0.0,0.0,0.670118343195,1.0,913,613,https://www.flickr.com/photos/mikevines/28279673710,https://creativecommons.org/licenses/by/2.0/,Michael Vines,https://www.flickr.com/people/mikevines/ cccd3907158215eb,https://c1.staticflickr.com/9/8717/29648201905_166a22f07c_o.jpg,0.249079528719,0.0,0.747238586156,0.75,920,110,https://www.flickr.com/photos/zigazou76/29648201905,https://creativecommons.org/licenses/by/2.0/,Fr\303\251d\303\251ric BISSON,https://www.flickr.com/people/zigazou76/ 62f1ea06dd035411,https://c1.staticflickr.com/9/8487/29164599321_a8d731a072_o.jpg,0.503303964758,0.0,1.0,0.75,558,136,https://www.flickr.com/photos/bensutherland/29164599321/,https://creativecommons.org/licenses/by/2.0/,Ben Sutherland,https://www.flickr.com/people/bensutherland/ bf9772a06e6bd842,https://c1.staticflickr.com/8/7315/27414153246_b55027fc98_o.jpg,0.43661971831,0.0,1.0,0.75,920,786,https://www.flickr.com/photos/cogdog/27414153246,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 9948070c7eb241cb,https://c1.staticflickr.com/1/397/31799195482_ea6a9b7948_o.jpg,0.281690140845,0.25,0.845070422535,1.0,459,371,https://www.flickr.com/photos/southbeachcars/31799195482/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/ 79076158fba7a39d,https://c1.staticflickr.com/9/8224/28906604211_2d45aba340_o.jpg,0.25,0.0,1.0,1.0,585,663,https://www.flickr.com/photos/29233640@N07/28906604211,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ 3364515343243bae,https://c1.staticflickr.com/6/5343/30819612231_1ab0929f5f_o.jpg,0.244708029197,0.25,0.734124087591,1.0,780,338,https://www.flickr.com/photos/thoseguys119/30819612231,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 371f777dda9cd5f2,https://c1.staticflickr.com/9/8032/29124912696_d646a40c99_o.jpg,0.28125,0.0,0.84375,0.75,548,760,https://www.flickr.com/photos/marsupilami92/29124912696,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/ 0f84a04a79317573,https://c1.staticflickr.com/9/8070/29255976990_81b8e72fb8_o.jpg,0.469650986343,0.25,1.0,1.0,349,855,https://www.flickr.com/photos/allanhenderson/29255976990,https://creativecommons.org/licenses/by/2.0/,Allan Henderson,https://www.flickr.com/people/allanhenderson/ 933f8a330a000d59,https://c1.staticflickr.com/9/8583/28241037270_7739bda028_o.jpg,0.25,0.401209677419,1.0,1.0,975,548,https://www.flickr.com/photos/jsjgeology/28241037270,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ c0c524882c16f45e,https://c1.staticflickr.com/1/738/32978160830_4d801ecc54_o.jpg,0.4375,0.25,1.0,1.0,985,77,https://www.flickr.com/photos/29233640@N07/32978160830/,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/ 25751a37d6eb7739,https://c1.staticflickr.com/8/7370/27426742961_bbe898417b_o.jpg,0.256343283582,0.25,0.769029850746,1.0,308,803,https://www.flickr.com/photos/52450054@N04/27426742961,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ a49df2e07d174af7,https://c1.staticflickr.com/9/8448/29922523135_8174e0f943_o.jpg,0.2806640625,0.25,0.8419921875,1.0,373,767,https://flickr.com/31712587@N04/29922523135,https://creativecommons.org/licenses/by/2.0/,Micka\303\253l T.,https://www.flickr.com/people/mickaeltr/ e696bf8fe883ed39,https://c1.staticflickr.com/8/7389/27420246256_b6f7d34604_o.jpg,0.25,0.0,1.0,1.0,404,538,https://www.flickr.com/photos/royluck/27420246256,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/ b2aaad12ebac992a,https://c1.staticflickr.com/6/5780/31335424802_8a8640b947_o.jpg,0.333333333333,0.0,1.0,1.0,484,513,https://www.flickr.com/photos/renaud-camus/31335424802,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/ 873c37abe611d1fb,https://c1.staticflickr.com/3/2884/32717868852_b869e9da2e_o.jpg,0.0,0.0,1.0,1.0,13,749,http://www.flickr.com/photos/dfaulder/32717868852/,https://creativecommons.org/licenses/by/2.0/,dfaulder,https://www.flickr.com/people/dfaulder/ a70e96b60eca3a96,https://c1.staticflickr.com/9/8062/28519062462_5505cf870f_o.jpg,0.332106038292,0.0,0.996318114875,1.0,968,654,https://www.flickr.com/photos/rainsong/28519062462/,https://creativecommons.org/licenses/by/2.0/,Ali - \330\271\331\204\331\212 from Riyadh - \331\205\331\206 \330\247\331\204\330\261\331\212\330\247\330\266,https://www.flickr.com/people/rainsong/ 94af6f5825ff1572,https://c1.staticflickr.com/6/5552/31016672313_5baf276018_o.jpg,0.0,0.0,0.5625,0.75,327,409,https://flickr.com/86548370@N00/31016672313,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 3380e4cc39a4dab0,https://c1.staticflickr.com/1/345/32468565175_54a6f13b7e_o.jpg,0.0,0.25,0.5625,1.0,796,477,https://www.flickr.com/photos/summonedbyfells/32468565175,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/ c0307fa56264c9bb,https://c1.staticflickr.com/6/5601/15120292444_9e37f86c00_o.jpg,0.0,0.0,0.75,0.75,874,548,https://www.flickr.com/photos/zedzap/15120292444,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/ 986e14bd6ae80609,https://c1.staticflickr.com/8/7381/27521892384_554504b2f0_o.jpg,0.0,0.0,1.0,0.943859649123,418,307,https://flickr.com/41431665@N07/27521892384,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 9fded22b79506a09,https://c1.staticflickr.com/8/7282/27354642564_e39fd7f2e1_o.jpg,0.302264808362,0.25,1.0,1.0,896,217,https://www.flickr.com/photos/hisgett/27354642564,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 7a78a62689165294,https://c1.staticflickr.com/6/5523/30364402276_46f3da8c37_o.jpg,0.287776898734,0.25,0.863330696203,1.0,780,664,https://www.flickr.com/photos/dkelly1126/30364402276/,https://creativecommons.org/licenses/by/2.0/,Diana Kelly,https://www.flickr.com/people/dkelly1126/ dad43c6ae87e0927,https://c1.staticflickr.com/9/8268/29163369571_f6136ba560_o.jpg,0.28125,0.0,0.84375,0.75,548,346,https://www.flickr.com/photos/trolleway/29163369571/,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/ 832d5de57a52b684,https://c1.staticflickr.com/8/7444/27810689071_5f349c068e_o.jpg,0.332842415317,0.0,0.99852724595,1.0,867,837,https://www.flickr.com/photos/finchlake/27810689071/,https://creativecommons.org/licenses/by/2.0/,finchlake2000,https://www.flickr.com/people/finchlake/ db69026788bf39b2,https://c1.staticflickr.com/9/8006/29304387226_63afe36fda_o.jpg,0.496696035242,0.0,0.993392070485,0.75,484,513,https://www.flickr.com/photos/sybarite48/29304387226,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/ 052be5dc0166cdc6,https://c1.staticflickr.com/8/7528/27932366904_9bde2b50bc_o.jpg,0.25,0.0,1.0,0.75,938,278,https://www.flickr.com/photos/joyosity/27932366904,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/ 7208eab14503deda,https://c1.staticflickr.com/9/8421/29146009174_e0f0fe3fbe_o.jpg,0.281690140845,0.25,0.845070422535,1.0,318,716,https://www.flickr.com/photos/treegrow/29146009174,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ beae2ac1b950174f,https://c1.staticflickr.com/9/8688/28194418523_7cb21fc5b5_o.jpg,0.5,0.0,1.0,0.75,561,276,https://www.flickr.com/photos/thomasjhannigan/28194418523,https://creativecommons.org/licenses/by/2.0/,Tom Hannigan,https://www.flickr.com/people/thomasjhannigan/ cf1cc361a000f8a6,https://c1.staticflickr.com/9/8648/29939073166_120a14a928_o.jpg,0.248348017621,0.0,0.745044052863,0.75,699,871,https://www.flickr.com/photos/pedrocaetano/29939073166,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/ 7ae9e7b56127f0d8,https://c1.staticflickr.com/6/5507/30360040950_37fb5a00e5_o.jpg,0.0,0.0,0.640173410405,1.0,548,629,https://www.flickr.com/photos/robdammers/30360040950/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ dd8ccc83592bf69b,https://c1.staticflickr.com/8/7565/28949578652_6951b623a3_o.jpg,0.496696035242,0.25,0.993392070485,1.0,404,867,https://www.flickr.com/photos/portofsandiego/28949578652,https://creativecommons.org/licenses/by/2.0/,Port of San Diego,https://www.flickr.com/people/portofsandiego/ a1a2fa098fc4fc3c,https://c1.staticflickr.com/8/7467/26593529263_357a50aa58_o.jpg,0.0,0.0,0.75,1.0,428,982,https://www.flickr.com/photos/guldem/26593529263,https://creativecommons.org/licenses/by/2.0/,G\303\274ldem \303\234st\303\274n,https://www.flickr.com/people/guldem/ 6a42993e4bd7652b,https://c1.staticflickr.com/9/8318/29386275485_40da1d0497_o.jpg,0.0,0.0,0.499263622975,0.75,983,744,https://www.flickr.com/photos/financialtimes/29386275485,https://creativecommons.org/licenses/by/2.0/,Financial Times,https://www.flickr.com/people/financialtimes/ efc6df602eede117,https://c1.staticflickr.com/1/434/32107205765_d7ee78b496_o.jpg,0.55851800554,0.0,1.0,0.75,405,541,https://flickr.com/37804979@N00/32107205765,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 1283f76b7311e2e6,https://c1.staticflickr.com/8/7617/26855646820_e49af75ca8_o.jpg,0.409,0.0,0.818,0.75,780,597,https://www.flickr.com/photos/thoseguys119/26855646820,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 4dd9e222da4ae04f,https://c1.staticflickr.com/1/693/31741654584_a88ee8c393_o.jpg,0.330631399317,0.25,1.0,1.0,309,367,https://www.flickr.com/photos/gails_pictures/31741654584,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 73f56da232a8e86c,https://c1.staticflickr.com/8/7334/26475894743_6c4a0bce0c_o.jpg,0.25,0.0,0.75,0.75,409,492,https://www.flickr.com/photos/byzantiumbooks/26475894743/,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/ 08784f3f5caf20bd,https://c1.staticflickr.com/9/8646/28328054482_62c3ed4a69_o.jpg,0.0,0.0,0.75,1.0,484,661,https://www.flickr.com/photos/grassrootsgroundswell/28328054482,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/ b4f8e13a9894328b,https://c1.staticflickr.com/9/8399/29987363721_23194e8239_o.jpg,0.464488636364,0.25,0.928977272727,1.0,292,946,https://www.flickr.com/photos/dkeats/29987363721/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ b20d32b794d781f7,https://c1.staticflickr.com/9/8327/28106197624_620f46c25f_o.jpg,0.256726457399,0.0,0.770179372197,0.75,139,52,https://www.flickr.com/photos/dkeats/28106197624,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ cb5c719eb9342ca4,https://c1.staticflickr.com/6/5695/30492253795_a7028302d4_o.jpg,0.248713235294,0.25,0.746139705882,1.0,666,161,https://www.flickr.com/photos/sg2012/30492253795,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/ f00fe3ed04a247a6,https://c1.staticflickr.com/8/7160/27361709666_6f76912533_o.jpg,0.0,0.0,0.666666666667,1.0,760,235,https://www.flickr.com/photos/janitors/27361709666,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 099dd8638d5b1b90,https://c1.staticflickr.com/8/7338/27126345262_1385d44e63_o.jpg,0.0,0.0,0.474137931034,0.75,548,815,https://www.flickr.com/photos/robdammers/27126345262,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ eaf3a39db70f1b1c,https://c1.staticflickr.com/8/7660/27751997323_bfdb0afc93_o.jpg,0.248348017621,0.25,0.745044052863,1.0,986,955,https://www.flickr.com/photos/konfourier/27751997323,https://creativecommons.org/licenses/by/2.0/,Bastien Konfourier,https://www.flickr.com/people/konfourier/ 486d49986d58de99,https://c1.staticflickr.com/8/7416/27543726913_8a2a7d990b_o.jpg,0.25,0.25,0.75,1.0,940,329,https://www.flickr.com/photos/47283811@N06/27543726913,https://creativecommons.org/licenses/by/2.0/,Cornelia Kopp,https://www.flickr.com/people/47283811@N06/ 065c2292b52e9a5f,https://c1.staticflickr.com/9/8316/28976743180_b20cf89476_o.jpg,0.25,0.496301775148,1.0,1.0,407,106,https://www.flickr.com/photos/eltb/28976743180,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 569659e75e0e41b2,https://c1.staticflickr.com/6/5760/30454891041_c5f3ff3cfc_o.jpg,0.25,0.0,0.75,0.75,980,804,https://www.flickr.com/photos/henry_hemming/30454891041/,https://creativecommons.org/licenses/by/2.0/,Henry Hemming,https://www.flickr.com/people/henry_hemming/ 543f819b48fd3793,https://c1.staticflickr.com/9/8779/29619650321_38ba7cea69_o.jpg,0.194489465154,0.0,1.0,1.0,806,829,https://www.flickr.com/photos/dirkhansen/29619650321,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/ 4e63180f8290db66,https://c1.staticflickr.com/6/5787/29592265593_b799822ecb_o.jpg,0.28125,0.0,0.84375,0.75,975,846,https://www.flickr.com/photos/jsjgeology/29592265593,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 86a933ec3675aef9,https://c1.staticflickr.com/9/8515/29496890760_d05222072b_o.jpg,0.0,0.0,0.56338028169,0.75,608,930,https://www.flickr.com/photos/rusty_clark/29496890760/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ c47bf7985b789cc9,https://c1.staticflickr.com/9/8547/29959306941_6d26ff1f6b_o.jpg,0.0,0.0,0.75,1.0,704,842,https://www.flickr.com/photos/andyarthur/29959306941,https://creativecommons.org/licenses/by/2.0/,Andy Arthur,https://www.flickr.com/people/andyarthur/ e0832b8ff59e9b4b,https://c1.staticflickr.com/9/8196/29392948526_be2cf50f89_o.jpg,0.296147672552,0.25,0.888443017657,1.0,311,38,https://www.flickr.com/photos/gails_pictures/29392948526,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ fa6dd8395db3c0ef,https://c1.staticflickr.com/9/8849/28853827912_741ca3c350_o.jpg,0.0,0.0,0.666666666667,1.0,976,515,https://www.flickr.com/photos/o_0/28853827912,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ df624a1163d16448,https://c1.staticflickr.com/6/5582/30852047003_011b7c76ed_o.jpg,0.333333333333,0.0,1.0,1.0,297,998,https://flickr.com/145745023@N04/30852047003,https://creativecommons.org/licenses/by/2.0/,Jacob Dawson,https://www.flickr.com/people/jacobdawson/ 7cf5d1811b244ea3,https://c1.staticflickr.com/9/8601/27655067304_d4cf229436_o.jpg,0.5,0.0,1.0,0.75,512,696,https://www.flickr.com/photos/nielsautos/27655067304,https://creativecommons.org/licenses/by/2.0/,Niels de Wit,https://www.flickr.com/people/nielsautos/ 3d3e89e496f5127d,https://c1.staticflickr.com/6/5055/29591741454_8c2cee1451_o.jpg,0.25,0.0,1.0,1.0,975,570,https://www.flickr.com/photos/jsjgeology/29591741454,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 7e238605be116a2c,https://c1.staticflickr.com/8/7614/27342898111_dc64b3cfbd_o.jpg,0.0,0.0,0.75,0.526475037821,918,789,https://www.flickr.com/photos/egizu/27342898111,https://creativecommons.org/licenses/by/2.0/,EGIZU Getxo Euskaldun Elkartea,https://www.flickr.com/people/egizu/ 07e44b6351ae7c0e,https://c1.staticflickr.com/8/7162/26514541484_2d525146f7_o.jpg,0.561004784689,0.0,1.0,1.0,821,765,https://www.flickr.com/photos/jsjgeology/26514541484,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 8faba74de473fecf,https://c1.staticflickr.com/9/8627/28003286624_e8a84b2e5a_o.jpg,0.25,0.25,1.0,1.0,992,887,https://www.flickr.com/photos/treegrow/28003286624,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ b0eb2b45ea61d526,https://c1.staticflickr.com/1/576/31741942984_550a4af723_o.jpg,0.5,0.25,1.0,1.0,581,672,https://www.flickr.com/photos/glenbowman/31741942984/,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 4f96a53846ad8fd6,https://c1.staticflickr.com/9/8114/29865783120_6b044a040f_o.jpg,0.0,0.0,0.666666666667,1.0,618,889,https://www.flickr.com/photos/rdecom/29865783120,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/ 38951edc87604648,https://c1.staticflickr.com/9/8550/28990372682_b754ee408e_o.jpg,0.25,0.25,0.75,1.0,448,273,https://www.flickr.com/photos/usfws_pacificsw/28990372682,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/ 8e7f94eeded8fede,https://c1.staticflickr.com/9/8518/29707080782_b58dd6fff8_o.jpg,0.578822733424,0.25,1.0,1.0,512,868,https://www.flickr.com/photos/119886413@N05/29707080782,https://creativecommons.org/licenses/by/2.0/,Michel Curi,https://www.flickr.com/people/119886413@N05/ a4f4f4b3d31bf054,https://c1.staticflickr.com/6/5657/30260567744_baf4c5c5e6_o.jpg,0.0,0.0,0.75,1.0,618,901,https://www.flickr.com/photos/zeevveez/30260567744/,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/ a80cfadffd1c9ef3,https://c1.staticflickr.com/9/8890/28467737901_ae7eaa6832_o.jpg,0.28125,0.0,0.84375,0.75,880,52,https://www.flickr.com/photos/38508395@N08/28467737901,https://creativecommons.org/licenses/by/2.0/,Wind&Wuthering,https://www.flickr.com/people/38508395@N08/ 9297c7a168159867,https://c1.staticflickr.com/6/5511/31442990336_8acb326976_o.jpg,0.0,0.25,0.5,1.0,763,669,https://www.flickr.com/photos/lwpkommunikacio/31442990336,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ 55b99265ed64ede0,https://c1.staticflickr.com/9/8689/28303248802_85cece4991_o.jpg,0.427694406548,0.25,0.855388813097,1.0,405,918,https://www.flickr.com/photos/hisgett/28303248802,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 63cefb8737267f76,https://c1.staticflickr.com/9/8623/27975020643_7243731904_o.jpg,0.25,0.0,1.0,1.0,662,408,https://www.flickr.com/photos/quinet/27975020643,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ c93a9fa0ccd5444b,https://c1.staticflickr.com/9/8837/28154650460_2cbbd24f7f_o.jpg,0.0,0.0,1.0,1.0,204,322,https://www.flickr.com/photos/55229469@N07/28154650460,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ 9838ed8186ab0392,https://c1.staticflickr.com/1/511/32162105601_3bf4030aaa_o.jpg,0.210588633288,0.0,0.631765899865,0.75,650,894,https://www.flickr.com/photos/stonehenge-stone-circle/32162105601,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/ 9238840b7104b607,https://c1.staticflickr.com/9/8874/28462364052_e9296014d5_o.jpg,0.25,0.280530973451,1.0,1.0,842,589,https://www.flickr.com/photos/zongo/28462364052,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 7a8b855d28159640,https://c1.staticflickr.com/6/5329/30063772605_f61935188a_o.jpg,0.210588633288,0.25,0.631765899865,1.0,686,945,https://www.flickr.com/photos/mujitra/30063772605/,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/ 9396f851c71f9afa,https://c1.staticflickr.com/6/5466/30617917356_780219dfea_o.jpg,0.28125,0.0,0.84375,0.75,820,879,https://flickr.com/38377150@N04/30617917356,https://creativecommons.org/licenses/by/2.0/,H. Doug Matsuoka,https://www.flickr.com/people/hdoug/ 9a036ab3a1d8e28c,https://c1.staticflickr.com/1/400/31530794544_d955610c44_o.jpg,0.28125,0.25,0.84375,1.0,652,862,https://flickr.com/23994900@N02/31530794544,https://creativecommons.org/licenses/by/2.0/,John Coley,https://www.flickr.com/people/lakemartinvoice/ 5e1c56cdfaf1e343,https://c1.staticflickr.com/8/7649/26539713373_f78c56bb07_o.jpg,0.396914446003,0.0,1.0,1.0,963,766,https://www.flickr.com/photos/djackmanson/26539713373,https://creativecommons.org/licenses/by/2.0/,David Jackmanson,https://www.flickr.com/people/djackmanson/ 7db587c09275bf41,https://c1.staticflickr.com/9/8798/28606938861_4c67b7d5d8_o.jpg,0.5,0.25,1.0,1.0,125,239,https://www.flickr.com/photos/j_regan/28606938861/,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/ 60c9302d50f9a1d4,https://c1.staticflickr.com/8/7371/27196733850_d754c8512c_o.jpg,0.692196531792,0.25,1.0,1.0,405,632,https://www.flickr.com/photos/epicfireworks/27196733850/,https://creativecommons.org/licenses/by/2.0/,Epic Fireworks,https://www.flickr.com/people/epicfireworks/ 023c23b2329a90ca,https://c1.staticflickr.com/9/8289/29279398816_c960409e25_o.jpg,0.168039538715,0.0,1.0,1.0,545,860,https://flickr.com/10390868@N07/29279398816,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 68a9ac8758c57aa9,https://c1.staticflickr.com/8/7547/26756372954_b98d5685d8_o.jpg,0.0,0.0,0.666666666667,1.0,662,470,https://www.flickr.com/photos/greggjerdingen/26756372954,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 824e1d499f83a4e9,https://c1.staticflickr.com/1/311/32754272056_1eec3c54dd_o.jpg,0.4375,0.25,1.0,1.0,458,557,https://www.flickr.com/photos/stevendepolo/32754272056,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 51e3dfa6c7a5a223,https://c1.staticflickr.com/9/8008/28802904060_eb01f6a0d5_o.jpg,0.0,0.25,0.5,1.0,519,960,https://www.flickr.com/photos/box_repsol/28802904060,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 2c72943c853dfa8c,https://c1.staticflickr.com/6/5814/30715570335_733db7b624_o.jpg,0.0,0.0,0.747269890796,1.0,563,425,https://www.flickr.com/photos/30478819@N08/30715570335/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 02aa6c6397869b17,https://c1.staticflickr.com/1/446/32102284791_1b0f61eb68_o.jpg,0.0,0.0,0.666666666667,1.0,980,745,https://www.flickr.com/photos/sergiosf/32102284791,https://creativecommons.org/licenses/by/2.0/,Serge Saint,https://www.flickr.com/people/sergiosf/ c74096d2012341e0,https://c1.staticflickr.com/8/7396/26592307230_2258140b9f_o.jpg,0.2806640625,0.25,0.8419921875,1.0,976,46,https://www.flickr.com/photos/ashleyt/26592307230,https://creativecommons.org/licenses/by/2.0/,Lim Ashley,https://www.flickr.com/people/ashleyt/ a07cc0a744c8d5e0,https://c1.staticflickr.com/8/7437/27207741233_82c2fa8c88_o.jpg,0.0,0.0,0.5625,0.75,763,480,https://www.flickr.com/photos/thinkgeoenergy/27207741233/,https://creativecommons.org/licenses/by/2.0/,ThinkGeoEnergy,https://www.flickr.com/people/thinkgeoenergy/ c543121724c27808,https://c1.staticflickr.com/1/450/31863260782_2df91c6029_o.jpg,0.0,0.25,0.5,1.0,511,576,https://www.flickr.com/photos/45958601@N02/31863260782,https://creativecommons.org/licenses/by/2.0/,joey zanotti,https://www.flickr.com/people/45958601@N02/ 409746e2fff0e9e5,https://c1.staticflickr.com/9/8204/29238217966_8b18ea4c29_o.jpg,0.0,0.0,0.666666666667,1.0,431,355,https://flickr.com/143676616@N05/29238217966,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ dc0ce6bfee8ddde6,https://c1.staticflickr.com/9/8222/29271590834_bc97f9e932_o.jpg,0.0,0.25,0.5,1.0,456,748,https://flickr.com/54524572@N00/29271590834,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/ 891786588190cfee,https://c1.staticflickr.com/8/7208/27190901460_983b972e7b_o.jpg,0.0,0.0,0.5625,0.75,780,443,https://www.flickr.com/photos/thoseguys119/27190901460,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f8e9e8559fd3f46e,https://c1.staticflickr.com/6/5728/30282426530_609e4d758d_o.jpg,0.25,0.0,0.75,0.75,818,556,https://www.flickr.com/photos/automobileitalia/30282426530,https://creativecommons.org/licenses/by/2.0/,Automobile Italia,https://www.flickr.com/people/automobileitalia/ 266b4cb5bf151576,https://c1.staticflickr.com/8/7252/27300445970_5722920e1f_o.jpg,0.0,0.0,0.5,0.75,848,3,https://www.flickr.com/photos/janitors/27300445970,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 0989e38b3e764952,https://c1.staticflickr.com/6/5513/30544468814_a29884c072_o.jpg,0.25,0.0,1.0,0.75,693,572,https://flickr.com/99453901@N00/30544468814,https://creativecommons.org/licenses/by/2.0/,Emily Allen,https://www.flickr.com/people/empracht/ 384910de87f4bec5,https://c1.staticflickr.com/9/8611/27979936513_5b88d16a7c_o.jpg,0.25,0.0,1.0,1.0,512,766,https://www.flickr.com/photos/hugo90/27979936513/,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ ed311c9c1ba3be3c,https://c1.staticflickr.com/8/7509/27181093226_2e53954f96_o.jpg,0.53125,0.0,1.0,0.75,738,790,https://www.flickr.com/photos/nazionalecalcio/27181093226,https://creativecommons.org/licenses/by/2.0/,Nazionale Calcio,https://www.flickr.com/people/nazionalecalcio/ d6ce7645627ccb4c,https://c1.staticflickr.com/8/7386/27126499933_cd1cb15bd8_o.jpg,0.0,0.0,0.704545454545,1.0,821,408,https://www.flickr.com/photos/jsjgeology/27126499933,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 1ab396f9a7dabcc6,https://c1.staticflickr.com/8/7528/27309832621_338f6f3917_o.jpg,0.503303964758,0.0,1.0,0.75,752,489,https://www.flickr.com/photos/seymour-pics/27309832621,https://creativecommons.org/licenses/by/2.0/,Mark Seymour,https://www.flickr.com/people/seymour-pics/ dae039f249108b78,https://c1.staticflickr.com/4/3749/33253836391_4e905abc56_o.jpg,0.25,0.25,1.0,1.0,471,150,https://flickr.com/94212497@N00/33253836391,https://creativecommons.org/licenses/by/2.0/,Rosmarie Voegtli,https://www.flickr.com/people/rvoegtli/ 76994fc6350a86b6,https://c1.staticflickr.com/9/8116/28625065272_ed3934e0d5_o.jpg,0.5,0.0,1.0,0.75,450,408,https://www.flickr.com/photos/davebloggs007/28625065272,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ d6dd1fe210ed7066,https://c1.staticflickr.com/2/1618/26495255280_24c7e801b2_o.jpg,0.405546623794,0.25,1.0,1.0,559,751,https://www.flickr.com/photos/sinnfeinireland/26495255280,https://creativecommons.org/licenses/by/2.0/,Sinn F\303\251in,https://www.flickr.com/people/sinnfeinireland/ dfb284ac7a5e1db5,https://c1.staticflickr.com/8/7470/30068687015_d0eccc7c0f_o.jpg,0.333333333333,0.0,1.0,1.0,519,923,https://www.flickr.com/photos/box_repsol/30068687015,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 6609a57fa378c03e,https://c1.staticflickr.com/6/5677/30952782772_a899d381bb_o.jpg,0.333333333333,0.0,1.0,1.0,548,583,https://www.flickr.com/photos/rhemkes/30952782772,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/ dc96a0be0c1573de,https://c1.staticflickr.com/6/5447/30371311393_05afd72fd8_o.jpg,0.0,0.28125,0.75,0.84375,438,594,https://www.flickr.com/photos/142799281@N02/30371311393,https://creativecommons.org/licenses/by/2.0/,_hq_,https://www.flickr.com/people/_hq_/ aca0f7bb5634215e,https://c1.staticflickr.com/8/7724/27058933660_9656bb7a47_o.jpg,0.0,0.25,0.537844036697,1.0,448,139,https://www.flickr.com/photos/51764518@N02/27058933660,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 3206953b67268a91,https://c1.staticflickr.com/8/7778/28303777932_fd1d286dee_o.jpg,0.0,0.25,0.50110619469,1.0,971,22,https://www.flickr.com/photos/matsen/28303777932/,https://creativecommons.org/licenses/by/2.0/,Mats Sk\303\266lving,https://www.flickr.com/people/matsen/ 237e4f52095aa09e,https://c1.staticflickr.com/8/7677/27869446396_ac1a864c9c_o.jpg,0.0,0.25,0.423913043478,1.0,885,589,https://www.flickr.com/photos/eltb/27869446396,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 4fd4885be5338a57,https://c1.staticflickr.com/9/8586/28724211260_530486a4bc_o.jpg,0.28125,0.25,0.84375,1.0,666,824,https://www.flickr.com/photos/22510321@N08/28724211260,https://creativecommons.org/licenses/by/2.0/,E.Zorrilla,https://www.flickr.com/people/22510321@N08/ c7f667b10a9cdd04,https://c1.staticflickr.com/8/7038/27201839735_b2db9bb65a_o.jpg,0.5,0.25,1.0,1.0,820,865,https://www.flickr.com/photos/strelka/27201839735,https://creativecommons.org/licenses/by/2.0/,"Strelka Institute for Media, Architecture and Design",https://www.flickr.com/people/strelka/ 8d37465546a95616,https://c1.staticflickr.com/8/7673/27547477780_099375b44c_o.jpg,0.0,0.0,0.75,1.0,437,284,https://www.flickr.com/photos/zombieite/27547477780/,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/ 0f3914b5e7ec8e33,https://c1.staticflickr.com/9/8643/30167041025_4844f5266f_o.jpg,0.25,0.25,0.75,1.0,407,886,https://flickr.com/43714545@N06/30167041025,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/ 11bd90ea5ca8f6f1,https://c1.staticflickr.com/8/7132/26758410771_6329d0739b_o.jpg,0.25,0.0,1.0,1.0,673,440,https://www.flickr.com/photos/bravenboer/26758410771,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/ f8079884a0f650c7,https://c1.staticflickr.com/8/7162/27101372196_7dc435625b_o.jpg,0.294385432473,0.0,1.0,1.0,98,779,https://www.flickr.com/photos/usfwsmtnprairie/27101372196,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 38a26523bd4229a9,https://c1.staticflickr.com/9/8268/29436310370_0ddbe96f13_o.jpg,0.25,0.25,1.0,1.0,418,836,https://www.flickr.com/photos/clairity/29436310370/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ b3d201e0a3e939b4,https://c1.staticflickr.com/9/8065/29895084306_6d25f60eb3_o.jpg,0.248348017621,0.25,0.745044052863,1.0,699,868,https://www.flickr.com/photos/pedrocaetano/29895084306/,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/ df99ed0da6515572,https://c1.staticflickr.com/2/1542/26762390325_c8dcc829c3_o.jpg,0.25,0.0,0.75,0.75,512,631,https://www.flickr.com/photos/42220226@N07/26762390325,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 3556700af6826a6e,https://c1.staticflickr.com/4/3876/32879535311_dec10b4ee0_o.jpg,0.488702623907,0.25,0.977405247813,1.0,980,352,https://flickr.com/145712985@N08/32879535311,https://creativecommons.org/licenses/by/2.0/,Tinker & Rove,https://www.flickr.com/people/tinkerandrove/ b07b0ac3ed31ace9,https://c1.staticflickr.com/8/7295/27725844795_06cd6c63da_o.jpg,0.0,0.0,0.666666666667,1.0,848,72,https://www.flickr.com/photos/janitors/27725844795,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ 081806d391df2390,https://c1.staticflickr.com/9/8874/28367452733_30ee590efd_o.jpg,0.0,0.0,0.75,0.75,719,678,https://www.flickr.com/photos/discoveroregon/28367452733/,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 822297a0cbf32b88,https://c1.staticflickr.com/8/7309/26961888755_1f75345c85_o.jpg,0.238832853026,0.0,0.716498559078,0.75,676,459,https://www.flickr.com/photos/jeepersmedia/26961888755,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ be4ffdd4e0d99b31,https://c1.staticflickr.com/1/678/31460907262_0289b9d746_o.jpg,0.0,0.0,0.5625,0.75,875,554,https://www.flickr.com/photos/69203347@N03/31460907262/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/ d81db4769aa15b96,https://c1.staticflickr.com/3/2807/32948842081_faed92e444_o.jpg,0.333333333333,0.0,1.0,1.0,568,107,https://www.flickr.com/photos/yourbestdigs/32948842081,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/ 8b6b25e9ff49e9b5,https://c1.staticflickr.com/9/8402/29477196100_e9785a792f_o.jpg,0.0,0.0,0.5,0.75,699,550,https://www.flickr.com/photos/o_0/29477196100,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ bf10efe12d1e0dab,https://c1.staticflickr.com/1/706/31613882224_5cc230d979_o.jpg,0.280226209048,0.0,0.840678627145,0.75,563,129,https://www.flickr.com/photos/129657405@N05/31613882224/,https://creativecommons.org/licenses/by/2.0/,Tilly Sfortunato,https://www.flickr.com/people/129657405@N05/ 096b5029e028b8f9,https://c1.staticflickr.com/1/487/32225593260_1231d03f7f_o.jpg,0.28125,0.0,0.84375,0.75,820,680,https://www.flickr.com/photos/philliecasablanca/32225593260/,https://creativecommons.org/licenses/by/2.0/,Phil Whitehouse,https://www.flickr.com/people/philliecasablanca/ fe6744c008d45d8f,https://c1.staticflickr.com/9/8013/28628989292_7fd5bc6843_o.jpg,0.0,0.25,0.5625,1.0,866,950,https://www.flickr.com/photos/rollercoasterphilosophy/28628989292,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/ 7c8a01ae3f94e659,https://c1.staticflickr.com/8/7645/27486654783_797af732b3_o.jpg,0.275735294118,0.25,0.827205882353,1.0,669,392,https://www.flickr.com/photos/jdlasica/27486654783,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ bd647214a1ae577f,https://c1.staticflickr.com/1/559/31143298614_d04af7febb_o.jpg,0.0,0.400242326333,0.75,1.0,484,128,https://www.flickr.com/photos/77423179@N02/31143298614/,https://creativecommons.org/licenses/by/2.0/,Melissa Hillier,https://www.flickr.com/people/77423179@N02/ 73ad049bc5f146ea,https://c1.staticflickr.com/8/7513/28091756891_4c20dc1593_o.jpg,0.254086181278,0.0,0.762258543834,0.75,848,475,https://www.flickr.com/photos/13476480@N07/28091756891,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 95b93ca38c465268,https://c1.staticflickr.com/6/5676/29732226764_25d9891e96_o.jpg,0.333333333333,0.0,1.0,1.0,683,605,https://www.flickr.com/photos/thejointstaff/29732226764,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/ a3843f42dd00e6fd,https://c1.staticflickr.com/8/7392/27168716050_cc70b5a5ab_o.jpg,0.25,0.409855769231,1.0,1.0,499,291,https://www.flickr.com/photos/telecastered/27168716050,https://creativecommons.org/licenses/by/2.0/,C. J. Lee,https://www.flickr.com/people/telecastered/ 5364866bfc6312df,https://c1.staticflickr.com/8/7459/26827307085_8707297f43_o.jpg,0.0,0.25,0.475215517241,1.0,896,619,https://www.flickr.com/photos/34153108@N06/26827307085,https://creativecommons.org/licenses/by/2.0/,Gerard van der Schaaf,https://www.flickr.com/people/34153108@N06/ 155cd7ab1bfc5a25,https://c1.staticflickr.com/8/7666/28603343172_c6d09ab4ba_o.jpg,0.0,0.0,0.75,1.0,822,862,https://www.flickr.com/photos/jdlasica/28603343172,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ c4bdb43ad16185d7,https://c1.staticflickr.com/8/7567/26271179253_b8fe02d86d_o.jpg,0.25,0.0,1.0,0.5625,323,899,https://www.flickr.com/photos/chaz_pics/26271179253,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/ 9ec0db73dc71e450,https://c1.staticflickr.com/6/5698/30344565330_5248256034_o.jpg,0.0,0.0,1.0,0.75,976,161,https://www.flickr.com/photos/wwarby/30344565330,https://creativecommons.org/licenses/by/2.0/,William Warby,https://www.flickr.com/people/wwarby/ e6bea491b7b39c9d,https://c1.staticflickr.com/9/8477/28487302991_df096a8ac8_o.jpg,0.0,0.348396501458,1.0,1.0,923,25,https://www.flickr.com/photos/lac-bac/28487302991,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/ 293f76237070c32b,https://c1.staticflickr.com/6/5608/30563417220_ac0e48c340_o.jpg,0.0,0.0,1.0,1.0,672,483,https://www.flickr.com/photos/glorycycles/30563417220,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ a8cffac6950f35cc,https://c1.staticflickr.com/6/5798/29571368013_b2972d303e_o.jpg,0.0,0.0,0.75,0.75,672,671,https://www.flickr.com/photos/glorycycles/29571368013,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 45c94010912bc366,https://c1.staticflickr.com/9/8533/30168037975_1d617a70c5_o.jpg,0.25,0.25,0.75,1.0,874,586,https://flickr.com/133488379@N08/30168037975,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/ 5a6a98ba9accb03d,https://c1.staticflickr.com/1/608/31114810934_2b38208d62_o.jpg,0.0,0.0,0.739130434783,1.0,854,212,https://flickr.com/13476480@N07/31114810934,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 801da2880d3020e2,https://c1.staticflickr.com/9/8161/28623947984_37510a6889_o.jpg,0.0,0.0,1.0,1.0,558,588,https://www.flickr.com/photos/us_mission_canada/28623947984,https://creativecommons.org/licenses/by/2.0/,US Embassy Canada,https://www.flickr.com/people/us_mission_canada/ c9b88e9170f68f43,https://c1.staticflickr.com/1/598/30997903794_9d05ae2c09_o.jpg,0.4375,0.0,1.0,0.75,960,59,https://flickr.com/8996753@N06/30997903794,https://creativecommons.org/licenses/by/2.0/,MiNe,https://www.flickr.com/people/sfmine79/ c2d51a897ca62786,https://c1.staticflickr.com/9/8415/29578628651_925aa2c330_o.jpg,0.43661971831,0.0,1.0,0.75,297,193,https://flickr.com/143363015@N06/29578628651,https://creativecommons.org/licenses/by/2.0/,Tobias Begemann,https://www.flickr.com/people/tobiasbegemann/ 4d4036763558c2b3,https://c1.staticflickr.com/8/7213/27681849505_37918cfaee_o.jpg,0.298790322581,0.0,0.896370967742,0.75,896,785,https://www.flickr.com/photos/13476480@N07/27681849505,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ a573b8ca54f3ac26,https://c1.staticflickr.com/1/736/31406996843_d86b711fd0_o.jpg,0.249631811487,0.0,0.748895434462,0.75,20,147,https://www.flickr.com/photos/birdbrian/31406996843/,https://creativecommons.org/licenses/by/2.0/,Brian Ralphs,https://www.flickr.com/people/birdbrian/ be1554f765f0782f,https://c1.staticflickr.com/8/7789/28849608790_2d277f0323_o.jpg,0.421177266576,0.0,0.842354533153,0.75,976,705,https://www.flickr.com/photos/wuerzburg_tg/28849608790,https://creativecommons.org/licenses/by/2.0/,ssabineteigelkmper,https://www.flickr.com/people/wuerzburg_tg/ 84e35b4740958d4c,https://c1.staticflickr.com/8/7403/27089871841_1b286687e6_o.jpg,0.4375,0.25,1.0,1.0,780,919,https://www.flickr.com/photos/thoseguys119/27089871841/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 8e985ccb88dc8141,https://c1.staticflickr.com/8/7027/26748475792_6b5bfb1887_o.jpg,0.0,0.25,0.539816232772,1.0,141,487,https://www.flickr.com/photos/winnu/26748475792/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/ 6f02e50dd98765b7,https://c1.staticflickr.com/9/8532/29511028682_e85a300749_o.jpg,0.500736377025,0.25,1.0,1.0,566,274,https://www.flickr.com/photos/kansasscanner/29511028682,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ 61e2fbffc6975c45,https://c1.staticflickr.com/6/5777/30657355572_1e8c138189_o.jpg,0.0977701543739,0.0,1.0,1.0,95,755,https://www.flickr.com/photos/usfwsmtnprairie/30657355572,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/ 21b0a03adfe01811,https://c1.staticflickr.com/8/7260/27026875233_8a6381ed51_o.jpg,0.25,0.25,1.0,1.0,909,580,https://www.flickr.com/photos/stevensnodgrass/27026875233,https://creativecommons.org/licenses/by/2.0/,Steve Snodgrass,https://www.flickr.com/people/stevensnodgrass/ 033646d2530c0a1c,https://c1.staticflickr.com/8/7630/28026241731_2bcb016e84_o.jpg,0.0,0.25,0.543461538462,1.0,320,693,https://www.flickr.com/photos/47602497@N06/28026241731,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/ 845b8719fe64a756,https://c1.staticflickr.com/9/8400/29658924786_e9035b2901_o.jpg,0.0,0.0,0.75,1.0,481,818,https://www.flickr.com/photos/jeepersmedia/29658924786,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 46eb5b02b6dab007,https://c1.staticflickr.com/6/5818/31187085512_2fd4584709_o.jpg,0.21087398374,0.0,0.63262195122,0.75,147,909,http://www.flickr.com/photos/blachswan/31187085512/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/ 982dada7e8bf2b34,https://c1.staticflickr.com/3/2108/32727356202_9e10724895_o.jpg,0.0,0.0945017182131,1.0,1.0,18,144,https://www.flickr.com/photos/49963509@N00/32727356202/,https://creativecommons.org/licenses/by/2.0/,John Fogarty,https://www.flickr.com/people/49963509@N00/ 9c2ce96b55282297,https://c1.staticflickr.com/6/5594/31066499201_360b07fdac_o.jpg,0.0,0.333333333333,1.0,1.0,672,568,https://flickr.com/68777082@N00/31066499201,https://creativecommons.org/licenses/by/2.0/,Flowizm ...,https://www.flickr.com/people/flowizm/ 9fa6d395396668eb,https://c1.staticflickr.com/9/8244/28322409363_284770d64c_o.jpg,0.25,0.0,0.75,0.75,699,730,https://www.flickr.com/photos/gildardo/28322409363,https://creativecommons.org/licenses/by/2.0/,Gildardo S\303\241nchez,https://www.flickr.com/people/gildardo/ de2ec27ed1edbc33,https://c1.staticflickr.com/6/5153/29955257172_8f29f222f4_o.jpg,0.5,0.25,1.0,1.0,519,581,https://www.flickr.com/photos/box_repsol/29955257172,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 3a93a4dc2c8c866a,https://c1.staticflickr.com/1/697/31538317141_99541f0e95_o.jpg,0.0,0.25,0.5,1.0,25,470,https://www.flickr.com/photos/kamcmillan/31538317141/,https://creativecommons.org/licenses/by/2.0/,Ken McMillan,https://www.flickr.com/people/kamcmillan/ 9ace66f6b97ef68d,https://c1.staticflickr.com/8/7472/29851578962_bc4b58e1d2_o.jpg,0.438430311231,0.0,1.0,1.0,991,614,https://www.flickr.com/photos/mauroguanandi/29851578962/,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/ 3d519d9cde00b9ff,https://c1.staticflickr.com/6/5565/30818457422_3ee7fb1357_o.jpg,0.333333333333,0.0,1.0,1.0,810,29,https://www.flickr.com/photos/o_0/30818457422,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ e7c04e8d9c810ed0,https://c1.staticflickr.com/8/7598/26783988296_e574d0a2d1_o.jpg,0.499263622975,0.0,0.99852724595,0.75,981,648,https://www.flickr.com/photos/manu_praba_dissanayake/26783988296,https://creativecommons.org/licenses/by/2.0/,Manu Praba,https://www.flickr.com/people/manu_praba_dissanayake/ c0629d8ca76b7d4c,https://c1.staticflickr.com/6/5750/29791589544_d4b09c5e08_o.jpg,0.0,0.25,0.5625,1.0,975,570,https://www.flickr.com/photos/jsjgeology/29791589544,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ bccba8785faf326f,https://c1.staticflickr.com/8/7452/27420975771_93a07ed520_o.jpg,0.0,0.25,0.421177266576,1.0,4,712,https://www.flickr.com/photos/wilfred_hdez/27420975771/,https://creativecommons.org/licenses/by/2.0/,Wilfred Hdez,https://www.flickr.com/people/wilfred_hdez/ c33de864bf6054de,https://c1.staticflickr.com/9/8012/29379222006_de0fa9b05d_o.jpg,0.250391236307,0.0,1.0,1.0,815,472,https://www.flickr.com/photos/67165210@N00/29379222006,https://creativecommons.org/licenses/by/2.0/,horslips5,https://www.flickr.com/people/67165210@N00/ 6d0ace8f643e933f,https://c1.staticflickr.com/1/409/32697536260_b61ce714f3_o.jpg,0.4375,0.0,1.0,0.75,691,360,https://www.flickr.com/photos/davidstanleytravel/32697536260,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ d3a52dec3597b33b,https://c1.staticflickr.com/8/7396/27904829001_514bb5006d_o.jpg,0.0,0.25,0.496696035242,1.0,320,428,https://www.flickr.com/photos/usfwsmidwest/27904829001,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ d6f196a9850c32ee,https://c1.staticflickr.com/9/8029/29856931862_26db02aa44_o.jpg,0.0,0.25,0.599757673667,1.0,458,317,https://www.flickr.com/photos/asuenglish/29856931862,https://creativecommons.org/licenses/by/2.0/,ASU Department of English,https://www.flickr.com/people/asuenglish/ 6c0079a07ca91e27,https://c1.staticflickr.com/8/7247/26676847930_fc3166d93b_o.jpg,0.25,0.0,1.0,0.599757673667,771,634,https://www.flickr.com/photos/haxpett/26676847930,https://creativecommons.org/licenses/by/2.0/,Axel Pettersson,https://www.flickr.com/people/haxpett/ ad7ea659e7388a75,https://c1.staticflickr.com/6/5564/30525161525_56a1eaed53_o.jpg,0.2515625,0.0,1.0,1.0,982,166,https://www.flickr.com/photos/apardavila/30525161525,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 3610fa43d5f330cd,https://c1.staticflickr.com/9/8307/29371779515_6176ee5a4b_o.jpg,0.0,0.0,0.5,0.75,566,424,https://www.flickr.com/photos/concavowheels/29371779515,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/ 85c3a34ef80646ff,https://c1.staticflickr.com/8/7060/27682536091_e782d9e970_o.jpg,0.0,0.25,0.5,1.0,644,340,https://www.flickr.com/photos/jdlasica/27682536091,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 214f5e19afc69a80,https://c1.staticflickr.com/8/7681/27804063085_7b9ac8d32f_o.jpg,0.0,0.0,0.75,0.75,807,89,https://www.flickr.com/photos/trilliumdesign/27804063085,https://creativecommons.org/licenses/by/2.0/,Trilliumdesign ~ Caroline,https://www.flickr.com/people/trilliumdesign/ 01286c51d69d22c7,https://c1.staticflickr.com/6/5325/30710847566_148ce4d1bc_o.jpg,0.0,0.0,0.5,0.75,412,491,https://www.flickr.com/photos/ubudwritersfest/30710847566,https://creativecommons.org/licenses/by/2.0/,Ubud Writers & Readers Festival,https://www.flickr.com/people/ubudwritersfest/ 30fc7df9512a11fc,https://c1.staticflickr.com/1/421/32304006235_c8a947a8a5_o.jpg,0.332106038292,0.0,0.996318114875,1.0,98,178,http://www.flickr.com/photos/136804067@N08/32304006235/,https://creativecommons.org/licenses/by/2.0/,austin Lan,https://www.flickr.com/people/136804067@N08/ 3ea10f5dbf40c0d9,https://c1.staticflickr.com/3/2076/32726800431_3bd5f94b6e_o.jpg,0.0,0.0,0.7484375,1.0,965,328,https://www.flickr.com/photos/68147320@N02/32726800431,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/ e46f32ee2a471099,https://c1.staticflickr.com/9/8621/28571156650_d9dfb4c931_o.jpg,0.211382113821,0.25,0.634146341463,1.0,617,952,https://www.flickr.com/photos/epicantus/28571156650,https://creativecommons.org/licenses/by/2.0/,Epicantus,https://www.flickr.com/people/epicantus/ f5d216121d5a7ee4,https://c1.staticflickr.com/9/8712/28878921452_6d0beb21f8_o.jpg,0.0,0.0,0.5,0.75,760,568,https://www.flickr.com/photos/rafiot/28878921452,https://creativecommons.org/licenses/by/2.0/,Rapha\303\253l Vinot,https://www.flickr.com/people/rafiot/ a00828cce794420e,https://c1.staticflickr.com/8/7578/27987773565_e609085d74_o.jpg,0.0,0.25,0.5625,1.0,449,346,https://www.flickr.com/photos/jeanbaptistem/27987773565,https://creativecommons.org/licenses/by/2.0/,JeanbaptisteM,https://www.flickr.com/people/jeanbaptistem/ 004f4dada5838d75,https://c1.staticflickr.com/9/8556/29881342191_ec70fdb0c2_o.jpg,0.0,0.0,0.75,1.0,859,658,https://www.flickr.com/photos/quirky/29881342191/,https://creativecommons.org/licenses/by/2.0/,Wendy Harman,https://www.flickr.com/people/quirky/ 8d2bea8e702e82cf,https://c1.staticflickr.com/8/7450/27061820631_2b236867cc_o.jpg,0.0,0.0,1.0,1.0,922,638,https://www.flickr.com/photos/agfanclub/27061820631,https://creativecommons.org/licenses/by/2.0/,AJ Gulyas,https://www.flickr.com/people/agfanclub/ 655548fae336baed,https://c1.staticflickr.com/9/8782/29306804352_03d25ce870_o.jpg,0.25,0.25,0.75,1.0,664,490,http://www.flickr.com/photos/prof_richard/29306804352/,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/ 615e495418e3a05c,https://c1.staticflickr.com/4/3947/32902081952_4986583f9d_o.jpg,0.0,0.25,0.75,1.0,118,659,http://www.flickr.com/photos/35693053@N04/32902081952,https://creativecommons.org/licenses/by/2.0/,Ross Elliott,https://www.flickr.com/people/ross_elliott/ d8da85f009866249,https://c1.staticflickr.com/6/5751/30488108604_58337db71d_o.jpg,0.0,0.25,0.5,1.0,459,398,https://www.flickr.com/photos/shankaronline/30488108604/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ b021e837a38887ad,https://c1.staticflickr.com/6/5334/30653769375_f6efbfffb7_o.jpg,0.0,0.25,1.0,1.0,644,457,https://www.flickr.com/photos/tomronworldwide/30653769375/,https://creativecommons.org/licenses/by/2.0/,Ron Frazier,https://www.flickr.com/people/tomronworldwide/ 699488b43a12598f,https://c1.staticflickr.com/1/253/31488185906_57f7d6666c_o.jpg,0.0178890876565,0.0,1.0,1.0,545,804,https://www.flickr.com/photos/13476480@N07/31488185906,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 27eec8105515a1db,https://c1.staticflickr.com/1/588/32358895423_67268af0ec_o.jpg,0.511297376093,0.0,1.0,0.75,653,298,https://flickr.com/40994485@N04/32358895423,https://creativecommons.org/licenses/by/2.0/,Georgia National Guard,https://www.flickr.com/people/ganatlguard/ f613452e95564242,https://c1.staticflickr.com/6/5691/30811964902_74270d7f1d_o.jpg,0.333333333333,0.0,1.0,1.0,840,697,https://www.flickr.com/photos/lisamilas/30811964902/,https://creativecommons.org/licenses/by/2.0/,Lisa Milas,https://www.flickr.com/people/lisamilas/ 3bf189e89600fab7,https://c1.staticflickr.com/8/7630/27335824192_fcbf9aeb62_o.jpg,0.210588633288,0.0,0.631765899865,0.75,704,744,https://www.flickr.com/photos/131880272@N06/27335824192,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/ d40343ec11465b3c,https://c1.staticflickr.com/1/483/32266689106_4ebbda6714_o.jpg,0.0,0.25,0.547453703704,1.0,875,231,https://www.flickr.com/photos/bazzadarambler/32266689106,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 11876431739271f6,https://c1.staticflickr.com/8/7281/27209646476_f14ff59be1_o.jpg,0.321697324415,0.25,0.965091973244,1.0,309,224,https://www.flickr.com/photos/gails_pictures/27209646476/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 4a202c4d2ec8cb94,https://c1.staticflickr.com/9/8311/29808469505_030287bb55_o.jpg,0.49889380531,0.25,1.0,1.0,625,955,https://www.flickr.com/photos/uni-salzburg/29808469505,https://creativecommons.org/licenses/by/2.0/,Universit\303\244t Salzburg (PR),https://www.flickr.com/people/uni-salzburg/ 980ffe7b5dac5792,https://c1.staticflickr.com/8/7217/26575984800_0197c49f49_o.jpg,0.28125,0.25,0.84375,1.0,440,810,https://www.flickr.com/photos/slapers/26575984800,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/ 6eb464ba280d3883,https://c1.staticflickr.com/1/176/30709324723_a9058b46e6_o.jpg,0.25,0.0,1.0,1.0,840,568,https://www.flickr.com/photos/amanderson/30709324723/,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ 18ea2ea49b265d37,https://c1.staticflickr.com/9/8487/29452967005_e11e45dee0_o.jpg,0.25,0.25,1.0,1.0,914,9,https://www.flickr.com/photos/carlchristian/29452967005,https://creativecommons.org/licenses/by/2.0/,Carl Christian Gr\303\270ndahl,https://www.flickr.com/people/carlchristian/ 1804bb73960ecdea,https://c1.staticflickr.com/8/7066/27117274255_b3e3c9b035_o.jpg,0.28125,0.25,0.84375,1.0,974,931,https://www.flickr.com/photos/132646954@N02/27117274255/,https://creativecommons.org/licenses/by/2.0/,dronepicr,https://www.flickr.com/people/132646954@N02/ 526ad50c19fcb8b7,https://c1.staticflickr.com/3/2083/32026569874_9575ec3cef_o.jpg,0.425510204082,0.0,0.851020408163,0.75,407,50,https://www.flickr.com/photos/eltb/32026569874,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 897a3c48e2481149,https://c1.staticflickr.com/8/7345/27211435212_93490f6729_o.jpg,0.0,0.0,0.666666666667,1.0,752,757,https://www.flickr.com/photos/eksrx/27211435212/,https://creativecommons.org/licenses/by/2.0/,EKSRX,https://www.flickr.com/people/eksrx/ 1c92bf4ac0318c5c,https://c1.staticflickr.com/9/8342/29157833276_0dda95eefc_o.jpg,0.0,0.0,0.75,0.75,869,812,https://flickr.com/27963141@N00/29157833276,https://creativecommons.org/licenses/by/2.0/,Courtney Boyd Myers,https://www.flickr.com/people/courtbean/ f06d24f1e3b09d90,https://c1.staticflickr.com/9/8077/29031588504_069c98d905_o.jpg,0.438671875,0.0,1.0,0.75,418,953,https://www.flickr.com/photos/xingxiyang/29031588504/,https://creativecommons.org/licenses/by/2.0/,Kiefer,https://www.flickr.com/people/xingxiyang/ 24a5746629ee7f3a,https://c1.staticflickr.com/6/5702/30894949235_2b36d46cac_o.jpg,0.28125,0.0,0.84375,0.75,285,373,https://flickr.com/36686400@N00/30894949235,https://creativecommons.org/licenses/by/2.0/,shellac,https://www.flickr.com/people/pldms/ ba8243f5066ab428,https://c1.staticflickr.com/8/7534/28060427926_4686971fd6_o.jpg,0.0,0.0,0.5625,0.75,998,741,https://www.flickr.com/photos/treegrow/28060427926/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 4a5012b748c480fd,https://c1.staticflickr.com/9/8387/29265133865_f093ee98ac_o.jpg,0.0,0.496301775148,0.75,1.0,407,561,https://www.flickr.com/photos/eltb/29265133865,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 35b7318798733412,https://c1.staticflickr.com/3/2865/33164098205_07dbedd1d3_o.jpg,0.269333843798,0.0,0.808001531394,0.75,848,907,https://www.flickr.com/photos/13476480@N07/33164098205/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 6b2ea691643f6f25,https://c1.staticflickr.com/8/7117/27697276410_51efe2c75a_o.jpg,0.0,0.23937007874,1.0,1.0,254,845,https://www.flickr.com/photos/70253321@N00/27697276410,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 7ffa6205e4379a9a,https://c1.staticflickr.com/9/8544/28512913754_fb5ede00ed_o.jpg,0.25,0.25,1.0,1.0,406,535,https://www.flickr.com/photos/exurban/28512913754,https://creativecommons.org/licenses/by/2.0/,Jayson Shenk,https://www.flickr.com/people/exurban/ 29410bdb64265c89,https://c1.staticflickr.com/6/5686/30744262330_328e081bef_o.jpg,0.25,0.0,0.75,0.75,806,994,https://www.flickr.com/photos/twan74/30744262330/,https://creativecommons.org/licenses/by/2.0/,Twan Van Dongen,https://www.flickr.com/people/twan74/ d59e996d3462f970,https://c1.staticflickr.com/9/8558/29607216714_41ebbc9a5f_o.jpg,0.501840942563,0.25,1.0,1.0,561,643,https://www.flickr.com/photos/eaglebrook/29607216714/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/ 60190bcf2ad06e96,https://c1.staticflickr.com/8/7420/26367907063_ca611a227a_o.jpg,0.0,0.0,0.871838111298,1.0,310,557,https://www.flickr.com/photos/gails_pictures/26367907063,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ cb97dc7df4864b90,https://c1.staticflickr.com/6/5533/30919026221_6f3fb9a209_o.jpg,0.28125,0.25,0.84375,1.0,760,737,https://www.flickr.com/photos/augustksphotos/30919026221/,https://creativecommons.org/licenses/by/2.0/,August Kelm,https://www.flickr.com/people/augustksphotos/ 4e179bf6c5a9f998,https://c1.staticflickr.com/8/7664/26352238873_8f77c357c5_o.jpg,0.0,0.0,1.0,1.0,986,781,https://www.flickr.com/photos/jhtaylor/26352238873,https://creativecommons.org/licenses/by/2.0/,Julia Taylor,https://www.flickr.com/people/jhtaylor/ 95a1d81b5ccf8c13,https://c1.staticflickr.com/9/8446/28871217906_471052562c_o.jpg,0.4375,0.25,1.0,1.0,780,698,https://www.flickr.com/photos/thoseguys119/28871217906,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ fc8a8385ad487520,https://c1.staticflickr.com/9/8064/29602941756_04c36e3d0c_o.jpg,0.200323101777,0.0,1.0,1.0,95,304,https://www.flickr.com/photos/andymorffew/29602941756,https://creativecommons.org/licenses/by/2.0/,Andy Morffew,https://www.flickr.com/people/andymorffew/ f6a7dd4d677e62ae,https://c1.staticflickr.com/8/7057/27403439775_6f2e0689f3_o.jpg,0.0,0.25,0.490510948905,1.0,979,28,https://www.flickr.com/photos/johnshortland/27403439775,https://creativecommons.org/licenses/by/2.0/,john shortland,https://www.flickr.com/people/johnshortland/ 7aa6239440552d1e,https://c1.staticflickr.com/1/407/31455997020_a88c07a527_o.jpg,0.0,0.440717628705,0.75,1.0,114,713,https://www.flickr.com/photos/scotnelson/31455997020,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 688aca7fa5bffa73,https://c1.staticflickr.com/4/3923/33180907756_a64297d858_o.jpg,0.201612903226,0.0,1.0,1.0,519,538,https://www.flickr.com/photos/box_repsol/33180907756/,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ eb9efb2bd798eac8,https://c1.staticflickr.com/9/8368/28874857510_b068c9665f_o.jpg,0.25,0.25,0.75,1.0,404,832,https://www.flickr.com/photos/usnavy/28874857510,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 333323be56c0589d,https://c1.staticflickr.com/8/7444/27121910060_acfc66e8a3_o.jpg,0.5,0.0,1.0,0.75,405,151,https://www.flickr.com/photos/newsoresund/27121910060,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/ 949b6656c77fc44c,https://c1.staticflickr.com/9/8419/29633802674_db7b847f6e_o.jpg,0.340175953079,0.0,1.0,1.0,548,361,https://www.flickr.com/photos/robdammers/29633802674,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 429d39104d553887,https://c1.staticflickr.com/1/730/32634846712_dbddcd8a1a_o.jpg,0.25,0.314766839378,1.0,1.0,324,807,https://www.flickr.com/photos/puliarfanita/32634846712,https://creativecommons.org/licenses/by/2.0/,Anita Ritenour,https://www.flickr.com/people/puliarfanita/ cf76444721b06c6f,https://c1.staticflickr.com/3/2915/33037948775_6f4fb65dbf_o.jpg,0.247797356828,0.0,0.743392070485,0.75,548,976,https://www.flickr.com/photos/robdammers/33037948775/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 847bfbb83034c673,https://c1.staticflickr.com/9/8793/28816297605_eef8a68d8d_o.jpg,0.4375,0.0,1.0,0.75,127,220,https://flickr.com/86548370@N00/28816297605,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ c818e4dd21e80d0b,https://c1.staticflickr.com/1/331/31894377736_da36dafa6d_o.jpg,0.0,0.25,0.568396226415,1.0,806,491,https://flickr.com/143135875@N03/31894377736,https://creativecommons.org/licenses/by/2.0/,Save the Dream,https://www.flickr.com/people/143135875@N03/ 17655256e9e840db,https://c1.staticflickr.com/9/8506/29353868725_d6f269bff4_o.jpg,0.0,0.0,0.666666666667,1.0,484,841,https://www.flickr.com/photos/harshlight/29353868725,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/ 74ec5e9086ad260b,https://c1.staticflickr.com/1/697/31687423702_b20d0a28ac_o.jpg,0.0,0.0,1.0,1.0,539,779,https://www.flickr.com/photos/vitroids/31687423702/,https://creativecommons.org/licenses/by/2.0/,Masakazu Matsumoto,https://www.flickr.com/people/vitroids/ 1ed9d0097c8f4ac8,https://c1.staticflickr.com/6/5708/31195717806_0248e22819_o.jpg,0.0,0.0,0.5625,0.75,763,337,https://www.flickr.com/photos/moverelbigote/31195717806,https://creativecommons.org/licenses/by/2.0/,Mover el Bigote,https://www.flickr.com/people/moverelbigote/ bc6d4701b1e74505,https://c1.staticflickr.com/9/8107/29013707233_c92f7210c2_o.jpg,0.324925816024,0.0,1.0,1.0,548,485,https://www.flickr.com/photos/8269539@N04/29013707233,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/ 2e20a18deb1216ad,https://c1.staticflickr.com/1/367/32131991750_50301ce3a2_o.jpg,0.225,0.0,0.675,0.75,133,954,https://www.flickr.com/photos/rusty_clark/32131991750,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ b9a2de97d7ac1c34,https://c1.staticflickr.com/8/7392/27710327815_3373449a3a_o.jpg,0.503303964758,0.0,1.0,0.75,331,66,https://www.flickr.com/photos/usfwsmidwest/27710327815,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/ 63570a584cc2c5c2,https://c1.staticflickr.com/9/8262/28857174883_1f150beb98_o.jpg,0.25,0.0,1.0,0.5,889,801,https://www.flickr.com/photos/atoach/28857174883/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 455e0d28b61e5d77,https://c1.staticflickr.com/9/8525/29621105616_a6a85e6f08_o.jpg,0.25,0.25,0.75,1.0,578,32,https://www.flickr.com/photos/quinet/29621105616/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 4d6ec01f10988b30,https://c1.staticflickr.com/9/8237/28458447001_2b6eaed3a7_o.jpg,0.28125,0.0,0.84375,0.75,815,418,https://www.flickr.com/photos/nikonvscanon/28458447001,https://creativecommons.org/licenses/by/2.0/,David Blaikie,https://www.flickr.com/people/nikonvscanon/ 2bdbffb29d3a775c,https://c1.staticflickr.com/9/8552/29937703371_78fc337a2b_o.jpg,0.0,0.0,0.502588757396,0.75,844,555,https://www.flickr.com/photos/martius/29937703371,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 4ae1e87e1855a760,https://c1.staticflickr.com/8/7570/29468158715_2b97f02bc0_o.jpg,0.25,0.25,0.75,1.0,662,460,https://www.flickr.com/photos/42220226@N07/29468158715,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ bad9465acdcdc1ad,https://c1.staticflickr.com/8/7740/27009854992_92d873b440_o.jpg,0.4375,0.0,1.0,0.75,965,559,https://www.flickr.com/photos/39551170@N02/27009854992,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/ 073b699ce2135571,https://c1.staticflickr.com/9/8509/29433308770_32feeb0bd0_o.jpg,0.0,0.0,0.5,0.75,459,853,https://www.flickr.com/photos/80340800@N05/29433308770,https://creativecommons.org/licenses/by/2.0/,Peter,https://www.flickr.com/people/80340800@N05/ 242471eacd6a30fb,https://c1.staticflickr.com/1/773/31757271514_eed661d058_o.jpg,0.0,0.250923190547,0.75,0.75276957164,888,482,https://www.flickr.com/photos/eltb/31757271514,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 034f77eae2228f33,https://c1.staticflickr.com/6/5484/30468956330_fafdf7255f_o.jpg,0.5,0.25,1.0,1.0,699,911,https://www.flickr.com/photos/tipsfortravellers/30468956330,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ adc6b364404bde53,https://c1.staticflickr.com/9/8374/29863343296_574e3b8297_o.jpg,0.0,0.421177266576,0.75,0.842354533153,874,789,https://www.flickr.com/photos/ankurp/29863343296,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/ c3ea33d2e15d202d,https://c1.staticflickr.com/9/8606/27791184724_847315c035_o.jpg,0.25,0.25,1.0,1.0,392,572,https://www.flickr.com/photos/mamnaimie/27791184724,https://creativecommons.org/licenses/by/2.0/,piotr mamnaimie,https://www.flickr.com/people/mamnaimie/ 6376137590e81be5,https://c1.staticflickr.com/8/7362/27077720003_68aae9ec05_o.jpg,0.306930693069,0.0,0.920792079208,1.0,304,387,https://www.flickr.com/photos/m-a-r-t-i-n/27077720003,https://creativecommons.org/licenses/by/2.0/,Martin Cooper,https://www.flickr.com/people/m-a-r-t-i-n/ 9ce1eab2e8a89a50,https://c1.staticflickr.com/6/5544/31245586366_f6c39f6b92_o.jpg,0.5,0.25,1.0,1.0,769,676,https://www.flickr.com/photos/jill_carlson/31245586366/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/ 278ef4fc6c9ff3bd,https://c1.staticflickr.com/8/7793/26970017146_ca13ed9cc5_o.jpg,0.5,0.25,1.0,1.0,806,221,https://www.flickr.com/photos/stabakcomeback/26970017146,https://creativecommons.org/licenses/by/2.0/,Stab\303\246k Comeback Team,https://www.flickr.com/people/stabakcomeback/ 03b8c0d800873383,https://c1.staticflickr.com/9/8642/28927887276_4f02407854_o.jpg,0.337738619677,0.0,1.0,1.0,771,632,https://www.flickr.com/photos/spera-designerschuhe/28927887276,https://creativecommons.org/licenses/by/2.0/,"SPERA.de Designerschuhe, Taschen und Accessoires",https://www.flickr.com/people/spera-designerschuhe/ fb72826ed52164d8,https://c1.staticflickr.com/6/5649/30468919110_2ae742121d_o.jpg,0.25,0.0,0.75,0.75,699,515,https://www.flickr.com/photos/tipsfortravellers/30468919110/,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 24afcbc942da4f1d,https://c1.staticflickr.com/8/7337/26821533233_c5f568c219_o.jpg,0.0,0.0,0.666666666667,1.0,321,572,https://www.flickr.com/photos/52450054@N04/26821533233,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/ 873da6fb94924159,https://c1.staticflickr.com/9/8658/28336534461_07be273f45_o.jpg,0.269333843798,0.25,0.808001531394,1.0,975,532,https://www.flickr.com/photos/jsjgeology/28336534461,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 45b463a50e07f882,https://c1.staticflickr.com/8/7574/28720436840_3b7859c286_o.jpg,0.333333333333,0.0,1.0,1.0,320,988,https://www.flickr.com/photos/tejvan/28720436840,https://creativecommons.org/licenses/by/2.0/,Tejvan Pettinger,https://www.flickr.com/people/tejvan/ 60bad371625ab964,https://c1.staticflickr.com/9/8217/29265526604_d43161bcb9_o.jpg,0.543661971831,0.0,1.0,0.75,702,493,https://www.flickr.com/photos/texaus1/29265526604/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/ d1d4e9e224332afb,https://c1.staticflickr.com/6/5831/31047829881_0d5e75063d_o.jpg,0.0,0.285686119874,0.75,0.857058359621,142,642,https://www.flickr.com/photos/dkeats/31047829881/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 0c9b2c4eb592ba42,https://c1.staticflickr.com/9/8256/28919935500_339f23b367_o.jpg,0.499375,0.25,1.0,1.0,806,95,https://www.flickr.com/photos/143134916@N06/28919935500/,https://creativecommons.org/licenses/by/2.0/,Miranda Mylne,https://www.flickr.com/people/143134916@N06/ 17395bc0a3ed6388,https://c1.staticflickr.com/8/7555/26500044183_4ee8b79838_o.jpg,0.25,0.0,1.0,0.599757673667,422,839,https://www.flickr.com/photos/peterhess/26500044183,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/ 77da99df706fe501,https://c1.staticflickr.com/8/7456/27603917315_96ab8da5d6_o.jpg,0.0,0.326388888889,0.75,0.979166666667,788,91,https://www.flickr.com/photos/conner395/27603917315,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/ 195f6b93ce83d376,https://c1.staticflickr.com/1/407/32235056900_e892940325_o.jpg,0.333333333333,0.0,1.0,1.0,868,966,https://www.flickr.com/photos/76969036@N02/32235056900,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 8eb8699863591e64,https://c1.staticflickr.com/8/7794/26892523043_5373c83de0_o.jpg,0.0,0.25,0.5,1.0,512,984,https://www.flickr.com/photos/greggjerdingen/26892523043,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 95cb84a8cd49955b,https://c1.staticflickr.com/6/5329/31244584072_80df6dce7a_o.jpg,0.0,0.0,0.666666666667,1.0,556,721,https://www.flickr.com/photos/rpavich/31244584072,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/ 39e679dd1fb167f9,https://c1.staticflickr.com/9/8771/28874428046_e37fbca3a5_o.jpg,0.5,0.0,1.0,0.75,982,573,https://www.flickr.com/photos/mindahaas/28874428046,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/ 8b41cf5c37d1e806,https://c1.staticflickr.com/9/8354/27749850074_26f1a5bfbe_o.jpg,0.0,0.0,0.5625,0.75,976,859,https://www.flickr.com/photos/jeffhollettvancouverwa/27749850074,https://creativecommons.org/licenses/by/2.0/,Jeff Hollett,https://www.flickr.com/people/jeffhollettvancouverwa/ 7813339c05a069fe,https://c1.staticflickr.com/8/7786/27050345992_fbc4baa162_o.jpg,0.421177266576,0.0,0.842354533153,0.75,985,263,https://www.flickr.com/photos/sauterel/27050345992,https://creativecommons.org/licenses/by/2.0/,J\303\251r\303\251my Sauterel,https://www.flickr.com/people/sauterel/ 0c8ddf3813edea99,https://c1.staticflickr.com/9/8630/28976073876_6160c47ca1_o.jpg,0.331130690162,0.0,0.993392070485,1.0,920,910,https://flickr.com/144551102@N07/28976073876,https://creativecommons.org/licenses/by/2.0/,Investment Zen,https://www.flickr.com/people/investmentzen/ 01b2592eec61252d,https://c1.staticflickr.com/8/7530/26568065093_ecd3bb9ae1_o.jpg,0.0,0.0,0.421177266576,0.75,977,557,https://www.flickr.com/photos/oatsy40/26568065093/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/ 7b6ba615471d32ed,https://c1.staticflickr.com/1/589/33247617972_04f139e4fe_o.jpg,0.0,0.0,0.75,0.5,964,613,https://www.flickr.com/photos/_-o-_/33247617972/,https://creativecommons.org/licenses/by/2.0/,Thomas,https://www.flickr.com/people/_-o-_/ aeb1e681ad1ec720,https://c1.staticflickr.com/9/8222/29831695975_b847a52057_o.jpg,0.37517831669,0.0,1.0,1.0,979,388,https://www.flickr.com/photos/tdlucas5000/29831695975,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/ b6d39b42bd4c4f1b,https://c1.staticflickr.com/9/8145/29519095115_48722b84f1_o.jpg,0.0,0.25,0.75,1.0,196,373,https://flickr.com/52066925@N00/29519095115,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/ c491d498a63f5d04,https://c1.staticflickr.com/6/5771/30566724705_126975b83c_o.jpg,0.5,0.0,1.0,0.75,511,410,https://flickr.com/22539273@N00/30566724705,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ c68a7f95358d000e,https://c1.staticflickr.com/8/7551/26553707663_7df942348d_o.jpg,0.25,0.0,1.0,0.740574506284,780,845,https://www.flickr.com/photos/thoseguys119/26553707663,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 991023218c5bc04c,https://c1.staticflickr.com/6/5621/29827832963_a456a1d146_o.jpg,0.25,0.0,1.0,1.0,459,535,https://www.flickr.com/photos/davidwilson1949/29827832963/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 37cf19b4c1a7c320,https://c1.staticflickr.com/9/8741/27914336480_5e944bf24b_o.jpg,0.112244897959,0.0,1.0,1.0,86,904,https://www.flickr.com/photos/winnu/27914336480/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/ 1ed36bcbf5dcaad2,https://c1.staticflickr.com/9/8568/28402665310_7f39ac77bd_o.jpg,0.454545454545,0.25,1.0,1.0,874,925,https://www.flickr.com/photos/infrogmation/28402665310,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/ 344c3091a2cf05b1,https://c1.staticflickr.com/9/8518/29425205001_03ca5a12c2_o.jpg,0.324925816024,0.0,1.0,1.0,920,541,https://www.flickr.com/photos/duncanh1/29425205001,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/ 078c928a70ed1118,https://c1.staticflickr.com/9/8637/28562284352_df677874fc_o.jpg,0.0,0.0,0.75,0.5,777,201,https://www.flickr.com/photos/24365773@N03/28562284352,https://creativecommons.org/licenses/by/2.0/,Man Alive!,https://www.flickr.com/people/24365773@N03/ 3ca6dfbeffec15d8,https://c1.staticflickr.com/6/5709/22845615358_4dbece279f_o.jpg,0.286971830986,0.25,1.0,1.0,721,227,https://www.flickr.com/photos/usdagov/22845615358,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 1971b87c6680235e,https://c1.staticflickr.com/3/2475/32810778076_cf7d87f2d7_o.jpg,0.0,0.25,0.608536585366,1.0,887,444,https://www.flickr.com/photos/vitroids/32810778076,https://creativecommons.org/licenses/by/2.0/,Masakazu Matsumoto,https://www.flickr.com/people/vitroids/ 1a554d01773b4b91,https://c1.staticflickr.com/6/5769/29680929103_f05a1b3972_o.jpg,0.421177266576,0.0,0.842354533153,0.75,780,397,https://www.flickr.com/photos/119034083@N02/29680929103/,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/ 22803820be0e282a,https://c1.staticflickr.com/8/7793/27919179674_d07328a8cd_o.jpg,0.0,0.25,0.553488372093,1.0,472,956,https://www.flickr.com/photos/jlcernadas/27919179674/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ 35ad6492796c6da6,https://c1.staticflickr.com/8/7645/28724984041_afb8265da5_o.jpg,0.25,0.0,0.75,0.75,465,875,https://flickr.com/21712103@N06/28724984041,https://creativecommons.org/licenses/by/2.0/,media.digest,https://www.flickr.com/people/photo-digest/ d709b3b07426a833,https://c1.staticflickr.com/6/5275/29951542811_f83d2af94e_o.jpg,0.28125,0.25,0.84375,1.0,923,43,https://www.flickr.com/photos/wfryer/29951542811,https://creativecommons.org/licenses/by/2.0/,Wesley Fryer,https://www.flickr.com/people/wfryer/ 2cda2bc7950d1803,https://c1.staticflickr.com/8/7472/26432450134_4897a866a5_o.jpg,0.0,0.0,0.75,0.75,760,301,https://www.flickr.com/photos/vienois/26432450134,https://creativecommons.org/licenses/by/2.0/,Traveling Darkroom,https://www.flickr.com/people/vienois/ 0760df7b9f52457d,https://c1.staticflickr.com/9/8846/28747826542_68979fe362_o.jpg,0.4375,0.0,1.0,0.75,822,575,https://www.flickr.com/photos/zongo/28747826542,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ decae972dfb0388d,https://c1.staticflickr.com/9/8129/30110286906_f6cc5c2d28_o.jpg,0.25,0.517391304348,1.0,1.0,113,866,https://www.flickr.com/photos/jsjgeology/30110286906,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 2415686df039fdbc,https://c1.staticflickr.com/8/7408/26713896834_35fe074816_o.jpg,0.0,0.0,0.562330623306,1.0,542,670,https://www.flickr.com/photos/gonmi/26713896834,https://creativecommons.org/licenses/by/2.0/,Nacho,https://www.flickr.com/people/gonmi/ f12d9fb74d93ac1b,https://c1.staticflickr.com/8/7524/29248924341_341c681c07_o.jpg,0.25,0.25,0.75,1.0,148,414,https://flickr.com/23524762@N00/29248924341,https://creativecommons.org/licenses/by/2.0/,Artie Kopelman,https://www.flickr.com/people/ah_kopelman/ a8d24cae46f367f8,https://c1.staticflickr.com/1/332/32190482520_35c146ac90_o.jpg,0.0,0.25,0.5,1.0,880,990,https://www.flickr.com/photos/31029865@N06/32190482520,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/ d0e72f1ac9850b1b,https://c1.staticflickr.com/9/8401/28943173665_455984fc52_o.jpg,0.0,0.0,0.663412563667,0.75,672,54,https://www.flickr.com/photos/glorycycles/28943173665,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 5f844c8eecf60283,https://c1.staticflickr.com/3/2402/32563390420_867be07e42_o.jpg,0.2515625,0.0,1.0,1.0,305,124,http://www.flickr.com/photos/treegrow/32563390420/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 3fa6bf8463f5f498,https://c1.staticflickr.com/6/5666/30858423940_09a8fb8ff4_o.jpg,0.25,0.25,0.75,1.0,873,577,https://www.flickr.com/photos/presidentialoffice/30858423940,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ d441eb660d2c9b7a,https://c1.staticflickr.com/1/657/32224351623_83ae2382c4_o.jpg,0.25,0.0,1.0,0.736583184258,978,256,https://www.flickr.com/photos/jlcernadas/32224351623,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/ 4ca8c4a7f7322ee8,https://c1.staticflickr.com/9/8620/27980886830_1ce1fa3740_o.jpg,0.248713235294,0.25,0.746139705882,1.0,625,793,https://www.flickr.com/photos/vvbad/27980886830,https://creativecommons.org/licenses/by/2.0/,VVBAD,https://www.flickr.com/people/vvbad/ 6ff6a4993c9e296c,https://c1.staticflickr.com/6/5635/30741341732_a1eed2f0c4_o.jpg,0.25,0.25,0.75,1.0,949,328,https://www.flickr.com/photos/watts_photos/30741341732/,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/ 3002c7a80e250ffe,https://c1.staticflickr.com/1/525/31074822804_0b75bd3791_o.jpg,0.0,0.0,0.75,0.674229452055,533,757,https://flickr.com/47544036@N03/31074822804,https://creativecommons.org/licenses/by/2.0/,Indo Gemstone IndoGemstone,https://www.flickr.com/people/indogemstone/ 6896681fcd9aa109,https://c1.staticflickr.com/6/5833/30193550762_122b9a626f_o.jpg,0.0561403508772,0.0,1.0,1.0,982,503,https://www.flickr.com/photos/apardavila/30193550762,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/ 76d4df36ca6fd78b,https://c1.staticflickr.com/8/7124/27193861553_f19b7205cd_o.jpg,0.281690140845,0.0,0.845070422535,0.75,986,825,https://www.flickr.com/photos/swallowtailgardenseeds/27193861553,https://creativecommons.org/licenses/by/2.0/,Swallowtail Garden Seeds,https://www.flickr.com/people/swallowtailgardenseeds/ 3358bb7f4c17c8a4,https://c1.staticflickr.com/6/5333/30345489662_a39c2201ce_o.jpg,0.0,0.400242326333,0.75,1.0,973,646,https://flickr.com/26547429@N02/30345489662,https://creativecommons.org/licenses/by/2.0/,Ghost Behind The Lens,https://www.flickr.com/people/ocheen/ 62b90b5ae8ac685e,https://c1.staticflickr.com/8/7406/26190703664_9e626bb83f_o.jpg,0.25,0.0,1.0,1.0,622,428,https://www.flickr.com/photos/amslerpix/26190703664/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 21eb821ccf42813a,https://c1.staticflickr.com/6/5466/29997226772_1d8a3f9d47_o.jpg,0.5,0.25,1.0,1.0,561,564,https://www.flickr.com/photos/116153846@N06/29997226772/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/ 6ed4a29b181dc758,https://c1.staticflickr.com/9/8136/29162731380_6953c4661f_o.jpg,0.0,0.0,0.666666666667,1.0,512,506,https://www.flickr.com/photos/greggjerdingen/29162731380/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ e36dddff51b421e2,https://c1.staticflickr.com/6/5707/30312980204_4d56d92f23_o.jpg,0.0,0.0,0.561569688769,1.0,511,808,https://www.flickr.com/photos/oatsy40/30312980204/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/ ed3f7f459c209ab8,https://c1.staticflickr.com/9/8348/28253462770_ec6806ed8a_o.jpg,0.429527559055,0.25,1.0,1.0,473,147,https://www.flickr.com/photos/bdom/28253462770/,https://creativecommons.org/licenses/by/2.0/,bDom - artiste - www.bdom.info,https://www.flickr.com/people/bdom/ fc22fbca42cf2960,https://c1.staticflickr.com/1/287/31882075412_582e1f992a_o.jpg,0.25,0.0,1.0,0.5625,108,299,https://www.flickr.com/photos/jimg944/31882075412,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 963869f9295298d5,https://c1.staticflickr.com/9/8183/28832932845_2d58a0f0bd_o.jpg,0.25,0.0,1.0,0.75,512,547,https://www.flickr.com/photos/atoach/28832932845,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ 95615275d19f5ada,https://c1.staticflickr.com/9/8243/28075375513_8670476428_o.jpg,0.0,0.25,0.5,1.0,625,858,https://www.flickr.com/photos/icte-uq/28075375513,https://creativecommons.org/licenses/by/2.0/,ICTE-UQ,https://www.flickr.com/people/icte-uq/ 602e769ee7e788de,https://c1.staticflickr.com/6/5834/30937916961_8a8121dffd_o.jpg,0.0,0.0,0.501846381093,0.75,459,549,https://www.flickr.com/photos/francisvallance/30937916961/,https://creativecommons.org/licenses/by/2.0/,Francis Vallance (Heritage Warrior),https://www.flickr.com/people/francisvallance/ f107b64f254b2358,https://c1.staticflickr.com/8/7097/26936899386_d00cf2d1f6_o.jpg,0.421177266576,0.25,0.842354533153,1.0,566,646,https://www.flickr.com/photos/thepassengertrain/26936899386/in/dateposted-friend/,https://creativecommons.org/licenses/by/2.0/,Jos\303\251 Pereda,https://www.flickr.com/people/thepassengertrain/ aa40a2b3c3669785,https://c1.staticflickr.com/1/435/32446527496_4811f3c2d8_o.jpg,0.0,0.0,0.792604501608,1.0,951,461,https://flickr.com/17467193@N00/32446527496,https://creativecommons.org/licenses/by/2.0/,jesse1dog,https://www.flickr.com/people/jesseflickrdog/ 4b6dc719bde7e53e,https://c1.staticflickr.com/1/264/31641355323_3a420df6aa_o.jpg,0.518089725036,0.0,1.0,0.75,82,854,https://flickr.com/75576067@N03/31641355323,https://creativecommons.org/licenses/by/2.0/,Always a birder!,https://www.flickr.com/people/alwaysabirder/ 8b67e578f558cbd1,https://c1.staticflickr.com/1/381/32251290882_909fca8244_o.jpg,0.0,0.0,0.623970345964,0.75,326,750,https://www.flickr.com/photos/gails_pictures/32251290882/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ e3199060826add66,https://c1.staticflickr.com/8/7521/26469172193_89c7521397_o.jpg,0.63211125158,0.25,1.0,1.0,706,541,https://www.flickr.com/photos/jsjgeology/26469172193,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ fcb8b89aec2bfbf9,https://c1.staticflickr.com/9/8292/29025884234_5b495ca77b_o.jpg,0.248713235294,0.0,0.746139705882,0.75,748,755,https://www.flickr.com/photos/holiday-extras/29025884234,https://creativecommons.org/licenses/by/2.0/,Holidayextras,https://www.flickr.com/people/holiday-extras/ afea02f4b5067a0d,https://c1.staticflickr.com/1/458/32153923192_e4132b3168_o.jpg,0.341370558376,0.0,1.0,0.75,327,743,http://www.flickr.com/photos/gails_pictures/32153923192/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 282bc03cc2a5c35f,https://c1.staticflickr.com/6/5832/30963414056_c210351727_o.jpg,0.25,0.0,1.0,0.744604316547,604,470,https://www.flickr.com/photos/13476480@N07/30963414056,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 4d8738f69fe30804,https://c1.staticflickr.com/1/525/31927294734_8952a51131_o.jpg,0.25,0.0,0.75,0.75,868,842,https://www.flickr.com/photos/76969036@N02/31927294734/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 8c25acb3c180ab09,https://c1.staticflickr.com/1/320/32417107542_6491c19115_o.jpg,0.25,0.0,0.75,0.75,600,659,https://www.flickr.com/photos/karen_roe/32417107542,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/ 890f2cab34341428,https://c1.staticflickr.com/9/8605/28213111224_2086c4af60_o.jpg,0.4375,0.25,1.0,1.0,563,451,https://www.flickr.com/photos/36668466@N05/28213111224,https://creativecommons.org/licenses/by/2.0/,Fernando Medina,https://www.flickr.com/people/36668466@N05/ a1d70e8b6062e228,https://c1.staticflickr.com/9/8556/29775848175_65f31f79d7_o.jpg,0.0,0.0,0.496696035242,0.75,625,868,https://www.flickr.com/photos/pedrocaetano/29775848175,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/ 0f3917a53d9af1b1,https://c1.staticflickr.com/8/7545/27467654966_00bdba7fa3_o.jpg,0.25,0.0,1.0,0.75,845,726,https://flickr.com/41898857@N04/27467654966,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/ 4fa1b6ed1ac46c13,https://c1.staticflickr.com/6/5823/31007561916_a985bd7ed8_o.jpg,0.128161888702,0.0,1.0,1.0,820,481,https://www.flickr.com/photos/tomronworldwide/31007561916/,https://creativecommons.org/licenses/by/2.0/,Ron Frazier,https://www.flickr.com/people/tomronworldwide/ d96aa254a9d06f19,https://c1.staticflickr.com/8/7247/26466263693_df0e519a95_o.jpg,0.25,0.25,1.0,1.0,968,649,https://www.flickr.com/photos/journeyscoffee/26466263693,https://creativecommons.org/licenses/by/2.0/,Dan Lacher,https://www.flickr.com/people/journeyscoffee/ bc3c605c14599dc9,https://c1.staticflickr.com/9/8308/27956576013_2f9f7a8657_o.jpg,0.421177266576,0.0,0.842354533153,0.75,980,40,https://www.flickr.com/photos/blmoregon/27956576013,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/ b96a687a469af6b3,https://c1.staticflickr.com/6/5698/31207832001_99ed65c6c4_o.jpg,0.0,0.0,0.5,0.75,868,273,https://www.flickr.com/photos/76969036@N02/31207832001,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ d00e37994716353a,https://c1.staticflickr.com/8/7597/27481303810_790d4028a1_o.jpg,0.21087398374,0.25,0.63262195122,1.0,976,692,https://www.flickr.com/photos/heyitsbenrobinson/27481303810,https://creativecommons.org/licenses/by/2.0/,Ben Robinson,https://www.flickr.com/people/heyitsbenrobinson/ 5b478f16b99ee75e,https://c1.staticflickr.com/8/7433/27355223014_d074395808_o.jpg,0.0,0.0,0.666666666667,1.0,668,613,https://www.flickr.com/photos/ufv/27355223014,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ 8bf626dff1c0cede,https://c1.staticflickr.com/8/7135/27419669343_23d4403dda_o.jpg,0.0,0.25,0.75,1.0,461,627,https://www.flickr.com/photos/idovermani/27419669343/,https://creativecommons.org/licenses/by/2.0/,Dov Harrington,https://www.flickr.com/people/idovermani/ f93154f181883e71,https://c1.staticflickr.com/8/7157/26708144763_7b0e8d12a7_o.jpg,0.0,0.25,0.502588757396,1.0,604,9,https://www.flickr.com/photos/edenpictures/26708144763,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ 6d1bfad890b0b1c2,https://c1.staticflickr.com/8/7569/28771176582_32b5156f0c_o.jpg,0.288109756098,0.0,1.0,1.0,561,580,https://www.flickr.com/photos/klemencic/28771176582,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/ f408f6a2edee1f3f,https://c1.staticflickr.com/8/7795/26823623503_287f53558c_o.jpg,0.25,0.0,1.0,0.75,778,827,https://www.flickr.com/photos/moto_club4ag/26823623503,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ f5cd3e269b0f388e,https://c1.staticflickr.com/8/7013/27070641421_f49b733b7d_o.jpg,0.25,0.0,0.75,0.75,301,768,https://www.flickr.com/photos/briangratwicke/27070641421,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/ 0611703cbfcefc21,https://c1.staticflickr.com/1/558/32471056652_29d76e0150_o.jpg,0.0,0.25,0.5,1.0,473,850,https://www.flickr.com/photos/30478819@N08/32471056652,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ d4c06c1da1658af6,https://c1.staticflickr.com/8/7249/27041481226_3ecd5d2bc7_o.jpg,0.25,0.2806640625,1.0,0.8419921875,558,607,https://www.flickr.com/photos/dainismatisons/27041481226,https://creativecommons.org/licenses/by/2.0/,Dainis Matisons,https://www.flickr.com/people/dainismatisons/ 49dcebfc5f06cf7b,https://c1.staticflickr.com/9/8192/29182858674_cc3a87e959_o.jpg,0.0,0.0,0.5,0.75,405,393,https://www.flickr.com/photos/alessandroambrosetti/29182858674/,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ 1376d42862646478,https://c1.staticflickr.com/1/490/32016746180_e4fc8acb29_o.jpg,0.5,0.25,1.0,1.0,731,830,https://www.flickr.com/photos/quinet/32016746180,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ 90ec4bfe75a1d915,https://c1.staticflickr.com/1/274/32581927456_a7ed3391ab_o.jpg,0.0,0.0,0.75,0.599757673667,747,99,https://www.flickr.com/photos/mark6mauno/32581927456,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ c8cef686ffba362d,https://c1.staticflickr.com/9/8248/28374641312_8c77c363cc_o.jpg,0.0,0.0,0.75,1.0,527,357,https://www.flickr.com/photos/cambodia4kidsorg/28374641312,https://creativecommons.org/licenses/by/2.0/,Cambodia4kids.org Beth Kanter,https://www.flickr.com/people/cambodia4kidsorg/ ee6009e30c777a0c,https://c1.staticflickr.com/6/5572/29487040554_da789c18a4_o.jpg,0.0,0.0,0.5625,0.75,975,354,https://flickr.com/47445767@N05/29487040554,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ 807a428d832e68d3,https://c1.staticflickr.com/8/7499/27490061826_df9bab0294_o.jpg,0.0,0.25,0.543461538462,1.0,651,749,https://flickr.com/132839593@N02/27490061826,https://creativecommons.org/licenses/by/2.0/,Riberto Frederico,https://www.flickr.com/people/132839593@N02/ f7707d76d59b537d,https://c1.staticflickr.com/8/7197/27220170255_f20eab87ef_o.jpg,0.578822733424,0.0,1.0,0.75,629,898,https://www.flickr.com/photos/patrice_calatayu/27220170255,https://creativecommons.org/licenses/by/2.0/,Patrice CALATAYU,https://www.flickr.com/people/patrice_calatayu/ 18315f3ae78391e5,https://c1.staticflickr.com/9/8573/27804481733_67c82e98bd_o.jpg,0.0,0.0,0.640173410405,1.0,975,479,https://www.flickr.com/photos/jsjgeology/27804481733,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ bfca9c790fc8c01b,https://c1.staticflickr.com/1/522/32555560306_923eb4e177_o.jpg,0.25,0.0,0.75,0.75,484,832,https://www.flickr.com/photos/gravitat-off/32555560306,https://creativecommons.org/licenses/by/2.0/,gravitat-OFF,https://www.flickr.com/people/gravitat-off/ 49e82d2b96bc223a,https://c1.staticflickr.com/6/5681/30268264846_246ab880b5_o.jpg,0.333333333333,0.0,1.0,1.0,835,525,https://www.flickr.com/photos/avedaphotos/30268264846,https://creativecommons.org/licenses/by/2.0/,Aveda Corporation,https://www.flickr.com/people/avedaphotos/ db540b162d21f131,https://c1.staticflickr.com/9/8257/29674247336_6b1775e7c7_o.jpg,0.0,0.0,0.75,1.0,459,649,https://www.flickr.com/photos/rheba/29674247336,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/ a43196bcf70e3d1b,https://c1.staticflickr.com/8/7314/27753523935_727cb8e35c_o.jpg,0.0,0.0,0.75,1.0,24,967,https://www.flickr.com/photos/amanderson/27753523935,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/ b2e89d2d86fb11fd,https://c1.staticflickr.com/8/7372/28038354721_f8691750eb_o.jpg,0.333333333333,0.0,1.0,1.0,980,495,https://www.flickr.com/photos/davebloggs007/28038354721,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/ 6f4a4af6fe6af183,https://c1.staticflickr.com/8/7067/27153599051_b7522e0f30_o.jpg,0.4375,0.25,1.0,1.0,966,308,https://www.flickr.com/photos/55229469@N07/27153599051,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/ f4d150c15cf1dbae,https://c1.staticflickr.com/1/289/31513756992_0cf2b5ec9b_o.jpg,0.0,0.0,0.518018018018,0.75,973,427,https://www.flickr.com/photos/clairity/31513756992,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 1d73de0c6e148cc5,https://c1.staticflickr.com/1/358/32329710092_ea5d41d96e_o.jpg,0.297226688103,0.0,0.891680064309,0.75,311,764,https://www.flickr.com/photos/gails_pictures/32329710092,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 55ffe38dfe142a62,https://c1.staticflickr.com/8/7190/27892448656_3093a4e3c2_o.jpg,0.25,0.4375,1.0,1.0,459,656,https://www.flickr.com/photos/16894927@N08/27892448656/,https://creativecommons.org/licenses/by/2.0/,todd.vision,https://www.flickr.com/people/16894927@N08/ b621fed904bb921c,https://c1.staticflickr.com/8/7443/27479683111_66cb66a7ed_o.jpg,0.25,0.0,1.0,0.75,611,118,https://www.flickr.com/photos/hmk/27479683111,https://creativecommons.org/licenses/by/2.0/,H. Michael Karshis,https://www.flickr.com/people/hmk/ d841169bb11cd083,https://c1.staticflickr.com/8/7321/26792025860_6ccff53fa4_o.jpg,0.29465849387,0.0,1.0,0.75,323,120,https://www.flickr.com/photos/33398884@N03/26792025860,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/ 5f995220f250d08d,https://c1.staticflickr.com/8/7553/28120915535_3dd5604d97_o.jpg,0.25,0.0,1.0,1.0,735,517,https://www.flickr.com/photos/27665395@N05/28120915535,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ ba5b137369090cd4,https://c1.staticflickr.com/6/5642/30586137583_df7a540357_o.jpg,0.0,0.0,0.501846381093,0.75,971,670,http://www.flickr.com/photos/flightlog/30586137583/,https://creativecommons.org/licenses/by/2.0/,flightlog,https://www.flickr.com/people/flightlog/ 961a16572c6a2132,https://c1.staticflickr.com/1/718/33055344860_28dd9fb708_o.jpg,0.256343283582,0.0,0.769029850746,0.75,908,794,https://www.flickr.com/photos/30478819@N08/33055344860/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ d57b6311f42ceb01,https://c1.staticflickr.com/8/7363/26537126553_b687ced39b_o.jpg,0.252730109204,0.0,1.0,1.0,780,491,https://www.flickr.com/photos/thoseguys119/26537126553,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 08d9ab4f6006ddd1,https://c1.staticflickr.com/1/322/31451801080_558139f5a1_o.jpg,0.25,0.0,1.0,0.5625,952,109,https://www.flickr.com/photos/garlandcannon/31451801080,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/ c22d948aeb29b6bc,https://c1.staticflickr.com/9/8401/28357145384_10bbb0bee0_o.jpg,0.55851800554,0.25,1.0,1.0,971,398,https://www.flickr.com/photos/70253321@N00/28357145384,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/ 348eb05801aa42d2,https://c1.staticflickr.com/9/8609/28783232702_7f490bc841_o.jpg,0.4375,0.0,1.0,0.75,459,386,https://www.flickr.com/photos/londonmatt/28783232702,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ 8cc69ca06eefaef6,https://c1.staticflickr.com/9/8019/29591673661_8c3eb406cc_o.jpg,0.2806640625,0.25,0.8419921875,1.0,310,779,https://www.flickr.com/photos/pondapple/29591673661,https://creativecommons.org/licenses/by/2.0/,Bob Peterson,https://www.flickr.com/people/pondapple/ 5ac33c67c22cf9d7,https://c1.staticflickr.com/9/8535/29974986986_4083624408_o.jpg,0.0,0.0,0.5,0.75,672,1,https://www.flickr.com/photos/garryknight/29974986986,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/ 551d5e48a210d941,https://c1.staticflickr.com/8/7043/27725852465_e1959d4a3a_o.jpg,0.333333333333,0.0,1.0,1.0,848,787,https://www.flickr.com/photos/janitors/27725852465,https://creativecommons.org/licenses/by/2.0/,K\304\201rlis Dambr\304\201ns,https://www.flickr.com/people/janitors/ d3128343721d72f0,https://c1.staticflickr.com/8/7524/29945297200_5a58c0c082_o.jpg,0.25,0.25,0.75,1.0,519,841,https://www.flickr.com/photos/tangi_bertin/29945297200/,https://creativecommons.org/licenses/by/2.0/,tangi bertin,https://www.flickr.com/people/tangi_bertin/ 0f2fbc71ee00fa31,https://c1.staticflickr.com/9/8045/28565290083_78b045c5ff_o.jpg,0.4375,0.25,1.0,1.0,923,786,https://flickr.com/127226743@N02/28565290083,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 31132b257261e655,https://c1.staticflickr.com/9/8222/29341814513_6c6a72c557_o.jpg,0.331771720613,0.25,1.0,1.0,459,148,https://www.flickr.com/photos/22711505@N05/29341814513,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 125e9559c680d818,https://c1.staticflickr.com/8/7338/27398775121_764ef27fdf_o.jpg,0.0,0.0,1.0,1.0,463,551,https://www.flickr.com/photos/epicfireworks/27398775121,https://creativecommons.org/licenses/by/2.0/,Epic Fireworks,https://www.flickr.com/people/epicfireworks/ 8d20add7d43244ef,https://c1.staticflickr.com/6/5795/31393791525_b182ba39d6_o.jpg,0.0,0.25,0.5,1.0,906,132,http://www.flickr.com/photos/boneball/31393791525/,https://creativecommons.org/licenses/by/2.0/,Endre Majoros,https://www.flickr.com/people/boneball/ 02ba3db93b1b350f,https://c1.staticflickr.com/9/8554/29694697643_9a9f471f3b_o.jpg,0.0,0.0,0.75,1.0,780,414,https://www.flickr.com/photos/thoseguys119/29694697643,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 0e72c48ea2b788c0,https://c1.staticflickr.com/9/8668/29396924254_228a003269_o.jpg,0.210588633288,0.25,0.631765899865,1.0,426,194,https://www.flickr.com/photos/larry1732/29396924254/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/ 07a1784e76b608c6,https://c1.staticflickr.com/9/8667/27622799234_3f39c71ff1_o.jpg,0.5,0.0,1.0,0.75,294,175,https://www.flickr.com/photos/flowcomm/27622799234/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/ 53d84f767c2c751b,https://c1.staticflickr.com/9/8876/28799517836_2c9a77e6f4_o.jpg,0.28882725832,0.0,0.86648177496,0.75,309,903,https://www.flickr.com/photos/gails_pictures/28799517836,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 45d0fa3ee3c946f8,https://c1.staticflickr.com/8/7792/26511285184_61546c2d9d_o.jpg,0.5,0.25,1.0,1.0,100,842,https://flickr.com/30478819@N08/26511285184,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ 771a3735ff67b691,https://c1.staticflickr.com/8/7797/27686605332_6a3f0f2733_o.jpg,0.333333333333,0.0,1.0,1.0,971,492,https://www.flickr.com/photos/quinet/27686605332/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/ ce9a23ece1fa977e,https://c1.staticflickr.com/1/424/32932227076_bdeac7d0c7_o.jpg,0.471030042918,0.25,0.942060085837,1.0,539,497,https://www.flickr.com/photos/eltb/32932227076,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 53c34e3ae2536b64,https://c1.staticflickr.com/1/452/32358418221_839bf47300_o.jpg,0.340328467153,0.25,0.680656934307,1.0,481,129,https://flickr.com/36217981@N02/32358418221,https://creativecommons.org/licenses/by/2.0/,Tim Adams,https://www.flickr.com/people/36217981@N02/ a750589299278c07,https://c1.staticflickr.com/6/5570/31023343101_06d4b394f6_o.jpg,0.0,0.333333333333,1.0,1.0,855,258,https://www.flickr.com/photos/stevieawards/31023343101/,https://creativecommons.org/licenses/by/2.0/,mikeg44311,https://www.flickr.com/people/stevieawards/ bf2fda9ba8d52410,https://c1.staticflickr.com/1/382/32200613252_a54c82bf0d_o.jpg,0.0,0.0,0.561569688769,1.0,328,321,https://flickr.com/65847118@N06/32200613252,https://creativecommons.org/licenses/by/2.0/,Maarten Heerlien,https://www.flickr.com/people/65847118@N06/ cb803f98cb1e1f72,https://c1.staticflickr.com/1/682/31545042966_77958e7b67_o.jpg,0.25,0.0,1.0,1.0,780,214,https://www.flickr.com/photos/thoseguys119/31545042966/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ c1cbef6ab5c90c6c,https://c1.staticflickr.com/6/5222/29216320604_2753d1609e_o.jpg,0.4375,0.0,1.0,0.75,407,844,https://www.flickr.com/photos/davidwilson1949/29216320604,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ 7076116f57181197,https://c1.staticflickr.com/9/8764/28168978570_db6949020a_o.jpg,0.0,0.0,0.75,0.5,484,128,https://www.flickr.com/photos/tipsfortravellers/28168978570,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ 5eabe8dd27005858,https://c1.staticflickr.com/1/288/32995484935_6e2ec71dd9_o.jpg,0.21087398374,0.0,0.63262195122,0.75,405,774,https://flickr.com/99041966@N06/32995484935,https://creativecommons.org/licenses/by/2.0/,Nicky Boogaard,https://www.flickr.com/people/n-bphotography/ c37b0265424953d4,https://c1.staticflickr.com/1/549/31961098985_a4abee7d00_o.jpg,0.0,0.25,0.519144144144,1.0,975,397,https://www.flickr.com/photos/hisgett/31961098985,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 8a00786f3d86419b,https://c1.staticflickr.com/1/647/31353558614_515be9f889_o.jpg,0.0,0.25,0.75,0.75,747,113,https://www.flickr.com/photos/usarak/31353558614,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/ b3eb8facaf02aa42,https://c1.staticflickr.com/9/8415/30308230371_4c49b02b29_o.jpg,0.0,0.0,0.5625,0.75,20,296,https://www.flickr.com/photos/9750464@N02/30308230371,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ c86e563dd593428c,https://c1.staticflickr.com/6/5830/30702606771_20c2ae69a5_o.jpg,0.0,0.0,0.75,0.75,438,350,https://www.flickr.com/photos/glynlowe/30702606771,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/ fb86659c6be78d78,https://c1.staticflickr.com/9/8142/29357161641_0ce40c60e5_o.jpg,0.25,0.0,0.75,0.75,650,197,https://flickr.com/129665369@N02/29357161641,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ 2d50e34985ec267b,https://c1.staticflickr.com/9/8500/29593268302_9da84c549e_o.jpg,0.2806640625,0.0,0.8419921875,0.75,914,314,https://www.flickr.com/photos/vastateparksstaff/29593268302/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/ 48c6a1f5068c2003,https://c1.staticflickr.com/8/7448/26847601405_3479af77e7_o.jpg,0.25,0.0,1.0,1.0,991,497,https://www.flickr.com/photos/aroberts/26847601405,https://creativecommons.org/licenses/by/2.0/,Andy Roberts,https://www.flickr.com/people/aroberts/ 473980460c33868a,https://c1.staticflickr.com/8/7002/26221285173_dd588b8d17_o.jpg,0.0,0.25,0.498159057437,1.0,673,709,https://www.flickr.com/photos/bravenboer/26221285173,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/ 1b8bbe97386a4b63,https://c1.staticflickr.com/6/5730/29382363483_8f7db83970_o.jpg,0.0,0.25,0.5625,1.0,975,539,https://www.flickr.com/photos/jsjgeology/29382363483/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ ad575359e5940050,https://c1.staticflickr.com/3/2881/32835623361_f1c558e98a_o.jpg,0.0,0.0,0.5,0.75,581,962,http://www.flickr.com/photos/martius/32835623361/,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/ 593dd8ca5538d49d,https://c1.staticflickr.com/8/7497/26704373970_090d46eeec_o.jpg,0.25,0.25,0.75,1.0,820,620,https://www.flickr.com/photos/142602025@N03/26704373970,https://creativecommons.org/licenses/by/2.0/,Robert Voigt,https://www.flickr.com/people/142602025@N03/ bc197152df01b4ba,https://c1.staticflickr.com/3/2753/32822852976_22903ed1bc_o.jpg,0.2806640625,0.0,0.8419921875,0.75,980,872,http://www.flickr.com/photos/philippeamiot/32822852976/,https://creativecommons.org/licenses/by/2.0/,Philippe AMIOT,https://www.flickr.com/people/philippeamiot/ 3835f34272b005a8,https://c1.staticflickr.com/1/244/30704336683_e0a0a15639_o.jpg,0.0,0.333049403748,0.75,1.0,484,108,https://www.flickr.com/photos/pyride/30704336683/,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/ 5083efba7ecb43ee,https://c1.staticflickr.com/1/387/32873391022_854a1678f9_o.jpg,0.333049403748,0.25,1.0,1.0,641,32,http://www.flickr.com/photos/10390868@N07/32873391022,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/ 85d58a955e97666f,https://c1.staticflickr.com/6/5807/31454165115_f7eb3cab88_o.jpg,0.25,0.0,0.75,0.75,625,678,https://www.flickr.com/photos/shankaronline/31454165115,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/ 0c80b6ad59ab0c3f,https://c1.staticflickr.com/8/7317/27037593283_e068fd1bde_o.jpg,0.0,0.25,0.686528497409,1.0,611,852,https://www.flickr.com/photos/moritzbarcelona/27037593283,https://creativecommons.org/licenses/by/2.0/,Moritz Barcelona,https://www.flickr.com/people/moritzbarcelona/ 22857d3fd7a5ae23,https://c1.staticflickr.com/6/5652/30446571023_41d6e37f1f_o.jpg,0.0,0.0,0.662261380323,1.0,973,433,https://www.flickr.com/photos/ufv/30446571023,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/ a5351f835331276a,https://c1.staticflickr.com/3/2347/32285401514_e3e943f8b2_o.jpg,0.4375,0.25,1.0,1.0,11,983,https://www.flickr.com/photos/9750464@N02/32285401514/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/ d549e24c99bd103a,https://c1.staticflickr.com/9/8796/28444006476_7368731152_o.jpg,0.0,0.25,0.57765451664,1.0,821,860,https://www.flickr.com/photos/hisgett/28444006476/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/ 34075be444cdc745,https://c1.staticflickr.com/6/5630/30035718155_53da708848_o.jpg,0.25,0.25,0.75,1.0,962,22,https://www.flickr.com/photos/stevendepolo/30035718155,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ f4d449876bf3db82,https://c1.staticflickr.com/9/8233/29115892520_943b05a394_o.jpg,0.0,0.0,0.651515151515,0.75,429,29,https://www.flickr.com/photos/usfwshq/29115892520,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/ dbb1f355dea6b6c1,https://c1.staticflickr.com/1/335/31956346113_16c6d052eb_o.jpg,0.25,0.0,0.75,0.75,868,248,https://www.flickr.com/photos/76969036@N02/31956346113/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 690ac780eb6f7015,https://c1.staticflickr.com/6/5679/30807246541_b4c6c7107f_o.jpg,0.28125,0.0,0.84375,0.75,880,826,https://www.flickr.com/photos/39551170@N02/30807246541/,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/ 9208188d2dec6fbf,https://c1.staticflickr.com/6/5473/30867175032_8408a571e0_o.jpg,0.280784844384,0.0,0.842354533153,1.0,820,897,http://www.flickr.com/photos/amslerpix/30867175032/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 96f7e340c4b799ca,https://c1.staticflickr.com/9/8057/29446964491_3b7f7a9ff0_o.jpg,0.25,0.0,0.75,0.75,731,908,https://www.flickr.com/photos/o_0/29446964491/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/ e0487839254820d8,https://c1.staticflickr.com/9/8735/28739100781_d909151de0_o.jpg,0.4375,0.0,1.0,0.75,986,593,https://www.flickr.com/photos/110035327@N08/28739100781,https://creativecommons.org/licenses/by/2.0/,Stefano Akram,https://www.flickr.com/people/110035327@N08/ 212250ad86bf62dd,https://c1.staticflickr.com/4/3866/33002671521_f6d45cf01d_o.jpg,0.25,0.25,0.75,1.0,538,881,https://www.flickr.com/photos/denalinps/33002671521/,https://creativecommons.org/licenses/by/2.0/,Denali National Park and Preserve,https://www.flickr.com/people/denalinps/ 775b6c53206572d9,https://c1.staticflickr.com/8/7494/26665562940_e60c76b02b_o.jpg,0.25,0.5,1.0,1.0,688,315,https://www.flickr.com/photos/dalbera/26665562940,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\303\251ra,https://www.flickr.com/people/dalbera/ 3c7701d981005eaf,https://c1.staticflickr.com/8/7519/26669075453_e39d203da4_o.jpg,0.0,0.0,0.75,0.497426470588,888,507,https://www.flickr.com/photos/agenciabrasilia/26669075453,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Bras\303\255lia,https://www.flickr.com/people/agenciabrasilia/ 65c3ea03d8340670,https://c1.staticflickr.com/8/7294/27999882732_571cd3c324_o.jpg,0.0,0.464122137405,0.75,1.0,835,970,https://www.flickr.com/photos/estonian-foreign-ministry/27999882732,https://creativecommons.org/licenses/by/2.0/,Estonian Foreign Ministry,https://www.flickr.com/people/estonian-foreign-ministry/ b13acdcc3b317140,https://c1.staticflickr.com/8/7773/26968211330_d782cd1f22_o.jpg,0.25,0.42234548336,1.0,1.0,742,556,https://www.flickr.com/photos/s1ingshot/26968211330,https://creativecommons.org/licenses/by/2.0/,s1ingshot,https://www.flickr.com/people/s1ingshot/ d7f81fe9899e141b,https://c1.staticflickr.com/1/515/32626937906_237d8a4b0a_o.jpg,0.0,0.0,0.75,1.0,875,209,https://www.flickr.com/photos/76969036@N02/32626937906/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ e0b8ad0f53a7cd88,https://c1.staticflickr.com/1/654/31978023896_1be599f21a_o.jpg,0.25,0.0,1.0,1.0,11,759,https://www.flickr.com/photos/16502322@N03/31978023896,https://creativecommons.org/licenses/by/2.0/,fishhawk,https://www.flickr.com/people/16502322@N03/ 97d35229353f62f4,https://c1.staticflickr.com/9/8837/26770558915_e875e27934_o.jpg,0.319375,0.25,0.958125,1.0,405,750,https://www.flickr.com/photos/wjarrettc/26770558915,https://creativecommons.org/licenses/by/2.0/,Jarrett Campbell,https://www.flickr.com/people/wjarrettc/ 570e0141e061525f,https://c1.staticflickr.com/9/8621/28622365852_f80e7d5bcd_o.jpg,0.249631811487,0.25,0.748895434462,1.0,459,828,https://www.flickr.com/photos/panr/28622365852,https://creativecommons.org/licenses/by/2.0/,Robert Cutts,https://www.flickr.com/people/panr/ 9b0e22966c366036,https://c1.staticflickr.com/8/7405/27516904754_fa5a3185e9_o.jpg,0.25,0.0,0.75,0.75,763,157,https://flickr.com/89562459@N03/27516904754,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/ 55dda78464ecf171,https://c1.staticflickr.com/8/7694/26801339376_fe524d94d9_o.jpg,0.578822733424,0.25,1.0,1.0,666,973,https://www.flickr.com/photos/postmanpetecoluk/26801339376,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/ 96651d0a3b3c92c4,https://c1.staticflickr.com/9/8046/29148275091_0843827964_o.jpg,0.4375,0.25,1.0,1.0,780,491,https://www.flickr.com/photos/thoseguys119/29148275091,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 50c425d8721a4199,https://c1.staticflickr.com/3/2856/32977467506_297fe752c5_o.jpg,0.248348017621,0.0,0.745044052863,0.75,536,742,https://www.flickr.com/photos/glorycycles/32977467506,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 1056e7b2b773f4f7,https://c1.staticflickr.com/6/5558/30780432135_157a04c905_o.jpg,0.0,0.0,1.0,1.0,484,108,https://www.flickr.com/photos/valerialaura/30780432135/,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/ 47091d51eb76366b,https://c1.staticflickr.com/1/729/32713209785_95003f5a8c_o.jpg,0.0,0.25,0.5625,1.0,89,503,https://www.flickr.com/photos/rusty_clark/32713209785/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/ 956d7533342ac3cc,https://c1.staticflickr.com/1/397/31989508073_a2da0061e9_o.jpg,0.5,0.0,1.0,0.75,431,710,https://www.flickr.com/photos/codnewsroom/31989508073,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 96bcd4869e3d4fd7,https://c1.staticflickr.com/6/5528/29860716290_7c4f730e2b_o.jpg,0.438430311231,0.0,1.0,1.0,979,51,https://www.flickr.com/photos/oatsy40/29860716290/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/ ef6b6e1b378ccb9f,https://c1.staticflickr.com/1/599/31984162833_168b1e3913_o.jpg,0.0,0.25,0.497426470588,1.0,712,507,https://www.flickr.com/photos/preciosa-ornela/31984162833,https://creativecommons.org/licenses/by/2.0/,PRECIOSA ORNELA,https://www.flickr.com/people/preciosa-ornela/ 4417d207dc1c314e,https://c1.staticflickr.com/9/8880/27695837134_b1bc3b596d_o.jpg,0.0,0.0,0.665684830633,1.0,609,643,https://www.flickr.com/photos/fotosagenciabrasil/27695837134,https://creativecommons.org/licenses/by/2.0/,Ag\303\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/ 555ae39a964ad7cc,https://c1.staticflickr.com/8/7341/27729351220_a9cbeca117_o.jpg,0.24882629108,0.0,1.0,1.0,309,378,https://www.flickr.com/photos/treegrow/27729351220/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 62572e474b0df7ba,https://c1.staticflickr.com/6/5585/30609804841_e9b89dac21_o.jpg,0.4375,0.0,1.0,0.75,608,552,https://www.flickr.com/photos/glenbowman/30609804841,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/ 2e289c874a05d5d5,https://c1.staticflickr.com/9/8080/29122401374_dc6d7a710f_o.jpg,0.0,0.250923190547,0.75,0.75276957164,407,697,https://www.flickr.com/photos/eltb/29122401374,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ fb26ba0a11ec571a,https://c1.staticflickr.com/6/5801/30388499545_fe78ba2dd0_o.jpg,0.0,0.25,0.5,1.0,982,449,https://www.flickr.com/photos/codnewsroom/30388499545,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/ 5948fbd35229358b,https://c1.staticflickr.com/9/8131/29584131574_1f1ef8b2c0_o.jpg,0.25,0.0,1.0,0.75,418,258,https://www.flickr.com/photos/inmobili-ariascamargo/29584131574,https://creativecommons.org/licenses/by/2.0/,Quelverd Arias Camargo,https://www.flickr.com/people/inmobili-ariascamargo/ 284579d93f8f455d,https://c1.staticflickr.com/6/5650/29800307090_63da86bdfd_o.jpg,0.0,0.0,0.75,0.75,906,576,https://www.flickr.com/photos/rodrigoparedes/29800307090,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/ a45ba7ef76816ac3,https://c1.staticflickr.com/8/7175/26861099872_2d32dc9007_o.jpg,0.28125,0.25,0.84375,1.0,459,535,https://www.flickr.com/photos/16349984@N07/26861099872,https://creativecommons.org/licenses/by/2.0/,Keith Seabridge,https://www.flickr.com/people/16349984@N07/ 8c83cb573dfb858a,https://c1.staticflickr.com/6/5794/31076781201_25f411861a_o.jpg,0.267938931298,0.0,0.803816793893,0.75,138,58,https://flickr.com/143049688@N08/31076781201,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/ b28356d4697f5d3f,https://c1.staticflickr.com/8/7318/27053109552_1a812ee1ce_o.jpg,0.386029411765,0.25,1.0,1.0,309,723,https://www.flickr.com/photos/gails_pictures/27053109552,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ a752dbd50bcd2de1,https://c1.staticflickr.com/4/3811/31953578214_42f1771e80_o.jpg,0.25,0.0,1.0,1.0,977,126,https://www.flickr.com/photos/davidstanleytravel/31953578214,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 0ed5b6b75db86563,https://c1.staticflickr.com/6/5570/30613973841_dd1db7f854_o.jpg,0.0,0.0,0.56338028169,0.75,320,694,https://www.flickr.com/photos/treegrow/30613973841,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ cf4b507eddee0828,https://c1.staticflickr.com/8/7009/26195323853_a58fc9d97d_o.jpg,0.5,0.25,1.0,1.0,769,802,https://www.flickr.com/photos/132091501@N05/26195323853/,https://creativecommons.org/licenses/by/2.0/,Saffar Abdalah,https://www.flickr.com/people/132091501@N05/ 87c012e12f39ff79,https://c1.staticflickr.com/6/5718/30924340496_9e7250ca75_o.jpg,0.25,0.281690140845,1.0,0.845070422535,407,786,https://www.flickr.com/photos/eltb/30924340496,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ f00bd297dae41dfd,https://c1.staticflickr.com/9/8362/29293900803_fd14f9e319_o.jpg,0.0,0.0,0.5,0.75,629,751,https://www.flickr.com/photos/patrice_calatayu/29293900803,https://creativecommons.org/licenses/by/2.0/,Patrice CALATAYU,https://www.flickr.com/people/patrice_calatayu/ 7e5e38db024fae39,https://c1.staticflickr.com/1/291/31565963182_b2a0b2d526_o.jpg,0.25,0.0,0.75,0.75,556,697,https://www.flickr.com/photos/walterpro/31565963182/,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/ 7853d8c5bcddf639,https://c1.staticflickr.com/9/8462/28924770154_757c4bdc78_o.jpg,0.250553097345,0.25,0.751659292035,1.0,458,486,https://www.flickr.com/photos/romanboed/28924770154/,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/ 337c8f7c7b20b222,https://c1.staticflickr.com/9/8584/28242113744_a2c406a6eb_o.jpg,0.0,0.281690140845,0.75,0.845070422535,407,795,https://www.flickr.com/photos/eltb/28242113744,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 3c9610941395dd1f,https://c1.staticflickr.com/9/8352/29654371456_9a938111dc_o.jpg,0.0,0.0,0.7484375,1.0,309,384,https://www.flickr.com/photos/treegrow/29654371456,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 3f6cc90a41038b6f,https://c1.staticflickr.com/6/5495/30675223163_5f9422b5e0_o.jpg,0.0,0.25,0.5,1.0,519,634,https://www.flickr.com/photos/box_repsol/30675223163,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 2ca42dd6ef2815cf,https://c1.staticflickr.com/8/7318/27500591446_90e0066d79_o.jpg,0.0,0.25,0.5,1.0,855,429,https://www.flickr.com/photos/presidentialoffice/27500591446,https://creativecommons.org/licenses/by/2.0/,\347\270\275\347\265\261\345\272\234,https://www.flickr.com/people/presidentialoffice/ 3d3b1807318f0478,https://c1.staticflickr.com/6/5708/30526609924_b50bd868c5_o.jpg,0.4375,0.0,1.0,0.75,657,504,https://www.flickr.com/photos/nzcarfreak/30526609924/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 210a7d8ca572c12a,https://c1.staticflickr.com/6/5334/29949222700_ea8fee8893_o.jpg,0.25,0.0,0.75,0.75,973,551,https://www.flickr.com/photos/tanj/29949222700,https://creativecommons.org/licenses/by/2.0/,tanjila ahmed,https://www.flickr.com/people/tanj/ 5f9d13820921fb77,https://c1.staticflickr.com/9/8679/28281391953_074c2d2090_o.jpg,0.25,0.0,1.0,0.75,100,846,https://www.flickr.com/photos/28169156@N03/28281391953,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/ 054741fb2bbf75da,https://c1.staticflickr.com/6/5486/30483643042_27b95c963b_o.jpg,0.0,0.25,0.5,1.0,868,288,https://www.flickr.com/photos/76969036@N02/30483643042,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ 80137521805682f5,https://c1.staticflickr.com/8/7415/27022420330_72211aa0ae_o.jpg,0.0,0.0,1.0,0.799676898223,518,874,https://www.flickr.com/photos/n28307/27022420330,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/ e8f105fba60a0633,https://c1.staticflickr.com/9/8766/28439487580_6a331f0900_o.jpg,0.0,0.0,0.515344311377,0.75,139,519,https://www.flickr.com/photos/dkeats/28439487580,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/ 595ddb2e9afb8936,https://c1.staticflickr.com/6/5761/31364357796_de619cfec8_o.jpg,0.499263622975,0.0,0.99852724595,0.75,699,214,https://www.flickr.com/photos/126654539@N08/31364357796,https://creativecommons.org/licenses/by/2.0/,Phil Dolby,https://www.flickr.com/people/126654539@N08/ ab5c4888a4f1094b,https://c1.staticflickr.com/1/431/30912771704_ab8ff5a95d_o.jpg,0.0,0.0,0.5,0.75,662,771,https://www.flickr.com/photos/greggjerdingen/30912771704,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ 4e5b38bde3e8e4e1,https://c1.staticflickr.com/3/2408/32668491350_bc9f625c20_o.jpg,0.0,0.0,1.0,1.0,976,366,https://www.flickr.com/photos/clairity/32668491350,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/ 435a34365638275f,https://c1.staticflickr.com/8/7386/28138672215_5f75139463_o.jpg,0.0,0.25,0.5625,1.0,920,678,https://www.flickr.com/photos/nostri-imago/28138672215,https://creativecommons.org/licenses/by/2.0/,Cliff,https://www.flickr.com/people/nostri-imago/ d46fded6be786e43,https://c1.staticflickr.com/9/8612/27634665354_681f5b6e2d_o.jpg,0.0,0.0,0.75,0.498159057437,864,634,https://www.flickr.com/photos/alaska_region/27634665354,https://creativecommons.org/licenses/by/2.0/,USDA Forest Service Alaska Region,https://www.flickr.com/people/alaska_region/ 66a35333c68a0849,https://c1.staticflickr.com/8/7330/27632217990_e145d65978_o.jpg,0.42654028436,0.0,1.0,0.75,975,363,https://www.flickr.com/photos/ncoker/27632217990/,https://creativecommons.org/licenses/by/2.0/,ned_coker,https://www.flickr.com/people/ncoker/ 801ad9fa49217249,https://c1.staticflickr.com/9/8615/28166353040_799710b63e_o.jpg,0.497426470588,0.0,0.994852941176,0.75,546,511,https://www.flickr.com/photos/trishamanasan/28166353040,https://creativecommons.org/licenses/by/2.0/,tc_manasan,https://www.flickr.com/people/trishamanasan/ f0dc944b6a1609ae,https://c1.staticflickr.com/8/7190/27049521445_7271dbe08c_o.jpg,0.25,0.295673076923,1.0,0.887019230769,481,850,https://www.flickr.com/photos/79157069@N03/27049521445,https://creativecommons.org/licenses/by/2.0/,Matthew Paul Argall,https://www.flickr.com/people/79157069@N03/ 6468da21ace1b901,https://c1.staticflickr.com/1/518/30908707833_2de16124be_o.jpg,0.280784844384,0.0,0.842354533153,1.0,981,784,https://flickr.com/149503105@N07/30908707833,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ 7d520d4829cb5aab,https://c1.staticflickr.com/8/7718/27351821750_9685b86d03_o.jpg,0.5,0.0,1.0,0.75,821,436,https://www.flickr.com/photos/elsie/27351821750,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/ 8c20f23d9f4d4e8c,https://c1.staticflickr.com/8/7645/28454913406_cdeea42249_o.jpg,0.0,0.0,1.0,1.0,480,661,https://www.flickr.com/photos/moto_club4ag/28454913406,https://creativecommons.org/licenses/by/2.0/,Moto "Club4AG" Miwa,https://www.flickr.com/people/moto_club4ag/ 155a239fc082b2e0,https://c1.staticflickr.com/8/7581/28379393045_5823328332_o.jpg,0.25,0.0,1.0,0.75,844,606,https://www.flickr.com/photos/blmurch/28379393045,https://creativecommons.org/licenses/by/2.0/,Beatrice Murch,https://www.flickr.com/people/blmurch/ a7920e219c49dd21,https://c1.staticflickr.com/9/8555/28425490445_f54fdaf6b1_o.jpg,0.0,0.0,0.665684830633,1.0,548,802,https://www.flickr.com/photos/robdammers/28425490445,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/ 838495724e23ac62,https://c1.staticflickr.com/8/7179/27497369654_383ceb9353_o.jpg,0.4375,0.25,1.0,1.0,974,608,https://www.flickr.com/photos/noaaphotolib/27497369654,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/ 2fdfbffb2c298099,https://c1.staticflickr.com/8/7399/27232578162_6f8d9fc8f0_o.jpg,0.25,0.25,0.75,1.0,519,538,https://www.flickr.com/photos/box_repsol/27232578162,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/ 96824de66bf662e6,https://c1.staticflickr.com/8/7245/27387152334_b4d8a8cb51_o.jpg,0.400242326333,0.0,1.0,0.75,985,614,https://www.flickr.com/photos/billmorrow/27387152334,https://creativecommons.org/licenses/by/2.0/,Bill Morrow,https://www.flickr.com/people/billmorrow/ b824fbce8f8c77ce,https://c1.staticflickr.com/8/7334/28067333826_47ef801ab0_o.jpg,0.0,0.25,0.5,1.0,539,730,https://www.flickr.com/photos/jdlasica/28067333826,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/ 85a7b55e9f714c93,https://c1.staticflickr.com/6/5681/30435245365_57e605a32d_o.jpg,0.25,0.25,0.75,1.0,819,687,https://flickr.com/59740516@N08/30435245365,https://creativecommons.org/licenses/by/2.0/,Gunnar M\303\241r Hauksson,https://www.flickr.com/people/gunnarmh/ b3fb2c13905c6b0b,https://c1.staticflickr.com/9/8419/30124174620_6bfe750ba9_o.jpg,0.286277602524,0.0,0.858832807571,0.75,986,817,https://www.flickr.com/photos/cmichel67/30124174620,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/ 562df2f149a10d80,https://c1.staticflickr.com/6/5335/30253208263_1cdbcfc5a0_o.jpg,0.0,0.4375,0.75,1.0,901,845,https://www.flickr.com/photos/davidwilson1949/30253208263/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/ b39c0f81189d7125,https://c1.staticflickr.com/1/529/32009314935_5928837885_o.jpg,0.0,0.25,0.5625,1.0,979,782,http://www.flickr.com/photos/h3h/32009314935/,https://creativecommons.org/licenses/by/2.0/,Brad Fults,https://www.flickr.com/people/h3h/ e44acefb4bdb07b8,https://c1.staticflickr.com/8/7488/28116720336_9c583e051a_o.jpg,0.249631811487,0.0,0.748895434462,0.75,653,771,https://www.flickr.com/photos/mtaphotos/28116720336,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/ a37ca39c603553f4,https://c1.staticflickr.com/9/8485/28811253743_0db58fd23e_o.jpg,0.25,0.0,0.75,0.75,699,810,https://www.flickr.com/photos/26700188@N05/28811253743,https://creativecommons.org/licenses/by/2.0/,besopha,https://www.flickr.com/people/26700188@N05/ 58320d9cf4b6092d,https://c1.staticflickr.com/8/7436/27367241993_ebedb6955c_o.jpg,0.0,0.0,0.511567164179,0.75,976,542,https://www.flickr.com/photos/12463666@N03/27367241993,https://creativecommons.org/licenses/by/2.0/,Bob M ~,https://www.flickr.com/people/12463666@N03/ 3284433ea3e2a79e,https://c1.staticflickr.com/1/527/31838246061_25a9b10f7a_o.jpg,0.0,0.0,0.714503816794,1.0,854,729,https://www.flickr.com/photos/13476480@N07/31838246061,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ e77349aa3908f37f,https://c1.staticflickr.com/8/7722/26477933564_70b76996f8_o.jpg,0.25,0.0,1.0,1.0,980,184,https://www.flickr.com/photos/ilri/26477933564,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/ a3619347c7c49176,https://c1.staticflickr.com/9/8303/29065194983_fb31725a55_o.jpg,0.25,0.25,0.75,1.0,971,306,https://www.flickr.com/photos/cristiano_betta/29065194983,https://creativecommons.org/licenses/by/2.0/,Cristiano Betta,https://www.flickr.com/people/cristiano_betta/ 4c23ce60b4f34cd6,https://c1.staticflickr.com/1/352/31351035214_3d7c16a6be_o.jpg,0.0,0.0,0.702797202797,0.75,920,535,https://flickr.com/46052415@N08/31351035214,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 685d7c32af8c7541,https://c1.staticflickr.com/1/391/32387568125_08fc6fb589_o.jpg,0.28125,0.25,0.84375,1.0,676,1000,https://www.flickr.com/photos/27665395@N05/32387568125,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ f065d67949b67574,https://c1.staticflickr.com/8/7340/27774921576_af0b55bd0f_o.jpg,0.0,0.0,0.665684830633,1.0,113,917,https://www.flickr.com/photos/jsjgeology/27774921576,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ ac532b3cd64be7bb,https://c1.staticflickr.com/8/7213/26755420372_57a2583b83_o.jpg,0.0,0.0,0.75,1.0,830,652,https://www.flickr.com/photos/infrogmation/26755420372,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/ 5a7e5a9624cfcb3e,https://c1.staticflickr.com/9/8267/29632282993_397f78418c_o.jpg,0.0,0.0,1.0,1.0,426,643,https://www.flickr.com/photos/the_light_show/29632282993/,https://creativecommons.org/licenses/by/2.0/,chaps1,https://www.flickr.com/people/the_light_show/ aafcfbea3859a75e,https://c1.staticflickr.com/9/8770/28484805370_3f56729f4e_o.jpg,0.34375,0.0,1.0,0.75,459,862,https://www.flickr.com/photos/atoach/28484805370,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/ bbaadb6d719acb42,https://c1.staticflickr.com/6/5684/30778889451_22e125c63f_o.jpg,0.28125,0.0,0.84375,0.75,469,614,https://www.flickr.com/photos/gillyberlin/30778889451/in/album-72157674821053502/,https://creativecommons.org/licenses/by/2.0/,GillyBerlin,https://www.flickr.com/people/gillyberlin/ 8554665a898f8ec6,https://c1.staticflickr.com/3/2313/32903737856_c091f37ca6_o.jpg,0.0,0.0036036036036,1.0,1.0,512,570,https://www.flickr.com/photos/benoit59/32903737856,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/ 51640d336bf97a40,https://c1.staticflickr.com/9/8225/29059870865_7824f3e980_o.jpg,0.476244343891,0.0,1.0,0.75,673,442,https://www.flickr.com/photos/lasuperlili/29059870865/,https://creativecommons.org/licenses/by/2.0/,LetNoun,https://www.flickr.com/people/lasuperlili/ 4561d75e1eb2008d,https://c1.staticflickr.com/9/8774/28423951903_1a45a30432_o.jpg,0.28125,0.25,0.84375,1.0,709,92,https://flickr.com/127226743@N02/28423951903,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/ 59477acb3d5d7a0d,https://c1.staticflickr.com/6/5523/30265074450_ef3a8a2e88_o.jpg,0.0,0.0,0.421177266576,0.75,985,451,https://www.flickr.com/photos/crysisrubel/30265074450/,https://creativecommons.org/licenses/by/2.0/,Crysis Rubel,https://www.flickr.com/people/crysisrubel/ 4edf885a00cd08b6,https://c1.staticflickr.com/1/338/31634262561_7a1fa632bd_o.jpg,0.0,0.273726851852,0.75,0.821180555556,895,450,https://www.flickr.com/photos/bryanalexander/31634262561,https://creativecommons.org/licenses/by/2.0/,Bryan Alexander,https://www.flickr.com/people/bryanalexander/ 9d35cab047945982,https://c1.staticflickr.com/1/288/31087113293_c99bc0a19d_o.jpg,0.29939516129,0.0,0.898185483871,0.75,972,262,https://flickr.com/17467193@N00/31087113293,https://creativecommons.org/licenses/by/2.0/,jesse1dog,https://www.flickr.com/people/jesseflickrdog/ 30a8ecf40a9446de,https://c1.staticflickr.com/9/8790/28550491332_029135e099_o.jpg,0.0,0.0,0.5625,0.75,986,569,https://www.flickr.com/photos/torsten-behrens/28550491332,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/ b3c21426c8875562,https://c1.staticflickr.com/8/7623/26804576616_7a3ce918b6_o.jpg,0.498153618907,0.25,1.0,1.0,450,866,https://www.flickr.com/photos/paulmannix/26804576616/,https://creativecommons.org/licenses/by/2.0/,Paul Mannix,https://www.flickr.com/people/paulmannix/ 767c263d463a9b94,https://c1.staticflickr.com/1/703/31380590702_50bdd31066_o.jpg,0.0,0.0,0.733746130031,1.0,520,865,https://www.flickr.com/photos/polnostyuvse/31380590702/,https://creativecommons.org/licenses/by/2.0/,\320\262\320\260\321\200\321\210\321\211 + \321\205\320\273\320\276\320\277\320\270\320\271,https://www.flickr.com/people/polnostyuvse/ 663614da001313c7,https://c1.staticflickr.com/9/8317/27801930034_bc35d0f176_o.jpg,0.0,0.0,0.66814159292,1.0,934,870,https://www.flickr.com/photos/personalcreations/27801930034,https://creativecommons.org/licenses/by/2.0/,Personal Creations,https://www.flickr.com/people/personalcreations/ 68d5273237304f04,https://c1.staticflickr.com/9/8570/30157601692_1024d7c8f6_o.jpg,0.25,0.25,0.75,1.0,85,490,https://www.flickr.com/photos/jsjgeology/30157601692,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d2ad6c48a51f8d92,https://c1.staticflickr.com/8/7348/26572767423_2baf79b10f_o.jpg,0.242767295597,0.0,0.728301886792,1.0,518,810,https://www.flickr.com/photos/sbl/26572767423,https://creativecommons.org/licenses/by/2.0/,jens kuu,https://www.flickr.com/people/sbl/ e293fbc87aa225c3,https://c1.staticflickr.com/9/8587/28623937382_2d530646d5_o.jpg,0.25,0.0,0.75,0.75,405,856,https://flickr.com/60911558@N04/28623937382,https://creativecommons.org/licenses/by/2.0/,Ian Gratton,https://www.flickr.com/people/ian_a_gratton/ 86a895427c96ca68,https://c1.staticflickr.com/9/8604/28354828195_cf6a5c1a47_o.jpg,0.25,0.4375,1.0,1.0,438,730,https://www.flickr.com/photos/normalsanik/28354828195,https://creativecommons.org/licenses/by/2.0/,normalsanik,https://www.flickr.com/people/normalsanik/ f548d86cd829fdb6,https://c1.staticflickr.com/9/8552/29273200371_033c4513da_o.jpg,0.0,0.25,0.5,1.0,561,804,https://flickr.com/21841998@N06/29273200371,https://creativecommons.org/licenses/by/2.0/,The People's Tribune,https://www.flickr.com/people/21841998@N06/ 34f8525365d47f3a,https://c1.staticflickr.com/8/7469/26963601325_723a96ea5b_o.jpg,0.25,0.5,1.0,1.0,553,998,https://www.flickr.com/photos/68158920@N08/26963601325,https://creativecommons.org/licenses/by/2.0/,pdjohnson,https://www.flickr.com/people/68158920@N08/ 4e736252a0b8f3b8,https://c1.staticflickr.com/8/7532/28918099361_65c6c64a3e_o.jpg,0.0,0.0,0.5,0.75,752,802,https://www.flickr.com/photos/42220226@N07/28918099361,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/ 254ac39248b21522,https://c1.staticflickr.com/1/499/32338720481_65ed79aaa1_o.jpg,0.438671875,0.25,1.0,1.0,536,577,https://www.flickr.com/photos/glorycycles/32338720481,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 243135506de968ec,https://c1.staticflickr.com/8/7232/26732959301_b32ab85282_o.jpg,0.333333333333,0.0,1.0,1.0,891,814,https://www.flickr.com/photos/recserv/26732959301,https://creativecommons.org/licenses/by/2.0/,Recreational Services,https://www.flickr.com/people/recserv/ bbeaae3521881745,https://c1.staticflickr.com/6/5676/29848886643_0141fe96ed_o.jpg,0.5,0.0,1.0,0.75,416,677,https://www.flickr.com/photos/gotovan/29848886643/,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/ 2a7cec863613ad30,https://c1.staticflickr.com/9/8404/28801973161_98ffdc04fb_o.jpg,0.0,0.25,0.501846381093,1.0,673,921,https://www.flickr.com/photos/139421366@N03/28801973161,https://creativecommons.org/licenses/by/2.0/,Chris Bee,https://www.flickr.com/people/139421366@N03/ 21155a5258a45a27,https://c1.staticflickr.com/6/5725/30209918326_8629735f0d_o.jpg,0.5,0.0,1.0,0.75,364,493,https://www.flickr.com/photos/happymillerman/30209918326,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ 5ba78ef4eb4b5fed,https://c1.staticflickr.com/1/630/31965465392_938326c642_o.jpg,0.264605462822,0.0,0.793816388467,0.75,437,796,https://www.flickr.com/photos/hugo90/31965465392,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/ 228eb33ee8e56c09,https://c1.staticflickr.com/1/459/32262984911_c86484c7a2_o.jpg,0.25,0.0,1.0,0.531155015198,755,60,https://www.flickr.com/photos/51764518@N02/32262984911,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 98787e46deedc940,https://c1.staticflickr.com/8/7567/27101317783_424d29751b_o.jpg,0.0,0.25,0.5,1.0,821,5,https://www.flickr.com/photos/big-ashb/27101317783/,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/ 0ce9d90ff8fda05d,https://c1.staticflickr.com/6/5754/31101319172_97c21189d3_o.jpg,0.450540958269,0.25,1.0,1.0,820,456,https://www.flickr.com/photos/jus10h/31101319172,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 23fd1a86ae1e6bbc,https://c1.staticflickr.com/9/8395/29945265306_99a9e21269_o.jpg,0.28125,0.0,0.84375,0.75,735,727,https://www.flickr.com/photos/27665395@N05/29945265306,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/ f7c5f3674656f4f8,https://c1.staticflickr.com/8/7607/28776748586_661d1ffacf_o.jpg,0.292105263158,0.25,1.0,1.0,309,928,https://www.flickr.com/photos/gails_pictures/28776748586,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 26800a7c683139a5,https://c1.staticflickr.com/6/5624/30911992306_78e8b81a3a_o.jpg,0.0,0.25,0.5625,1.0,566,148,https://www.flickr.com/photos/railwayofaustralia/30911992306/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/ 30e85d1e2c85669f,https://c1.staticflickr.com/3/2483/32833836286_729d961ba7_o.jpg,0.0,0.0,1.0,1.0,926,754,https://www.flickr.com/photos/yto/32833836286,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/ 8a038f144892de74,https://c1.staticflickr.com/6/5739/30735760786_acc8569edd_o.jpg,0.498153618907,0.25,1.0,1.0,610,146,https://www.flickr.com/photos/wakataitea/30735760786/,https://creativecommons.org/licenses/by/2.0/,hans wakataitea,https://www.flickr.com/people/wakataitea/ c1ba5f088cd57777,https://c1.staticflickr.com/2/1521/26653240642_df0bb615d5_o.jpg,0.278188180404,0.0,0.834564541213,0.75,438,856,https://www.flickr.com/photos/kansallisarkisto/26653240642,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/ 4e8ed9b40a06347b,https://c1.staticflickr.com/9/8404/30001929842_10ec3ac0c5_o.jpg,0.0,0.0,0.676077265973,1.0,461,39,https://www.flickr.com/photos/126654539@N08/30001929842,https://creativecommons.org/licenses/by/2.0/,Phil Dolby,https://www.flickr.com/people/126654539@N08/ 23a4a4aa1ce48ed7,https://c1.staticflickr.com/9/8771/29609018051_c11f73a97f_o.jpg,0.0,0.0,1.0,0.998194945848,499,412,https://www.flickr.com/photos/13476480@N07/29609018051/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ 12604190c39067c4,https://c1.staticflickr.com/9/8194/29489268131_b726c7cb7e_o.jpg,0.0,0.25,0.5625,1.0,971,286,https://www.flickr.com/photos/mountrainiernps/29489268131,https://creativecommons.org/licenses/by/2.0/,Mount Rainier National Park,https://www.flickr.com/people/mountrainiernps/ 109bbd75d9482b76,https://c1.staticflickr.com/6/5826/30708175501_8338cc7d03_o.jpg,0.223015320334,0.0,0.669045961003,0.75,556,529,https://www.flickr.com/photos/kansasscanner/30708175501,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/ dd9a51c03871e2df,https://c1.staticflickr.com/6/5240/29918577515_1bf2f338ab_o.jpg,0.28125,0.25,0.84375,1.0,583,489,https://www.flickr.com/photos/infrogmation/29918577515,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/ fffcdfd68e315642,https://c1.staticflickr.com/6/5488/29542854934_542cdd043e_o.jpg,0.502573529412,0.0,1.0,0.75,887,617,https://www.flickr.com/photos/toomore/29542854934,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/ 7e2635e5357b97f4,https://c1.staticflickr.com/6/5348/25357678069_fe17656184_o.jpg,0.5,0.0,1.0,0.75,704,642,https://www.flickr.com/photos/stevendepolo/25357678069,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ e9b4744a260b323e,https://c1.staticflickr.com/8/7281/26543860733_1b90f9cced_o.jpg,0.446030640669,0.25,0.892061281337,1.0,645,966,https://www.flickr.com/photos/bryanalexander/26543860733,https://creativecommons.org/licenses/by/2.0/,Bryan Alexander,https://www.flickr.com/people/bryanalexander/ c6e76def54c2b6ab,https://c1.staticflickr.com/9/8803/28278820324_e90f1e1a81_o.jpg,0.0,0.305989583333,0.75,1.0,17,472,https://flickr.com/9494793@N06/28278820324,https://creativecommons.org/licenses/by/2.0/,shrikant rao,https://www.flickr.com/people/9494793@N06/ 40dab89f9645f8ae,https://c1.staticflickr.com/8/7349/27291988094_0afb90f35a_o.jpg,0.594621513944,0.25,1.0,1.0,305,617,https://www.flickr.com/photos/m-a-r-t-i-n/27291988094,https://creativecommons.org/licenses/by/2.0/,Martin Cooper,https://www.flickr.com/people/m-a-r-t-i-n/ a101a53c492140a1,https://c1.staticflickr.com/8/7437/26895430856_d411e97a44_o.jpg,0.5,0.0,1.0,0.75,769,495,https://www.flickr.com/photos/galwegians/26895430856/,https://creativecommons.org/licenses/by/2.0/,Galwegians Rugby,https://www.flickr.com/people/galwegians/ 1dbe97d0379ab9c5,https://c1.staticflickr.com/8/7298/27751596661_a039153e7c_o.jpg,0.203198494826,0.25,0.406396989652,1.0,780,78,https://www.flickr.com/photos/thoseguys119/27751596661,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ a73752530022b44d,https://c1.staticflickr.com/6/5630/30987530100_048f9e520a_o.jpg,0.251849112426,0.0,0.755547337278,0.75,896,577,https://www.flickr.com/photos/13476480@N07/30987530100/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ c7547d2ee03ee69d,https://c1.staticflickr.com/9/8549/30266636766_a176d82ea9_o.jpg,0.4375,0.0,1.0,0.75,625,607,https://flickr.com/135302410@N02/30266636766,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/ bb9aa62e89632c7d,https://c1.staticflickr.com/8/7464/29743738816_b0b83f324b_o.jpg,0.400242326333,0.25,1.0,1.0,133,866,https://www.flickr.com/photos/donmillertogo/29743738816/,https://creativecommons.org/licenses/by/2.0/,Don Miller,https://www.flickr.com/people/donmillertogo/ 7c01e0d1a303d2f3,https://c1.staticflickr.com/9/8420/29155784033_72a36cc6c0_o.jpg,0.578822733424,0.0,1.0,0.75,441,829,https://www.flickr.com/photos/subzonica/29155784033,https://creativecommons.org/licenses/by/2.0/,Hern\303\241n Garc\303\255a Crespo,https://www.flickr.com/people/subzonica/ 655b6788c1315279,https://c1.staticflickr.com/9/8883/29247953915_ddd4888552_o.jpg,0.0,0.0,0.75,1.0,937,933,https://www.flickr.com/photos/scotnelson/29247953915/,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ 5a211b16bae489d8,https://c1.staticflickr.com/6/5598/30704295670_aaec5b307d_o.jpg,0.0,0.0,0.97504456328,1.0,518,267,https://flickr.com/130921112@N07/30704295670,https://creativecommons.org/licenses/by/2.0/,Governor Tom Wolf,https://www.flickr.com/people/governortomwolf/ 34c0e98505f21171,https://c1.staticflickr.com/6/5614/30941289433_ebecf9c5c1_o.jpg,0.0,0.25,0.42174796748,1.0,958,14,https://www.flickr.com/photos/98302443@N00/30941289433,https://creativecommons.org/licenses/by/2.0/,Shalu Sharma,https://www.flickr.com/people/98302443@N00/ ecbf91f2df3ef9eb,https://c1.staticflickr.com/8/7661/27961191812_b6e319662e_o.jpg,0.0,0.0,1.0,1.0,563,861,https://www.flickr.com/photos/83015819@N00/27961191812,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/ cda835d476e0c303,https://c1.staticflickr.com/1/614/32499451306_42d0de0df1_o.jpg,0.249631811487,0.0,0.748895434462,0.75,780,717,https://www.flickr.com/photos/thoseguys119/32499451306,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 45ad724c3815c7b8,https://c1.staticflickr.com/8/7372/26916105626_8298375324_o.jpg,0.0,0.25,0.5,1.0,848,524,https://www.flickr.com/photos/7armyjmtc/26916105626/,https://creativecommons.org/licenses/by/2.0/,7th Army Training Command,https://www.flickr.com/people/7armyjmtc/ 3ef78722fb50dc4e,https://c1.staticflickr.com/1/281/32188072501_dd5d47127f_o.jpg,0.25,0.0,1.0,0.75,931,517,https://flickr.com/13102974@N00/32188072501,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/ 137dfc0abf39ed5e,https://c1.staticflickr.com/6/5772/30687856481_e7ed50f385_o.jpg,0.276595744681,0.25,1.0,1.0,309,465,https://www.flickr.com/photos/gails_pictures/30687856481,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ ad19cc3febf757e6,https://c1.staticflickr.com/9/8583/29924605133_05fb3cb7e1_o.jpg,0.0,0.502573529412,0.75,1.0,340,287,https://www.flickr.com/photos/yakobusan/29924605133/,https://creativecommons.org/licenses/by/2.0/,Jakob Montrasio,https://www.flickr.com/people/yakobusan/ 22a6de1e01888655,https://c1.staticflickr.com/8/7398/27280854834_6bebb3f100_o.jpg,0.443623639191,0.0,1.0,0.75,980,22,https://www.flickr.com/photos/wangjs/27280854834,https://creativecommons.org/licenses/by/2.0/,Jiashiang,https://www.flickr.com/people/wangjs/ 268dac5b873d3530,https://c1.staticflickr.com/6/5485/32171699355_1f16beeed3_o.jpg,0.25,0.400242326333,1.0,1.0,931,532,https://www.flickr.com/photos/sixteenmilesofstring/32171699355,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/ b139fbe563887bcf,https://c1.staticflickr.com/8/7572/27197514215_faf0675220_o.jpg,0.133271202237,0.0,0.39981360671,1.0,821,418,https://www.flickr.com/photos/jsjgeology/27197514215,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ d2a50ead60c0b157,https://c1.staticflickr.com/4/3851/32931502042_9553a0ef75_o.jpg,0.0,0.25,0.607317073171,1.0,323,962,https://www.flickr.com/photos/gails_pictures/32931502042,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/ 261eeba61cd73331,https://c1.staticflickr.com/9/8482/28689100292_ecb46c0f95_o.jpg,0.0,0.333333333333,1.0,1.0,490,377,https://www.flickr.com/photos/pasa/28689100292/,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/ 13105cb5634b9a49,https://c1.staticflickr.com/8/7056/27107312625_ef95e2a069_o.jpg,0.5,0.0,1.0,0.75,541,361,https://www.flickr.com/photos/133937251@N05/27107312625,https://creativecommons.org/licenses/by/2.0/,Ende Gel\303\244nde,https://www.flickr.com/people/133937251@N05/ fcfcc61c4b07e16d,https://c1.staticflickr.com/9/8784/28976070496_b23e3a0b2c_o.jpg,0.503303964758,0.0,1.0,0.75,920,602,https://www.flickr.com/photos/investmentzen/28976070496,https://creativecommons.org/licenses/by/2.0/,Investment Zen,https://www.flickr.com/people/investmentzen/ db2991615682db75,https://c1.staticflickr.com/1/726/31538320631_4cfcf3b91d_o.jpg,0.0,0.25,0.5,1.0,25,647,https://www.flickr.com/photos/kamcmillan/31538320631/,https://creativecommons.org/licenses/by/2.0/,Ken McMillan,https://www.flickr.com/people/kamcmillan/ 86702bbd3c4d4f89,https://c1.staticflickr.com/9/8480/28350467743_6f5537fda0_o.jpg,0.493045387994,0.0,0.986090775988,0.75,826,706,https://www.flickr.com/photos/anandajoti/28350467743,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/ eaa4a85d25ce39f5,https://c1.staticflickr.com/8/7585/27027131144_84a01f83f9_o.jpg,0.249631811487,0.0,0.748895434462,0.75,909,565,https://www.flickr.com/photos/jm-photography/27027131144/,https://creativecommons.org/licenses/by/2.0/,jeffrey montes,https://www.flickr.com/people/jm-photography/ ee0e6080dddf5703,https://c1.staticflickr.com/6/5207/29351498774_18234848d2_o.jpg,0.282874617737,0.0,1.0,1.0,975,846,https://www.flickr.com/photos/jsjgeology/29351498774,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/ e414052fda796eb9,https://c1.staticflickr.com/1/357/30746013933_bfb1931024_o.jpg,0.3,0.0,0.9,1.0,920,746,https://flickr.com/46052415@N08/30746013933,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/ 57ca6160263d94d6,https://c1.staticflickr.com/6/5506/30928887792_fa06653274_o.jpg,0.0,0.0,0.75,0.75,579,466,https://flickr.com/52244076@N06/30928887792,https://creativecommons.org/licenses/by/2.0/,MikuMarmalade,https://www.flickr.com/people/miku-marmalade/ 9b4db99ec2377808,https://c1.staticflickr.com/8/7388/27158529342_e4e9cbd346_o.jpg,0.50015060241,0.0,0.833584337349,0.75,780,445,https://www.flickr.com/photos/thoseguys119/27158529342/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ 4ed04153c045ea71,https://c1.staticflickr.com/6/5460/29507740443_4cfa7e96ea_o.jpg,0.0,0.0,0.5625,0.75,937,497,https://www.flickr.com/photos/scotnelson/29507740443,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/ f024d688f3924217,https://c1.staticflickr.com/1/263/32796974715_04e14ff09d_o.jpg,0.223849372385,0.0,0.671548117155,0.75,437,209,https://www.flickr.com/photos/autohistorian/32796974715,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/ ae232d0f74605317,https://c1.staticflickr.com/1/300/32193750935_ac178c1503_o.jpg,0.28125,0.25,0.84375,1.0,437,190,https://www.flickr.com/photos/nzcarfreak/32193750935/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ 7c8463c279d68e6b,https://c1.staticflickr.com/1/713/31513626785_6f1178432e_o.jpg,0.25,0.0,1.0,0.75,442,268,https://flickr.com/62558987@N07/31513626785,https://creativecommons.org/licenses/by/2.0/,"Kurman Communications, Inc.",https://www.flickr.com/people/kurmanphotos/ 3995ad179c709c84,https://c1.staticflickr.com/9/8615/28451661715_6a2813bbcb_o.jpg,0.0,0.25,0.5,1.0,647,763,https://www.flickr.com/photos/tipsfortravellers/28451661715,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/ aa6827ae0a593711,https://c1.staticflickr.com/8/7713/26254501373_c163f88b35_o.jpg,0.333333333333,0.0,1.0,1.0,719,144,https://www.flickr.com/photos/francisvallance/26254501373,https://creativecommons.org/licenses/by/2.0/,Francis Vallance (Heritage Warrior),https://www.flickr.com/people/francisvallance/ 3d9ad62bf4ab0b13,https://c1.staticflickr.com/8/7777/28291997911_8285fd7055_o.jpg,0.0,0.0,0.697735191638,0.75,683,643,https://www.flickr.com/photos/13476480@N07/28291997911,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/ bfcddc8708aced98,https://c1.staticflickr.com/9/8566/28881297121_de4fd43c71_o.jpg,0.0,0.0,0.5,0.75,354,449,https://www.flickr.com/photos/alanclark/28881297121,https://creativecommons.org/licenses/by/2.0/,Alan Clark,https://www.flickr.com/people/alanclark/ 46c7ceea2b75121c,https://c1.staticflickr.com/6/5571/30299364414_e8c7263c4d_o.jpg,0.0,0.0,0.5,0.75,470,302,https://www.flickr.com/photos/amslerpix/30299364414/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/ 981709a956b1fd25,https://c1.staticflickr.com/9/8329/29087032425_beb74263fe_o.jpg,0.5,0.0,1.0,0.75,621,730,https://www.flickr.com/photos/statenskartverk/29087032425,https://creativecommons.org/licenses/by/2.0/,Kartverket,https://www.flickr.com/people/statenskartverk/ e860dd4f427ab3a2,https://c1.staticflickr.com/9/8549/29870558446_a808cb710a_o.jpg,0.0,0.0,0.5625,0.75,820,620,https://flickr.com/89246112@N00/29870558446,https://creativecommons.org/licenses/by/2.0/,Bart,https://www.flickr.com/people/89246112@N00/ 5b892db51a31a5c0,https://c1.staticflickr.com/9/8639/27839994073_b07714484f_o.jpg,0.322931785196,0.0,0.968795355588,1.0,752,106,https://www.flickr.com/photos/mdpettitt/27839994073,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/ 83c37b1bad359074,https://c1.staticflickr.com/8/7433/26932375335_381e5c1030_o.jpg,0.248713235294,0.0,0.746139705882,0.75,834,943,https://www.flickr.com/photos/usnavy/26932375335,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ 978fe748ed471e15,https://c1.staticflickr.com/1/545/31787250433_9f39ac7b89_o.jpg,0.4375,0.0,1.0,0.75,437,511,https://www.flickr.com/photos/nzcarfreak/31787250433/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/ d0eaf6fd93c44abe,https://c1.staticflickr.com/9/8185/29487563706_a15c9244c1_o.jpg,0.28125,0.25,0.84375,1.0,109,68,https://www.flickr.com/photos/mypubliclands/29487563706,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 4ada4520102001a5,https://c1.staticflickr.com/1/494/31615767056_8ac77aa682_o.jpg,0.0,0.200323101777,1.0,1.0,563,551,https://flickr.com/10485077@N06/31615767056,https://creativecommons.org/licenses/by/2.0/,"Eden, Janine and Jim",https://www.flickr.com/people/edenpictures/ b75d4a5e7aaa4cfa,https://c1.staticflickr.com/1/771/30940459194_f76847a7f3_o.jpg,0.0,0.25,0.5625,1.0,704,518,https://flickr.com/104342908@N08/30940459194,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/ 50111847ea478991,https://c1.staticflickr.com/9/8494/29675571856_5a9935f26f_o.jpg,0.438671875,0.25,1.0,1.0,27,138,https://www.flickr.com/photos/treegrow/29675571856,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 974a04e784e5e198,https://c1.staticflickr.com/8/7547/26799575725_d8664b7c2c_o.jpg,0.0,0.25,0.5625,1.0,780,18,https://www.flickr.com/photos/thoseguys119/26799575725/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ bfa1720aad5a71e1,https://c1.staticflickr.com/8/7570/27750301885_c8ef3e1f21_o.jpg,0.0,0.25,0.5,1.0,978,292,https://www.flickr.com/photos/clearlyambiguous/27750301885,https://creativecommons.org/licenses/by/2.0/,Scott Robinson,https://www.flickr.com/people/clearlyambiguous/ 0fa6619e1d719771,https://c1.staticflickr.com/9/8370/29658924176_dafe2e70ea_o.jpg,0.4375,0.0,1.0,0.75,481,869,https://www.flickr.com/photos/jeepersmedia/29658924176,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ d55218a482e5a546,https://c1.staticflickr.com/9/8794/28971021403_80e7afd968_o.jpg,0.25,0.0,0.75,0.75,826,318,https://www.flickr.com/photos/mypubliclands/28971021403,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management,https://www.flickr.com/people/mypubliclands/ 4ca8d6fd58b58706,https://c1.staticflickr.com/8/7423/27794180135_dbbd2eb4be_o.jpg,0.0,0.25,0.5,1.0,404,417,https://www.flickr.com/photos/usnavy/27794180135,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/ cf932781aae2ac43,https://c1.staticflickr.com/9/8539/29004626402_2c74c80dc8_o.jpg,0.25,0.0,1.0,0.75,563,436,https://www.flickr.com/photos/87249144@N08/29004626402/,https://creativecommons.org/licenses/by/2.0/,FolsomNatural,https://www.flickr.com/people/87249144@N08/ bdd716c95ce26487,https://c1.staticflickr.com/8/7399/27387253424_741247df73_o.jpg,0.0,0.0,0.5625,0.75,738,617,https://www.flickr.com/photos/jeepersmedia/27387253424,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ 4f5e38e8cf60aedf,https://c1.staticflickr.com/8/7611/27754339715_4f5c8bd5f6_o.jpg,0.0,0.0,0.75,1.0,338,385,https://www.flickr.com/photos/nature80020/27754339715,https://creativecommons.org/licenses/by/2.0/,nature80020,https://www.flickr.com/people/nature80020/ 933417539c52a3ae,https://c1.staticflickr.com/6/5618/31324317931_25a81a14d4_o.jpg,0.28125,0.0,0.84375,0.75,965,586,https://www.flickr.com/photos/stevendepolo/31324317931,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/ 56f7ad089702ca1b,https://c1.staticflickr.com/6/5509/30650278201_f673e278b5_o.jpg,0.250553097345,0.0,0.751659292035,0.75,693,554,http://www.flickr.com/photos/erix/30650278201/,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand,https://www.flickr.com/people/erix/ 2e04fde62e10dbbb,https://c1.staticflickr.com/1/649/32020042313_a7b3a61213_o.jpg,0.0,0.0,1.0,1.0,869,607,https://www.flickr.com/photos/30478819@N08/32020042313,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/ bf0cbc34e1c31343,https://c1.staticflickr.com/6/5769/30228196633_deb94de512_o.jpg,0.0,0.25,0.5,1.0,473,629,https://www.flickr.com/photos/camppinewood/30228196633/,https://creativecommons.org/licenses/by/2.0/,Camp Pinewood,https://www.flickr.com/people/camppinewood/ 67c1cc213415e711,https://c1.staticflickr.com/1/706/31190410530_0bed92184e_o.jpg,0.4375,0.0,1.0,0.75,2,295,https://www.flickr.com/photos/dubster/31190410530/,https://creativecommons.org/licenses/by/2.0/,Dubi Kaufmann,https://www.flickr.com/people/dubster/ 7f34c2ad7f4821f2,https://c1.staticflickr.com/1/308/32349117701_5e47c9bc47_o.jpg,0.0,0.25,0.5,1.0,793,587,https://flickr.com/92793865@N07/32349117701,https://creativecommons.org/licenses/by/2.0/,Galeria del Ministerio de Defensa del Per\303\272,https://www.flickr.com/people/ministeriodedefensaperu/ c84bcc8d6d795f24,https://c1.staticflickr.com/8/7050/27513501296_2bcb3747d6_o.jpg,0.267938931298,0.0,0.803816793893,0.75,973,568,https://www.flickr.com/photos/ruthanddave/27513501296,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ 899ef69fc6bcfa4a,https://c1.staticflickr.com/8/7691/27299804871_8a264cd1f1_o.jpg,0.335787923417,0.0,1.0,1.0,459,894,https://www.flickr.com/photos/londonmatt/27299804871,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/ d5931a9914f7765f,https://c1.staticflickr.com/9/8138/29012387976_259617f44a_o.jpg,0.5,0.25,1.0,1.0,896,523,https://www.flickr.com/photos/soldiersmediacenter/29012387976,https://creativecommons.org/licenses/by/2.0/,The U.S. Army,https://www.flickr.com/people/soldiersmediacenter/ ff8746649ab3f934,https://c1.staticflickr.com/9/8688/30192840776_6f00e3af78_o.jpg,0.0,0.498153618907,0.75,1.0,407,795,https://www.flickr.com/photos/eltb/30192840776,https://creativecommons.org/licenses/by/2.0/,Catedrales e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/ 786fdbb6581b38f0,https://c1.staticflickr.com/9/8143/29815032402_00b3a80887_o.jpg,0.0,0.0,0.75,0.75,938,146,https://www.flickr.com/photos/jcbrandon/29815032402,https://creativecommons.org/licenses/by/2.0/,Farther Along,https://www.flickr.com/people/jcbrandon/ c1a9b83c9c7c8ad5,https://c1.staticflickr.com/8/7401/27389457714_35fc8e943a_o.jpg,0.0,0.28125,0.75,0.84375,981,269,https://www.flickr.com/photos/usdagov/27389457714,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/ 4fc0d5234680582e,https://c1.staticflickr.com/8/7398/27494067812_7c5205c244_o.jpg,0.28125,0.25,0.84375,1.0,780,23,https://www.flickr.com/photos/thoseguys119/27494067812,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ f3abe16a33f0b8a6,https://c1.staticflickr.com/2/1662/26727102896_6aa53b55a7_o.jpg,0.25,0.0,0.75,0.75,874,783,https://www.flickr.com/photos/flynn_nrg/26727102896/,https://creativecommons.org/licenses/by/2.0/,Miguel Mendez,https://www.flickr.com/people/flynn_nrg/ 58fc5d9fcf6f23f7,https://c1.staticflickr.com/9/8827/29069940253_e3fab86c67_o.jpg,0.4375,0.25,1.0,1.0,481,411,https://www.flickr.com/photos/jeepersmedia/29069940253,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/ e1cb60b8cd997417,https://c1.staticflickr.com/1/681/32754033794_47c9e15c85_o.jpg,0.249631811487,0.25,0.748895434462,1.0,747,819,https://www.flickr.com/photos/mark6mauno/32754033794,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/ 863ca84267d8e8b2,https://c1.staticflickr.com/6/5496/31293038651_5cae95952d_o.jpg,0.28125,0.25,0.84375,1.0,490,965,https://flickr.com/136987764@N03/31293038651,https://creativecommons.org/licenses/by/2.0/,ystsoi,https://www.flickr.com/people/136987764@N03/ 6ee2a3e9f33a690f,https://c1.staticflickr.com/1/385/32175562862_f0115e6a48_o.jpg,0.4375,0.0,1.0,0.75,980,669,https://www.flickr.com/photos/davidstanleytravel/32175562862,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/ 7b5654633ce5b30b,https://c1.staticflickr.com/8/7393/27498622033_48141d442a_o.jpg,0.0,0.0,0.75,0.5625,980,640,https://www.flickr.com/photos/ruthanddave/27498622033,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/ ec72d7b70a4e4bd0,https://c1.staticflickr.com/6/5496/30382727226_4d54d017e9_o.jpg,0.395867098865,0.0,1.0,0.75,539,759,https://www.flickr.com/photos/22711505@N05/30382727226,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/ 6437205d8c82e0a6,https://c1.staticflickr.com/1/780/31268057140_14e88f0afa_o.jpg,0.0,0.25,0.5,1.0,819,446,https://www.flickr.com/photos/92592438@N04/31268057140/,https://creativecommons.org/licenses/by/2.0/,Simeon Berg,https://www.flickr.com/people/92592438@N04/ ee410ee55940d799,https://c1.staticflickr.com/8/7540/27597421481_86cdd88a49_o.jpg,0.0,0.0,0.666666666667,1.0,618,970,https://www.flickr.com/photos/ucdaviscoe/27597421481,https://creativecommons.org/licenses/by/2.0/,UC Davis College of Engineering,https://www.flickr.com/people/ucdaviscoe/ 58c1f41617158f95,https://c1.staticflickr.com/8/7606/27286002021_817049446c_o.jpg,0.28125,0.25,0.84375,1.0,699,748,https://www.flickr.com/photos/zongo/27286002021,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/ 528b7a8443c8ff42,https://c1.staticflickr.com/1/697/32161603130_2f50f52d65_o.jpg,0.25,0.0,0.75,0.75,422,666,https://www.flickr.com/photos/vallausa/32161603130/,https://creativecommons.org/licenses/by/2.0/,Sandra Vallaure,https://www.flickr.com/people/vallausa/ 911954f2e60f7f01,https://c1.staticflickr.com/1/580/31937560623_2dbe5d4c35_o.jpg,0.271313364055,0.0,0.813940092166,0.75,101,543,https://www.flickr.com/photos/wildreturn/31937560623/,https://creativecommons.org/licenses/by/2.0/,Andy Reago & Chrissy McClarren,https://www.flickr.com/people/wildreturn/ 6fb72c99a573d872,https://c1.staticflickr.com/6/5682/32348736215_f6b7dc9205_o.jpg,0.0,0.28125,0.75,0.84375,108,759,https://www.flickr.com/photos/jimg944/32348736215,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/ 6d48120c1bb80d32,https://c1.staticflickr.com/6/5608/30598440096_6bab176599_o.jpg,0.483695652174,0.25,0.967391304348,1.0,820,447,https://www.flickr.com/photos/jus10h/30598440096,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/ 8f3505c8e6454794,https://c1.staticflickr.com/9/8704/28833795002_ef3629475f_o.jpg,0.4375,0.25,1.0,1.0,459,787,https://www.flickr.com/photos/hinkelstone/28833795002,https://creativecommons.org/licenses/by/2.0/,Karl-Ludwig Poggemann,https://www.flickr.com/people/hinkelstone/ 6e3b9ccb07d3b81d,https://c1.staticflickr.com/6/5794/31078383382_51632acefc_o.jpg,0.0,0.0,0.5625,0.75,976,788,https://www.flickr.com/photos/conner395/31078383382,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/ 40bb932b6acf8cc8,https://c1.staticflickr.com/9/8325/29275242831_f38dc55d37_o.jpg,0.0,0.0,0.666666666667,1.0,38,829,https://flickr.com/129665369@N02/29275242831,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/ dce89277addc4074,https://c1.staticflickr.com/8/7612/28010168326_182297ff49_o.jpg,0.25,0.25,0.75,1.0,896,619,https://www.flickr.com/photos/markyharky/28010168326,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ d429a336d8aaf942,https://c1.staticflickr.com/6/5471/31433318845_7002317d39_o.jpg,0.210588633288,0.0,0.631765899865,0.75,818,224,https://www.flickr.com/photos/lwpkommunikacio/31433318845,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\303\241ci\303\263,https://www.flickr.com/people/lwpkommunikacio/ bf97721a1770eb55,https://c1.staticflickr.com/1/491/32238911612_b08a8dd04c_o.jpg,0.265577507599,0.25,0.796732522796,1.0,875,761,https://www.flickr.com/photos/grand_canyon_nps/32238911612,https://creativecommons.org/licenses/by/2.0/,Grand Canyon National Park,https://www.flickr.com/people/grand_canyon_nps/ 4717870ebe8c38c8,https://c1.staticflickr.com/9/8547/28090604464_159d489645_o.jpg,0.28125,0.0,0.84375,0.75,909,415,https://www.flickr.com/photos/mickaeltr/28090604464/,https://creativecommons.org/licenses/by/2.0/,Micka\303\253l T.,https://www.flickr.com/people/mickaeltr/ 7c973a7f04ef9ac9,https://c1.staticflickr.com/8/7504/27223435762_97e4858860_o.jpg,0.0,0.0,0.56338028169,0.75,407,340,https://www.flickr.com/photos/enneafive/27223435762,https://creativecommons.org/licenses/by/2.0/,Johan Neven,https://www.flickr.com/people/enneafive/ 2ef920eeebd4a9fa,https://c1.staticflickr.com/6/5767/30288729990_6736a90857_o.jpg,0.0,0.25,0.75,1.0,807,572,https://www.flickr.com/photos/glorycycles/30288729990,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/ 404c7b706f17e3a7,https://c1.staticflickr.com/8/7530/30030881622_0e33ec4d45_o.jpg,0.0,0.25,0.75,1.0,740,597,https://flickr.com/37409525@N05/30030881622,https://creativecommons.org/licenses/by/2.0/,GretaMichelle Joachim,https://www.flickr.com/people/michellegj/ f6e8a8fa627ab486,https://c1.staticflickr.com/8/7333/27326128272_8cec1e2472_o.jpg,0.0,0.0,1.0,1.0,829,116,https://www.flickr.com/photos/icanchangethisright/27326128272,https://creativecommons.org/licenses/by/2.0/,Bradley Gordon,https://www.flickr.com/people/icanchangethisright/ 037acb9fd8e29084,https://c1.staticflickr.com/1/694/32599556301_e4c538f40a_o.jpg,0.0,0.207395498392,1.0,1.0,612,955,https://www.flickr.com/photos/sotghwu/32599556301,https://creativecommons.org/licenses/by/2.0/,Grace Hwu,https://www.flickr.com/people/sotghwu/ d52be689d2672767,https://c1.staticflickr.com/1/456/32423482375_a9a60c69fd_o.jpg,0.28125,0.0,0.84375,0.75,922,706,https://flickr.com/71445589@N02/32423482375,https://creativecommons.org/licenses/by/2.0/,\303\211tienne Pouvreau,https://www.flickr.com/people/etiennepouvreau/ 0398af20cdc80e17,https://c1.staticflickr.com/8/7410/26888198482_81a2849352_o.jpg,0.487313432836,0.25,1.0,1.0,971,998,https://www.flickr.com/photos/weyes/26888198482,https://creativecommons.org/licenses/by/2.0/,Alessandro Caproni,https://www.flickr.com/people/weyes/ 2f5510205da8776d,https://c1.staticflickr.com/8/7660/27501516476_63a6c77a3c_o.jpg,0.0,0.0,0.75,0.5625,980,640,https://www.flickr.com/photos/cogdog/27501516476/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 55d4770499efeaa4,https://c1.staticflickr.com/9/8739/28816295785_cf045806d7_o.jpg,0.0,0.0,0.75,1.0,304,328,https://flickr.com/86548370@N00/28816295785,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/ 5e2795e93d116422,https://c1.staticflickr.com/1/436/31816887610_3aed2b1919_o.jpg,0.249631811487,0.0,0.748895434462,0.75,405,830,https://www.flickr.com/photos/markyharky/31816887610,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/ 241643e62f317913,https://c1.staticflickr.com/9/8199/29559949596_2810dc7e50_o.jpg,0.5,0.0,1.0,0.75,437,168,https://www.flickr.com/photos/greggjerdingen/29559949596,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/ c4f8b575d5929648,https://c1.staticflickr.com/6/5144/30052023461_d2feaee121_o.jpg,0.5,0.25,1.0,1.0,355,856,https://flickr.com/8634814@N03/30052023461,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/ c654a0c6043a2be7,https://c1.staticflickr.com/6/5452/30337894602_bbe13a6fc3_o.jpg,0.5,0.25,1.0,1.0,868,222,https://www.flickr.com/photos/76969036@N02/30337894602/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/ c994b784f45a6f02,https://c1.staticflickr.com/9/8462/29435829632_8899e78d0e_o.jpg,0.252730109204,0.0,1.0,1.0,512,355,https://www.flickr.com/photos/andreboeni/29435829632,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/ 7a1aaf28fcb230f1,https://c1.staticflickr.com/8/7295/27570145304_d7c563da84_o.jpg,0.0,0.25,0.5625,1.0,611,476,https://www.flickr.com/photos/cogdog/27570145304,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/ 8e6f46716c52ca61,https://c1.staticflickr.com/6/5489/31326184845_139b8d8f1d_o.jpg,0.5,0.0,1.0,0.75,948,774,https://www.flickr.com/photos/64933790@N00/31326184845,https://creativecommons.org/licenses/by/2.0/,Pato Novoa,https://www.flickr.com/people/64933790@N00/ cc614d907404a74c,https://c1.staticflickr.com/8/7438/27046250110_ae09d0647e_o.jpg,0.0,0.0,0.666666666667,1.0,706,414,https://www.flickr.com/photos/126337928@N05/27046250110,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/ 65cf51069efdaf96,https://c1.staticflickr.com/1/739/30880078254_766c5118b8_o.jpg,0.145528683915,0.0,0.436586051744,0.75,848,866,http://www.flickr.com/photos/mohit_s/30880078254/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/ 33eb044cba036dfd,https://c1.staticflickr.com/1/504/32787851015_c1d716df82_o.jpg,0.0,0.25,0.468616262482,1.0,699,495,http://www.flickr.com/photos/31176607@N05/32787851015,https://creativecommons.org/licenses/by/2.0/,kuhnmi,https://www.flickr.com/people/31176607@N05/ 77dcba158e450113,https://c1.staticflickr.com/6/5755/30446314871_d1df04b764_o.jpg,0.283163265306,0.0,0.849489795918,0.75,760,871,https://www.flickr.com/photos/51764518@N02/30446314871,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/ 3f8bba587fc11cef,https://c1.staticflickr.com/6/5608/30746539130_4a3266eb4f_o.jpg,0.0,0.0,0.75,0.75,599,842,https://www.flickr.com/photos/grantwickes/30746539130/,https://creativecommons.org/licenses/by/2.0/,Grant Wickes,https://www.flickr.com/people/grantwickes/ 76e817284d83c182,https://c1.staticflickr.com/9/8691/28495844145_63e9c8c34d_o.jpg,0.25,0.25,1.0,1.0,575,700,https://flickr.com/7831824@N04/28495844145,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/ 7eda6af195a61a91,https://c1.staticflickr.com/8/7186/27305401282_c5546078ce_o.jpg,0.5,0.0,1.0,0.75,405,976,https://www.flickr.com/photos/alessandroambrosetti/27305401282,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/ b8070817c83b5224,https://c1.staticflickr.com/1/592/32952561555_d8447bf9cb_o.jpg,0.292105263158,0.0,1.0,0.75,431,796,https://flickr.com/21207441@N08/32952561555,https://creativecommons.org/licenses/by/2.0/,Michelle Milla,https://www.flickr.com/people/michellemilla/ f0062fb379eefa26,https://c1.staticflickr.com/1/781/31811137746_60f712a939_o.jpg,0.281690140845,0.0,0.845070422535,0.75,469,767,https://www.flickr.com/photos/andyhay/31811137746,https://creativecommons.org/licenses/by/2.0/,Andy Hay,https://www.flickr.com/people/andyhay/ 23b2145369efc45d,https://c1.staticflickr.com/1/715/31056358404_32d2eb2aaa_o.jpg,0.243449781659,0.25,0.730349344978,1.0,490,831,https://www.flickr.com/photos/royluck/31056358404,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/ 3b4185b505fbfad2,https://c1.staticflickr.com/1/603/30872960764_9220bb57d6_o.jpg,0.438430311231,0.0,1.0,1.0,818,478,https://flickr.com/149503105@N07/30872960764,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/ 0596087dd0ebc76b,https://c1.staticflickr.com/6/5717/30449115936_bd3d06760f_o.jpg,0.49889380531,0.0,1.0,0.75,855,784,https://www.flickr.com/photos/scatto_felino/30449115936/,https://creativecommons.org/licenses/by/2.0/,Marco,https://www.flickr.com/people/scatto_felino/ 9c404556c905cd2c,https://c1.staticflickr.com/8/7562/26836060583_f154a64dc5_o.jpg,0.297202797203,0.0,1.0,0.75,304,64,https://www.flickr.com/photos/m-a-r-t-i-n/26836060583,https://creativecommons.org/licenses/by/2.0/,Martin Cooper,https://www.flickr.com/people/m-a-r-t-i-n/ 03e38a597881f7ad,https://c1.staticflickr.com/3/2826/33341223922_1e71444a5d_o.jpg,0.28125,0.0,0.84375,0.75,780,872,http://www.flickr.com/photos/62048854@N08/33341223922,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/ ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/.gitignore ================================================ # ignoring dataset subdirectory dataset/ ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/README.md ================================================ # Development toolkit for participants of adversarial competition This is a development toolkit for the [Competition on Adversarial Examples and Defenses](https://www.kaggle.com/nips-2017-adversarial-learning-competition) which will be held as a part of NIPS'17 conference. This toolkit includes: * Dev dataset which participants can use for development and testing of their attacks and defenses * Sample adversarial attacks * Sample adversarial defenses * Tool to run attacks against defenses and compute score. ## Installation ### Prerequisites Following software required to use this package: * Python 2.7 with installed [Numpy](http://www.numpy.org/) and [Pillow](https://python-pillow.org/) packages. * [Docker](https://www.docker.com/) Additionally, all provided examples are written with use of the [TensorFlow](https://www.tensorflow.org/). Thus you may find useful to install TensorFlow to experiment with the examples, however this is not strictly necessary. ### Installation procedure To be able to run the examples you need to download checkpoints for provided models as well as dataset. To download the dataset and all checkpoints run following: ```bash ./download_data.sh ``` If you only need to download the dataset then you can run: ```bash # ${DATASET_IMAGES_DIR} is a directory to save images python ../dataset/download_images.py \ --input_file=../dataset/dev_dataset.csv \ --output_dir=${DATASET_IMAGES_DIR} ``` ## Dataset This toolkit includes DEV dataset with 1000 labelled images. DEV dataset could be used for development and testing of adversarial attacks and defenses. Details about dataset are [here](../dataset/README.md). ## Sample attacks and defenses Toolkit includes examples of attacks and defenses in the following directories: * `sample_attacks/` - directory with examples of attacks: * `sample_attacks/fgsm/` - Fast gradient sign attack. * `sample_attacks/noop/` - No-op attack, which just copied images unchanged. * `sample_attacks/random_noise/` - Attack which adds random noise to images. * `sample_targeted_attacks/` - directory with examples of targeted attacks: * `sample_targeted_attacks/step_target_class/` - one step towards target class attack. This is not particularly good targeted attack, but it demonstrates how targeted attack could be written. * `sample_targeted_attacks/iter_target_class/` - iterative target class attack. This is a pretty good white-box attack, but it does not do well in black box setting. * `sample_defenses/` - directory with examples of defenses: * `sample_defenses/base_inception_model/` - baseline inception classifier, which actually does not provide any defense against adversarial examples. * `sample_defenses/adv_inception_v3/` - adversarially trained Inception v3 model from [Adversarial Machine Learning at Scale](https://arxiv.org/abs/1611.01236) paper. * `sample_defenses/ens_adv_inception_resnet_v2/` - Inception ResNet v2 model which is adversarially trained against an ensemble of different kind of adversarial examples. Model is described in [Ensemble Adversarial Training: Attacks and Defenses](https://arxiv.org/abs/1705.07204) paper. ### Structure of attacks and defenses Each attack and defense should be stored in a separate subdirectory, should be self-contained and intended to be run inside Docker container. Directory with each attack or defense should contain file `metadata.json` in JSON format with following fields: * `type` could be one of `"attack"`, `"defense"` or `"targeted_attack"`. * `container` is a URL of Docker container inside which attack or defense should be run. * `container_gpu` is an optional field, URL of Docker container with GPU support. * `entry_point` is a script which launches attack or defense. Example of `metadata.json`: ```json { "type": "attack", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_attack.sh" } ``` #### Non-targeted attack Entry point script for a non-targeted attack should accept three arguments: input directory, output directory and maximum size of adversarial perturbation (in [infinity norm](https://en.wikipedia.org/wiki/Uniform_norm)). It will be invoked in the following way: ```bash attack_entry_point.sh INPUT_DIR OUTPUT_DIR MAX_SIZE_OF_PERTURBAION ``` Input directory will contain source images from dataset in PNG format and attack has to write adversarial images into output directory. Input images are 299x299 pixels RGB images, output images should have the same size and also written in PNG format. Filenames of adversarial images should be the same as filenames of corresponding source images from the dataset. Non-targeted attack is expected to produce adversarial images which are likely will be misclassified by image classifier (assuming that it can classify source images well). Difference between each generated adversarial images and corresponding source image has to be within specified maximum size of adversarial perturbation. If it's not the case then competition runtime will automatically clip adversarial image to be within the limits. #### Targeted attack Entry point script for a targeted attack accepts the same set of arguments as for non-targeted attack: input directory, output directory, maximum size of perturbation. The only difference is that input directory will contain `target_class.csv` file addition to images. Each line of `target_class.csv` will contain comma-separated pairs of image filename and target class. Targeted attack is expected to produce adversarial image which will be likely classified as desired target class by image classifier. Difference between source images and generated adversarial images should be within specified maximum size of perturbation, similarly to non-targeted attack. #### Defense Entry point script for a defense accepts two arguments: input directory and output file. It will be invoked in a following way: ```bash defense_entry_point.sh INPUT_DIR OUTPUT_FILE ``` Input directory will contain bunch of adversarial images in PNG format. Defense has to classify all these images and write its predictions into output file. Each line of the output file should contain comma separated image filename and predicted label. ## How to run attacks against defenses Script `run_attacks_and_defenses.py` runs all attacks against all defenses and computes scores of each attack and each defense. You can run it in a following way: ```bash python run_attacks_and_defenses.py \ --attacks_dir="${DIRECTORY_WITH_ATTACKS}" \ --targeted_attacks_dir="${DIRECTORY_WITH_TARGETED_ATTACKS}" \ --defenses_dir="${DIRECTORY_WITH_DEFENSES}" \ --dataset_dir="${DIRECTORY_WITH_DATASET_IMAGES}" \ --intermediate_results_dir="${TEMP_DIRECTORY_FOR_INTERMEDIATE_RESULTS}" \ --dataset_metadata=dataset/dataset.csv \ --output_dir="${OUTPUT_DIRECTORY}" \ --epsilon="${MAXIMUM_SIZE_OF_ADVERSARIAL_PERTURBATION}" ``` If you have GPU card and [nvidia-docker](https://github.com/NVIDIA/nvidia-docker) installed then you can additionally pass `--gpu` argument to `run_attacks_and_defenses.py` so attacks and defenses will be able to take advantage of GPU to speedup computations. Alternatively instead of running `run_attacks_and_defenses.py` directly and providing all command line arguments you can use helper script `run_attacks_and_defenses.sh` to run all attacks and defenses from this toolkit against each other and save results to temporary directory. NOTE: You should cleanup temporary directory created by `run_attacks_and_defenses.sh` after running it. `run_attacks_and_defenses.py` will write following files into output directory: * `accuracy_on_attacks.csv` with matrix which will contain number of correctly classified images for each pair of non-targeted attack and defense. Columns of the matrix are defenses, rows of the matrix are non-targeted attacks. * `accuracy_on_targeted_attacks.csv` with matrix which will contain number of correctly classified images for each pair of targeted attack and defense. Columns of the matrix are defenses, rows of the matrix are targeted attacks. * `hit_target_class.csv` with matrix which will contain number of times images were classified as target class by defense for each given targeted attack. Columns of the matrix are defenses, rows of the matrix are targeted attacks. * `defense_ranking.csv` with ranking of all defenses (best - first, worst - last, ties in arbitrary order), along with the score of each defense. Score for each defense is computed as total number of correctly classified adversarial images by defense classifier. * `attack_ranking.csv` with ranking of all non-targeted (best - first, worst - last, ties in arbitrary order), along with the score of each attack. Score for each attack is computed as total number of time attack was able to cause incorrect classification * `targeted_attack_ranking.csv` with ranking of all targeted attacks (best - first, worst - last, ties in arbitrary order), along with the score of each targeted attack. Score is computed as number of times the attack was able to force defense classifier to recognize adversarial image as specified target class. Additionally, if flag `--save_all_classification` is provided then `run_attacks_and_defenses.py` will save file `all_classification.csv` which contains classification predictions (along with true classes and target classes) for each adversarial image generated by each attack and classified by each defense. This might be useful for debugging. ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/download_data.sh ================================================ #!/bin/bash cd "$( dirname "${BASH_SOURCE[0]}" )" # Download checkpoints for sample attacks and defenses. sample_attacks/download_checkpoints.sh sample_targeted_attacks/download_checkpoints.sh sample_defenses/download_checkpoints.sh # Download dataset. mkdir -p dataset/images cp ../dataset/dev_dataset.csv dataset/ python ../dataset/download_images.py \ --input_file=dataset/dev_dataset.csv \ --output_dir=dataset/images/ ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/run_attacks_and_defenses.py ================================================ """Tool which runs all attacks against all defenses and computes results.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import csv import json import os import subprocess import numpy as np from PIL import Image def parse_args(): """Parses command line arguments.""" parser = argparse.ArgumentParser(description="Tool to run attacks and defenses.") parser.add_argument("--attacks_dir", required=True, help="Location of all attacks.") parser.add_argument( "--targeted_attacks_dir", required=True, help="Location of all targeted attacks.", ) parser.add_argument( "--defenses_dir", required=True, help="Location of all defenses." ) parser.add_argument("--dataset_dir", required=True, help="Location of the dataset.") parser.add_argument( "--dataset_metadata", required=True, help="Location of the dataset metadata." ) parser.add_argument( "--intermediate_results_dir", required=True, help="Directory to store intermediate results.", ) parser.add_argument("--output_dir", required=True, help=("Output directory.")) parser.add_argument( "--epsilon", required=False, type=int, default=16, help="Maximum allowed size of adversarial perturbation", ) parser.add_argument("--gpu", dest="use_gpu", action="store_true") parser.add_argument("--nogpu", dest="use_gpu", action="store_false") parser.set_defaults(use_gpu=False) parser.add_argument( "--save_all_classification", dest="save_all_classification", action="store_true" ) parser.add_argument( "--nosave_all_classification", dest="save_all_classification", action="store_false", ) parser.set_defaults(save_all_classification=False) return parser.parse_args() class Submission(object): """Base class for all submissions.""" def __init__(self, directory, container, entry_point, use_gpu): """Initializes instance of Submission class. Args: directory: location of the submission. container: URL of Docker container which should be used to run submission. entry_point: entry point script, which invokes submission. use_gpu: whether to use Docker with GPU or not. """ self.name = os.path.basename(directory) self.directory = directory self.container = container self.entry_point = entry_point self.use_gpu = use_gpu def docker_binary(self): """Returns appropriate Docker binary to use.""" return "nvidia-docker" if self.use_gpu else "docker" class Attack(Submission): """Class which stores and runs attack.""" def run(self, input_dir, output_dir, epsilon): """Runs attack inside Docker. Args: input_dir: directory with input (dataset). output_dir: directory where output (adversarial images) should be written. epsilon: maximum allowed size of adversarial perturbation, should be in range [0, 255]. """ print("Running attack ", self.name) cmd = [ self.docker_binary(), "run", "-v", "{0}:/input_images".format(input_dir), "-v", "{0}:/output_images".format(output_dir), "-v", "{0}:/code".format(self.directory), "-w", "/code", self.container, "./" + self.entry_point, "/input_images", "/output_images", str(epsilon), ] print(" ".join(cmd)) subprocess.call(cmd) class Defense(Submission): """Class which stores and runs defense.""" def run(self, input_dir, output_dir): """Runs defense inside Docker. Args: input_dir: directory with input (adversarial images). output_dir: directory to write output (classification result). """ print("Running defense ", self.name) cmd = [ self.docker_binary(), "run", "-v", "{0}:/input_images".format(input_dir), "-v", "{0}:/output_data".format(output_dir), "-v", "{0}:/code".format(self.directory), "-w", "/code", self.container, "./" + self.entry_point, "/input_images", "/output_data/result.csv", ] print(" ".join(cmd)) subprocess.call(cmd) def read_submissions_from_directory(dirname, use_gpu): """Scans directory and read all submissions. Args: dirname: directory to scan. use_gpu: whether submissions should use GPU. This argument is used to pick proper Docker container for each submission and create instance of Attack or Defense class. Returns: List with submissions (subclasses of Submission class). """ result = [] for sub_dir in os.listdir(dirname): submission_path = os.path.join(dirname, sub_dir) try: if not os.path.isdir(submission_path): continue if not os.path.exists(os.path.join(submission_path, "metadata.json")): continue with open(os.path.join(submission_path, "metadata.json")) as f: metadata = json.load(f) if use_gpu and ("container_gpu" in metadata): container = metadata["container_gpu"] else: container = metadata["container"] entry_point = metadata["entry_point"] submission_type = metadata["type"] if submission_type == "attack" or submission_type == "targeted_attack": submission = Attack(submission_path, container, entry_point, use_gpu) elif submission_type == "defense": submission = Defense(submission_path, container, entry_point, use_gpu) else: raise ValueError("Invalid type of submission: %s" % submission_type) result.append(submission) except (IOError, KeyError, ValueError): print("Failed to read submission from directory ", submission_path) return result class AttacksOutput(object): """Helper class to store data about images generated by attacks.""" def __init__( self, dataset_dir, attacks_output_dir, targeted_attacks_output_dir, all_adv_examples_dir, epsilon, ): """Initializes instance of AttacksOutput class. Args: dataset_dir: location of the dataset. attacks_output_dir: where to write results of attacks. targeted_attacks_output_dir: where to write results of targeted attacks. all_adv_examples_dir: directory to copy all adversarial examples from all attacks. epsilon: maximum allowed size of adversarial perturbation. """ self.attacks_output_dir = attacks_output_dir self.targeted_attacks_output_dir = targeted_attacks_output_dir self.all_adv_examples_dir = all_adv_examples_dir self._load_dataset_clipping(dataset_dir, epsilon) self._output_image_idx = 0 self._output_to_attack_mapping = {} self._attack_image_count = 0 self._targeted_attack_image_count = 0 self._attack_names = set() self._targeted_attack_names = set() def _load_dataset_clipping(self, dataset_dir, epsilon): """Helper method which loads dataset and determines clipping range. Args: dataset_dir: location of the dataset. epsilon: maximum allowed size of adversarial perturbation. """ self.dataset_max_clip = {} self.dataset_min_clip = {} self._dataset_image_count = 0 for fname in os.listdir(dataset_dir): if not fname.endswith(".png"): continue image_id = fname[:-4] image = np.array( Image.open(os.path.join(dataset_dir, fname)).convert("RGB") ) image = image.astype("int32") self._dataset_image_count += 1 self.dataset_max_clip[image_id] = np.clip(image + epsilon, 0, 255).astype( "uint8" ) self.dataset_min_clip[image_id] = np.clip(image - epsilon, 0, 255).astype( "uint8" ) def clip_and_copy_attack_outputs(self, attack_name, is_targeted): """Clips results of attack and copy it to directory with all images. Args: attack_name: name of the attack. is_targeted: if True then attack is targeted, otherwise non-targeted. """ if is_targeted: self._targeted_attack_names.add(attack_name) else: self._attack_names.add(attack_name) attack_dir = os.path.join( self.targeted_attacks_output_dir if is_targeted else self.attacks_output_dir, attack_name, ) for fname in os.listdir(attack_dir): if not (fname.endswith(".png") or fname.endswith(".jpg")): continue image_id = fname[:-4] if image_id not in self.dataset_max_clip: continue image_max_clip = self.dataset_max_clip[image_id] image_min_clip = self.dataset_min_clip[image_id] adversarial_image = np.array( Image.open(os.path.join(attack_dir, fname)).convert("RGB") ) clipped_adv_image = np.clip( adversarial_image, image_min_clip, image_max_clip ) output_basename = "{0:08d}".format(self._output_image_idx) self._output_image_idx += 1 self._output_to_attack_mapping[output_basename] = ( attack_name, is_targeted, image_id, ) if is_targeted: self._targeted_attack_image_count += 1 else: self._attack_image_count += 1 Image.fromarray(clipped_adv_image).save( os.path.join(self.all_adv_examples_dir, output_basename + ".png") ) @property def attack_names(self): """Returns list of all non-targeted attacks.""" return self._attack_names @property def targeted_attack_names(self): """Returns list of all targeted attacks.""" return self._targeted_attack_names @property def attack_image_count(self): """Returns number of all images generated by non-targeted attacks.""" return self._attack_image_count @property def dataset_image_count(self): """Returns number of all images in the dataset.""" return self._dataset_image_count @property def targeted_attack_image_count(self): """Returns number of all images generated by targeted attacks.""" return self._targeted_attack_image_count def image_by_base_filename(self, filename): """Returns information about image based on it's filename.""" return self._output_to_attack_mapping[filename] class DatasetMetadata(object): """Helper class which loads and stores dataset metadata.""" def __init__(self, filename): """Initializes instance of DatasetMetadata.""" self._true_labels = {} self._target_classes = {} with open(filename) as f: reader = csv.reader(f) header_row = next(reader) try: row_idx_image_id = header_row.index("ImageId") row_idx_true_label = header_row.index("TrueLabel") row_idx_target_class = header_row.index("TargetClass") except ValueError: raise IOError("Invalid format of dataset metadata.") for row in reader: if len(row) < len(header_row): # skip partial or empty lines continue try: image_id = row[row_idx_image_id] self._true_labels[image_id] = int(row[row_idx_true_label]) self._target_classes[image_id] = int(row[row_idx_target_class]) except (IndexError, ValueError): raise IOError("Invalid format of dataset metadata") def get_true_label(self, image_id): """Returns true label for image with given ID.""" return self._true_labels[image_id] def get_target_class(self, image_id): """Returns target class for image with given ID.""" return self._target_classes[image_id] def save_target_classes(self, filename): """Saves target classed for all dataset images into given file.""" with open(filename, "w") as f: for k, v in self._target_classes.items(): f.write("{0}.png,{1}\n".format(k, v)) def load_defense_output(filename): """Loads output of defense from given file.""" result = {} with open(filename) as f: for row in csv.reader(f): try: image_filename = row[0] if image_filename.endswith(".png") or image_filename.endswith(".jpg"): image_filename = image_filename[: image_filename.rfind(".")] label = int(row[1]) except (IndexError, ValueError): continue result[image_filename] = label return result def compute_and_save_scores_and_ranking( attacks_output, defenses_output, dataset_meta, output_dir, save_all_classification=False, ): """Computes scores and ranking and saves it. Args: attacks_output: output of attacks, instance of AttacksOutput class. defenses_output: outputs of defenses. Dictionary of dictionaries, key in outer dictionary is name of the defense, key of inner dictionary is name of the image, value of inner dictionary is classification label. dataset_meta: dataset metadata, instance of DatasetMetadata class. output_dir: output directory where results will be saved. save_all_classification: If True then classification results of all defenses on all images produces by all attacks will be saved into all_classification.csv file. Useful for debugging. This function saves following files into output directory: accuracy_on_attacks.csv: matrix with number of correctly classified images for each pair of defense and attack. accuracy_on_targeted_attacks.csv: matrix with number of correctly classified images for each pair of defense and targeted attack. hit_target_class.csv: matrix with number of times defense classified image as specified target class for each pair of defense and targeted attack. defense_ranking.csv: ranking and scores of all defenses. attack_ranking.csv: ranking and scores of all attacks. targeted_attack_ranking.csv: ranking and scores of all targeted attacks. all_classification.csv: results of classification of all defenses on all images produced by all attacks. Only saved if save_all_classification argument is True. """ def write_ranking(filename, header, names, scores): """Helper method which saves submissions' scores and names.""" order = np.argsort(scores)[::-1] with open(filename, "w") as f: writer = csv.writer(f) writer.writerow(header) for idx in order: writer.writerow([names[idx], scores[idx]]) def write_score_matrix(filename, scores, row_names, column_names): """Helper method which saves score matrix.""" result = np.pad(scores, ((1, 0), (1, 0)), "constant").astype(np.object) result[0, 0] = "" result[1:, 0] = row_names result[0, 1:] = column_names np.savetxt(filename, result, fmt="%s", delimiter=",") attack_names = list(attacks_output.attack_names) attack_names_idx = {name: index for index, name in enumerate(attack_names)} targeted_attack_names = list(attacks_output.targeted_attack_names) targeted_attack_names_idx = { name: index for index, name in enumerate(targeted_attack_names) } defense_names = list(defenses_output.keys()) defense_names_idx = {name: index for index, name in enumerate(defense_names)} # In the matrices below: rows - attacks, columns - defenses. accuracy_on_attacks = np.zeros( (len(attack_names), len(defense_names)), dtype=np.int32 ) accuracy_on_targeted_attacks = np.zeros( (len(targeted_attack_names), len(defense_names)), dtype=np.int32 ) hit_target_class = np.zeros( (len(targeted_attack_names), len(defense_names)), dtype=np.int32 ) for defense_name, defense_result in defenses_output.items(): for image_filename, predicted_label in defense_result.items(): attack_name, is_targeted, image_id = attacks_output.image_by_base_filename( image_filename ) true_label = dataset_meta.get_true_label(image_id) defense_idx = defense_names_idx[defense_name] if is_targeted: target_class = dataset_meta.get_target_class(image_id) if true_label == predicted_label: attack_idx = targeted_attack_names_idx[attack_name] accuracy_on_targeted_attacks[attack_idx, defense_idx] += 1 if target_class == predicted_label: attack_idx = targeted_attack_names_idx[attack_name] hit_target_class[attack_idx, defense_idx] += 1 else: if true_label == predicted_label: attack_idx = attack_names_idx[attack_name] accuracy_on_attacks[attack_idx, defense_idx] += 1 # Save matrices. write_score_matrix( os.path.join(output_dir, "accuracy_on_attacks.csv"), accuracy_on_attacks, attack_names, defense_names, ) write_score_matrix( os.path.join(output_dir, "accuracy_on_targeted_attacks.csv"), accuracy_on_targeted_attacks, targeted_attack_names, defense_names, ) write_score_matrix( os.path.join(output_dir, "hit_target_class.csv"), hit_target_class, targeted_attack_names, defense_names, ) # Compute and save scores and ranking of attacks and defenses, # higher scores are better. defense_scores = np.sum(accuracy_on_attacks, axis=0) + np.sum( accuracy_on_targeted_attacks, axis=0 ) attack_scores = attacks_output.dataset_image_count * len(defenses_output) - np.sum( accuracy_on_attacks, axis=1 ) targeted_attack_scores = np.sum(hit_target_class, axis=1) write_ranking( os.path.join(output_dir, "defense_ranking.csv"), ["DefenseName", "Score"], defense_names, defense_scores, ) write_ranking( os.path.join(output_dir, "attack_ranking.csv"), ["AttackName", "Score"], attack_names, attack_scores, ) write_ranking( os.path.join(output_dir, "targeted_attack_ranking.csv"), ["AttackName", "Score"], targeted_attack_names, targeted_attack_scores, ) if save_all_classification: with open(os.path.join(output_dir, "all_classification.csv"), "w") as f: writer = csv.writer(f) writer.writerow( [ "AttackName", "IsTargeted", "DefenseName", "ImageId", "PredictedLabel", "TrueLabel", "TargetClass", ] ) for defense_name, defense_result in defenses_output.items(): for image_filename, predicted_label in defense_result.items(): ( attack_name, is_targeted, image_id, ) = attacks_output.image_by_base_filename(image_filename) true_label = dataset_meta.get_true_label(image_id) target_class = dataset_meta.get_target_class(image_id) writer.writerow( [ attack_name, is_targeted, defense_name, image_id, predicted_label, true_label, target_class, ] ) def main(): """Run all attacks against all defenses and compute results.""" args = parse_args() attacks_output_dir = os.path.join(args.intermediate_results_dir, "attacks_output") targeted_attacks_output_dir = os.path.join( args.intermediate_results_dir, "targeted_attacks_output" ) defenses_output_dir = os.path.join(args.intermediate_results_dir, "defenses_output") all_adv_examples_dir = os.path.join( args.intermediate_results_dir, "all_adv_examples" ) # Load dataset metadata. dataset_meta = DatasetMetadata(args.dataset_metadata) # Load attacks and defenses. attacks = [ a for a in read_submissions_from_directory(args.attacks_dir, args.use_gpu) if isinstance(a, Attack) ] targeted_attacks = [ a for a in read_submissions_from_directory( args.targeted_attacks_dir, args.use_gpu ) if isinstance(a, Attack) ] defenses = [ d for d in read_submissions_from_directory(args.defenses_dir, args.use_gpu) if isinstance(d, Defense) ] print("Found attacks: ", [a.name for a in attacks]) print("Found tageted attacks: ", [a.name for a in targeted_attacks]) print("Found defenses: ", [d.name for d in defenses]) # Prepare subdirectories for intermediate results. os.mkdir(attacks_output_dir) os.mkdir(targeted_attacks_output_dir) os.mkdir(defenses_output_dir) os.mkdir(all_adv_examples_dir) for a in attacks: os.mkdir(os.path.join(attacks_output_dir, a.name)) for a in targeted_attacks: os.mkdir(os.path.join(targeted_attacks_output_dir, a.name)) for d in defenses: os.mkdir(os.path.join(defenses_output_dir, d.name)) # Run all non-targeted attacks. attacks_output = AttacksOutput( args.dataset_dir, attacks_output_dir, targeted_attacks_output_dir, all_adv_examples_dir, args.epsilon, ) for a in attacks: a.run(args.dataset_dir, os.path.join(attacks_output_dir, a.name), args.epsilon) attacks_output.clip_and_copy_attack_outputs(a.name, False) # Run all targeted attacks. dataset_meta.save_target_classes(os.path.join(args.dataset_dir, "target_class.csv")) for a in targeted_attacks: a.run( args.dataset_dir, os.path.join(targeted_attacks_output_dir, a.name), args.epsilon, ) attacks_output.clip_and_copy_attack_outputs(a.name, True) # Run all defenses. defenses_output = {} for d in defenses: d.run(all_adv_examples_dir, os.path.join(defenses_output_dir, d.name)) defenses_output[d.name] = load_defense_output( os.path.join(defenses_output_dir, d.name, "result.csv") ) # Compute and save scoring. compute_and_save_scores_and_ranking( attacks_output, defenses_output, dataset_meta, args.output_dir, args.save_all_classification, ) if __name__ == "__main__": main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/run_attacks_and_defenses.sh ================================================ #!/bin/bash # exit on first error set -e # directory where this script is located SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ATTACKS_DIR="${SCRIPT_DIR}/sample_attacks" TARGETED_ATTACKS_DIR="${SCRIPT_DIR}/sample_targeted_attacks" DEFENSES_DIR="${SCRIPT_DIR}/sample_defenses" DATASET_DIR="${SCRIPT_DIR}/dataset/images" DATASET_METADATA_FILE="${SCRIPT_DIR}/dataset/dev_dataset.csv" MAX_EPSILON=16 # Prepare working directory and copy all necessary files. # In particular copy attacks defenses and dataset, so originals won't # be overwritten. if [[ "${OSTYPE}" == "darwin"* ]]; then WORKING_DIR="/private"$(mktemp -d) else WORKING_DIR=$(mktemp -d) fi echo "Preparing working directory: ${WORKING_DIR}" mkdir "${WORKING_DIR}/attacks" mkdir "${WORKING_DIR}/targeted_attacks" mkdir "${WORKING_DIR}/defenses" mkdir "${WORKING_DIR}/dataset" mkdir "${WORKING_DIR}/intermediate_results" mkdir "${WORKING_DIR}/output_dir" cp -R "${ATTACKS_DIR}"/* "${WORKING_DIR}/attacks" cp -R "${TARGETED_ATTACKS_DIR}"/* "${WORKING_DIR}/targeted_attacks" cp -R "${DEFENSES_DIR}"/* "${WORKING_DIR}/defenses" cp -R "${DATASET_DIR}"/* "${WORKING_DIR}/dataset" cp "${DATASET_METADATA_FILE}" "${WORKING_DIR}/dataset.csv" echo "Running attacks and defenses" python "${SCRIPT_DIR}/run_attacks_and_defenses.py" \ --attacks_dir="${WORKING_DIR}/attacks" \ --targeted_attacks_dir="${WORKING_DIR}/targeted_attacks" \ --defenses_dir="${WORKING_DIR}/defenses" \ --dataset_dir="${WORKING_DIR}/dataset" \ --intermediate_results_dir="${WORKING_DIR}/intermediate_results" \ --dataset_metadata="${WORKING_DIR}/dataset.csv" \ --output_dir="${WORKING_DIR}/output_dir" \ --epsilon="${MAX_EPSILON}" \ --save_all_classification echo "Output is saved in directory '${WORKING_DIR}/output_dir'" ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/download_checkpoints.sh ================================================ #!/bin/bash # # Scripts which download checkpoints for provided models. # SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Download inception v3 checkpoint for fgsm attack. cd "${SCRIPT_DIR}/fgsm/" wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz tar -xvzf inception_v3_2016_08_28.tar.gz rm inception_v3_2016_08_28.tar.gz ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/attack_fgsm.py ================================================ """Implementation of sample attack.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import warnings import numpy as np import tensorflow as tf from tensorflow.contrib.slim.nets import inception from PIL import Image from cleverhans.attacks import FastGradientMethod slim = tf.contrib.slim tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", "", "Path to checkpoint for inception network." ) tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_dir", "", "Output directory with images.") tf.flags.DEFINE_float("max_epsilon", 16.0, "Maximum size of adversarial perturbation.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: image = np.array(Image.open(f).convert("RGB")).astype(np.float) / 255.0 # Images for inception classifier are normalized to be in [-1, 1] interval. images[idx, :, :, :] = image * 2.0 - 1.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def save_images(images, filenames, output_dir): """Saves images to the output directory. Args: images: array with minibatch of images filenames: list of filenames without path If number of file names in this list less than number of images in the minibatch then only first len(filenames) images will be saved. output_dir: directory where to save images """ for i, filename in enumerate(filenames): # Images for inception classifier are normalized to be in [-1, 1] interval, # so rescale them back to [0, 1]. with tf.gfile.Open(os.path.join(output_dir, filename), "w") as f: img = (((images[i, :, :, :] + 1.0) * 0.5) * 255.0).astype(np.uint8) Image.fromarray(img).save(f, format="PNG") class InceptionModel(object): """Model class for CleverHans library.""" def __init__(self, nb_classes=None, num_classes=None): if num_classes is not None: if nb_classes is not None: raise ValueError( "Should not specify both nb_classes and its deprecated" " alias, num_classes" ) warnings.warn( "`num_classes` is deprecated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23." ) nb_classes = num_classes del num_classes self.nb_classes = nb_classes self.built = False def __call__(self, x_input): """Constructs model and return probabilities for given input.""" reuse = True if self.built else None with slim.arg_scope(inception.inception_v3_arg_scope()): _, end_points = inception.inception_v3( x_input, num_classes=self.nb_classes, is_training=False, reuse=reuse ) self.built = True output = end_points["Predictions"] # Strip off the extra reshape op at the output probs = output.op.inputs[0] return probs def main(_): """Run the sample attack""" # Images for inception classifier are normalized to be in [-1, 1] interval, # eps is a difference between pixels so it should be in [0, 2] interval. # Renormalizing epsilon from [0, 255] to [0, 2]. eps = 2.0 * FLAGS.max_epsilon / 255.0 batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) model = InceptionModel(nb_classes) fgsm = FastGradientMethod(model) x_adv = fgsm.generate(x_input, eps=eps, clip_min=-1.0, clip_max=1.0) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: for filenames, images in load_images(FLAGS.input_dir, batch_shape): adv_images = sess.run(x_adv, feed_dict={x_input: images}) save_images(adv_images, filenames, FLAGS.output_dir) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/metadata.json ================================================ { "type": "attack", "container": "goodfellow/competition:cpu", "container_gpu": "goodfellow/competition:gpu", "entry_point": "run_attack.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/run_attack.sh ================================================ #!/bin/bash # # run_attack.sh is a script which executes the attack # # Envoronment which runs attacks and defences calls it in a following way: # run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON # where: # INPUT_DIR - directory with input PNG images # OUTPUT_DIR - directory where adversarial images should be written # MAX_EPSILON - maximum allowed L_{\infty} norm of adversarial perturbation # INPUT_DIR=$1 OUTPUT_DIR=$2 MAX_EPSILON=$3 python attack_fgsm.py \ --input_dir="${INPUT_DIR}" \ --output_dir="${OUTPUT_DIR}" \ --max_epsilon="${MAX_EPSILON}" \ --checkpoint_path=inception_v3.ckpt ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/noop/attack_noop.py ================================================ """Implementation of sample attack.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import numpy as np from scipy.misc import imread from scipy.misc import imsave import tensorflow as tf tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_dir", "", "Output directory with images.") tf.flags.DEFINE_float("max_epsilon", 16.0, "Maximum size of adversarial perturbation.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Length of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: images[idx, :, :, :] = imread(f, mode="RGB").astype(np.float) / 255.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def save_images(images, filenames, output_dir): """Saves images to the output directory. Args: images: array with minibatch of images filenames: list of filenames without path If number of file names in this list less than number of images in the minibatch then only first len(filenames) images will be saved. output_dir: directory where to save images """ for i, filename in enumerate(filenames): with tf.gfile.Open(os.path.join(output_dir, filename), "w") as f: imsave(f, images[i, :, :, :], format="png") def main(_): """Run the sample attack""" batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] for filenames, images in load_images(FLAGS.input_dir, batch_shape): save_images(images, filenames, FLAGS.output_dir) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/noop/metadata.json ================================================ { "type": "attack", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_attack.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/noop/run_attack.sh ================================================ #!/bin/bash # # run_attack.sh is a script which executes the attack # # Envoronment which runs attacks and defences calls it in a following way: # run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON # where: # INPUT_DIR - directory with input PNG images # OUTPUT_DIR - directory where adversarial images should be written # MAX_EPSILON - maximum allowed L_{\infty} norm of adversarial perturbation # INPUT_DIR=$1 OUTPUT_DIR=$2 # Noop attack does not care aboout epsilon # MAX_EPSILON=$3 python attack_noop.py \ --input_dir="${INPUT_DIR}" \ --output_dir="${OUTPUT_DIR}" ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/random_noise/attack_random_noise.py ================================================ """Implementation of sample attack.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import numpy as np from scipy.misc import imread from scipy.misc import imsave import tensorflow as tf tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_dir", "", "Output directory with images.") tf.flags.DEFINE_float("max_epsilon", 16.0, "Maximum size of adversarial perturbation.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: images[idx, :, :, :] = imread(f, mode="RGB").astype(np.float) / 255.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def save_images(images, filenames, output_dir): """Saves images to the output directory. Args: images: array with minibatch of images filenames: list of filenames without path If number of file names in this list less than number of images in the minibatch then only first len(filenames) images will be saved. output_dir: directory where to save images """ for i, filename in enumerate(filenames): with tf.gfile.Open(os.path.join(output_dir, filename), "w") as f: imsave(f, images[i, :, :, :], format="png") def main(_): """Run the sample attack""" eps = FLAGS.max_epsilon / 255.0 batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] with tf.Graph().as_default(): x_input = tf.placeholder(tf.float32, shape=batch_shape) noisy_images = x_input + eps * tf.sign(tf.random_normal(batch_shape)) x_output = tf.clip_by_value(noisy_images, 0.0, 1.0) with tf.Session(FLAGS.master) as sess: for filenames, images in load_images(FLAGS.input_dir, batch_shape): out_images = sess.run(x_output, feed_dict={x_input: images}) save_images(out_images, filenames, FLAGS.output_dir) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/random_noise/metadata.json ================================================ { "type": "attack", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_attack.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/random_noise/run_attack.sh ================================================ #!/bin/bash # # run_attack.sh is a script which executes the attack # # Envoronment which runs attacks and defences calls it in a following way: # run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON # where: # INPUT_DIR - directory with input PNG images # OUTPUT_DIR - directory where adversarial images should be written # MAX_EPSILON - maximum allowed L_{\infty} norm of adversarial perturbation # INPUT_DIR=$1 OUTPUT_DIR=$2 MAX_EPSILON=$3 python attack_random_noise.py \ --input_dir="${INPUT_DIR}" \ --output_dir="${OUTPUT_DIR}" \ --max_epsilon="${MAX_EPSILON}" ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/adv_inception_v3/defense.py ================================================ """Implementation of sample defense. This defense loads inception v3 checkpoint and classifies all images using loaded checkpoint. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import numpy as np from scipy.misc import imread import tensorflow as tf from tensorflow.contrib.slim.nets import inception slim = tf.contrib.slim tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", "", "Path to checkpoint for inception network." ) tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_file", "", "Output file to save labels.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: image = imread(f, mode="RGB").astype(np.float) / 255.0 # Images for inception classifier are normalized to be in [-1, 1] interval. images[idx, :, :, :] = image * 2.0 - 1.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def main(_): """Run the sample defense""" batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) with slim.arg_scope(inception.inception_v3_arg_scope()): _, end_points = inception.inception_v3( x_input, num_classes=nb_classes, is_training=False ) predicted_labels = tf.argmax(end_points["Predictions"], 1) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: with tf.gfile.Open(FLAGS.output_file, "w") as out_file: for filenames, images in load_images(FLAGS.input_dir, batch_shape): labels = sess.run(predicted_labels, feed_dict={x_input: images}) for filename, label in zip(filenames, labels): out_file.write("{0},{1}\n".format(filename, label)) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/adv_inception_v3/metadata.json ================================================ { "type": "defense", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_defense.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/adv_inception_v3/run_defense.sh ================================================ #!/bin/bash # # run_defense.sh is a script which executes the defense # # Envoronment which runs attacks and defences calls it in a following way: # run_defense.sh INPUT_DIR OUTPUT_FILE # where: # INPUT_DIR - directory with input PNG images # OUTPUT_FILE - file to store classification labels # INPUT_DIR=$1 OUTPUT_FILE=$2 python defense.py \ --input_dir="${INPUT_DIR}" \ --output_file="${OUTPUT_FILE}" \ --checkpoint_path=adv_inception_v3.ckpt ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/base_inception_model/defense.py ================================================ """Implementation of sample defense. This defense loads inception v3 checkpoint and classifies all images using loaded checkpoint. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import numpy as np from scipy.misc import imread import tensorflow as tf from tensorflow.contrib.slim.nets import inception slim = tf.contrib.slim tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", "", "Path to checkpoint for inception network." ) tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_file", "", "Output file to save labels.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: image = imread(f, mode="RGB").astype(np.float) / 255.0 # Images for inception classifier are normalized to be in [-1, 1] interval. images[idx, :, :, :] = image * 2.0 - 1.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def main(_): batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) with slim.arg_scope(inception.inception_v3_arg_scope()): _, end_points = inception.inception_v3( x_input, num_classes=nb_classes, is_training=False ) predicted_labels = tf.argmax(end_points["Predictions"], 1) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: with tf.gfile.Open(FLAGS.output_file, "w") as out_file: for filenames, images in load_images(FLAGS.input_dir, batch_shape): labels = sess.run(predicted_labels, feed_dict={x_input: images}) for filename, label in zip(filenames, labels): out_file.write("{0},{1}\n".format(filename, label)) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/base_inception_model/metadata.json ================================================ { "type": "defense", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_defense.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/base_inception_model/run_defense.sh ================================================ #!/bin/bash # # run_defense.sh is a script which executes the defense # # Envoronment which runs attacks and defences calls it in a following way: # run_defense.sh INPUT_DIR OUTPUT_FILE # where: # INPUT_DIR - directory with input PNG images # OUTPUT_FILE - file to store classification labels # INPUT_DIR=$1 OUTPUT_FILE=$2 python defense.py \ --input_dir="${INPUT_DIR}" \ --output_file="${OUTPUT_FILE}" \ --checkpoint_path=inception_v3.ckpt ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/download_checkpoints.sh ================================================ #!/bin/bash # # Scripts which download checkpoints for provided models. # SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Download inception v3 checkpoint into base_inception_model subdirectory cd "${SCRIPT_DIR}/base_inception_model/" wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz tar -xvzf inception_v3_2016_08_28.tar.gz rm inception_v3_2016_08_28.tar.gz # Download adversarially trained inception v3 checkpoint # into adv_inception_v3 subdirectory cd "${SCRIPT_DIR}/adv_inception_v3/" wget http://download.tensorflow.org/models/adv_inception_v3_2017_08_18.tar.gz tar -xvzf adv_inception_v3_2017_08_18.tar.gz rm adv_inception_v3_2017_08_18.tar.gz # Download ensemble adversarially trained inception resnet v2 checkpoint # into ens_adv_inception_resnet_v2 subdirectory cd "${SCRIPT_DIR}/ens_adv_inception_resnet_v2/" wget http://download.tensorflow.org/models/ens_adv_inception_resnet_v2_2017_08_18.tar.gz tar -xvzf ens_adv_inception_resnet_v2_2017_08_18.tar.gz rm ens_adv_inception_resnet_v2_2017_08_18.tar.gz ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/defense.py ================================================ """Implementation of sample defense. This defense loads inception resnet v2 checkpoint and classifies all images using loaded checkpoint. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import numpy as np from scipy.misc import imread import tensorflow as tf import inception_resnet_v2 slim = tf.contrib.slim tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", "", "Path to checkpoint for inception network." ) tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_file", "", "Output file to save labels.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: image = imread(f, mode="RGB").astype(np.float) / 255.0 # Images for inception classifier are normalized to be in [-1, 1] interval. images[idx, :, :, :] = image * 2.0 - 1.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def main(_): """Classify all images using the sample defense.""" batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) with slim.arg_scope(inception_resnet_v2.inception_resnet_v2_arg_scope()): _, end_points = inception_resnet_v2.inception_resnet_v2( x_input, num_classes=nb_classes, is_training=False ) predicted_labels = tf.argmax(end_points["Predictions"], 1) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: with tf.gfile.Open(FLAGS.output_file, "w") as out_file: for filenames, images in load_images(FLAGS.input_dir, batch_shape): labels = sess.run(predicted_labels, feed_dict={x_input: images}) for filename, label in zip(filenames, labels): out_file.write("{0},{1}\n".format(filename, label)) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/inception_resnet_v2.py ================================================ # Copyright 2017 The TensorFlow Authors All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """Contains the definition of the Inception Resnet V2 architecture. As described in http://arxiv.org/abs/1602.07261. Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import warnings import tensorflow as tf slim = tf.contrib.slim def block35(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None): """Builds the 35x35 resnet block.""" with tf.variable_scope(scope, "Block35", [net], reuse=reuse): with tf.variable_scope("Branch_0"): tower_conv = slim.conv2d(net, 32, 1, scope="Conv2d_1x1") with tf.variable_scope("Branch_1"): tower_conv1_0 = slim.conv2d(net, 32, 1, scope="Conv2d_0a_1x1") tower_conv1_1 = slim.conv2d(tower_conv1_0, 32, 3, scope="Conv2d_0b_3x3") with tf.variable_scope("Branch_2"): tower_conv2_0 = slim.conv2d(net, 32, 1, scope="Conv2d_0a_1x1") tower_conv2_1 = slim.conv2d(tower_conv2_0, 48, 3, scope="Conv2d_0b_3x3") tower_conv2_2 = slim.conv2d(tower_conv2_1, 64, 3, scope="Conv2d_0c_3x3") mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_1, tower_conv2_2]) up = slim.conv2d( mixed, net.get_shape()[3], 1, normalizer_fn=None, activation_fn=None, scope="Conv2d_1x1", ) net += scale * up if activation_fn: net = activation_fn(net) return net def block17(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None): """Builds the 17x17 resnet block.""" with tf.variable_scope(scope, "Block17", [net], reuse=reuse): with tf.variable_scope("Branch_0"): tower_conv = slim.conv2d(net, 192, 1, scope="Conv2d_1x1") with tf.variable_scope("Branch_1"): tower_conv1_0 = slim.conv2d(net, 128, 1, scope="Conv2d_0a_1x1") tower_conv1_1 = slim.conv2d( tower_conv1_0, 160, [1, 7], scope="Conv2d_0b_1x7" ) tower_conv1_2 = slim.conv2d( tower_conv1_1, 192, [7, 1], scope="Conv2d_0c_7x1" ) mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_2]) up = slim.conv2d( mixed, net.get_shape()[3], 1, normalizer_fn=None, activation_fn=None, scope="Conv2d_1x1", ) net += scale * up if activation_fn: net = activation_fn(net) return net def block8(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None): """Builds the 8x8 resnet block.""" with tf.variable_scope(scope, "Block8", [net], reuse=reuse): with tf.variable_scope("Branch_0"): tower_conv = slim.conv2d(net, 192, 1, scope="Conv2d_1x1") with tf.variable_scope("Branch_1"): tower_conv1_0 = slim.conv2d(net, 192, 1, scope="Conv2d_0a_1x1") tower_conv1_1 = slim.conv2d( tower_conv1_0, 224, [1, 3], scope="Conv2d_0b_1x3" ) tower_conv1_2 = slim.conv2d( tower_conv1_1, 256, [3, 1], scope="Conv2d_0c_3x1" ) mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_2]) up = slim.conv2d( mixed, net.get_shape()[3], 1, normalizer_fn=None, activation_fn=None, scope="Conv2d_1x1", ) net += scale * up if activation_fn: net = activation_fn(net) return net def inception_resnet_v2_base( inputs, final_endpoint="Conv2d_7b_1x1", output_stride=16, align_feature_maps=False, scope=None, ): """Inception model from http://arxiv.org/abs/1602.07261. Constructs an Inception Resnet v2 network from inputs to the given final endpoint. This method can construct the network up to the final inception block Conv2d_7b_1x1. Args: inputs: a tensor of size [batch_size, height, width, channels]. final_endpoint: specifies the endpoint to construct the network up to. It can be one of ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', 'MaxPool_5a_3x3', 'Mixed_5b', 'Mixed_6a', 'PreAuxLogits', 'Mixed_7a', 'Conv2d_7b_1x1'] output_stride: A scalar that specifies the requested ratio of input to output spatial resolution. Only supports 8 and 16. align_feature_maps: When true, changes all the VALID paddings in the network to SAME padding so that the feature maps are aligned. scope: Optional variable_scope. Returns: tensor_out: output tensor corresponding to the final_endpoint. end_points: a set of activations for external use, for example summaries or losses. Raises: ValueError: if final_endpoint is not set to one of the predefined values, or if the output_stride is not 8 or 16, or if the output_stride is 8 and we request an end point after 'PreAuxLogits'. """ if output_stride != 8 and output_stride != 16: raise ValueError("output_stride must be 8 or 16.") padding = "SAME" if align_feature_maps else "VALID" end_points = {} def add_and_check_final(name, net): """ TODO: write this """ end_points[name] = net return name == final_endpoint with tf.variable_scope(scope, "InceptionResnetV2", [inputs]): with slim.arg_scope( [slim.conv2d, slim.max_pool2d, slim.avg_pool2d], stride=1, padding="SAME" ): # 149 x 149 x 32 net = slim.conv2d( inputs, 32, 3, stride=2, padding=padding, scope="Conv2d_1a_3x3" ) if add_and_check_final("Conv2d_1a_3x3", net): return net, end_points # 147 x 147 x 32 net = slim.conv2d(net, 32, 3, padding=padding, scope="Conv2d_2a_3x3") if add_and_check_final("Conv2d_2a_3x3", net): return net, end_points # 147 x 147 x 64 net = slim.conv2d(net, 64, 3, scope="Conv2d_2b_3x3") if add_and_check_final("Conv2d_2b_3x3", net): return net, end_points # 73 x 73 x 64 net = slim.max_pool2d( net, 3, stride=2, padding=padding, scope="MaxPool_3a_3x3" ) if add_and_check_final("MaxPool_3a_3x3", net): return net, end_points # 73 x 73 x 80 net = slim.conv2d(net, 80, 1, padding=padding, scope="Conv2d_3b_1x1") if add_and_check_final("Conv2d_3b_1x1", net): return net, end_points # 71 x 71 x 192 net = slim.conv2d(net, 192, 3, padding=padding, scope="Conv2d_4a_3x3") if add_and_check_final("Conv2d_4a_3x3", net): return net, end_points # 35 x 35 x 192 net = slim.max_pool2d( net, 3, stride=2, padding=padding, scope="MaxPool_5a_3x3" ) if add_and_check_final("MaxPool_5a_3x3", net): return net, end_points # 35 x 35 x 320 with tf.variable_scope("Mixed_5b"): with tf.variable_scope("Branch_0"): tower_conv = slim.conv2d(net, 96, 1, scope="Conv2d_1x1") with tf.variable_scope("Branch_1"): tower_conv1_0 = slim.conv2d(net, 48, 1, scope="Conv2d_0a_1x1") tower_conv1_1 = slim.conv2d( tower_conv1_0, 64, 5, scope="Conv2d_0b_5x5" ) with tf.variable_scope("Branch_2"): tower_conv2_0 = slim.conv2d(net, 64, 1, scope="Conv2d_0a_1x1") tower_conv2_1 = slim.conv2d( tower_conv2_0, 96, 3, scope="Conv2d_0b_3x3" ) tower_conv2_2 = slim.conv2d( tower_conv2_1, 96, 3, scope="Conv2d_0c_3x3" ) with tf.variable_scope("Branch_3"): tower_pool = slim.avg_pool2d( net, 3, stride=1, padding="SAME", scope="AvgPool_0a_3x3" ) tower_pool_1 = slim.conv2d(tower_pool, 64, 1, scope="Conv2d_0b_1x1") net = tf.concat( [tower_conv, tower_conv1_1, tower_conv2_2, tower_pool_1], 3 ) if add_and_check_final("Mixed_5b", net): return net, end_points # TODO(alemi): Register intermediate endpoints net = slim.repeat(net, 10, block35, scale=0.17) # 17 x 17 x 1088 if output_stride == 8, # 33 x 33 x 1088 if output_stride == 16 use_atrous = output_stride == 8 with tf.variable_scope("Mixed_6a"): with tf.variable_scope("Branch_0"): tower_conv = slim.conv2d( net, 384, 3, stride=1 if use_atrous else 2, padding=padding, scope="Conv2d_1a_3x3", ) with tf.variable_scope("Branch_1"): tower_conv1_0 = slim.conv2d(net, 256, 1, scope="Conv2d_0a_1x1") tower_conv1_1 = slim.conv2d( tower_conv1_0, 256, 3, scope="Conv2d_0b_3x3" ) tower_conv1_2 = slim.conv2d( tower_conv1_1, 384, 3, stride=1 if use_atrous else 2, padding=padding, scope="Conv2d_1a_3x3", ) with tf.variable_scope("Branch_2"): tower_pool = slim.max_pool2d( net, 3, stride=1 if use_atrous else 2, padding=padding, scope="MaxPool_1a_3x3", ) net = tf.concat([tower_conv, tower_conv1_2, tower_pool], 3) if add_and_check_final("Mixed_6a", net): return net, end_points # TODO(alemi): register intermediate endpoints with slim.arg_scope([slim.conv2d], rate=2 if use_atrous else 1): net = slim.repeat(net, 20, block17, scale=0.10) if add_and_check_final("PreAuxLogits", net): return net, end_points if output_stride == 8: # TODO(gpapan): Properly support output_stride for the rest of the net. raise ValueError( "output_stride==8 is only supported up to the " "PreAuxlogits end_point for now." ) # 8 x 8 x 2080 with tf.variable_scope("Mixed_7a"): with tf.variable_scope("Branch_0"): tower_conv = slim.conv2d(net, 256, 1, scope="Conv2d_0a_1x1") tower_conv_1 = slim.conv2d( tower_conv, 384, 3, stride=2, padding=padding, scope="Conv2d_1a_3x3", ) with tf.variable_scope("Branch_1"): tower_conv1 = slim.conv2d(net, 256, 1, scope="Conv2d_0a_1x1") tower_conv1_1 = slim.conv2d( tower_conv1, 288, 3, stride=2, padding=padding, scope="Conv2d_1a_3x3", ) with tf.variable_scope("Branch_2"): tower_conv2 = slim.conv2d(net, 256, 1, scope="Conv2d_0a_1x1") tower_conv2_1 = slim.conv2d( tower_conv2, 288, 3, scope="Conv2d_0b_3x3" ) tower_conv2_2 = slim.conv2d( tower_conv2_1, 320, 3, stride=2, padding=padding, scope="Conv2d_1a_3x3", ) with tf.variable_scope("Branch_3"): tower_pool = slim.max_pool2d( net, 3, stride=2, padding=padding, scope="MaxPool_1a_3x3" ) net = tf.concat( [tower_conv_1, tower_conv1_1, tower_conv2_2, tower_pool], 3 ) if add_and_check_final("Mixed_7a", net): return net, end_points # TODO(alemi): register intermediate endpoints net = slim.repeat(net, 9, block8, scale=0.20) net = block8(net, activation_fn=None) # 8 x 8 x 1536 net = slim.conv2d(net, 1536, 1, scope="Conv2d_7b_1x1") if add_and_check_final("Conv2d_7b_1x1", net): return net, end_points raise ValueError("final_endpoint (%s) not recognized" % final_endpoint) def inception_resnet_v2( inputs, nb_classes=1001, is_training=True, dropout_keep_prob=0.8, reuse=None, scope="InceptionResnetV2", create_aux_logits=True, num_classes=None, ): """Creates the Inception Resnet V2 model. Args: inputs: a 4-D tensor of size [batch_size, height, width, 3]. nb_classes: number of predicted classes. is_training: whether is training or not. dropout_keep_prob: float, the fraction to keep before final layer. reuse: whether or not the network and its variables should be reused. To be able to reuse 'scope' must be given. scope: Optional variable_scope. create_aux_logits: Whether to include the auxilliary logits. num_classes: depricated alias for nb_classes Returns: logits: the logits outputs of the model. end_points: the set of end_points from the inception model. """ if num_classes is not None: warnings.warn( "`num_classes` is deprecated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23." ) nb_classes = num_classes del num_classes end_points = {} with tf.variable_scope( scope, "InceptionResnetV2", [inputs, nb_classes], reuse=reuse ) as var_scope: with slim.arg_scope([slim.batch_norm, slim.dropout], is_training=is_training): net, end_points = inception_resnet_v2_base(inputs, scope=var_scope) if create_aux_logits: with tf.variable_scope("AuxLogits"): aux = end_points["PreAuxLogits"] aux = slim.avg_pool2d( aux, 5, stride=3, padding="VALID", scope="Conv2d_1a_3x3" ) aux = slim.conv2d(aux, 128, 1, scope="Conv2d_1b_1x1") aux = slim.conv2d( aux, 768, aux.get_shape()[1:3], padding="VALID", scope="Conv2d_2a_5x5", ) aux = slim.flatten(aux) aux = slim.fully_connected( aux, nb_classes, activation_fn=None, scope="Logits" ) end_points["AuxLogits"] = aux with tf.variable_scope("Logits"): net = slim.avg_pool2d( net, net.get_shape()[1:3], padding="VALID", scope="AvgPool_1a_8x8" ) net = slim.flatten(net) net = slim.dropout( net, dropout_keep_prob, is_training=is_training, scope="Dropout" ) end_points["PreLogitsFlatten"] = net logits = slim.fully_connected( net, nb_classes, activation_fn=None, scope="Logits" ) end_points["Logits"] = logits end_points["Predictions"] = tf.nn.softmax(logits, name="Predictions") return logits, end_points inception_resnet_v2.default_image_size = 299 def inception_resnet_v2_arg_scope( weight_decay=0.00004, batch_norm_decay=0.9997, batch_norm_epsilon=0.001 ): """Returns the scope with the default parameters for inception_resnet_v2. Args: weight_decay: the weight decay for weights variables. batch_norm_decay: decay for the moving average of batch_norm momentums. batch_norm_epsilon: small float added to variance to avoid dividing by zero. Returns: a arg_scope with the parameters needed for inception_resnet_v2. """ # Set weight_decay for weights in conv2d and fully_connected layers. with slim.arg_scope( [slim.conv2d, slim.fully_connected], weights_regularizer=slim.l2_regularizer(weight_decay), biases_regularizer=slim.l2_regularizer(weight_decay), ): batch_norm_params = { "decay": batch_norm_decay, "epsilon": batch_norm_epsilon, } # Set activation_fn and parameters for batch_norm. with slim.arg_scope( [slim.conv2d], activation_fn=tf.nn.relu, normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params, ) as scope: return scope ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/metadata.json ================================================ { "type": "defense", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_defense.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/run_defense.sh ================================================ #!/bin/bash # # run_defense.sh is a script which executes the defense # # Envoronment which runs attacks and defences calls it in a following way: # run_defense.sh INPUT_DIR OUTPUT_FILE # where: # INPUT_DIR - directory with input PNG images # OUTPUT_FILE - file to store classification labels # INPUT_DIR=$1 OUTPUT_FILE=$2 python defense.py \ --input_dir="${INPUT_DIR}" \ --output_file="${OUTPUT_FILE}" \ --checkpoint_path=ens_adv_inception_resnet_v2.ckpt ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/download_checkpoints.sh ================================================ #!/bin/bash # # Scripts which download checkpoints for provided models. # SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Download inception v3 checkpoint for step_target_class attack. cd "${SCRIPT_DIR}/step_target_class/" wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz tar -xvzf inception_v3_2016_08_28.tar.gz # Another copy of inception v3 checkpoint for iter_target_class attack mv inception_v3_2016_08_28.tar.gz "${SCRIPT_DIR}/iter_target_class/" cd "${SCRIPT_DIR}/iter_target_class/" tar -xvzf inception_v3_2016_08_28.tar.gz rm inception_v3_2016_08_28.tar.gz ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/iter_target_class/attack_iter_target_class.py ================================================ """Implementation of sample attack.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import csv import os import numpy as np import tensorflow as tf from tensorflow.contrib.slim.nets import inception from scipy.misc import imread from scipy.misc import imsave slim = tf.contrib.slim tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", "", "Path to checkpoint for inception network." ) tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_dir", "", "Output directory with images.") tf.flags.DEFINE_float("max_epsilon", 16.0, "Maximum size of adversarial perturbation.") tf.flags.DEFINE_float("iter_alpha", 1.0, "Step size for one iteration.") tf.flags.DEFINE_integer("num_iter", 20, "Number of iterations.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_target_class(input_dir): """Loads target classes.""" with tf.gfile.Open(os.path.join(input_dir, "target_class.csv")) as f: return {row[0]: int(row[1]) for row in csv.reader(f) if len(row) >= 2} def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: image = imread(f, mode="RGB").astype(np.float) / 255.0 # Images for inception classifier are normalized to be in [-1, 1] interval. images[idx, :, :, :] = image * 2.0 - 1.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def save_images(images, filenames, output_dir): """Saves images to the output directory. Args: images: array with minibatch of images filenames: list of filenames without path If number of file names in this list less than number of images in the minibatch then only first len(filenames) images will be saved. output_dir: directory where to save images """ for i, filename in enumerate(filenames): # Images for inception classifier are normalized to be in [-1, 1] interval, # so rescale them back to [0, 1]. with tf.gfile.Open(os.path.join(output_dir, filename), "w") as f: imsave(f, (images[i, :, :, :] + 1.0) * 0.5, format="png") def main(_): """Run the sample attack""" # Images for inception classifier are normalized to be in [-1, 1] interval, # eps is a difference between pixels so it should be in [0, 2] interval. # Renormalizing epsilon from [0, 255] to [0, 2]. eps = 2.0 * FLAGS.max_epsilon / 255.0 alpha = 2.0 * FLAGS.iter_alpha / 255.0 num_iter = FLAGS.num_iter batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) all_images_taget_class = load_target_class(FLAGS.input_dir) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) x_max = tf.clip_by_value(x_input + eps, -1.0, 1.0) x_min = tf.clip_by_value(x_input - eps, -1.0, 1.0) with slim.arg_scope(inception.inception_v3_arg_scope()): inception.inception_v3(x_input, num_classes=nb_classes, is_training=False) x_adv = x_input target_class_input = tf.placeholder(tf.int32, shape=[FLAGS.batch_size]) one_hot_target_class = tf.one_hot(target_class_input, nb_classes) for _ in range(num_iter): with slim.arg_scope(inception.inception_v3_arg_scope()): logits, end_points = inception.inception_v3( x_adv, num_classes=nb_classes, is_training=False, reuse=True ) cross_entropy = tf.losses.softmax_cross_entropy( one_hot_target_class, logits, label_smoothing=0.1, weights=1.0 ) cross_entropy += tf.losses.softmax_cross_entropy( one_hot_target_class, end_points["AuxLogits"], label_smoothing=0.1, weights=0.4, ) x_next = x_adv - alpha * tf.sign(tf.gradients(cross_entropy, x_adv)[0]) x_next = tf.clip_by_value(x_next, x_min, x_max) x_adv = x_next # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: for filenames, images in load_images(FLAGS.input_dir, batch_shape): target_class_for_batch = [ all_images_taget_class[n] for n in filenames ] + [0] * (FLAGS.batch_size - len(filenames)) adv_images = sess.run( x_adv, feed_dict={ x_input: images, target_class_input: target_class_for_batch, }, ) save_images(adv_images, filenames, FLAGS.output_dir) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/iter_target_class/metadata.json ================================================ { "type": "targeted_attack", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_attack.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/iter_target_class/run_attack.sh ================================================ #!/bin/bash # # run_attack.sh is a script which executes the attack # # Envoronment which runs attacks and defences calls it in a following way: # run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON # where: # INPUT_DIR - directory with input PNG images # OUTPUT_DIR - directory where adversarial images should be written # MAX_EPSILON - maximum allowed L_{\infty} norm of adversarial perturbation # INPUT_DIR=$1 OUTPUT_DIR=$2 MAX_EPSILON=$3 # For how many iterations run this attack NUM_ITERATIONS=20 python attack_iter_target_class.py \ --input_dir="${INPUT_DIR}" \ --output_dir="${OUTPUT_DIR}" \ --max_epsilon="${MAX_EPSILON}" \ --num_iter="${NUM_ITERATIONS}" \ --checkpoint_path=inception_v3.ckpt ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/step_target_class/attack_step_target_class.py ================================================ """Implementation of sample attack.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import csv import os import numpy as np import tensorflow as tf from tensorflow.contrib.slim.nets import inception from scipy.misc import imread from scipy.misc import imsave slim = tf.contrib.slim tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", "", "Path to checkpoint for inception network." ) tf.flags.DEFINE_string("input_dir", "", "Input directory with images.") tf.flags.DEFINE_string("output_dir", "", "Output directory with images.") tf.flags.DEFINE_float("max_epsilon", 16.0, "Maximum size of adversarial perturbation.") tf.flags.DEFINE_integer("image_width", 299, "Width of each input images.") tf.flags.DEFINE_integer("image_height", 299, "Height of each input images.") tf.flags.DEFINE_integer("batch_size", 16, "How many images process at one time.") FLAGS = tf.flags.FLAGS def load_target_class(input_dir): """Loads target classes.""" with tf.gfile.Open(os.path.join(input_dir, "target_class.csv")) as f: return {row[0]: int(row[1]) for row in csv.reader(f) if len(row) >= 2} def load_images(input_dir, batch_shape): """Read png images from input directory in batches. Args: input_dir: input directory batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3] Yields: filenames: list file names without path of each image Lenght of this list could be less than batch_size, in this case only first few images of the result are elements of the minibatch. images: array with all images from this batch """ images = np.zeros(batch_shape) filenames = [] idx = 0 batch_size = batch_shape[0] for filepath in tf.gfile.Glob(os.path.join(input_dir, "*.png")): with tf.gfile.Open(filepath) as f: image = imread(f, mode="RGB").astype(np.float) / 255.0 # Images for inception classifier are normalized to be in [-1, 1] interval. images[idx, :, :, :] = image * 2.0 - 1.0 filenames.append(os.path.basename(filepath)) idx += 1 if idx == batch_size: yield filenames, images filenames = [] images = np.zeros(batch_shape) idx = 0 if idx > 0: yield filenames, images def save_images(images, filenames, output_dir): """Saves images to the output directory. Args: images: array with minibatch of images filenames: list of filenames without path If number of file names in this list less than number of images in the minibatch then only first len(filenames) images will be saved. output_dir: directory where to save images """ for i, filename in enumerate(filenames): # Images for inception classifier are normalized to be in [-1, 1] interval, # so rescale them back to [0, 1]. with tf.gfile.Open(os.path.join(output_dir, filename), "w") as f: imsave(f, (images[i, :, :, :] + 1.0) * 0.5, format="png") def main(_): # Images for inception classifier are normalized to be in [-1, 1] interval, # eps is a difference between pixels so it should be in [0, 2] interval. # Renormalizing epsilon from [0, 255] to [0, 2]. eps = 2.0 * FLAGS.max_epsilon / 255.0 batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3] nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) all_images_taget_class = load_target_class(FLAGS.input_dir) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) with slim.arg_scope(inception.inception_v3_arg_scope()): logits, end_points = inception.inception_v3( x_input, num_classes=nb_classes, is_training=False ) target_class_input = tf.placeholder(tf.int32, shape=[FLAGS.batch_size]) one_hot_target_class = tf.one_hot(target_class_input, nb_classes) cross_entropy = tf.losses.softmax_cross_entropy( one_hot_target_class, logits, label_smoothing=0.1, weights=1.0 ) cross_entropy += tf.losses.softmax_cross_entropy( one_hot_target_class, end_points["AuxLogits"], label_smoothing=0.1, weights=0.4, ) x_adv = x_input - eps * tf.sign(tf.gradients(cross_entropy, x_input)[0]) x_adv = tf.clip_by_value(x_adv, -1.0, 1.0) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: for filenames, images in load_images(FLAGS.input_dir, batch_shape): target_class_for_batch = [ all_images_taget_class[n] for n in filenames ] + [0] * (FLAGS.batch_size - len(filenames)) adv_images = sess.run( x_adv, feed_dict={ x_input: images, target_class_input: target_class_for_batch, }, ) save_images(adv_images, filenames, FLAGS.output_dir) if __name__ == "__main__": tf.app.run() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/step_target_class/metadata.json ================================================ { "type": "targeted_attack", "container": "gcr.io/tensorflow/tensorflow:1.1.0", "container_gpu": "gcr.io/tensorflow/tensorflow:1.1.0-gpu", "entry_point": "run_attack.sh" } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/step_target_class/run_attack.sh ================================================ #!/bin/bash # # run_attack.sh is a script which executes the attack # # Envoronment which runs attacks and defences calls it in a following way: # run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON # where: # INPUT_DIR - directory with input PNG images # OUTPUT_DIR - directory where adversarial images should be written # MAX_EPSILON - maximum allowed L_{\infty} norm of adversarial perturbation # INPUT_DIR=$1 OUTPUT_DIR=$2 MAX_EPSILON=$3 python attack_step_target_class.py \ --input_dir="${INPUT_DIR}" \ --output_dir="${OUTPUT_DIR}" \ --max_epsilon="${MAX_EPSILON}" \ --checkpoint_path=inception_v3.ckpt ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/validation_tool/README.md ================================================ # Submission validation tool This tool verifies that a submission file is valid or reports an error. It extracts the submission, verifies presence and validity of metadata and runs the submission on sample data. Usage is following: ```bash # FILENAME - filename of the submission # TYPE - type of the submission, one of the following without quotes: # "attack", "targeted_attack" or "defense" # You can omit --usegpu argument, then submission will be run on CPU python validate_submission.py \ --submission_filename=FILENAME \ --submission_type=TYPE \ --usegpu ``` After run this tool will print whether submission is valid or not. If submission is invalid then log messages will contain explanation why. NOTE: This tool might not work properly if the file is located on NFS or if the directory containing submission file can't be mounted in Docker using `-v` command line argument. In such case copy file to different location and try again. ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/validation_tool/submission_validator_lib.py ================================================ """Helper library which performs validation of the submission.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function from builtins import int # long in python 2 import csv import json import logging import os import re import subprocess import numpy as np from six import iteritems from PIL import Image EXTRACT_COMMAND = { ".zip": ["unzip", "${src}", "-d", "${dst}"], ".tar": ["tar", "xvf", "${src}", "-C", "${dst}"], ".tar.gz": ["tar", "xvzf", "${src}", "-C", "${dst}"], } ALLOWED_SUBMISSION_TYPES = ["attack", "targeted_attack", "defense"] REQUIRED_METADATA_JSON_FIELDS = ["entry_point", "container", "container_gpu", "type"] CMD_VARIABLE_RE = re.compile("^\\$\\{(\\w+)\\}$") BATCH_SIZE = 100 IMAGE_NAME_PATTERN = "IMG{0:04}.png" ALLOWED_EPS = [4, 8, 12, 16] MAX_SUBMISSION_SIZE_ZIPPED = 8 * 1024 * 1024 * 1024 # 8 GiB MAX_SUBMISSION_SIZE_UNPACKED = 16 * 1024 * 1024 * 1024 # 16 GiB MAX_DOCKER_IMAGE_SIZE = 8 * 1024 * 1024 * 1024 # 8 GiB def get_extract_command_template(filename): """Returns extraction command based on the filename extension.""" for k, v in iteritems(EXTRACT_COMMAND): if filename.endswith(k): return v return None def shell_call(command, **kwargs): """Calls shell command with parameter substitution. Args: command: command to run as a list of tokens **kwargs: dirctionary with substitutions Returns: whether command was successful, i.e. returned 0 status code Example of usage: shell_call(['cp', '${A}', '${B}'], A='src_file', B='dst_file') will call shell command: cp src_file dst_file """ command = list(command) for i in range(len(command)): m = CMD_VARIABLE_RE.match(command[i]) if m: var_id = m.group(1) if var_id in kwargs: command[i] = kwargs[var_id] return subprocess.call(command) == 0 def make_directory_writable(dirname): """Makes directory readable and writable by everybody. Args: dirname: name of the directory Returns: True if operation was successfull If you run something inside Docker container and it writes files, then these files will be written as root user with restricted permissions. So to be able to read/modify these files outside of Docker you have to change permissions to be world readable and writable. """ retval = shell_call( [ "docker", "run", "-v", "{0}:/output_dir".format(dirname), "busybox:1.27.2", "chmod", "-R", "a+rwx", "/output_dir", ] ) if not retval: logging.error("Failed to change permissions on directory: %s", dirname) return retval def load_defense_output(filename): """Loads output of defense from given file.""" result = {} with open(filename) as f: for row in csv.reader(f): try: image_filename = row[0] if not image_filename.endswith(".png"): image_filename += ".png" label = int(row[1]) except (IndexError, ValueError): continue result[image_filename] = label return result class SubmissionValidator(object): """Class which performs validation of the submission.""" def __init__(self, temp_dir, use_gpu): """Initializes instance of SubmissionValidator. Args: temp_dir: temporary working directory use_gpu: whether to use GPU """ self._temp_dir = temp_dir self._use_gpu = use_gpu self._tmp_extracted_dir = os.path.join(self._temp_dir, "tmp_extracted") self._extracted_submission_dir = os.path.join(self._temp_dir, "extracted") self._sample_input_dir = os.path.join(self._temp_dir, "input") self._sample_output_dir = os.path.join(self._temp_dir, "output") def _prepare_temp_dir(self): """Cleans up and prepare temporary directory.""" shell_call(["rm", "-rf", os.path.join(self._temp_dir, "*")]) # NOTE: we do not create self._extracted_submission_dir # this is intentional because self._tmp_extracted_dir or it's subdir # will be renames into self._extracted_submission_dir os.mkdir(self._tmp_extracted_dir) os.mkdir(self._sample_input_dir) os.mkdir(self._sample_output_dir) # make output dir world writable shell_call(["chmod", "a+rwX", "-R", self._sample_output_dir]) def _extract_submission(self, filename): """Extracts submission and moves it into self._extracted_submission_dir.""" # verify filesize file_size = os.path.getsize(filename) if file_size > MAX_SUBMISSION_SIZE_ZIPPED: logging.error( "Submission archive size %d is exceeding limit %d", file_size, MAX_SUBMISSION_SIZE_ZIPPED, ) return False # determime archive type exctract_command_tmpl = get_extract_command_template(filename) if not exctract_command_tmpl: logging.error( "Input file has to be zip, tar or tar.gz archive; however " "found: %s", filename, ) return False # extract archive submission_dir = os.path.dirname(filename) submission_basename = os.path.basename(filename) logging.info("Extracting archive %s", filename) retval = shell_call( [ "docker", "run", "--network=none", "-v", "{0}:/input_dir".format(submission_dir), "-v", "{0}:/output_dir".format(self._tmp_extracted_dir), "busybox:1.27.2", ] + exctract_command_tmpl, src=os.path.join("/input_dir", submission_basename), dst="/output_dir", ) if not retval: logging.error("Failed to extract submission from file %s", filename) return False if not make_directory_writable(self._tmp_extracted_dir): return False # find submission root root_dir = self._tmp_extracted_dir root_dir_content = [d for d in os.listdir(root_dir) if d != "__MACOSX"] if len(root_dir_content) == 1 and os.path.isdir( os.path.join(root_dir, root_dir_content[0]) ): logging.info( 'Looks like submission root is in subdirectory "%s" of ' "the archive", root_dir_content[0], ) root_dir = os.path.join(root_dir, root_dir_content[0]) # Move files to self._extracted_submission_dir. # At this point self._extracted_submission_dir does not exist, # so following command will simply rename root_dir into # self._extracted_submission_dir if not shell_call(["mv", root_dir, self._extracted_submission_dir]): logging.error("Can" "t move submission files from root directory") return False return True def _verify_submission_size(self): submission_size = 0 for dirname, _, filenames in os.walk(self._extracted_submission_dir): for f in filenames: submission_size += os.path.getsize(os.path.join(dirname, f)) logging.info("Unpacked submission size: %d", submission_size) if submission_size > MAX_SUBMISSION_SIZE_UNPACKED: logging.error( "Submission size exceeding limit %d", MAX_SUBMISSION_SIZE_UNPACKED ) return submission_size <= MAX_SUBMISSION_SIZE_UNPACKED def _load_and_verify_metadata(self, submission_type): """Loads and verifies metadata. Args: submission_type: type of the submission Returns: dictionaty with metadata or None if metadata not found or invalid """ metadata_filename = os.path.join( self._extracted_submission_dir, "metadata.json" ) if not os.path.isfile(metadata_filename): logging.error("metadata.json not found") return None try: with open(metadata_filename, "r") as f: metadata = json.load(f) except IOError as e: logging.error("Failed to load metadata: %s", e) return None for field_name in REQUIRED_METADATA_JSON_FIELDS: if field_name not in metadata: logging.error("Field %s not found in metadata", field_name) return None # Verify submission type if submission_type != metadata["type"]: logging.error( 'Invalid submission type in metadata, expected "%s", ' 'actual "%s"', submission_type, metadata["type"], ) return None # Check submission entry point entry_point = metadata["entry_point"] if not os.path.isfile( os.path.join(self._extracted_submission_dir, entry_point) ): logging.error("Entry point not found: %s", entry_point) return None if not entry_point.endswith(".sh"): logging.warning( "Entry point is not an .sh script. " "This is not necessarily a problem, but if submission " "won" "t run double check entry point first: %s", entry_point, ) # Metadata verified return metadata def _verify_docker_image_size(self, image_name): """Verifies size of Docker image. Args: image_name: name of the Docker image. Returns: True if image size is withing the limits, False otherwise. """ shell_call(["docker", "pull", image_name]) try: image_size = subprocess.check_output( ["docker", "inspect", "--format={{.Size}}", image_name] ).strip() image_size = int(image_size) except (ValueError, subprocess.CalledProcessError) as e: logging.error("Failed to determine docker image size: %s", e) return False logging.info("Size of docker image %s is %d", image_name, image_size) if image_size > MAX_DOCKER_IMAGE_SIZE: logging.error("Image size exceeds limit %d", MAX_DOCKER_IMAGE_SIZE) return image_size <= MAX_DOCKER_IMAGE_SIZE def _prepare_sample_data(self, submission_type): """Prepares sample data for the submission. Args: submission_type: type of the submission. """ # write images images = np.random.randint( 0, 256, size=[BATCH_SIZE, 299, 299, 3], dtype=np.uint8 ) for i in range(BATCH_SIZE): Image.fromarray(images[i, :, :, :]).save( os.path.join(self._sample_input_dir, IMAGE_NAME_PATTERN.format(i)) ) # write target class for targeted attacks if submission_type == "targeted_attack": target_classes = np.random.randint(1, 1001, size=[BATCH_SIZE]) target_class_filename = os.path.join( self._sample_input_dir, "target_class.csv" ) with open(target_class_filename, "w") as f: for i in range(BATCH_SIZE): f.write( (IMAGE_NAME_PATTERN + ",{1}\n").format(i, target_classes[i]) ) def _run_submission(self, metadata): """Runs submission inside Docker container. Args: metadata: dictionary with submission metadata Returns: True if status code of Docker command was success (i.e. zero), False otherwise. """ if self._use_gpu: docker_binary = "nvidia-docker" container_name = metadata["container_gpu"] else: docker_binary = "docker" container_name = metadata["container"] if metadata["type"] == "defense": cmd = [ docker_binary, "run", "--network=none", "-m=24g", "-v", "{0}:/input_images:ro".format(self._sample_input_dir), "-v", "{0}:/output_data".format(self._sample_output_dir), "-v", "{0}:/code".format(self._extracted_submission_dir), "-w", "/code", container_name, "./" + metadata["entry_point"], "/input_images", "/output_data/result.csv", ] else: epsilon = np.random.choice(ALLOWED_EPS) cmd = [ docker_binary, "run", "--network=none", "-m=24g", "-v", "{0}:/input_images:ro".format(self._sample_input_dir), "-v", "{0}:/output_images".format(self._sample_output_dir), "-v", "{0}:/code".format(self._extracted_submission_dir), "-w", "/code", container_name, "./" + metadata["entry_point"], "/input_images", "/output_images", str(epsilon), ] logging.info("Command to run submission: %s", " ".join(cmd)) return shell_call(cmd) def _verify_output(self, submission_type): """Verifies correctness of the submission output. Args: submission_type: type of the submission Returns: True if output looks valid """ result = True if submission_type == "defense": try: image_classification = load_defense_output( os.path.join(self._sample_output_dir, "result.csv") ) expected_keys = [ IMAGE_NAME_PATTERN.format(i) for i in range(BATCH_SIZE) ] if set(image_classification.keys()) != set(expected_keys): logging.error("Classification results are not saved for all images") result = False except IOError as e: logging.error("Failed to read defense output file: %s", e) result = False else: for i in range(BATCH_SIZE): image_filename = os.path.join( self._sample_output_dir, IMAGE_NAME_PATTERN.format(i) ) try: img = np.array(Image.open(image_filename).convert("RGB")) if list(img.shape) != [299, 299, 3]: logging.error( "Invalid image size %s for image %s", str(img.shape), image_filename, ) result = False except IOError as e: result = False return result def validate_submission(self, filename, submission_type): """Validates submission. Args: filename: submission filename submission_type: type of the submission, one of 'attack', 'targeted_attack' or 'defense' Returns: whether submission is valid """ if submission_type not in ALLOWED_SUBMISSION_TYPES: logging.error("Invalid submission type: %s", submission_type) return False self._prepare_temp_dir() # Convert filename to be absolute path, # relative path might cause problems when monting directory in Docker filename = os.path.abspath(filename) # extract submission if not self._extract_submission(filename): return False # verify submission size if not self._verify_submission_size(): return False # Load metadata metadata = self._load_and_verify_metadata(submission_type) if not metadata: return False # verify docker container size if not self._verify_docker_image_size(metadata["container_gpu"]): return False # Try to run submission on sample data self._prepare_sample_data(submission_type) if not self._run_submission(metadata): logging.error("Failure while running submission") return False if not self._verify_output(submission_type): logging.warning( "Some of the outputs of your submission are invalid or " "missing. You submission still will be evaluation " "but you might get lower score." ) return True ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/validation_tool/validate_submission.py ================================================ r"""Tool to validate submission for adversarial competition. Usage: python validate_submission.py \ --submission_filename=FILENAME \ --submission_type=TYPE \ [--use_gpu] Where: FILENAME - filename of the submission TYPE - type of the submission, one of the following without quotes: "attack", "targeted_attack" or "defense" --use_gpu - if argument specified then submission will be run on GPU using nvidia-docker, otherwise will be run on CPU. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import logging import random import subprocess import tempfile import submission_validator_lib def print_in_box(text): """ Prints `text` surrounded by a box made of *s """ print("") print("*" * (len(text) + 6)) print("** " + text + " **") print("*" * (len(text) + 6)) print("") def main(args): """ Validates the submission. """ print_in_box("Validating submission " + args.submission_filename) random.seed() temp_dir = args.temp_dir delete_temp_dir = False if not temp_dir: temp_dir = tempfile.mkdtemp() logging.info("Created temporary directory: %s", temp_dir) delete_temp_dir = True validator = submission_validator_lib.SubmissionValidator(temp_dir, args.use_gpu) if validator.validate_submission(args.submission_filename, args.submission_type): print_in_box("Submission is VALID!") else: print_in_box("Submission is INVALID, see log messages for details") if delete_temp_dir: logging.info("Deleting temporary directory: %s", temp_dir) subprocess.call(["rm", "-rf", temp_dir]) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Submission validation script.") parser.add_argument( "--submission_filename", required=True, help="Filename of the submission." ) parser.add_argument( "--submission_type", required=True, help="Type of the submission, " 'one of "attack", "targeted_attack" or "defense"', ) parser.add_argument( "--temp_dir", required=False, default="", help="Temporary directory to extract and run submission. " "If empty then temporary directory will be created " "by the script and then deleted in the end.", ) parser.add_argument("--use_gpu", dest="use_gpu", action="store_true") parser.add_argument("--nouse_gpu", dest="use_gpu", action="store_false") parser.set_defaults(use_gpu=False) loggint_format = ( "%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s -- " "%(message)s" ) logging.basicConfig( format=loggint_format, level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S" ) main(parser.parse_args()) ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/README.md ================================================ # Evaluation infrastructure for adversarial competition ## About This directory contains code of the backend which was used to run evaluation of [NIPS17 Adversarial Competition](https://www.kaggle.com/nips-2017-adversarial-learning-competition). This file describes how to run and use the code. For more details about the competition refer to [our publication](https://arxiv.org/abs/1804.00097) and to [Kaggle competition page](https://www.kaggle.com/nips-2017-adversarial-learning-competition). NOTES AND DISCLAIMERS: * **This code is provided AS IS. At the time of publishing this code was well tested and was working for evaluation of the competition. We do not provide any future support of this code.** * This code is formatted according to [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html) which is different from PEP8 (biggest difference is number of spaces in indentation). We do not plan to reformat the code according to PEP8. * You can defer questions about this code to [Alexey Kurakin](https://github.com/AlexeyKurakin), however they will be answered on best effort basis. ## How to run During the evaluation all attacks are run on the image dataset to produce adversarial images, then all defenses are run on all adversarial images to produce classification labels and finally scores are computed based on classification labels, true classes and target classes of all images. Competition is evaluated in a distributed way by running multiple **workers** on [Google Cloud Compute Engine](https://cloud.google.com/compute/). At any given moment each worker runs single **attack work piece** - evaluation of a single attack on a batch of clean images or **defense work piece** - evaluation of a single defense on a batch of adversarial images. All attack work pieces are independent from each other and could be run in parallel. After all attack work pieces are done, defense work pieces are run in parallel. Coordination between workers is done via [Google Cloud Datastore](https://cloud.google.com/datastore/) where list of all work pieces is stored. Content of the datastore is populated by **master** which could be run either on local machine or on Google Cloud. So evaluation of the competition consists of following steps: * Validate all submissions and copy valid submissions to Google Cloud. * **Master** populates all attack work pieces. * **Workers** are deployed to Google Cloud VMs. * **Workers** compute all attack work pieces. * **Master** populates all defense work pieces. * **Workers** compute all defense work pieces. * **Master** computes scores of all submissions. Below this process is described in more details. ### 1. Preparation Before running the competition you need to prepare machine which will run master as well as Google Cloud VMs which will run workers. #### 1.1 Prepare Google Cloud Project Since most of the competition is run on Google Cloud you have to have [Google Cloud project](https://cloud.google.com/resource-manager/docs/creating-managing-projects). Also you need to create [Google Cloud Storage bucket](https://cloud.google.com/storage/docs/creating-buckets) for the competition data within your Google Cloud project. You also will need to install Google Cloud SDK to use `gsutil` - a tool to copy data to and from Google Cloud Storage. #### 1.2 Prepare dataset You need to prepare dataset of labeled images which will be used in the competition. You can either download DEV or FINAL dataset which was used in NIPS17 competition or prepare your own dataset in a similar format. NIPS17 competition dataset could be found [here](https://github.com/tensorflow/cleverhans/tree/master/examples/nips17_adversarial_competition/dataset). To download NIPS17 dataset make a local copy of [this](https://github.com/tensorflow/cleverhans/tree/master/examples/nips17_adversarial_competition/dataset) directory and then run following commands: ```bash # ${DATASET_DIR} is a directory where dataset will be downloaded # ${DATASET_NAME} is a name of the dataset, "dev" or "final" # Prepare directory with downloaded dataset mkdir -p ${DATASET_DIR}/images # Copy dataset metadata there cp ${DATASET_NAME}_dataset.csv ${DATASET_DIR} # Download dataset images python download_images.py --input_file=${DATASET_NAME}_dataset.csv \ --output_dir=${DATASET_DIR}/${DATASET_NAME}/images ``` After you done `${DATASET_DIR}` will contain dataset metadata and all dataset images in `images` subdirectory. Then copy the dataset into Google Cloud Storage: ```bash # copy metadata gsutil cp ${DATASET_DIR}/${DATASET_NAME}_dataset.csv \ gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/dataset/ # copy images gsutil -m cp ${DATASET_DIR}/images/* \ gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/dataset/${DATASET_NAME}/ ``` Keep the content of the `${DATASET_DIR}`, you will need to copy it to the worker VMs in one of the next steps. #### 1.3 Update config Before proceeding with next steps you need to update variables in config file `scripts/config.sh`. Update `GOOGLE_CLOUD_PROJECT_ID` and `GOOGLE_CLOUD_STORAGE_BUCKET` with names of Google Cloud Project ID and Google Cloud Storage Bucket which you will use for competition. Additionally consider updating `VIRTUALENV_NAME` if default value does not work for you. Few other variables will be updated in next steps. #### 1.4 Preparation of master machine Master has to be run only a few times to populate work pieces for workers and to compute final scores. These tasks should take no more than few hours combined (exact time depends on how fast your computer, network connection and how many submissions are in the competition). Thus master could be run on your own machine. Below we call a computer where you runs master as **master machine**. Generally speaking master machine can have any operating system, however we only tested master on Debian flavor of Linux. Also if you operating system does not support running bash scripts you may need to rewrite a few bash scripts in a way which is supported on your machine. To prepare master machine you need to do following: 1. Install Python 2.7 2. Install [Google Cloud SDK](https://cloud.google.com/sdk/docs/) 2. Run `scripts/prepare_virtualenv.sh` to prepare python virtual environment for the master 3. Run `gcloud auth application-default login` or set `GOOGLE_APPLICATION_CREDENTIALS` to proper value. This is needed for master to be able to authenticate to Google Cloud services. See [Application Default Credentials](https://developers.google.com/identity/protocols/application-default-credentials) for more information. #### 1.5 Copy baselines to Google Cloud Storage Each baseline is a zip archive which name starts with `baseline_`. This archive should be formatted in a same way as any other valid submission. You can use sample attacks and defenses from [dev toolkit](https://github.com/tensorflow/cleverhans/tree/master/examples/nips17_adversarial_competition/dev_toolkit) as baselines. Just keep in mind that you have to download checkpoints for these examples and package them into zip archives yourself. After you prepared set of baselines copy them into following locations in Google Cloud Storage: * `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/defense` - directory with defense baselines * `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/targeted` - directory with targeted attack baselines * `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/nontargeted` - directory with non-targeted attack baselines #### 1.6 Preparation of a snapshot for workers VMs First of all you need to decide in which zone you will be creating all VMs for the competition and update `GOOGLE_CLOUD_COMPUTE_ZONE` variable in `config.sh` with the name of the zone. Optionally you may want to update `GOOGLE_CLOUD_VM_USERNAME` depending on which username you will use to log in into VMs. After updating `config.sh` you will be able to use script `scp_cloud_vm.sh` to copy files to and from VM. You need to prepare snapshot of one VM manually, then you can use helper script to create many workers from this snapshot. To prepare snapshot: 1. Create a Cloud VM with attached GPU and Ubuntu 16.04 OS. * Make sure to enable read/write access to Google Cloud Storage for this VM. * If you're planning to pre-download all Docker images you may want to increase disk size of this machine to 100GiB or more. 2. Install some additional packages to VM: ```bash sudo apt-get update sudo apt-get upgrade # Install pip and virtualenv for Python 2 sudo apt-get install python-pip sudo pip install --upgrade pip sudo pip install virtualenv # Install zip sudo apt-get install zip unzip ``` 3. Install [Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/) into VM. * Make sure to follow "Manage Docker as a non-root user" section in [post installation steps](https://docs.docker.com/install/linux/linux-postinstall/) so you can run `docker` command without `sudo` 4. Install NVidia drivers and any other dependencies needed for NVidia Docker into VM. * You can get the latest version of the driver from [NVidia web-site](http://www.nvidia.com/object/unix.html) (look for the latest Linux x86_64 driver) and install it on your VM. You can safely ignore warnings about X library path and 32-bit compatibility binary during the installation. * Please refer to [NVidia Docker](https://github.com/NVIDIA/nvidia-docker) documentation for details about any additional dependencies. 5. Install [NVidia Docker](https://github.com/NVIDIA/nvidia-docker) into VM. 6. Make sure that NVidia Docker working properly and can detect your graphic card. To do this run `docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi` inside the VM. You should see output of NVIDIA-SMI tool which shows utilization of your graphic card. If it fails or can not detect your graphic card please resolve the problem before proceeding to next steps. 7. Copy dataset into VM. This step is run from outside of the VM. * At this point you should have dataset downloaded into `${DATASET_DIR}` So run `scripts/copy_dataset_to_vm.sh` to copy dataset to VM: ```bash # To copy dev dataset: scripts/copy_dataset_to_vm.sh ${DATASET_DIR} dev ${VM_NAME} # To copy final dataset: scripts/copy_dataset_to_vm.sh ${DATASET_DIR} final ${VM_NAME} ``` 8. Copy evaluation infrastructure to VM. This step is done from outside of the VM by running following script: ```bash scripts/copy_eval_infra_to_vm.sh ${VM_NAME} ``` NOTE: at this point don't worry if some of the values in `config.sh` are not updated. Script which starts workers will copy updated version of competition infrastructure with updated `config.sh`. 9. Run `eval_infra/scripts/prepare_virtualenv.sh` inside the VM to prepare python virtual environment needed to run the worker. 10. Shut down VM, make a snapshot of its disk (via Google Cloud web UI) and set value of `GOOGLE_CLOUD_REF_VM_SNAPSHOT` in `config.sh` to the name of the snapshot. This snapshot will be used during actual evaluation of the competition to create VMs with workers. ### 2. Running the competition Evaluation infrastructure can be used to run multiple rounds of the competition. Each round involves independent evaluation of all provided submission on given dataset. Intermediate data for each round are stored in separate subdirectory `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}` in Google Cloud Storage and using namespace `${ROUND_NAME}` in Google Cloud Datastore. Thus intermediate data for each round have no intersection with each other and you can run next round without cleaning up data of previous round as long as names of the rounds are different. Before you start evaluation of one round you need to decide which dataset you will use and what will be the name of the round. Then update variables `DATASET` and `ROUND_NAME` in `config.sh` on master machine (workers will be updated later). Also you may want to update `MASTER_RESULTS_DIR` and `NUM_DEFENSE_SHARDS` if default values does not work for you. #### 2.1 Validate and copy submissions and baselines First step of running the evaluation is to copy submissions and baselines to Google Cloud Storage directory for current evaluation round. To copy baselines from `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/` into directory which correspond to current round of the competition run following command: ```bash scripts/copy_baselines.sh ``` To validate submissions and copy them into appropriate location in Google Cloud Storage you can use program `validation_tool/validate_and_copy_submissions.py`. This tool scans all zip, tar and tar.gz archives in given Google Cloud Storage location, detects which of them are valid submissions and copies them to submission directory of the current round. You can run this tool in the VM created at "Preparation of a snapshot for workers VMs" step. To do this, turn this VM on, ssh into it and run following commands: ```bash source ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate cd eval_infra/validation_tool # ${SOURCE_DIR} is a directory in Google Cloud Storage which contains archives # with all submissions. # validate_and_copy_submissions.py will scan all subdirectories of the # ${SOURCE_DIR}, try to interpret all found zip, tar and tar.gz archives as # submissions, validate them and copy archives which are valid submissions # into target directory python -B validate_and_copy_submissions.py --use_gpu \ --source_dir=${SOURCE_DIR} \ --target_dir=gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions \ --containers_file=${HOME}/containers.txt \ --log_file=${HOME}/validation_log.txt deactivate ``` As a side effect this command will also download all Docker images from all submissions into the VM. So you can re-create snapshot `${GOOGLE_CLOUD_REF_VM_SNAPSHOT}` of this VM right now and this snapshot will contain all Docker images of all submissions. Using snapshot with all Docker images will help you to save time and network traffic during actual evaluation of the submissions. #### 2.2 Prepare attack work pieces To prepare attack work pieces and write them to Google Cloud Datastore run following command: ```bash run_master.sh attack ``` This operation may take several minutes so be patient. If you interrupt preparation of the attack work pieces you probably will need to clean up datastore before retrying. To cleanup datastore run `run_master.sh cleanup_datastore` NOTE: If you want to have a test run of your competition on a small subset of the dataset then you can add flag `--limited_dataset` into `run_master.sh` as additional argument to `master.py`. This flag will force to use only 30 images from the dataset with batch size 10. #### 2.3 Create worker VMs To avoid confusion let's introduce some terminology: * **creating VM** - create virtual machine which will host worker. * **starting VM** - start virtual machine which will be used to run worker. After worker VM is started we will say that **worker VM is up and running**. * **starting worker** - start worker script which performs evaluation on a VM. After script is started we will say that **worker is running**. At this step we only create and start VMs, but not the worker script. At this point you need to decide how many workers you need and what will be their indices. Indices could be any non-negative numbers, but for simplicity we recommend to use 0, ... (N-1) as indices where N is total number of workers. Depending on chosen number of workers you may want to update `NUM_DEFENSE_SHARDS` in `config.sh`. We recommend to use min(1, NUM_WORKERS/10) defense shards. After you decided how many workers you need and what are their indices, create worker VMs by running `scripts/create_workers.sh`: ```bash # Create workers with indices ${INDICES} # ${INDICES} should be list of numbers separated by spaces scripts/create_workers.sh "${INDICES}" # Create workers with indices 0, 1, 2, ..., 9 scripts/create_workers.sh "$(seq 0 9)" # Create workers with indices 1, 3 and 5 scripts/create_workers.sh "1 3 5" ``` Script `create_workers.sh` only create VMs and does not start worker code on these VMs. You need to wait until all VMs are up and running (if you can ssh into VM then it's ready) and proceed to the next step to start worker code. NOTE: Keep in mind that `scripts/create_workers.sh` creates VMs in 'running' state and you will be billed for uptime of these machines. You may want to shut them down when they are not in use to avoid paying for idle machines. #### 2.4 Starting and restarting workers Before starting workers you need to make sure that all worker VMs are up and running. Also you need to make sure that worker script is not already running on the VMs. If VM was shut down, then simply start it from Google Cloud web UI and wait until Google Cloud will show that VM is up and running. If VM is already running then reload it using Google Cloud web UI and wait a few minutes until reload is complete. After worker VMs are up and running you can start workers by using script `scripts/start_workers.sh`: ```bash # to start workers 0,1,2,3, ... 9 scripts/start_workers.sh "$(seq 0 9)" # to start workers 1, 5 and 7: scripts/start_workers.sh "1 5 7" ``` Sometimes worker get stuck or fail. In such case you may need to restart failed workers. To do this restart corresponding VMs and then use the same script `scripts/start_workers.sh` to start workers. #### 2.5 Checking status of the workers Any time you can run following command to monitor progress of competition evaluation: ```bash run_master.sh status ``` Note that this command may take several minutes to complete. `run_master.sh status` will show how many attack and defense work pieces are done and how many work pieces was finished by each worker. It also show last time each worker completed a work piece. If you notice that some workers haven't had any updates for a long time it may indicate that they crash or stuck or some other problem have happen. You can log in to the VM with stuck worker and check `log.txt` to troubleshoot it, however in most cases these issues are transient and resolved by restarting stuck worker. #### 2.6 Prepare defense work pieces After all attack work pieces are done (according to `run_master.sh status`) you need to populate defense work pieces. To populate defense work pieces run following command: ```bash run_master.sh defense ``` This command may take many minutes to complete, so be patient. If for some reason you ended up with corrupted state of the database you can cleanup defense work pieces by running `run_master.sh cleanup_defenses`. #### 2.7 Compute results As soon as all attack work pieces and defense work pieces are evaluated you can shut down VMs with all workers (to avoid paying for idle VMs). Then you can run following command to compute results: ```bash run_master.sh results ``` It may take several minutes to compute all results. When done results will be saved into `${MASTER_RESULTS_DIR}` directory (as specified in `config.sh`) on master machine. Results include following files: * `accuracy_matrix.csv` - matrix with the number of correctly classified adversarial images for each pair of defense and attack (both targeted and non-targeted). Rows are defenses, columns are attacks. * `error_matrix.csv` - matrix with the number of misclassified adversarial images for each pair of defense and attack (both targeted and non-targeted). Rows are defenses, columns are attacks. * `hit_target_class_matrix.csv` - matrix with the number of times a defense recognized adversarial images produced by an attack (both targeted and non-targeted) as specific target class. Rows are defenses, columns are attacks. * `attack_results.csv` and `sorted_attack_results.csv` - unsorted and sorted results of non-targeted attacks. Sorted results are sorted by score and contain less stats about each submission. * `targeted_attack_results.csv` and `sorted_target_attack_results.csv` - unsorted and sorted results of targeted attacks. * `defense_results.csv` and `sorted_defense_results.csv` - unsorted and sorted results of defenses. * `attack_id_to_name.csv` - mapping from internal IDs of all targeted and non-targeted attacks to their external IDs. Internal IDs are used only by evaluation infrastructure, external IDs is what was provided as inputs. * `defense_id_to_name.csv` - mapping from internal IDs of all defenses to their external IDs. * `count_adv_images.csv` - file with number of adversarial images produces by each attack. * `classified_images_count.csv` - file with total number of images classified by each defense. * `*.dump` - these are temporary files with intermediate results saved by master. If master interrupted during computation of final results and then restarted these files are used to resume execution of the master without recomputing too much data. Additionally master will save log `log.txt` into the same directory. ## Known issues ### Python 3 compatibility Most of the code is compatible with both Python 2 and Python 3 However we haven't perform end-to-end testing of the entire competition evaluation with Python 3 thus we recommend to run code using Python 2. ### Same attack work piece evaluated twice This issue happens very rare with the current values of worker parameters, nevertheless its possible theoretically and below is an instruction on how to deal with it. It's possible that the same attack work piece will be evaluated twice. It can happen in following circumstances: * Worker A started evaluation of work piece W1, however got stuck downloading Docker container. * Worker B saw that work piece W1 was claimed by A too long ago, concluded that worker A crashed or got rebooted and started evaluation of work piece W1 * Worker A finished evaluation of work piece W1, wrote list of produced adversarial images to datastore, wrote archive with adversarial images to Google Cloud Storage. Worker A tried to mark work piece as completed but failed because it's already re-claimed by B. Nevertheless adversarial images were already written to datastore and storage. * Worker B finished evaluation of work piece W1, overwrote list of produced adversarial images in the datastore and overwrote archive with adversarial images into storage. Then worker B marked work piece W1 as completed. This behavior is by design and generally speaking does not cause any issues as long as in both cases result of evaluation of work piece W1 is the same. However if work piece W1 times out and does not output adversarial images for all inputs, it's possible that two different evaluations of the work piece will result in different number of produced images. In such case it's possible that archive with adversarial images written to Google Cloud Storage will contain less images than listed in Google Cloud Datastore. If this happen then defenses will classify less adversarial images than listed in the datastore. Then during computation of the final scores by master this inconsistency will lead to the fact that no defenses will be used to compute attack scores, so all attacks will receive score 0. The issue could be diagnosed by the fact that all attacks have score zero and following line appear in the log output of the master: ``` Number of defenses to use to score attacks: 0 ``` If issue have happened and you discovered it during computation of results then following could be done to fix it: * Manually find problematic piece of attack work and edit the content of the datastore to fix the issue. Then you can delete all `*.dump` files are redo computation of results by master. This is a clean way to fix the problem, but it might be time consuming. * Change `total_num_adversarial` in `EvaluationMaster.compute_results` in `master.py` to be equal to maximum value of `classified_images_count` dict (or maximum value from `classified_images_count.csv` file). Then again delete all `*.dump` files and restart master. This is a quick and hacky way to fix the issue, but it still should work in most cases. Moreover following steps could be done to decrease probability of the issue happening in the first place: * Pre-download all Docker images to each worker VM, so workers won't spend time downloading Docker image before running new submission. However if evaluation of competition takes multiple days and some of the submissions refer to the "latest" version of some Docker image (e.g. tensorflow/tensorflow:latest-gpu) instead of fixed version it's possible that the latest version of Docker image will be updated during evaluating of the competition and some workers will download it again. * Increase `MAX_PROCESSING_TIME` in `work_data.py`. This constant define how long worker is allowed to process one piece of work before it considered failed. ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/__init__.py ================================================ from eval_lib.classification_results import analyze_one_classification_result from eval_lib.classification_results import ClassificationBatches from eval_lib.cloud_client import CompetitionDatastoreClient from eval_lib.cloud_client import CompetitionStorageClient from eval_lib.dataset_helper import DatasetMetadata from eval_lib.dataset_helper import download_dataset from eval_lib.dataset_helper import enforce_epsilon_and_compute_hash from eval_lib.image_batches import AversarialBatches from eval_lib.image_batches import DatasetBatches from eval_lib.submissions import CompetitionSubmissions from eval_lib.work_data import AttackWorkPieces from eval_lib.work_data import DefenseWorkPieces ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/classification_results.py ================================================ """Module with classes to compute, read and store classification results. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import csv from io import BytesIO from io import StringIO import logging import os import pickle import time from six import iteritems from six import iterkeys from six import itervalues from six import PY3 KIND_CLASSIFICATION_BATCH = u"ClassificationBatch" CLASSIFICATION_BATCH_ID_PATTERN = u"CBATCH{:06}" CLASSIFICATION_BATCHES_SUBDIR = "classification_batches" TO_STR_MAX_BATCHES = 10 MAX_ALLOWED_CLASSIFICATION_RESULT_SIZE = 10000 def read_classification_results(storage_client, file_path): """Reads classification results from the file in Cloud Storage. This method reads file with classification results produced by running defense on singe batch of adversarial images. Args: storage_client: instance of CompetitionStorageClient or None for local file file_path: path of the file with results Returns: dictionary where keys are image names or IDs and values are classification labels """ if storage_client: # file on Cloud success = False retry_count = 0 while retry_count < 4: try: blob = storage_client.get_blob(file_path) if not blob: return {} if blob.size > MAX_ALLOWED_CLASSIFICATION_RESULT_SIZE: logging.warning( "Skipping classification result because it" "s too " "big: %d bytes for %s", blob.size, file_path, ) return None buf = BytesIO() blob.download_to_file(buf) buf.seek(0) success = True break except Exception: retry_count += 1 time.sleep(5) if not success: return None else: # local file try: with open(file_path, "rb") as f: buf = BytesIO(f.read()) except IOError: return None result = {} if PY3: buf = StringIO(buf.read().decode("UTF-8")) for row in csv.reader(buf): try: image_filename = row[0] if image_filename.endswith(".png") or image_filename.endswith(".jpg"): image_filename = image_filename[: image_filename.rfind(".")] label = int(row[1]) except (IndexError, ValueError): continue result[image_filename] = label return result def analyze_one_classification_result( storage_client, file_path, adv_batch, dataset_batches, dataset_meta ): """Reads and analyzes one classification result. This method reads file with classification result and counts how many images were classified correctly and incorrectly, how many times target class was hit and total number of images. Args: storage_client: instance of CompetitionStorageClient file_path: result file path adv_batch: AversarialBatches.data[adv_batch_id] adv_batch_id is stored in each ClassificationBatch entity dataset_batches: instance of DatasetBatches dataset_meta: instance of DatasetMetadata Returns: Tuple of (count_correctly_classified, count_errors, count_hit_target_class, num_images) """ class_result = read_classification_results(storage_client, file_path) if class_result is None: return 0, 0, 0, 0 adv_images = adv_batch["images"] dataset_batch_images = dataset_batches.data[adv_batch["dataset_batch_id"]]["images"] count_correctly_classified = 0 count_errors = 0 count_hit_target_class = 0 num_images = 0 for adv_img_id, label in iteritems(class_result): if adv_img_id not in adv_images: continue num_images += 1 clean_image_id = adv_images[adv_img_id]["clean_image_id"] dataset_image_id = dataset_batch_images[clean_image_id]["dataset_image_id"] if label == dataset_meta.get_true_label(dataset_image_id): count_correctly_classified += 1 else: count_errors += 1 if label == dataset_meta.get_target_class(dataset_image_id): count_hit_target_class += 1 return ( count_correctly_classified, count_errors, count_hit_target_class, num_images, ) class ResultMatrix(object): """Sparse matrix where rows and columns are indexed using string. This matrix is used to store resutls of the competition evaluation. """ def __init__(self, default_value=0): """Initializes empty matrix.""" self._items = {} self._dim0 = set() self._dim1 = set() self._default_value = default_value @property def dim0(self): """Returns set of rows.""" return self._dim0 @property def dim1(self): """Returns set of columns.""" return self._dim1 def __getitem__(self, key): """Returns element of the matrix indexed by given key. Args: key: tuple of (row_idx, column_idx) Returns: Element of the matrix Raises: IndexError: if key is invalid. """ if not isinstance(key, tuple) or len(key) != 2: raise IndexError("Invalid index: {0}".format(key)) return self._items.get(key, self._default_value) def __setitem__(self, key, value): """Sets element of the matrix at position indexed by key. Args: key: tuple of (row_idx, column_idx) value: new value of the element of the matrix Raises: IndexError: if key is invalid. """ if not isinstance(key, tuple) or len(key) != 2: raise IndexError("Invalid index: {0}".format(key)) self._dim0.add(key[0]) self._dim1.add(key[1]) self._items[key] = value def save_to_file(self, filename, remap_dim0=None, remap_dim1=None): """Saves matrix to the file. Args: filename: name of the file where to save matrix remap_dim0: dictionary with mapping row indices to row names which should be saved to file. If none then indices will be used as names. remap_dim1: dictionary with mapping column indices to column names which should be saved to file. If none then indices will be used as names. """ # rows - first index # columns - second index with open(filename, "w") as fobj: columns = list(sorted(self._dim1)) for col in columns: fobj.write(",") fobj.write(str(remap_dim1[col] if remap_dim1 else col)) fobj.write("\n") for row in sorted(self._dim0): fobj.write(str(remap_dim0[row] if remap_dim0 else row)) for col in columns: fobj.write(",") fobj.write(str(self[row, col])) fobj.write("\n") class ClassificationBatches(object): """Class which generates and stores classification batches. Each classification batch contains result of the classification of one batch of adversarial images. """ def __init__(self, datastore_client, storage_client, round_name): """Initializes ClassificationBatches. Args: datastore_client: instance of CompetitionDatastoreClient storage_client: instance of CompetitionStorageClient round_name: name of the round """ self._datastore_client = datastore_client self._storage_client = storage_client self._round_name = round_name # Data is dict of dicts {CLASSIFICATION_BATCH_ID: { ... }} self._data = {} def serialize(self, fobj): """Serializes data stored in this class.""" pickle.dump(self._data, fobj) def deserialize(self, fobj): """Deserializes data from file into this class.""" self._data = pickle.load(fobj) @property def data(self): """Returns dictionary with data.""" return self._data def __getitem__(self, key): """Returns one classification batch by given key.""" return self._data[key] def init_from_adversarial_batches_write_to_datastore( self, submissions, adv_batches ): """Populates data from adversarial batches and writes to datastore. Args: submissions: instance of CompetitionSubmissions adv_batches: instance of AversarialBatches """ # prepare classification batches idx = 0 for s_id in iterkeys(submissions.defenses): for adv_id in iterkeys(adv_batches.data): class_batch_id = CLASSIFICATION_BATCH_ID_PATTERN.format(idx) idx += 1 self.data[class_batch_id] = { "adversarial_batch_id": adv_id, "submission_id": s_id, "result_path": os.path.join( self._round_name, CLASSIFICATION_BATCHES_SUBDIR, s_id + "_" + adv_id + ".csv", ), } # save them to datastore client = self._datastore_client with client.no_transact_batch() as batch: for key, value in iteritems(self.data): entity = client.entity(client.key(KIND_CLASSIFICATION_BATCH, key)) entity.update(value) batch.put(entity) def init_from_datastore(self): """Initializes data by reading it from the datastore.""" self._data = {} client = self._datastore_client for entity in client.query_fetch(kind=KIND_CLASSIFICATION_BATCH): class_batch_id = entity.key.flat_path[-1] self.data[class_batch_id] = dict(entity) def read_batch_from_datastore(self, class_batch_id): """Reads and returns single batch from the datastore.""" client = self._datastore_client key = client.key(KIND_CLASSIFICATION_BATCH, class_batch_id) result = client.get(key) if result is not None: return dict(result) else: raise KeyError("Key {0} not found in the datastore".format(key.flat_path)) def compute_classification_results( self, adv_batches, dataset_batches, dataset_meta, defense_work=None ): """Computes classification results. Args: adv_batches: instance of AversarialBatches dataset_batches: instance of DatasetBatches dataset_meta: instance of DatasetMetadata defense_work: instance of DefenseWorkPieces Returns: accuracy_matrix, error_matrix, hit_target_class_matrix, processed_images_count """ class_batch_to_work = {} if defense_work: for v in itervalues(defense_work.work): class_batch_to_work[v["output_classification_batch_id"]] = v # accuracy_matrix[defense_id, attack_id] = num correctly classified accuracy_matrix = ResultMatrix() # error_matrix[defense_id, attack_id] = num misclassfied error_matrix = ResultMatrix() # hit_target_class_matrix[defense_id, attack_id] = num hit target class hit_target_class_matrix = ResultMatrix() # processed_images_count[defense_id] = num processed images by defense processed_images_count = {} total_count = len(self.data) processed_count = 0 logging.info("Processing %d files with classification results", len(self.data)) for k, v in iteritems(self.data): if processed_count % 100 == 0: logging.info( "Processed %d out of %d classification results", processed_count, total_count, ) processed_count += 1 defense_id = v["submission_id"] adv_batch = adv_batches.data[v["adversarial_batch_id"]] attack_id = adv_batch["submission_id"] work_item = class_batch_to_work.get(k) required_work_stats = [ "stat_correct", "stat_error", "stat_target_class", "stat_num_images", ] if work_item and work_item["error"]: # ignore batches with error continue if work_item and all( work_item.get(i) is not None for i in required_work_stats ): count_correctly_classified = work_item["stat_correct"] count_errors = work_item["stat_error"] count_hit_target_class = work_item["stat_target_class"] num_images = work_item["stat_num_images"] else: logging.warning("Recomputing accuracy for classification batch %s", k) ( count_correctly_classified, count_errors, count_hit_target_class, num_images, ) = analyze_one_classification_result( self._storage_client, v["result_path"], adv_batch, dataset_batches, dataset_meta, ) # update accuracy and hit target class accuracy_matrix[defense_id, attack_id] += count_correctly_classified error_matrix[defense_id, attack_id] += count_errors hit_target_class_matrix[defense_id, attack_id] += count_hit_target_class # update number of processed images processed_images_count[defense_id] = ( processed_images_count.get(defense_id, 0) + num_images ) return ( accuracy_matrix, error_matrix, hit_target_class_matrix, processed_images_count, ) def __str__(self): """Returns human readable string representation, useful for debugging.""" buf = StringIO() for idx, (class_batch_id, class_val) in enumerate(iteritems(self.data)): if idx >= TO_STR_MAX_BATCHES: buf.write(u" ...\n") break buf.write(u' ClassBatch "{0}"\n'.format(class_batch_id)) buf.write(u" {0}\n".format(str(class_val))) return buf.getvalue() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/cloud_client.py ================================================ """Helper classes and wrappers to access Google Cloud. Google Cloud API is encapsulated with these wrappers, so it's easier to test the code with help of fake (declared in testing/fake_cloud_client.py). """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import logging import math import random import time import traceback as tb from google.cloud import datastore from google.cloud import storage from google.cloud.exceptions import TooManyRequests # To resolve InsecurePlatformWarning try: import urllib3.contrib.pyopenssl urllib3.contrib.pyopenssl.inject_into_urllib3() print("Pyopenssl fix for urllib3 succesfully injected.") except ImportError: print("Failed to inject pyopenssl fix for urllib3.") # Cloud Datastore has 500 mutations per batch limit. MAX_MUTATIONS_IN_BATCH = 500 class CompetitionStorageClient(object): """Client wrapper to access Google Cloud Storage.""" def __init__(self, project_id, bucket_name): """Initialize client with project id and name of the storage bucket.""" self.project_id = project_id self.bucket_name = bucket_name self.client = storage.Client(project=project_id) self.bucket = self.client.get_bucket(bucket_name) def list_blobs(self, prefix=""): """Lists names of all blobs by their prefix.""" return [b.name for b in self.bucket.list_blobs(prefix=prefix)] def get_blob(self, blob_name): """Gets google.cloud.storage.blob.Blob object by blob name.""" return self.bucket.get_blob(blob_name) def new_blob(self, blob_name): """Creates new storage blob with provided name.""" return storage.Blob(blob_name, self.bucket) class NoTransactionBatch(object): """No transaction batch to write large number of entities. Usage: client = ... # instance of CompetitionDatastoreClient with NoTransactionBatch(client) as batch: batch.put(entity1) ... batch.put(entityN) batch.delete(del_entity1) ... batch.delete(del_entityM) It could be also used via CompetitionDatastoreClient.no_transact_batch: client = ... # instance of CompetitionDatastoreClient with client.no_transact_batch() as batch: batch.put(entity1) ... batch.put(entityN) batch.delete(del_entity1) ... batch.delete(del_entityM) Most methods of this class are provided to simulate google.cloud.datastore.batch.Batch interface, so they could be used interchangeably. Practically speaking, this class works by maintaining a buffer of pending mutations and committing them as soon as the length of the buffer reaches MAX_MUTATIONS_IN_BATCH. """ def __init__(self, client): """Init NoTransactionBatch with provided CompetitionDatastoreClient.""" self._client = client self._cur_batch = None self._num_mutations = 0 def begin(self): """Begins a batch.""" if self._cur_batch: raise ValueError("Previous batch is not committed.") self._cur_batch = self._client.batch() self._cur_batch.begin() self._num_mutations = 0 def commit(self): """Commits all pending mutations.""" self._cur_batch.commit() self._cur_batch = None self._num_mutations = 0 def rollback(self): """Rolls back pending mutations. Keep in mind that NoTransactionBatch splits all mutations into smaller batches and commit them as soon as mutation buffer reaches maximum length. That's why rollback method will only roll back pending mutations from the buffer, but won't be able to rollback already committed mutations. """ try: if self._cur_batch: self._cur_batch.rollback() except ValueError: # ignore "Batch must be in progress to rollback" error pass self._cur_batch = None self._num_mutations = 0 def put(self, entity): """Adds mutation of the entity to the mutation buffer. If mutation buffer reaches its capacity then this method commit all pending mutations from the buffer and emties it. Args: entity: entity which should be put into the datastore """ self._cur_batch.put(entity) self._num_mutations += 1 if self._num_mutations >= MAX_MUTATIONS_IN_BATCH: self.commit() self.begin() def delete(self, key): """Adds deletion of the entity with given key to the mutation buffer. If mutation buffer reaches its capacity then this method commit all pending mutations from the buffer and emties it. Args: key: key of the entity which should be deleted """ self._cur_batch.delete(key) self._num_mutations += 1 if self._num_mutations >= MAX_MUTATIONS_IN_BATCH: self.commit() self.begin() def __enter__(self): self.begin() return self def __exit__(self, exc_type, exc_value, traceback): if exc_type is None: self.commit() else: err = tb.format_exception(exc_type, exc_value, traceback) logging.error("Exception occurred during write:\n%s", err) self.rollback() def iterate_with_exp_backoff( base_iter, max_num_tries=6, max_backoff=300.0, start_backoff=4.0, backoff_multiplier=2.0, frac_random_backoff=0.25, ): """Iterate with exponential backoff on failures. Useful to wrap results of datastore Query.fetch to avoid 429 error. Args: base_iter: basic iterator of generator object max_num_tries: maximum number of tries for each request max_backoff: maximum backoff, in seconds start_backoff: initial value of backoff backoff_multiplier: backoff multiplier frac_random_backoff: fraction of the value of random part of the backoff Yields: values of yielded by base iterator """ try_number = 0 if hasattr(base_iter, "__iter__"): base_iter = iter(base_iter) while True: try: yield next(base_iter) try_number = 0 except StopIteration: break except TooManyRequests as e: logging.warning("TooManyRequests error: %s", tb.format_exc()) if try_number >= max_num_tries: logging.error("Number of tries exceeded, too many requests: %s", e) raise # compute sleep time for truncated exponential backoff sleep_time = start_backoff * math.pow(backoff_multiplier, try_number) sleep_time *= 1.0 + frac_random_backoff * random.random() sleep_time = min(sleep_time, max_backoff) logging.warning( "Too many requests error, " "retrying with exponential backoff %.3f", sleep_time, ) time.sleep(sleep_time) try_number += 1 class CompetitionDatastoreClient(object): """Client wrapper to access Google Cloud Datastore.""" def __init__(self, project_id, namespace=None): """Init this method with given project id and optional namespace.""" self._client = datastore.Client(project=project_id, namespace=namespace) def key(self, *args, **kwargs): """Creates datastore key.""" return self._client.key(*args, **kwargs) def entity(self, key): """Creates datastore entity.""" return datastore.Entity(key) def no_transact_batch(self): """Starts batch of mutation which is committed without transaction.""" return NoTransactionBatch(self._client) def batch(self): """Starts batch of mutations.""" return self._client.batch() def transaction(self): """Starts transaction.""" return self._client.transaction() def get(self, key, transaction=None): """Retrieves an entity given its key.""" return self._client.get(key, transaction=transaction) def query_fetch(self, **kwargs): """Queries datastore (using exponential backoff).""" return iterate_with_exp_backoff(self._client.query(**kwargs).fetch()) ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/dataset_helper.py ================================================ """Various helpers for the dataset. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import csv import hashlib import logging import os import shutil import subprocess import numpy as np from PIL import Image from six import iteritems class DatasetMetadata(object): """Helper class which loads and stores dataset metadata. Dataset metadata stored by this class contains true labels and target classes for all images in the dataset. """ def __init__(self, fobj): """Initializes instance of DatasetMetadata. Args: fobj: file object """ self._true_labels = {} self._target_classes = {} reader = csv.reader(fobj) header_row = next(reader) try: row_idx_image_id = header_row.index("ImageId") row_idx_true_label = header_row.index("TrueLabel") row_idx_target_class = header_row.index("TargetClass") except ValueError: raise IOError("Invalid format of the dataset metadata.") for row in reader: if len(row) < len(header_row): # skip partial or empty lines continue try: image_id = row[row_idx_image_id] self._true_labels[image_id] = int(row[row_idx_true_label]) self._target_classes[image_id] = int(row[row_idx_target_class]) except (IndexError, ValueError): raise IOError("Invalid format of dataset metadata") def get_true_label(self, image_id): """Returns true label for image with given ID.""" return self._true_labels[image_id] def get_target_class(self, image_id): """Returns target class for image with given ID.""" return self._target_classes[image_id] def save_target_classes_for_batch(self, filename, image_batches, batch_id): """Saves file with target class for given dataset batch. Args: filename: output filename image_batches: instance of ImageBatchesBase with dataset batches batch_id: dataset batch ID """ images = image_batches.data[batch_id]["images"] with open(filename, "w") as f: for image_id, image_val in iteritems(images): target_class = self.get_target_class(image_val["dataset_image_id"]) f.write("{0}.png,{1}\n".format(image_id, target_class)) def enforce_epsilon_and_compute_hash(dataset_batch_dir, adv_dir, output_dir, epsilon): """Enforces size of perturbation on images, and compute hashes for all images. Args: dataset_batch_dir: directory with the images of specific dataset batch adv_dir: directory with generated adversarial images output_dir: directory where to copy result epsilon: size of perturbation Returns: dictionary with mapping form image ID to hash. """ dataset_images = [f for f in os.listdir(dataset_batch_dir) if f.endswith(".png")] image_hashes = {} resize_warning = False for img_name in dataset_images: if not os.path.exists(os.path.join(adv_dir, img_name)): logging.warning("Image %s not found in the output", img_name) continue image = np.array( Image.open(os.path.join(dataset_batch_dir, img_name)).convert("RGB") ) image = image.astype("int32") image_max_clip = np.clip(image + epsilon, 0, 255).astype("uint8") image_min_clip = np.clip(image - epsilon, 0, 255).astype("uint8") # load and resize adversarial image if needed adv_image = Image.open(os.path.join(adv_dir, img_name)).convert("RGB") # Image.size is reversed compared to np.array.shape if adv_image.size[::-1] != image.shape[:2]: resize_warning = True adv_image = adv_image.resize( (image.shape[1], image.shape[0]), Image.BICUBIC ) adv_image = np.array(adv_image) clipped_adv_image = np.clip(adv_image, image_min_clip, image_max_clip) Image.fromarray(clipped_adv_image).save(os.path.join(output_dir, img_name)) # compute hash image_hashes[img_name[:-4]] = hashlib.sha1( clipped_adv_image.view(np.uint8) ).hexdigest() if resize_warning: logging.warning("One or more adversarial images had incorrect size") return image_hashes def download_dataset( storage_client, image_batches, target_dir, local_dataset_copy=None ): """Downloads dataset, organize it by batches and rename images. Args: storage_client: instance of the CompetitionStorageClient image_batches: subclass of ImageBatchesBase with data about images target_dir: target directory, should exist and be empty local_dataset_copy: directory with local dataset copy, if local copy is available then images will be takes from there instead of Cloud Storage Data in the target directory will be organized into subdirectories by batches, thus path to each image will be "target_dir/BATCH_ID/IMAGE_ID.png" where BATCH_ID - ID of the batch (key of image_batches.data), IMAGE_ID - ID of the image (key of image_batches.data[batch_id]['images']) """ for batch_id, batch_value in iteritems(image_batches.data): batch_dir = os.path.join(target_dir, batch_id) os.mkdir(batch_dir) for image_id, image_val in iteritems(batch_value["images"]): dst_filename = os.path.join(batch_dir, image_id + ".png") # try to use local copy first if local_dataset_copy: local_filename = os.path.join( local_dataset_copy, os.path.basename(image_val["image_path"]) ) if os.path.exists(local_filename): shutil.copyfile(local_filename, dst_filename) continue # download image from cloud cloud_path = ( "gs://" + storage_client.bucket_name + "/" + image_val["image_path"] ) if not os.path.exists(dst_filename): subprocess.call(["gsutil", "cp", cloud_path, dst_filename]) ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/image_batches.py ================================================ """Module with classes to read and store image batches. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import copy from io import BytesIO from io import StringIO import itertools import logging import os import zipfile from six import iteritems from six import iterkeys from six import itervalues # Cloud Datastore constants KIND_DATASET_BATCH = u"DatasetBatch" KIND_DATASET_IMAGE = u"DatasetImage" KIND_ADVERSARIAL_BATCH = u"AdversarialBatch" KIND_ADVERSARIAL_IMAGE = u"AdversarialImage" # Cloud Datastore ID patterns DATASET_BATCH_ID_PATTERN = u"BATCH{:03}" DATASET_IMAGE_ID_PATTERN = u"IMG{:06}" ADVERSARIAL_BATCH_ID_PATTERN = u"ADVBATCH{:03}" ADVERSARIAL_IMAGE_ID_PATTERN = u"ADV{:06}" # Default list of possible adversarial peturbations DEFAULT_EPSILON = [4, 8, 12, 16] # Constants for __str__ TO_STR_MAX_BATCHES = 5 TO_STR_MAX_IMAGES_PER_BATCH = 10 class ImageBatchesBase(object): """Base class to store image batches. Subclasses of this class are used to store batches of images from the dataset or batches of adversarial images. """ def __init__(self, datastore_client, entity_kind_batches, entity_kind_images): """Initialize ImageBatchesBase. Args: datastore_client: instance of the CompetitionDatastoreClient entity_kind_batches: Cloud Datastore entity kind which is used to store batches of images. entity_kind_images: Cloud Datastore entity kind which is used to store individual images. """ self._datastore_client = datastore_client self._entity_kind_batches = entity_kind_batches self._entity_kind_images = entity_kind_images # data is a dictionary with following structure: # self._data[batch_id] = { # 'batch_k1': batch_v1, # ... # 'batch_kN': batch_vN, # 'images': { # image_id: { 'img_k1': img_v1, ... } # } # } self._data = {} def _write_single_batch_images_internal(self, batch_id, client_batch): """Helper method to write images from single batch into datastore.""" client = self._datastore_client batch_key = client.key(self._entity_kind_batches, batch_id) for img_id, img in iteritems(self._data[batch_id]["images"]): img_entity = client.entity( client.key(self._entity_kind_images, img_id, parent=batch_key) ) for k, v in iteritems(img): img_entity[k] = v client_batch.put(img_entity) def write_to_datastore(self): """Writes all image batches to the datastore.""" client = self._datastore_client with client.no_transact_batch() as client_batch: for batch_id, batch_data in iteritems(self._data): batch_key = client.key(self._entity_kind_batches, batch_id) batch_entity = client.entity(batch_key) for k, v in iteritems(batch_data): if k != "images": batch_entity[k] = v client_batch.put(batch_entity) self._write_single_batch_images_internal(batch_id, client_batch) def write_single_batch_images_to_datastore(self, batch_id): """Writes only images from one batch to the datastore.""" client = self._datastore_client with client.no_transact_batch() as client_batch: self._write_single_batch_images_internal(batch_id, client_batch) def init_from_datastore(self): """Initializes batches by reading from the datastore.""" self._data = {} for entity in self._datastore_client.query_fetch( kind=self._entity_kind_batches ): batch_id = entity.key.flat_path[-1] self._data[batch_id] = dict(entity) self._data[batch_id]["images"] = {} for entity in self._datastore_client.query_fetch(kind=self._entity_kind_images): batch_id = entity.key.flat_path[-3] image_id = entity.key.flat_path[-1] self._data[batch_id]["images"][image_id] = dict(entity) @property def data(self): """Dictionary with data.""" return self._data def __getitem__(self, key): """Returns specific batch by its key.""" return self._data[key] def add_batch(self, batch_id, batch_properties=None): """Adds batch with give ID and list of properties.""" if batch_properties is None: batch_properties = {} if not isinstance(batch_properties, dict): raise ValueError( "batch_properties has to be dict, however it was: " + str(type(batch_properties)) ) self._data[batch_id] = batch_properties.copy() self._data[batch_id]["images"] = {} def add_image(self, batch_id, image_id, image_properties=None): """Adds image to given batch.""" if batch_id not in self._data: raise KeyError('Batch with ID "{0}" does not exist'.format(batch_id)) if image_properties is None: image_properties = {} if not isinstance(image_properties, dict): raise ValueError( "image_properties has to be dict, however it was: " + str(type(image_properties)) ) self._data[batch_id]["images"][image_id] = image_properties.copy() def count_num_images(self): """Counts total number of images in all batches.""" return sum([len(v["images"]) for v in itervalues(self.data)]) def __str__(self): """Returns human readable representation, which is useful for debugging.""" buf = StringIO() for batch_idx, (batch_id, batch_val) in enumerate(iteritems(self.data)): if batch_idx >= TO_STR_MAX_BATCHES: buf.write(u"...\n") break buf.write(u'BATCH "{0}"\n'.format(batch_id)) for k, v in iteritems(batch_val): if k != "images": buf.write(u" {0}: {1}\n".format(k, v)) for img_idx, img_id in enumerate(iterkeys(batch_val["images"])): if img_idx >= TO_STR_MAX_IMAGES_PER_BATCH: buf.write(u" ...") break buf.write( u' IMAGE "{0}" -- {1}\n'.format( img_id, batch_val["images"][img_id] ) ) buf.write(u"\n") return buf.getvalue() class DatasetBatches(ImageBatchesBase): """Class which stores batches of images from the dataset.""" def __init__(self, datastore_client, storage_client, dataset_name): """Initializes DatasetBatches. Args: datastore_client: instance of CompetitionDatastoreClient storage_client: instance of CompetitionStorageClient dataset_name: name of the dataset ('dev' or 'final') """ super(DatasetBatches, self).__init__( datastore_client=datastore_client, entity_kind_batches=KIND_DATASET_BATCH, entity_kind_images=KIND_DATASET_IMAGE, ) self._storage_client = storage_client self._dataset_name = dataset_name def _read_image_list(self, skip_image_ids=None): """Reads list of dataset images from the datastore.""" if skip_image_ids is None: skip_image_ids = [] images = self._storage_client.list_blobs( prefix=os.path.join("dataset", self._dataset_name) + "/" ) zip_files = [i for i in images if i.endswith(".zip")] if len(zip_files) == 1: # we have a zip archive with images zip_name = zip_files[0] logging.info("Reading list of images from zip file %s", zip_name) blob = self._storage_client.get_blob(zip_name) buf = BytesIO() logging.info("Downloading zip") blob.download_to_file(buf) buf.seek(0) logging.info("Reading content of the zip") with zipfile.ZipFile(buf) as f: images = [ os.path.join(zip_name, os.path.basename(n)) for n in f.namelist() if n.endswith(".png") ] buf.close() logging.info("Found %d images", len(images)) else: # we have just a directory with images, filter non-PNG files logging.info("Reading list of images from png files in storage") images = [i for i in images if i.endswith(".png")] logging.info("Found %d images", len(images)) # filter images which should be skipped images = [i for i in images if os.path.basename(i)[:-4] not in skip_image_ids] # assign IDs to images images = [ (DATASET_IMAGE_ID_PATTERN.format(idx), i) for idx, i in enumerate(sorted(images)) ] return images def init_from_storage_write_to_datastore( self, batch_size=100, allowed_epsilon=None, skip_image_ids=None, max_num_images=None, ): """Initializes dataset batches from the list of images in the datastore. Args: batch_size: batch size allowed_epsilon: list of allowed epsilon or None to use default skip_image_ids: list of image ids to skip max_num_images: maximum number of images to read """ if allowed_epsilon is None: allowed_epsilon = copy.copy(DEFAULT_EPSILON) # init dataset batches from data in storage self._dataset_batches = {} # read all blob names from storage images = self._read_image_list(skip_image_ids) if max_num_images: images = images[:max_num_images] for batch_idx, batch_start in enumerate(range(0, len(images), batch_size)): batch = images[batch_start : batch_start + batch_size] batch_id = DATASET_BATCH_ID_PATTERN.format(batch_idx) batch_epsilon = allowed_epsilon[batch_idx % len(allowed_epsilon)] self.add_batch(batch_id, {"epsilon": batch_epsilon}) for image_id, image_path in batch: self.add_image( batch_id, image_id, { "dataset_image_id": os.path.basename(image_path)[:-4], "image_path": image_path, }, ) # write data to datastore self.write_to_datastore() class AversarialBatches(ImageBatchesBase): """Class which stores batches of adversarial images generated by attacks.""" def __init__(self, datastore_client): """Initializes AversarialBatches. Args: datastore_client: instance of CompetitionDatastoreClient """ super(AversarialBatches, self).__init__( datastore_client=datastore_client, entity_kind_batches=KIND_ADVERSARIAL_BATCH, entity_kind_images=KIND_ADVERSARIAL_IMAGE, ) def init_from_dataset_and_submissions_write_to_datastore( self, dataset_batches, attack_submission_ids ): """Init list of adversarial batches from dataset batches and submissions. Args: dataset_batches: instances of DatasetBatches attack_submission_ids: iterable with IDs of all (targeted and nontargeted) attack submissions, could be obtains as CompetitionSubmissions.get_all_attack_ids() """ batches_x_attacks = itertools.product( dataset_batches.data.keys(), attack_submission_ids ) for idx, (dataset_batch_id, attack_id) in enumerate(batches_x_attacks): adv_batch_id = ADVERSARIAL_BATCH_ID_PATTERN.format(idx) self.add_batch( adv_batch_id, {"dataset_batch_id": dataset_batch_id, "submission_id": attack_id}, ) self.write_to_datastore() def count_generated_adv_examples(self): """Returns total number of all generated adversarial examples.""" result = {} for v in itervalues(self.data): s_id = v["submission_id"] result[s_id] = result.get(s_id, 0) + len(v["images"]) return result ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/submissions.py ================================================ """Classes and functions to manage submissions. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from collections import namedtuple from io import StringIO import os from six import iteritems # Cloud Storage directories ATTACK_SUBDIR = "submissions/nontargeted" TARGETED_ATTACK_SUBDIR = "submissions/targeted" DEFENSE_SUBDIR = "submissions/defense" # Cloud Datastore entity keys ATTACKS_ENTITY_KEY = [u"SubmissionType", u"Attacks"] TARGET_ATTACKS_ENTITY_KEY = [u"SubmissionType", u"TargetedAttacks"] DEFENSES_ENTITY_KEY = [u"SubmissionType", u"Defenses"] KIND_SUBMISSION = u"Submission" # Cloud Datastore ID patterns ATTACK_ID_PATTERN = u"SUBA{:03}" TARGETED_ATTACK_ID_PATTERN = u"SUBT{:03}" DEFENSE_ID_PATTERN = u"SUBD{:03}" # Constants for __str__ TO_STR_MAX_SUBMISSIONS = 5 ALLOWED_EXTENSIONS = [".zip", ".tar", ".tar.gz"] def participant_from_submission_path(submission_path): """Parses type of participant based on submission filename. Args: submission_path: path to the submission in Google Cloud Storage Returns: dict with one element. Element key correspond to type of participant (team, baseline), element value is ID of the participant. Raises: ValueError: is participant can't be determined based on submission path. """ basename = os.path.basename(submission_path) file_ext = None for e in ALLOWED_EXTENSIONS: if basename.endswith(e): file_ext = e break if not file_ext: raise ValueError("Invalid submission path: " + submission_path) basename = basename[: -len(file_ext)] if basename.isdigit(): return {"team_id": int(basename)} if basename.startswith("baseline_"): return {"baseline_id": basename[len("baseline_") :]} raise ValueError("Invalid submission path: " + submission_path) SubmissionDescriptor = namedtuple("SubmissionDescriptor", ["path", "participant_id"]) class CompetitionSubmissions(object): """Class which holds information about all submissions. All submissions are stored in 3 dictionaries, one for targeted attacks, one for non-targeted attacks and one for defenses. All submissions are identified using internal competition ID, which looks like 'SUB????'. Additionally each submission has external identified which could be name of baseline or Kaggle ID. External ID only used when list of submissions is formed and when scorebored is built. Internal submission IDs are used for all actual evaluation. Thus all identifiers are internal IDs unless otherwise noted. """ def __init__(self, datastore_client, storage_client, round_name): """Initializes CompetitionSubmissions. Args: datastore_client: instance of CompetitionDatastoreClient storage_client: instance of CompetitionStorageClient round_name: name of the round """ self._datastore_client = datastore_client self._storage_client = storage_client self._round_name = round_name # each of the variables is a dictionary, # where key - submission ID # value - SubmissionDescriptor namedtuple self._attacks = None self._targeted_attacks = None self._defenses = None def _load_submissions_from_datastore_dir(self, dir_suffix, id_pattern): """Loads list of submissions from the directory. Args: dir_suffix: suffix of the directory where submissions are stored, one of the folowing constants: ATTACK_SUBDIR, TARGETED_ATTACK_SUBDIR or DEFENSE_SUBDIR. id_pattern: pattern which is used to generate (internal) IDs for submissins. One of the following constants: ATTACK_ID_PATTERN, TARGETED_ATTACK_ID_PATTERN or DEFENSE_ID_PATTERN. Returns: dictionary with all found submissions """ submissions = self._storage_client.list_blobs( prefix=os.path.join(self._round_name, dir_suffix) ) return { id_pattern.format(idx): SubmissionDescriptor( path=s, participant_id=participant_from_submission_path(s) ) for idx, s in enumerate(submissions) } def init_from_storage_write_to_datastore(self): """Init list of sumibssions from Storage and saves them to Datastore. Should be called only once (typically by master) during evaluation of the competition. """ # Load submissions self._attacks = self._load_submissions_from_datastore_dir( ATTACK_SUBDIR, ATTACK_ID_PATTERN ) self._targeted_attacks = self._load_submissions_from_datastore_dir( TARGETED_ATTACK_SUBDIR, TARGETED_ATTACK_ID_PATTERN ) self._defenses = self._load_submissions_from_datastore_dir( DEFENSE_SUBDIR, DEFENSE_ID_PATTERN ) self._write_to_datastore() def _write_to_datastore(self): """Writes all submissions to datastore.""" # Populate datastore roots_and_submissions = zip( [ATTACKS_ENTITY_KEY, TARGET_ATTACKS_ENTITY_KEY, DEFENSES_ENTITY_KEY], [self._attacks, self._targeted_attacks, self._defenses], ) client = self._datastore_client with client.no_transact_batch() as batch: for root_key, submissions in roots_and_submissions: batch.put(client.entity(client.key(*root_key))) for k, v in iteritems(submissions): entity = client.entity( client.key(*(root_key + [KIND_SUBMISSION, k])) ) entity["submission_path"] = v.path entity.update(participant_from_submission_path(v.path)) batch.put(entity) def init_from_datastore(self): """Init list of submission from Datastore. Should be called by each worker during initialization. """ self._attacks = {} self._targeted_attacks = {} self._defenses = {} for entity in self._datastore_client.query_fetch(kind=KIND_SUBMISSION): submission_id = entity.key.flat_path[-1] submission_path = entity["submission_path"] participant_id = { k: entity[k] for k in ["team_id", "baseline_id"] if k in entity } submission_descr = SubmissionDescriptor( path=submission_path, participant_id=participant_id ) if list(entity.key.flat_path[0:2]) == ATTACKS_ENTITY_KEY: self._attacks[submission_id] = submission_descr elif list(entity.key.flat_path[0:2]) == TARGET_ATTACKS_ENTITY_KEY: self._targeted_attacks[submission_id] = submission_descr elif list(entity.key.flat_path[0:2]) == DEFENSES_ENTITY_KEY: self._defenses[submission_id] = submission_descr @property def attacks(self): """Dictionary with all non-targeted attacks.""" return self._attacks @property def targeted_attacks(self): """Dictionary with all targeted attacks.""" return self._targeted_attacks @property def defenses(self): """Dictionary with all defenses.""" return self._defenses def get_all_attack_ids(self): """Returns IDs of all attacks (targeted and non-targeted).""" return list(self.attacks.keys()) + list(self.targeted_attacks.keys()) def find_by_id(self, submission_id): """Finds submission by ID. Args: submission_id: ID of the submission Returns: SubmissionDescriptor with information about submission or None if submission is not found. """ return self._attacks.get( submission_id, self._defenses.get( submission_id, self._targeted_attacks.get(submission_id, None) ), ) def get_external_id(self, submission_id): """Returns human readable submission external ID. Args: submission_id: internal submission ID. Returns: human readable ID. """ submission = self.find_by_id(submission_id) if not submission: return None if "team_id" in submission.participant_id: return submission.participant_id["team_id"] elif "baseline_id" in submission.participant_id: return "baseline_" + submission.participant_id["baseline_id"] else: return "" def __str__(self): """Returns human readable representation, useful for debugging purposes.""" buf = StringIO() title_values = zip( [u"Attacks", u"Targeted Attacks", u"Defenses"], [self._attacks, self._targeted_attacks, self._defenses], ) for idx, (title, values) in enumerate(title_values): if idx >= TO_STR_MAX_SUBMISSIONS: buf.write("...\n") break buf.write(title) buf.write(u":\n") for k, v in iteritems(values): buf.write( u"{0} -- {1} {2}\n".format(k, v.path, str(v.participant_id)) ) buf.write(u"\n") return buf.getvalue() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/__init__.py ================================================ ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/classification_results_test.py ================================================ """Tests for eval_lib.classification_results.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import unittest from six import assertCountEqual from eval_lib import classification_results from eval_lib import image_batches from eval_lib import submissions from eval_lib import work_data from eval_lib.tests import fake_cloud_client ROUND_NAME = "round-name" class FakeDatasetMeta(object): """Fake for DatasetMetadata which alwasy returns constants.""" def get_true_label(self, _): return 1 def get_target_class(self, _): return 2 class ClassificationResultsTest(unittest.TestCase): def setUp(self): self.storage_client = fake_cloud_client.FakeStorageClient() self.datastore_client = fake_cloud_client.FakeDatastoreClient() self.submissions = submissions.CompetitionSubmissions( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=ROUND_NAME, ) # we only need list of submissin ids in CompetitionSubmissions for this test self.submissions._defenses = { "SUBD000": {}, "SUBD001": {}, } self.adv_batches = image_batches.AversarialBatches( datastore_client=self.datastore_client ) self.adv_batches._data = { "ADVBATCH000": { "dataset_batch_id": "BATCH000", "images": {}, "submission_id": "SUBA000", }, "ADVBATCH001": { "dataset_batch_id": "BATCH000", "images": {}, "submission_id": "SUBA001", }, "ADVBATCH002": { "dataset_batch_id": "BATCH000", "images": {}, "submission_id": "SUBT000", }, } def verify_classification_batches(self, class_batches): assertCountEqual( self, [ { "adversarial_batch_id": "ADVBATCH000", "submission_id": "SUBD000", "result_path": ( ROUND_NAME + "/classification_batches/SUBD000_ADVBATCH000.csv" ), }, { "adversarial_batch_id": "ADVBATCH000", "submission_id": "SUBD001", "result_path": ( ROUND_NAME + "/classification_batches/SUBD001_ADVBATCH000.csv" ), }, { "adversarial_batch_id": "ADVBATCH001", "submission_id": "SUBD000", "result_path": ( ROUND_NAME + "/classification_batches/SUBD000_ADVBATCH001.csv" ), }, { "adversarial_batch_id": "ADVBATCH001", "submission_id": "SUBD001", "result_path": ( ROUND_NAME + "/classification_batches/SUBD001_ADVBATCH001.csv" ), }, { "adversarial_batch_id": "ADVBATCH002", "submission_id": "SUBD000", "result_path": ( ROUND_NAME + "/classification_batches/SUBD000_ADVBATCH002.csv" ), }, { "adversarial_batch_id": "ADVBATCH002", "submission_id": "SUBD001", "result_path": ( ROUND_NAME + "/classification_batches/SUBD001_ADVBATCH002.csv" ), }, ], class_batches.data.values(), ) def test_init_from_adv_batches_and_submissions(self): class_batches = classification_results.ClassificationBatches( self.datastore_client, self.storage_client, ROUND_NAME ) class_batches.init_from_adversarial_batches_write_to_datastore( self.submissions, self.adv_batches ) self.verify_classification_batches(class_batches) class_batches = classification_results.ClassificationBatches( self.datastore_client, self.storage_client, ROUND_NAME ) class_batches.init_from_datastore() self.verify_classification_batches(class_batches) def test_read_batch_from_datastore(self): class_batches = classification_results.ClassificationBatches( self.datastore_client, self.storage_client, ROUND_NAME ) class_batches.init_from_adversarial_batches_write_to_datastore( self.submissions, self.adv_batches ) class_batches = classification_results.ClassificationBatches( self.datastore_client, self.storage_client, ROUND_NAME ) # read first batch from datastore and verify that only one batch was read batch = class_batches.read_batch_from_datastore("CBATCH000000") self.assertEqual(0, len(class_batches.data)) assertCountEqual( self, ["result_path", "adversarial_batch_id", "submission_id"], batch.keys() ) def test_compute_classification_results_from_defense_work(self): # Test computation of the results for the following case: # - one dataset batch BATCH000 with 5 images # - two defenses: SUBD000, SUBD001 # - three attacks with corresponding adversarial batches: # SUBA000 - ADVBATCH000 # SUBA001 - ADVBATCH001 # SUBT000 - ADVBATCH002 # # Results are following (correct/incorrect/hit tc/total adv img): # | SUBD000 | SUBD001 | # ----------+------------------+------------------+ # SUBA000 | defense error | 3 / 1 / 0 / 4 | # | WORK000 | WORK001 | # ----------+------------------+------------------+ # SUBA001 | 2 / 2 / 1 / 5 | 4 / 1 / 0 / 5 | # | WORK002 | WORK003 | # ----------+------------------+------------------+ # SUBT000 | 1 / 4 / 4 / 5 | 3 / 2 / 1 / 5 | # | WORK004 | WORK005 | class_batches = classification_results.ClassificationBatches( self.datastore_client, self.storage_client, ROUND_NAME ) result_path_prefix = ROUND_NAME + "/classification_batches/" class_batches._data = { "CBATCH000000": { "adversarial_batch_id": "ADVBATCH000", "submission_id": "SUBD000", "result_path": result_path_prefix + "SUBD000_ADVBATCH000.csv", }, "CBATCH000001": { "adversarial_batch_id": "ADVBATCH000", "submission_id": "SUBD001", "result_path": result_path_prefix + "SUBD001_ADVBATCH000.csv", }, "CBATCH000002": { "adversarial_batch_id": "ADVBATCH001", "submission_id": "SUBD000", "result_path": result_path_prefix + "SUBD000_ADVBATCH001.csv", }, "CBATCH000003": { "adversarial_batch_id": "ADVBATCH001", "submission_id": "SUBD001", "result_path": result_path_prefix + "SUBD001_ADVBATCH001.csv", }, "CBATCH000004": { "adversarial_batch_id": "ADVBATCH002", "submission_id": "SUBD000", "result_path": result_path_prefix + "SUBD000_ADVBATCH002.csv", }, "CBATCH000005": { "adversarial_batch_id": "ADVBATCH002", "submission_id": "SUBD001", "result_path": result_path_prefix + "SUBD001_ADVBATCH002.csv", }, } defense_work = work_data.DefenseWorkPieces(self.datastore_client) defense_work._work = { "WORK000": { "output_classification_batch_id": "CBATCH000000", "error": "error", }, "WORK001": { "output_classification_batch_id": "CBATCH000001", "stat_correct": 3, "stat_error": 1, "stat_target_class": 0, "stat_num_images": 4, "error": None, }, "WORK002": { "output_classification_batch_id": "CBATCH000002", "stat_correct": 2, "stat_error": 2, "stat_target_class": 1, "stat_num_images": 5, "error": None, }, "WORK003": { "output_classification_batch_id": "CBATCH000003", "stat_correct": 4, "stat_error": 1, "stat_target_class": 0, "stat_num_images": 5, "error": None, }, "WORK004": { "output_classification_batch_id": "CBATCH000004", "stat_correct": 1, "stat_error": 4, "stat_target_class": 4, "stat_num_images": 5, "error": None, }, "WORK005": { "output_classification_batch_id": "CBATCH000005", "stat_correct": 3, "stat_error": 2, "stat_target_class": 1, "stat_num_images": 5, "error": None, }, } # Compute and verify results ( accuracy_matrix, error_matrix, hit_target_class_matrix, processed_images_count, ) = class_batches.compute_classification_results( self.adv_batches, dataset_batches=None, dataset_meta=None, defense_work=defense_work, ) self.assertDictEqual( { ("SUBD001", "SUBA000"): 3, ("SUBD000", "SUBA001"): 2, ("SUBD001", "SUBA001"): 4, ("SUBD000", "SUBT000"): 1, ("SUBD001", "SUBT000"): 3, }, accuracy_matrix._items, ) self.assertDictEqual( { ("SUBD001", "SUBA000"): 1, ("SUBD000", "SUBA001"): 2, ("SUBD001", "SUBA001"): 1, ("SUBD000", "SUBT000"): 4, ("SUBD001", "SUBT000"): 2, }, error_matrix._items, ) self.assertDictEqual( { ("SUBD001", "SUBA000"): 0, ("SUBD000", "SUBA001"): 1, ("SUBD001", "SUBA001"): 0, ("SUBD000", "SUBT000"): 4, ("SUBD001", "SUBT000"): 1, }, hit_target_class_matrix._items, ) self.assertDictEqual({"SUBD000": 10, "SUBD001": 14}, processed_images_count) def test_read_classification_results(self): self.storage_client = fake_cloud_client.FakeStorageClient( {"filename": "img1.png,123\nimg2.jpg,456"} ) results = classification_results.read_classification_results( self.storage_client, "filename" ) self.assertDictEqual({"img1": 123, "img2": 456}, results) def test_analyze_one_classification_result(self): self.storage_client = fake_cloud_client.FakeStorageClient( {"filename": "a1.png,1\na2.png,4\na3.png,1\na4.png,1\na5.png,2\na6.png,9"} ) adv_batch = { "dataset_batch_id": "BATCH000", "images": { "a" + str(i): {"clean_image_id": "c" + str(i)} for i in range(1, 6) }, } dataset_batches = image_batches.DatasetBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, dataset_name="final", ) dataset_batches._data = { "BATCH000": { "images": { "c" + str(i): {"dataset_image_id": str(i)} for i in range(1, 6) } }, } ( count_correctly_classified, count_errors, count_hit_target_class, num_images, ) = classification_results.analyze_one_classification_result( self.storage_client, "filename", adv_batch, dataset_batches, FakeDatasetMeta(), ) self.assertEqual(3, count_correctly_classified) self.assertEqual(2, count_errors) self.assertEqual(1, count_hit_target_class) self.assertEqual(5, num_images) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/fake_cloud_client.py ================================================ """Library with fake Google Cloud client, used for testing of eval_lib. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import copy from io import StringIO import six class FakeBlob(object): """Fake for google.cloud.storage.blob.Blob to be used in tests.""" def __init__(self, content): """Initializes FakeBlob with given content.""" if six.PY3 and isinstance(content, str): self._content = content.encode() else: self._content = content self.size = len(content) def download_to_file(self, fobj): """Writes content of this blob into given file object.""" fobj.write(self._content) class FakeStorageClient(object): """Fake for CompetitionStorageClient to be used in tests.""" def __init__(self, blobs=None): """Inits FakeStorageClient with given blobs. Args: blobs: either list of blob names or dict with mapping from blob names to their content Raises: TypeError: if blobs argument has invalid type """ if blobs is not None: if isinstance(blobs, dict): self._blobs = copy.deepcopy(blobs) elif isinstance(blobs, list): self._blobs = {k: "" for k in blobs} else: raise TypeError("Invalid type of blobs argument") else: self._blobs = {} def list_blobs(self, prefix=""): """Lists names of all blobs by their prefix.""" return [b for b in self._blobs.keys() if b.startswith(prefix)] def get_blob(self, blob_name): """Gets google.cloud.storage.blob.Blob object by blob name.""" if blob_name in self._blobs: return FakeBlob(self._blobs[blob_name]) else: return None def new_blob(self, blob_name): """Creates new storage blob with provided name.""" del blob_name raise NotImplementedError("new_blob is not implemented in fake client.") class FakeDatastoreKey(object): """Fake datastore key. Fake datastore key is represented as a list with flat path. """ def __init__(self, *args, **kwargs): if "parent" not in kwargs: self._flat_path = args else: parent = kwargs["parent"] if not isinstance(parent, FakeDatastoreKey): raise ValueError("Invalid type of parent: " + str(type(parent))) self._flat_path = parent.flat_path + args @property def flat_path(self): return self._flat_path def __hash__(self): return hash(self._flat_path) def __eq__(self, other): return isinstance(other, FakeDatastoreKey) and ( self.flat_path == other.flat_path ) def __ne__(self, other): return not self.__eq__(other) def __str__(self): return self.__repr__() def __repr__(self): return "".format(self._flat_path) class FakeDatastoreEntity(dict): """Fake Datstore Entity. Fake datastore entity is just a dict, which additionally has key property. """ def __init__(self, key): super(FakeDatastoreEntity, self).__init__() if not isinstance(key, FakeDatastoreKey): raise TypeError("Wrong type of key: " + str(type(key))) self._key = key @property def key(self): return self._key def __eq__(self, other): if not isinstance(other, FakeDatastoreEntity): return False return other.key == self.key and (set(self.items()) == set(other.items())) def __ne__(self, other): return not self.__eq__(other) def __str__(self): return self.__repr__() def __repr__(self): return "".format( self.key, super(FakeDatastoreEntity, self).__repr__() ) def make_entity(key): """Helper method to make FakeDatastoreEntity. This method allows to path either tuple or FakeDatastoreKey as a key. Args: key: entity key, either tuple or FakeDatastoreKey Returns: Instance of FakeDatastoreEntity """ if isinstance(key, tuple): key = FakeDatastoreKey(*key) return FakeDatastoreEntity(key) class FakeDatastoreClientBatch(object): """Fake for NoTransactionBatch.""" def __init__(self, fake_datastore_client): """Init FakeDatastoreClientBatch.""" self._fake_datastore_client = fake_datastore_client self._mutations = [] def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): if exc_type is None: for m in self._mutations: self._fake_datastore_client.put(m) def put(self, entity): """Adds entity mutation to the batch.""" assert isinstance(entity, FakeDatastoreEntity) self._mutations.append(copy.deepcopy(entity)) class FakeDatastoreClientTransaction(object): """Fake for datastore transaction. See https://cloud.google.com/datastore/docs/concepts/transactions for details of how transactions work in Cloud Datastore. """ def __init__(self, fake_datastore_client): """Init FakeDatastoreClientTransaction.""" self._client = fake_datastore_client # snapshot of the data in the fake datastore self._data_snapshot = copy.deepcopy(fake_datastore_client.entities) # transaction stated: 'init', 'started', 'committed', 'rolledback' self._state = "init" # list of mutations in this transactions in sequential order # each mutation is instance of FakeDatastoreEntity self._mutations = [] # set of keys read in this transaction self._read_keys = set() def _check_transaction_started(self): """Helper method to check that transaction has been started.""" if self._state != "started": raise ValueError( ("Invalid state of transaction, " "expected started, was %s") % self._state ) def _check_update_state(self, old_state, new_state): """Checks old state and updates it to new state.""" if self._state != old_state: raise ValueError( "Invalid state of transaction, expected %s, was %s" % (old_state, self._state) ) self._state = new_state def begin(self): """Begins transaction.""" self._check_update_state("init", "started") def commit(self): """Commits transaction.""" self._check_transaction_started() # before committing transaction verity that all entities which # were read or updated in the transaction were not modified outside # of transaction touched_keys = self._read_keys | set([e.key for e in self._mutations]) for k in touched_keys: old_value = self._data_snapshot.get(k) cur_value = self._client.entities.get(k) if old_value != cur_value: self.rollback() raise Exception( "Transaction can not be committed due to " "conflicted updates in datastore." ) # commit all changes self._state = "committed" for m in self._mutations: self._client.put(m) def rollback(self): """Rolls back current transaction.""" self._check_update_state("started", "rolledback") self._mutations = [] def put(self, entity): """Puts entity to datastore.""" assert isinstance(entity, FakeDatastoreEntity) self._check_transaction_started() self._mutations.append(copy.deepcopy(entity)) def get(self, key): """Gets entity from the datastore.""" assert isinstance(key, FakeDatastoreKey) self._check_transaction_started() self._read_keys.add(key) return copy.deepcopy(self._data_snapshot.get(key)) def __enter__(self): self.begin() return self def __exit__(self, exc_type, exc_value, traceback): if exc_type is None: self.commit() else: self.rollback() _QUERY_FILTER_OPERATOR = { "<": lambda x, y: x < y, "<=": lambda x, y: x <= y, "=": lambda x, y: x == y, ">": lambda x, y: x > y, ">=": lambda x, y: x >= y, } class FakeDatastoreClient(object): """Fake for CompetitionDatastoreClient.""" def __init__(self, entities=None): """Init FakeDatastoreClient with specified entities.""" self._transaction_hook = None if isinstance(entities, list): self._entities = {e.key: e for e in entities} elif isinstance(entities, dict): self._entities = entities elif entities is None: self._entities = {} else: raise ValueError("Invalid type of entities: " + str(type(entities))) assert all([isinstance(k, FakeDatastoreKey) for k in self._entities.keys()]) @property def entities(self): """List of stored entities.""" return self._entities def key(self, *args, **kwargs): """Creates datastore key.""" return FakeDatastoreKey(*args, **kwargs) def entity(self, key): """Creates datastore entity.""" assert isinstance(key, FakeDatastoreKey) return FakeDatastoreEntity(key) def no_transact_batch(self): """Starts batch of mutation which is committed without transaction.""" return FakeDatastoreClientBatch(self) def transaction(self): """Starts datastore transaction.""" result = FakeDatastoreClientTransaction(self) if self._transaction_hook: self._transaction_hook(self) self._transaction_hook = None return result def get(self, key, transaction=None): """Gets an entity with given key.""" assert isinstance(key, FakeDatastoreKey) if transaction: return transaction.get(key) return copy.deepcopy(self._entities.get(key)) def put(self, entity): """Updates entity in the datastore.""" assert isinstance(entity, FakeDatastoreEntity) entity = copy.deepcopy(entity) if entity.key in self.entities: self.entities[entity.key].update(entity) else: self.entities[entity.key] = entity def batch(self): """Starts batch of mutations.""" raise NotImplementedError("FakeDatastoreClient.batch not implemented") def query_fetch(self, **kwargs): """Queries datastore.""" kind = kwargs.get("kind", None) ancestor = kwargs.get("ancestor", None) filters = kwargs.get("filters", []) if ancestor and not isinstance(ancestor, FakeDatastoreKey): raise ValueError("Invalid ancestor type: " + str(type(ancestor))) if ("projection" in kwargs) or ("order" in kwargs) or ("distinct_on" in kwargs): raise ValueError("Unsupported clause in arguments: " + str(kwargs)) for f in filters: if not isinstance(f, tuple) or len(f) != 3: raise ValueError("Invalid filter: " + str(filters)) if f[1] not in _QUERY_FILTER_OPERATOR.keys(): raise ValueError("Unsupported operator in filters: " + str(filters)) for e in self._entities.values(): key_tuple = e.key.flat_path if (kind is not None) and (key_tuple[-2] != kind): continue if (ancestor is not None) and (key_tuple[:-2] != ancestor.flat_path): continue all_filters_true = True for f in filters: if f[0] not in e: all_filters_true = False break if not _QUERY_FILTER_OPERATOR[f[1]](e[f[0]], f[2]): all_filters_true = False break if not all_filters_true: continue yield e def set_transaction_hook(self, hook): """Sets transaction hook. This hook will be executed right after next transaction created. It helps to model a situation when data are modified outside of transaction. To be used in tests to test how your code handles edits concurrent with transaction. Args: hook: transaction hook, should be a function which takes exactly one argument - instance of this class. Raises: ValueError: if transaction hook was already set """ if self._transaction_hook is not None: raise ValueError("Attempt to set transaction hook twice") self._transaction_hook = hook def __str__(self): """Returns string representation of all stored entities.""" buf = StringIO() for entity in self.entities.values(): buf.write(u"Entity {0}:\n".format(entity.key.flat_path)) buf.write(u" {0}\n".format(dict(entity))) return buf.getvalue() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/fake_cloud_client_test.py ================================================ """Tests for eval_lib.testing.fake_cloud_client.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import copy from io import BytesIO import unittest from eval_lib.tests import fake_cloud_client from six import assertCountEqual from six import b as six_b class FakeStorageClientTest(unittest.TestCase): def test_list_blobs(self): all_blobs = [ "some_blob", "dataset/dev_dataset.csv", "dataset/dev/img1.png", "dataset/dev/img2.png", ] client = fake_cloud_client.FakeStorageClient(all_blobs) assertCountEqual(self, all_blobs, client.list_blobs()) assertCountEqual( self, ["dataset/dev_dataset.csv", "dataset/dev/img1.png", "dataset/dev/img2.png"], client.list_blobs("dataset/dev"), ) assertCountEqual( self, ["dataset/dev/img1.png", "dataset/dev/img2.png"], client.list_blobs("dataset/dev/"), ) def test_get_blob(self): client = fake_cloud_client.FakeStorageClient( {"some_blob": "some_content", "blob2": "another_content"} ) self.assertIsNone(client.get_blob("blob3")) buf = BytesIO() client.get_blob("some_blob").download_to_file(buf) self.assertEqual(six_b("some_content"), buf.getvalue()) class FakeDatastoreKeyTest(unittest.TestCase): def test_flat_path(self): key1 = fake_cloud_client.FakeDatastoreKey("abc", "1") self.assertTupleEqual(("abc", "1"), key1.flat_path) key2 = fake_cloud_client.FakeDatastoreKey("def", "xyz", parent=key1) self.assertTupleEqual(("abc", "1", "def", "xyz"), key2.flat_path) def test_equality(self): key1a = fake_cloud_client.FakeDatastoreKey("abc", "1") key1b = fake_cloud_client.FakeDatastoreKey("abc", "1") key2a = fake_cloud_client.FakeDatastoreKey("def", "xyz", parent=key1a) key2b = fake_cloud_client.FakeDatastoreKey("def", "xyz", parent=key1a) # key equal to self self.assertTrue(key1a == key1a) self.assertFalse(key1a != key1a) # key equal to the same key self.assertTrue(key1a == key1b) self.assertFalse(key1a != key1b) self.assertTrue(key2a == key2b) self.assertFalse(key2a != key2b) # key different from other key self.assertFalse(key1a == key2a) self.assertTrue(key1a != key2a) # key not equal to tuple self.assertTrue(key1a != key1a.flat_path) self.assertFalse(key1a == key1a.flat_path) class FakeDatastoreEntityTest(unittest.TestCase): def test_key(self): entity = fake_cloud_client.make_entity(("abc", "1")) self.assertEqual(entity.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) def test_equality_keys(self): entity1a = fake_cloud_client.make_entity(("abc", "1")) entity1b = fake_cloud_client.make_entity(("abc", "1")) entity2 = fake_cloud_client.make_entity(("abc", "2")) self.assertFalse(entity1a == entity2) self.assertTrue(entity1a != entity2) self.assertTrue(entity1a == entity1b) self.assertFalse(entity1b != entity1b) def test_equality_dict(self): entity1 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = "v1" entity2 = fake_cloud_client.make_entity(("abc", "1")) entity2["k1"] = "v2" entity3 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = "v1" entity1["k2"] = "v2" # compare to self self.assertTrue(entity1 == entity1) self.assertFalse(entity1 != entity1) self.assertTrue(entity2 == entity2) self.assertFalse(entity2 != entity2) self.assertTrue(entity3 == entity3) self.assertFalse(entity3 != entity3) # compare to others self.assertFalse(entity1 == entity2) self.assertTrue(entity1 != entity2) self.assertFalse(entity1 == entity3) self.assertTrue(entity1 != entity3) self.assertFalse(entity2 == entity3) self.assertTrue(entity2 != entity3) def test_copy(self): entity1 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = ["v1"] self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) self.assertEqual(dict(entity1), {"k1": ["v1"]}) entity2 = copy.copy(entity1) entity2["k1"].append("v2") entity2["k3"] = "v3" self.assertIsInstance(entity2, fake_cloud_client.FakeDatastoreEntity) self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) self.assertEqual(dict(entity1), {"k1": ["v1", "v2"]}) self.assertEqual(entity2.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) self.assertEqual(dict(entity2), {"k1": ["v1", "v2"], "k3": "v3"}) def test_deep_copy(self): entity1 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = ["v1"] self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) self.assertEqual(dict(entity1), {"k1": ["v1"]}) entity2 = copy.deepcopy(entity1) entity2["k1"].append("v2") entity2["k3"] = "v3" self.assertIsInstance(entity2, fake_cloud_client.FakeDatastoreEntity) self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) self.assertEqual(dict(entity1), {"k1": ["v1"]}) self.assertEqual(entity2.key, fake_cloud_client.FakeDatastoreKey("abc", "1")) self.assertEqual(dict(entity2), {"k1": ["v1", "v2"], "k3": "v3"}) class FakeDatastoreClientTest(unittest.TestCase): def setUp(self): self._client = fake_cloud_client.FakeDatastoreClient() self._key1 = self._client.key("abc", "def") self._key2 = self._client.key("qwe", "rty", parent=self._key1) self._entity1 = self._client.entity(self._key1) self._entity1["k1"] = "v1" self._entity2 = self._client.entity(self._key2) self._entity2["k2"] = "v2" self._entity2["k3"] = "v3" def test_make_key(self): self.assertTupleEqual(("abc", "def"), self._key1.flat_path) self.assertTupleEqual(("abc", "def", "qwe", "rty"), self._key2.flat_path) def test_make_entity(self): self.assertTupleEqual(("abc", "def"), self._entity1.key.flat_path) def test_put_entity(self): self.assertDictEqual({}, self._client.entities) self._client.put(self._entity1) self.assertDictEqual({self._key1: self._entity1}, self._client.entities) self._client.put(self._entity2) self.assertDictEqual( {self._key1: self._entity1, self._key2: self._entity2}, self._client.entities, ) def test_get_entity(self): self._client.put(self._entity1) self._client.put(self._entity2) self.assertEqual(self._entity1, self._client.get(self._key1)) self.assertEqual(self._entity2, self._client.get(self._key2)) def test_write_batch(self): with self._client.no_transact_batch() as batch: batch.put(self._entity1) batch.put(self._entity2) assertCountEqual(self, [self._key1, self._key2], self._client.entities.keys()) self.assertEqual(self._key1, self._client.entities[self._key1].key) self.assertDictEqual({"k1": "v1"}, dict(self._client.entities[self._key1])) self.assertEqual(self._key2, self._client.entities[self._key2].key) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) def test_overwrite_values(self): client = fake_cloud_client.FakeDatastoreClient() key1 = client.key("abc", "def") entity1 = client.entity(key1) entity1["k1"] = "v1" entity2 = client.entity(key1) entity2["k1"] = "v2" entity2["k2"] = "v3" with client.no_transact_batch() as batch: batch.put(entity1) assertCountEqual(self, [key1], client.entities.keys()) self.assertEqual(key1, client.entities[key1].key) self.assertDictEqual({"k1": "v1"}, dict(client.entities[key1])) with client.no_transact_batch() as batch: batch.put(entity2) assertCountEqual(self, [key1], client.entities.keys()) self.assertEqual(key1, client.entities[key1].key) self.assertDictEqual({"k1": "v2", "k2": "v3"}, dict(client.entities[key1])) def test_query_fetch_all(self): entity1 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = "v1" entity2 = fake_cloud_client.make_entity(("abc", "1", "def", "2")) entity2["k2"] = "v2" client = fake_cloud_client.FakeDatastoreClient([entity1, entity2]) assertCountEqual(self, [entity1, entity2], client.query_fetch()) def test_query_fetch_kind_filter(self): entity1 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = "v1" entity2 = fake_cloud_client.make_entity(("abc", "1", "def", "2")) entity2["k2"] = "v2" client = fake_cloud_client.FakeDatastoreClient([entity1, entity2]) assertCountEqual(self, [entity1], client.query_fetch(kind="abc")) assertCountEqual(self, [entity2], client.query_fetch(kind="def")) def test_query_fetch_ancestor_filter(self): entity1 = fake_cloud_client.make_entity(("abc", "1", "def", "2")) entity1["k1"] = "v1" entity2 = fake_cloud_client.make_entity(("xyz", "3", "qwe", "4")) entity2["k2"] = "v2" client = fake_cloud_client.FakeDatastoreClient([entity1, entity2]) assertCountEqual( self, [entity1], client.query_fetch(ancestor=client.key("abc", "1")) ) assertCountEqual( self, [entity2], client.query_fetch(ancestor=client.key("xyz", "3")) ) def test_query_fetch_ancestor_and_kind_filter(self): entity1 = fake_cloud_client.make_entity(("abc", "1", "def", "2")) entity1["k1"] = "v1" entity2 = fake_cloud_client.make_entity(("abc", "1", "xyz", "3")) entity2["k2"] = "v2" entity3 = fake_cloud_client.make_entity(("def", "4")) entity3["k2"] = "v2" client = fake_cloud_client.FakeDatastoreClient([entity1, entity2, entity3]) assertCountEqual( self, [entity1], client.query_fetch(kind="def", ancestor=client.key("abc", "1")), ) def test_query_fetch_data_filter(self): entity1 = fake_cloud_client.make_entity(("abc", "1")) entity1["k1"] = "v1" entity2 = fake_cloud_client.make_entity(("abc", "2")) entity2["k1"] = "v2" entity2["k2"] = "v2" entity3 = fake_cloud_client.make_entity(("abc", "3")) entity3["k2"] = "v3" client = fake_cloud_client.FakeDatastoreClient([entity1, entity2, entity3]) assertCountEqual( self, [entity1], client.query_fetch(filters=[("k1", "=", "v1")]) ) assertCountEqual( self, [entity2], client.query_fetch(filters=[("k1", ">", "v1")]) ) assertCountEqual( self, [entity1, entity2], client.query_fetch(filters=[("k1", ">=", "v1")]) ) assertCountEqual( self, [entity2], client.query_fetch(filters=[("k2", "<", "v3")]) ) assertCountEqual( self, [entity2, entity3], client.query_fetch(filters=[("k2", "<=", "v3")]) ) assertCountEqual( self, [entity2], client.query_fetch(filters=[("k1", ">=", "v1"), ("k2", "<=", "v3")]), ) class FakeDatastoreClientTransactionTest(unittest.TestCase): def setUp(self): self._client = fake_cloud_client.FakeDatastoreClient() self._key1 = self._client.key("abc", "def") self._key2 = self._client.key("qwe", "rty", parent=self._key1) self._key3 = self._client.key("123", "456") self._entity1 = self._client.entity(self._key1) self._entity1["k1"] = "v1" self._entity2 = self._client.entity(self._key2) self._entity2["k2"] = "v2" self._entity2["k3"] = "v3" self._entity3 = self._client.entity(self._key3) self._entity3["k4"] = "v4" self._entity3["k5"] = "v5" self._entity3["k6"] = "v6" self._client.put(self._entity1) self._client.put(self._entity2) self._client.put(self._entity3) # verify datastore content assertCountEqual( self, [self._key1, self._key2, self._key3], self._client.entities.keys() ) self.assertDictEqual({"k1": "v1"}, dict(self._client.entities[self._key1])) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) self.assertDictEqual( {"k4": "v4", "k5": "v5", "k6": "v6"}, dict(self._client.entities[self._key3]), ) def test_transaction_write_only_no_concurrent(self): key4 = self._client.key("zxc", "vbn") entity4 = self._client.entity(key4) entity4["k7"] = "v7" entity3_upd = self._client.entity(self._key3) entity3_upd["k4"] = "upd_v4" with self._client.transaction() as transaction: # first write in transaction transaction.put(entity4) # second write in transaction transaction.put(entity3_upd) # verify datastore content assertCountEqual( self, [self._key1, self._key2, self._key3, key4], self._client.entities.keys(), ) self.assertDictEqual({"k1": "v1"}, dict(self._client.entities[self._key1])) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) self.assertDictEqual( {"k4": "upd_v4", "k5": "v5", "k6": "v6"}, dict(self._client.entities[self._key3]), ) self.assertDictEqual({"k7": "v7"}, dict(self._client.entities[key4])) def test_transaction_read_write_no_concurrent(self): key4 = self._client.key("zxc", "vbn") entity4 = self._client.entity(key4) entity4["k7"] = "v7" entity3_upd = self._client.entity(self._key3) entity3_upd["k4"] = "upd_v4" with self._client.transaction() as transaction: # reading in transaction always returns data snapshot before transaction read_entity = self._client.get(self._key3, transaction=transaction) self.assertDictEqual( {"k4": "v4", "k5": "v5", "k6": "v6"}, dict(read_entity) ) # first write in transaction transaction.put(entity3_upd) # second write in transaction transaction.put(entity4) # reading in transaction always returns data snapshot before transaction read_entity = self._client.get(self._key3, transaction=transaction) self.assertDictEqual( {"k4": "v4", "k5": "v5", "k6": "v6"}, dict(read_entity) ) # verify datastore content assertCountEqual( self, [self._key1, self._key2, self._key3, key4], self._client.entities.keys(), ) self.assertDictEqual({"k1": "v1"}, dict(self._client.entities[self._key1])) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) self.assertDictEqual( {"k4": "upd_v4", "k5": "v5", "k6": "v6"}, dict(self._client.entities[self._key3]), ) self.assertDictEqual({"k7": "v7"}, dict(self._client.entities[key4])) def test_transaction_read_write_concurrent_not_intersecting(self): key4 = self._client.key("zxc", "vbn") entity4 = self._client.entity(key4) entity4["k7"] = "v7" entity3_upd = self._client.entity(self._key3) entity3_upd["k4"] = "upd_v4" entity1_upd = self._client.entity(self._key1) entity1_upd["k1"] = "upd_v1" with self._client.transaction() as transaction: # reading in transaction always returns data snapshot before transaction read_entity = self._client.get(self._key3, transaction=transaction) self.assertDictEqual( {"k4": "v4", "k5": "v5", "k6": "v6"}, dict(read_entity) ) # first write in transaction transaction.put(entity3_upd) # modify some data which are not references in the transaction self._client.put(entity1_upd) # second write in transaction transaction.put(entity4) # reading in transaction always returns data snapshot before transaction read_entity = self._client.get(self._key3, transaction=transaction) self.assertDictEqual( {"k4": "v4", "k5": "v5", "k6": "v6"}, dict(read_entity) ) # verify datastore content assertCountEqual( self, [self._key1, self._key2, self._key3, key4], self._client.entities.keys(), ) self.assertDictEqual({"k1": "upd_v1"}, dict(self._client.entities[self._key1])) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) self.assertDictEqual( {"k4": "upd_v4", "k5": "v5", "k6": "v6"}, dict(self._client.entities[self._key3]), ) self.assertDictEqual({"k7": "v7"}, dict(self._client.entities[key4])) def test_transaction_write_concurrent(self): key4 = self._client.key("zxc", "vbn") entity4 = self._client.entity(key4) entity4["k7"] = "v7" entity3_upd = self._client.entity(self._key3) entity3_upd["k4"] = "upd_v4" entity3_upd_no_transact = self._client.entity(self._key3) entity3_upd_no_transact["k4"] = "another_v4" reached_end_of_transaction = False with self.assertRaises(Exception): with self._client.transaction() as transaction: # first write in transaction transaction.put(entity3_upd) # modify some data which are not references in the transaction self._client.put(entity3_upd_no_transact) # second write in transaction transaction.put(entity4) reached_end_of_transaction = True self.assertTrue(reached_end_of_transaction) # verify datastore content assertCountEqual( self, [self._key1, self._key2, self._key3], self._client.entities.keys() ) self.assertDictEqual({"k1": "v1"}, dict(self._client.entities[self._key1])) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) self.assertDictEqual( {"k4": "another_v4", "k5": "v5", "k6": "v6"}, dict(self._client.entities[self._key3]), ) def test_transaction_read_concurrent(self): key4 = self._client.key("zxc", "vbn") entity4 = self._client.entity(key4) entity4["k7"] = "v7" entity3_upd_no_transact = self._client.entity(self._key3) entity3_upd_no_transact["k4"] = "another_v4" reached_end_of_transaction = False with self.assertRaises(Exception): with self._client.transaction() as transaction: # write in transaction transaction.put(entity4) # read in transaction read_entity = self._client.get(self._key3, transaction=transaction) self.assertDictEqual( {"k4": "v4", "k5": "v5", "k6": "v6"}, dict(read_entity) ) # modify some data which are not references in the transaction self._client.put(entity3_upd_no_transact) reached_end_of_transaction = True self.assertTrue(reached_end_of_transaction) # verify datastore content assertCountEqual( self, [self._key1, self._key2, self._key3], self._client.entities.keys() ) self.assertDictEqual({"k1": "v1"}, dict(self._client.entities[self._key1])) self.assertDictEqual( {"k2": "v2", "k3": "v3"}, dict(self._client.entities[self._key2]) ) self.assertDictEqual( {"k4": "another_v4", "k5": "v5", "k6": "v6"}, dict(self._client.entities[self._key3]), ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/image_batches_test.py ================================================ """Tests for eval_lib.image_batches.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import itertools import unittest from six import assertCountEqual from eval_lib import image_batches from eval_lib import submissions from eval_lib.tests import fake_cloud_client ROUND_NAME = "round-name" class ImageBatchesBaseTest(unittest.TestCase): def setUp(self): self.datastore_client = fake_cloud_client.FakeDatastoreClient() self.image_batches = image_batches.ImageBatchesBase( datastore_client=self.datastore_client, entity_kind_batches="Batch", entity_kind_images="Image", ) def test_add_batch(self): self.assertEqual(0, len(self.image_batches.data)) self.image_batches.add_batch( "batch1", batch_properties={"k1": "v1", "k2": "v2"} ) self.assertEqual(1, len(self.image_batches.data)) self.assertDictEqual( {"k1": "v1", "k2": "v2", "images": {}}, self.image_batches["batch1"] ) self.image_batches.add_batch("batch2", batch_properties={"k3": "v3"}) self.assertEqual(2, len(self.image_batches.data)) self.assertDictEqual({"k3": "v3", "images": {}}, self.image_batches["batch2"]) def test_add_image(self): self.assertEqual(0, len(self.image_batches.data)) self.image_batches.add_batch( "batch1", batch_properties={"k1": "v1", "k2": "v2"} ) self.image_batches.add_image("batch1", "img1", image_properties={"k4": "v4"}) self.assertEqual(1, len(self.image_batches.data)) self.assertDictEqual( {"k1": "v1", "k2": "v2", "images": {"img1": {"k4": "v4"}}}, self.image_batches["batch1"], ) self.image_batches.add_image("batch1", "img2", image_properties={"k5": "v5"}) self.assertEqual(1, len(self.image_batches.data)) self.assertDictEqual( { "k1": "v1", "k2": "v2", "images": {"img1": {"k4": "v4"}, "img2": {"k5": "v5"}}, }, self.image_batches["batch1"], ) def test_write_to_datastore(self): # add 2 batches and 3 images, write everything to datastore self.image_batches.add_batch( "batch1", batch_properties={"k1": "v1", "k2": "v2"} ) self.image_batches.add_batch("batch2", batch_properties={"k3": "v3"}) self.image_batches.add_image("batch1", "img1", image_properties={"k4": "v4"}) self.image_batches.add_image("batch1", "img2", image_properties={"k5": "v5"}) self.image_batches.add_image("batch2", "img3", image_properties={"k6": "v6"}) self.image_batches.write_to_datastore() # verify batches batch_entity1 = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("Batch", "batch1") ) batch_entity1.update({"k1": "v1", "k2": "v2"}) batch_entity2 = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("Batch", "batch2") ) batch_entity2.update({"k3": "v3"}) assertCountEqual( self, [batch_entity1, batch_entity2], self.datastore_client.query_fetch(kind="Batch"), ) # verify images img_entity1 = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("Batch", "batch2", "Image", "img1") ) img_entity1.update({"k4": "v4"}) img_entity2 = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("Batch", "batch2", "Image", "img2") ) img_entity2.update({"k5": "v5"}) img_entity3 = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("Batch", "batch2", "Image", "img3") ) img_entity3.update({"k6": "v6"}) def test_write_single_batch_images_to_datastore(self): # add 2 batches and 3 images, write only one batch to datastore self.image_batches.add_batch( "batch1", batch_properties={"k1": "v1", "k2": "v2"} ) self.image_batches.add_batch("batch2", batch_properties={"k3": "v3"}) self.image_batches.add_image("batch1", "img1", image_properties={"k4": "v4"}) self.image_batches.add_image("batch1", "img2", image_properties={"k5": "v5"}) self.image_batches.add_image("batch2", "img3", image_properties={"k6": "v6"}) self.image_batches.write_single_batch_images_to_datastore("batch2") # verify batches # write_single_batch_images_to_datastore writes only images, so no batches assertCountEqual(self, [], self.datastore_client.query_fetch(kind="Batch")) # verify images img_entity3 = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("Batch", "batch2", "Image", "img3") ) img_entity3.update({"k6": "v6"}) assertCountEqual( self, [img_entity3], self.datastore_client.query_fetch(kind="Image") ) class DatasetBatchesTest(unittest.TestCase): def setUp(self): storage_blobs = [ "dataset/dev/img1.png", "dataset/dev/img2.png", "dataset/dev/img3.png", "dataset/dev/img4.png", "dataset/dev/img5.png", "dataset/dev_dataset.csv", ] self.storage_client = fake_cloud_client.FakeStorageClient(storage_blobs) self.datastore_client = fake_cloud_client.FakeDatastoreClient() self.dataset_batches = image_batches.DatasetBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, dataset_name="dev", ) def verify_dataset_batches(self): self.assertEqual(2, len(self.dataset_batches.data)) all_images = {} for batch in self.dataset_batches.data.values(): self.assertIn(batch["epsilon"], [4, 8, 12, 16]) self.assertGreaterEqual(3, len(batch["images"])) self.assertTrue( set(all_images.keys()).isdisjoint(batch["images"].keys()), msg=( "all_images and batch['images'] contains common keys %s" % set(all_images.keys()).intersection(batch["images"].keys()) ), ) all_images.update(batch["images"]) assertCountEqual( self, [ {"dataset_image_id": "img1", "image_path": "dataset/dev/img1.png"}, {"dataset_image_id": "img2", "image_path": "dataset/dev/img2.png"}, {"dataset_image_id": "img3", "image_path": "dataset/dev/img3.png"}, {"dataset_image_id": "img4", "image_path": "dataset/dev/img4.png"}, {"dataset_image_id": "img5", "image_path": "dataset/dev/img5.png"}, ], all_images.values(), ) def verify_datastore_entities(self): # Verify 'DatasetBatch' entities expected_batch_entities = [] for batch_id, batch in self.dataset_batches.data.items(): entity = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("DatasetBatch", batch_id) ) entity["epsilon"] = batch["epsilon"] expected_batch_entities.append(entity) assertCountEqual( self, expected_batch_entities, self.datastore_client.query_fetch(kind="DatasetBatch"), ) # Verify 'DatasetImage' entities expected_image_entities = [] for batch_id, batch in self.dataset_batches.data.items(): for image_id, image in batch["images"].items(): entity = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey( "DatasetBatch", batch_id, "DatasetImage", image_id ) ) entity.update(image) expected_image_entities.append(entity) assertCountEqual( self, expected_image_entities, self.datastore_client.query_fetch(kind="DatasetImage"), ) def test_init_from_storage(self): self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3) self.verify_dataset_batches() self.verify_datastore_entities() def test_init_from_datastore(self): self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3) self.dataset_batches = image_batches.DatasetBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, dataset_name="dev", ) self.dataset_batches.init_from_datastore() self.verify_dataset_batches() def test_count_num_images(self): self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3) self.assertEqual(5, self.dataset_batches.count_num_images()) class AdversarialBatchesTest(unittest.TestCase): def setUp(self): # prepare dataset batches and submissions storage_blobs = [ "dataset/dev/img1.png", "dataset/dev/img2.png", "dataset/dev/img3.png", "dataset/dev/img4.png", "dataset/dev/img5.png", "dataset/dev_dataset.csv", ROUND_NAME + "/submissions/nontargeted/1.zip", ROUND_NAME + "/submissions/nontargeted/baseline_nt.zip", ROUND_NAME + "/submissions/targeted/1.zip", ROUND_NAME + "/submissions/targeted/2.zip", ROUND_NAME + "/submissions/defense/3.zip", ROUND_NAME + "/submissions/defense/baseline_adv_train.zip", ] self.storage_client = fake_cloud_client.FakeStorageClient(storage_blobs) self.datastore_client = fake_cloud_client.FakeDatastoreClient() self.dataset_batches = image_batches.DatasetBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, dataset_name="dev", ) self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3) self.submissions = submissions.CompetitionSubmissions( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=ROUND_NAME, ) self.submissions.init_from_storage_write_to_datastore() def verify_adversarial_batches_without_images(self, adv_batches): attack_ids = list(self.submissions.attacks.keys()) + list( self.submissions.targeted_attacks.keys() ) dataset_batch_ids = self.dataset_batches.data.keys() expected_batches = [ {"dataset_batch_id": b_id, "submission_id": a_id, "images": {}} for (b_id, a_id) in itertools.product(dataset_batch_ids, attack_ids) ] assertCountEqual(self, expected_batches, adv_batches.data.values()) def test_init_from_dataset_and_submissions(self): adv_batches = image_batches.AversarialBatches( datastore_client=self.datastore_client ) adv_batches.init_from_dataset_and_submissions_write_to_datastore( dataset_batches=self.dataset_batches, attack_submission_ids=self.submissions.get_all_attack_ids(), ) self.verify_adversarial_batches_without_images(adv_batches) def test_init_from_datastore(self): # populate datastore adv_batches = image_batches.AversarialBatches( datastore_client=self.datastore_client ) adv_batches.init_from_dataset_and_submissions_write_to_datastore( dataset_batches=self.dataset_batches, attack_submission_ids=self.submissions.get_all_attack_ids(), ) # init AversarialBatches from datastore adv_batches = image_batches.AversarialBatches( datastore_client=self.datastore_client ) adv_batches.init_from_datastore() self.verify_adversarial_batches_without_images(adv_batches) def test_count_generated_adv_examples(self): adv_batches = image_batches.AversarialBatches( datastore_client=self.datastore_client ) adv_batches.init_from_dataset_and_submissions_write_to_datastore( dataset_batches=self.dataset_batches, attack_submission_ids=self.submissions.get_all_attack_ids(), ) self.assertDictEqual( {"SUBA000": 0, "SUBA001": 0, "SUBT000": 0, "SUBT001": 0}, adv_batches.count_generated_adv_examples(), ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/submissions_test.py ================================================ """Tests for eval_lib.submissions.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import unittest from six import assertCountEqual from eval_lib import submissions from eval_lib.tests import fake_cloud_client ROUND_NAME = "round-name" class ParticipantFromSubmissionPathTest(unittest.TestCase): def test_team_id(self): self.assertDictEqual( {"team_id": 42}, submissions.participant_from_submission_path("path/42.zip") ) def test_baseline_id(self): self.assertDictEqual( {"baseline_id": "a_1"}, submissions.participant_from_submission_path("path/baseline_a_1.zip"), ) def test_tar_extension(self): self.assertDictEqual( {"team_id": 42}, submissions.participant_from_submission_path("path/42.tar") ) def test_tar_gz_extension(self): self.assertDictEqual( {"team_id": 42}, submissions.participant_from_submission_path("path/42.tar.gz"), ) class SubmissionsTest(unittest.TestCase): def setUp(self): storage_blobs = [ ROUND_NAME + "/submissions/nontargeted/1.zip", ROUND_NAME + "/submissions/nontargeted/baseline_nt.zip", ROUND_NAME + "/submissions/targeted/1.zip", ROUND_NAME + "/submissions/targeted/2.zip", ROUND_NAME + "/submissions/defense/3.zip", ROUND_NAME + "/submissions/defense/baseline_adv_train.zip", ] self.storage_client = fake_cloud_client.FakeStorageClient(storage_blobs) self.datastore_client = fake_cloud_client.FakeDatastoreClient() self.submissions = submissions.CompetitionSubmissions( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=ROUND_NAME, ) def verify_submissions(self): assertCountEqual( self, [ submissions.SubmissionDescriptor( path=(ROUND_NAME + "/submissions/nontargeted/1.zip"), participant_id={"team_id": 1}, ), submissions.SubmissionDescriptor( path=(ROUND_NAME + "/submissions/nontargeted/baseline_nt.zip"), participant_id={"baseline_id": "nt"}, ), ], self.submissions.attacks.values(), ) assertCountEqual( self, [ submissions.SubmissionDescriptor( path=(ROUND_NAME + "/submissions/targeted/1.zip"), participant_id={"team_id": 1}, ), submissions.SubmissionDescriptor( path=(ROUND_NAME + "/submissions/targeted/2.zip"), participant_id={"team_id": 2}, ), ], self.submissions.targeted_attacks.values(), ) assertCountEqual( self, [ submissions.SubmissionDescriptor( path=(ROUND_NAME + "/submissions/defense/3.zip"), participant_id={"team_id": 3}, ), submissions.SubmissionDescriptor( path=(ROUND_NAME + "/submissions/defense/baseline_adv_train.zip"), participant_id={"baseline_id": "adv_train"}, ), ], self.submissions.defenses.values(), ) self.assertEqual( len(self.submissions.attacks) + len(self.submissions.targeted_attacks) + len(self.submissions.defenses), len( set(self.submissions.attacks.keys()) | set(self.submissions.targeted_attacks.keys()) | set(self.submissions.defenses.keys()) ), ) def verify_datastore_entities(self): # Verify 'SubmissionType' entities assertCountEqual( self, [ self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("SubmissionType", "Attacks") ), self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey( "SubmissionType", "TargetedAttacks" ) ), self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey("SubmissionType", "Defenses") ), ], self.datastore_client.query_fetch(kind="SubmissionType"), ) # Verify 'Submission' entities expected_submission_entities = [] for key_prefix, submission_entries in [ (("SubmissionType", "Attacks"), self.submissions.attacks), (("SubmissionType", "TargetedAttacks"), self.submissions.targeted_attacks), (("SubmissionType", "Defenses"), self.submissions.defenses), ]: for k, v in submission_entries.items(): entity = self.datastore_client.entity( fake_cloud_client.FakeDatastoreKey( *(key_prefix + ("Submission", k)) ) ) entity["submission_path"] = v.path entity.update(v.participant_id) expected_submission_entities.append(entity) assertCountEqual( self, expected_submission_entities, self.datastore_client.query_fetch(kind="Submission"), ) def test_init_from_storage(self): self.submissions.init_from_storage_write_to_datastore() self.verify_submissions() self.verify_datastore_entities() def test_init_from_datastore(self): # first we need to populate datastore self.submissions.init_from_storage_write_to_datastore() # now reset submission class and load data from datastore self.submissions = submissions.CompetitionSubmissions( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=ROUND_NAME, ) self.assertFalse(self.submissions.attacks) self.assertFalse(self.submissions.targeted_attacks) self.assertFalse(self.submissions.defenses) self.submissions.init_from_datastore() self.verify_submissions() def test_get_all_attacks_ids(self): self.submissions.init_from_storage_write_to_datastore() # total will be two targeted and two not-targeted attacks, # their IDs are generated sequentially assertCountEqual( self, ["SUBA000", "SUBA001", "SUBT000", "SUBT001"], self.submissions.get_all_attack_ids(), ) def test_find_by_id(self): self.submissions.init_from_storage_write_to_datastore() self.assertEqual( self.submissions.attacks["SUBA000"], self.submissions.find_by_id("SUBA000") ) self.assertEqual( self.submissions.targeted_attacks["SUBT001"], self.submissions.find_by_id("SUBT001"), ) self.assertEqual( self.submissions.defenses["SUBD001"], self.submissions.find_by_id("SUBD001") ) def test_get_external_id(self): self.submissions.init_from_storage_write_to_datastore() assertCountEqual( self, [3, "baseline_adv_train"], [ self.submissions.get_external_id("SUBD000"), self.submissions.get_external_id("SUBD001"), ], ) assertCountEqual( self, [1, "baseline_nt"], [ self.submissions.get_external_id("SUBA000"), self.submissions.get_external_id("SUBA001"), ], ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/work_data_test.py ================================================ """Tests for eval_lib.work_data.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import copy import unittest from six import assertCountEqual from six import itervalues from eval_lib import work_data from eval_lib.tests import fake_cloud_client TEST_WORK_TYPE_ENTITY_ID = "AllWork" class WorkPiecesBaseTest(unittest.TestCase): def setUp(self): self.datastore_client = fake_cloud_client.FakeDatastoreClient() self.work1 = { "submission_id": "s1", "output_adversarial_batch_id": "o1", "claimed_worker_id": "worker9999", "claimed_worker_start_time": -1, "is_completed": True, } self.work2 = { "submission_id": "s2", "output_adversarial_batch_id": "o2", "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, } def reset_work_pieces(self): self.work_pieces = work_data.WorkPiecesBase( self.datastore_client, TEST_WORK_TYPE_ENTITY_ID ) def test_is_unclaimed(self): # completed work considered claimed self.assertFalse(work_data.is_unclaimed(self.work1)) # not completed, not claimed work self.assertTrue(work_data.is_unclaimed(self.work2)) # claimed but not completed work self.work2["claimed_worker_id"] = "some_worker" self.work2["claimed_worker_start_time"] = work_data.get_integer_time() self.assertFalse(work_data.is_unclaimed(self.work2)) # work claimed too long ago considered unclaimed now self.work2["claimed_worker_start_time"] = ( work_data.get_integer_time() - work_data.MAX_PROCESSING_TIME - 1 ) self.assertTrue(work_data.is_unclaimed(self.work2)) def test_write_to_datastore(self): self.reset_work_pieces() self.work_pieces.work["w1"] = self.work1 self.work_pieces.work["w2"] = self.work2 self.work_pieces.write_all_to_datastore() # verify content of the datastore parent_key = fake_cloud_client.FakeDatastoreKey( work_data.KIND_WORK_TYPE, TEST_WORK_TYPE_ENTITY_ID ) assertCountEqual( self, [fake_cloud_client.make_entity(parent_key)], self.datastore_client.query_fetch(kind=work_data.KIND_WORK_TYPE), ) entity1 = fake_cloud_client.make_entity( fake_cloud_client.FakeDatastoreKey( work_data.KIND_WORK, "w1", parent=parent_key ) ) entity1.update(self.work1) entity2 = fake_cloud_client.make_entity( fake_cloud_client.FakeDatastoreKey( work_data.KIND_WORK, "w2", parent=parent_key ) ) entity2.update(self.work2) assertCountEqual( self, [entity1, entity2], self.datastore_client.query_fetch(kind=work_data.KIND_WORK), ) def test_read_from_datastore(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() self.reset_work_pieces() self.work_pieces.read_all_from_datastore() # verify data self.assertDictEqual( {"w10": self.work1, "w20": self.work2}, self.work_pieces.work ) def test_is_all_work_completed(self): self.reset_work_pieces() # empty set of work is considered completed self.assertTrue(self.work_pieces.is_all_work_competed()) # one completed piece of work - all work completed self.work_pieces.work["w11"] = copy.deepcopy(self.work1) self.assertTrue(self.work_pieces.is_all_work_competed()) # two completed pieces of work - all work completed self.work_pieces.work["w12"] = copy.deepcopy(self.work1) self.assertTrue(self.work_pieces.is_all_work_competed()) # two completed and one incomplete pieces of work - work not completed self.work_pieces.work["w2"] = copy.deepcopy(self.work2) self.assertFalse(self.work_pieces.is_all_work_competed()) def test_read_undone_from_datastore(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() self.reset_work_pieces() # return value is None because sharding is not used self.assertIsNone(self.work_pieces.read_undone_from_datastore()) # Only work with ID 'w20' is undone self.assertDictEqual({"w20": self.work2}, self.work_pieces.work) def test_read_undone_from_datastore_same_shards(self): self.reset_work_pieces() self.work1["shard_id"] = 1 self.work_pieces.work["w10"] = self.work1 self.work2["shard_id"] = 2 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() self.reset_work_pieces() # return value is ID of the shard with undone work self.assertEqual( 2, self.work_pieces.read_undone_from_datastore(shard_id=2, num_shards=3) ) # Only work with ID 'w20' is undone self.assertDictEqual({"w20": self.work2}, self.work_pieces.work) def test_read_undone_from_datastore_different_shards(self): self.reset_work_pieces() self.work1["shard_id"] = 1 self.work_pieces.work["w10"] = self.work1 self.work2["shard_id"] = 2 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() self.reset_work_pieces() # return value is ID of the shard with undone work self.assertEqual( 2, self.work_pieces.read_undone_from_datastore(shard_id=1, num_shards=3) ) # Only work with ID 'w20' is undone self.assertDictEqual({"w20": self.work2}, self.work_pieces.work) def test_try_pick_piece_of_work_simple(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() work_id = self.work_pieces.try_pick_piece_of_work("worker0") self.assertEqual("w20", work_id) self.reset_work_pieces() self.work_pieces.read_all_from_datastore() self.assertEqual("worker0", self.work_pieces.work["w20"]["claimed_worker_id"]) def test_try_pick_piece_of_work_all_completed(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work_pieces.work["w20"]["is_completed"] = True self.work_pieces.write_all_to_datastore() work_id = self.work_pieces.try_pick_piece_of_work("worker0") self.assertIsNone(work_id) def test_try_pick_piece_of_work_already_claimed(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work2["claimed_worker_id"] = "other_worker" self.work2["claimed_worker_start_time"] = work_data.get_integer_time() self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() work_id = self.work_pieces.try_pick_piece_of_work("worker0") # if work is claimed by another worker then it won't be picked self.assertIsNone(work_id) def test_try_pick_piece_of_work_claimed_long_ago(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work2["claimed_worker_id"] = "other_worker" self.work2["claimed_worker_start_time"] = ( work_data.get_integer_time() - work_data.MAX_PROCESSING_TIME * 2 ) self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() work_id = self.work_pieces.try_pick_piece_of_work("worker0") # if work is claimed by another worker, but it happened some time ago # then work will be claimed self.assertEqual("w20", work_id) def test_try_pick_piece_of_work_concurrent_update(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() # any concurrent change in the entity will cause transaction to fail def transaction_hook(client): key = client.key("WorkType", TEST_WORK_TYPE_ENTITY_ID, "Work", "w20") client.entities[key]["output_adversarial_batch_id"] = "o3" self.datastore_client.set_transaction_hook(transaction_hook) work_id = self.work_pieces.try_pick_piece_of_work("worker0") self.assertIsNone(work_id) def test_try_pick_piece_of_work_concurrent_update_of_other(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work_pieces.write_all_to_datastore() # concurrent change in entity which is not touched by the transaction # won't prevent transaction from completing def transaction_hook(client): key = client.key("WorkType", TEST_WORK_TYPE_ENTITY_ID, "Work", "w10") client.entities[key]["output_adversarial_batch_id"] = "o3" self.datastore_client.set_transaction_hook(transaction_hook) work_id = self.work_pieces.try_pick_piece_of_work("worker0") self.assertEqual("w20", work_id) def test_update_work_as_completed(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work2["claimed_worker_id"] = "this_worker" self.work2["claimed_worker_start_time"] = work_data.get_integer_time() self.work_pieces.write_all_to_datastore() self.assertTrue(self.work_pieces.update_work_as_completed("this_worker", "w20")) self.reset_work_pieces() self.work_pieces.read_all_from_datastore() self.assertTrue(self.work_pieces.work["w20"]["is_completed"]) self.assertNotIn("error", self.work_pieces.work["w20"]) def test_update_work_as_completed_other_values(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work2["claimed_worker_id"] = "this_worker" self.work2["claimed_worker_start_time"] = work_data.get_integer_time() self.work_pieces.write_all_to_datastore() self.assertTrue( self.work_pieces.update_work_as_completed( "this_worker", "w20", other_values={"a": 123, "b": 456} ) ) self.reset_work_pieces() self.work_pieces.read_all_from_datastore() self.assertTrue(self.work_pieces.work["w20"]["is_completed"]) self.assertNotIn("error", self.work_pieces.work["w20"]) self.assertEqual(123, self.work_pieces.work["w20"]["a"]) self.assertEqual(456, self.work_pieces.work["w20"]["b"]) def test_update_work_as_completed_with_error(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work2["claimed_worker_id"] = "this_worker" self.work2["claimed_worker_start_time"] = work_data.get_integer_time() self.work_pieces.write_all_to_datastore() self.assertTrue( self.work_pieces.update_work_as_completed("this_worker", "w20", error="err") ) self.reset_work_pieces() self.work_pieces.read_all_from_datastore() self.assertTrue(self.work_pieces.work["w20"]["is_completed"]) self.assertEqual("err", self.work_pieces.work["w20"]["error"]) def test_update_work_as_completed_wrong_claimed_worker(self): self.reset_work_pieces() self.work_pieces.work["w10"] = self.work1 self.work_pieces.work["w20"] = self.work2 self.work2["claimed_worker_id"] = "other_worker" self.work2["claimed_worker_start_time"] = work_data.get_integer_time() self.work_pieces.write_all_to_datastore() self.assertFalse( self.work_pieces.update_work_as_completed("this_worker", "w20") ) self.reset_work_pieces() self.work_pieces.read_all_from_datastore() self.assertFalse(self.work_pieces.work["w20"]["is_completed"]) def test_compute_work_stats(self): self.reset_work_pieces() self.work_pieces.work["w11"] = { "submission_id": "s1", "output_adversarial_batch_id": "o1", "claimed_worker_id": "worker1", "claimed_worker_start_time": -1, "is_completed": True, "elapsed_time": 1, } self.work_pieces.work["w12"] = { "submission_id": "s1", "output_adversarial_batch_id": "o2", "claimed_worker_id": "worker2", "claimed_worker_start_time": -1, "is_completed": False, } self.work_pieces.work["w21"] = { "submission_id": "s2", "output_adversarial_batch_id": "o1", "claimed_worker_id": "worker1", "claimed_worker_start_time": -1, "is_completed": True, "elapsed_time": 5, } self.work_pieces.work["w22"] = { "submission_id": "s2", "output_adversarial_batch_id": "o2", "claimed_worker_id": "worker2", "claimed_worker_start_time": -1, "is_completed": True, "elapsed_time": 10, "error": "err", } self.work_pieces.work["w23"] = { "submission_id": "s2", "output_adversarial_batch_id": "o1", "claimed_worker_id": "worker1", "claimed_worker_start_time": -1, "is_completed": True, "elapsed_time": 7, } stats = self.work_pieces.compute_work_statistics() for v in itervalues(stats): v["eval_times"] = sorted(v["eval_times"]) self.assertDictEqual( { "s1": { "completed": 1, "num_errors": 0, "error_messages": set(), "eval_times": [1.0], "min_eval_time": 1.0, "max_eval_time": 1.0, "mean_eval_time": 1.0, "median_eval_time": 1.0, }, "s2": { "completed": 3, "num_errors": 1, "error_messages": set(["err"]), "eval_times": [5.0, 7.0], "min_eval_time": 5.0, "max_eval_time": 7.0, "mean_eval_time": 6.0, "median_eval_time": 6.0, }, }, stats, ) class AttackWorkPiecesTest(unittest.TestCase): def setUp(self): self.datastore_client = fake_cloud_client.FakeDatastoreClient() def test_init_from_adversarial_batches(self): adv_batches = { "ADVBATCH000": {"submission_id": "s1"}, "ADVBATCH001": {"submission_id": "s2"}, "ADVBATCH002": {"submission_id": "s3"}, } expected_values = [ { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": "s1", "shard_id": None, "output_adversarial_batch_id": "ADVBATCH000", }, { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": "s2", "shard_id": None, "output_adversarial_batch_id": "ADVBATCH001", }, { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": "s3", "shard_id": None, "output_adversarial_batch_id": "ADVBATCH002", }, ] attack_work = work_data.AttackWorkPieces(self.datastore_client) attack_work.init_from_adversarial_batches(adv_batches) assertCountEqual(self, expected_values, attack_work.work.values()) attack_work.write_all_to_datastore() attack_work = work_data.AttackWorkPieces(self.datastore_client) attack_work.read_all_from_datastore() assertCountEqual(self, expected_values, attack_work.work.values()) class DefenseWorkPiecesTest(unittest.TestCase): def setUp(self): self.datastore_client = fake_cloud_client.FakeDatastoreClient() def test_init_from_classification_batches(self): class_batches = { "CBATCH000000": {"submission_id": "s1"}, "CBATCH000001": {"submission_id": "s2"}, "CBATCH000002": {"submission_id": "s3"}, } expected_values = [ { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": "s1", "shard_id": None, "output_classification_batch_id": "CBATCH000000", }, { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": "s2", "shard_id": None, "output_classification_batch_id": "CBATCH000001", }, { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": "s3", "shard_id": None, "output_classification_batch_id": "CBATCH000002", }, ] defense_work = work_data.DefenseWorkPieces(self.datastore_client) defense_work.init_from_class_batches(class_batches) assertCountEqual(self, expected_values, defense_work.work.values()) defense_work.write_all_to_datastore() defense_work = work_data.DefenseWorkPieces(self.datastore_client) defense_work.read_all_from_datastore() assertCountEqual(self, expected_values, defense_work.work.values()) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/work_data.py ================================================ """Module with classes to read and store data about work entities. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from builtins import int # long in python 2 from io import StringIO import pickle import random import time import numpy as np from six import iteritems from six import itervalues from six import text_type # Cloud Datastore constants KIND_WORK_TYPE = u"WorkType" KIND_WORK = u"Work" ID_ATTACKS_WORK_ENTITY = u"AllAttacks" ID_DEFENSES_WORK_ENTITY = u"AllDefenses" ATTACK_WORK_ID_PATTERN = u"WORKA{:03}" DEFENSE_WORK_ID_PATTERN = u"WORKD{:05}" # Constants for __str__ TO_STR_MAX_WORK = 20 # How long worker is allowed to process one piece of work, # before considered failed MAX_PROCESSING_TIME = 600 # Number of work records to read at once MAX_WORK_RECORDS_READ = 1000 def get_integer_time(): """Returns current time in long integer format.""" return int(time.time()) def is_unclaimed(work): """Returns True if work piece is unclaimed.""" if work["is_completed"]: return False cutoff_time = time.time() - MAX_PROCESSING_TIME if ( work["claimed_worker_id"] and work["claimed_worker_start_time"] is not None and work["claimed_worker_start_time"] >= cutoff_time ): return False return True class WorkPiecesBase(object): """Base class to store one piece of work. In adversarial competition, all work consists of the following: - evaluation of all attacks on all images from dataset which results in generation of adversarial images; - evaluation of all defenses on all adversarial images which results in storing classification labels. One piece of work is either evaluation of one attack on a subset of images or evaluation of one defense on a subset of adversarial images. This way all work is split into work pieces which could be computed independently in parallel by different workers. Each work piece is identified by unique ID and has one of the following statuses: - Unclaimed. This means that no worker has started working on the work piece. - Claimed by worker NN. This means that worker NN is working on this work piece. After workpiece being claimed for too long (more than MAX_PROCESSING_TIME seconds) it automatically considered unclaimed. This is needed in case worker failed while processing the work piece. - Completed. This means that computation of work piece is done. Additionally each work piece may be assigned to a shard. In such case workers are also grouped into shards. Each time worker looking for a work piece it first tries to find undone work from the shard worker is assigned to. Only after all work from this shard is done, worker will try to claim work pieces from other shards. The purpose of sharding is to reduce load on Google Cloud Datastore. """ def __init__(self, datastore_client, work_type_entity_id): """Initializes WorkPiecesBase class. Args: datastore_client: instance of CompetitionDatastoreClient. work_type_entity_id: ID of the WorkType parent entity """ self._datastore_client = datastore_client self._work_type_entity_id = work_type_entity_id # Dictionary: work_id -> dict with properties of the piece of work # # Common properties are following: # - claimed_worker_id - worker id which claimed the work # - claimed_worker_start_time - when work was claimed # - is_completed - whether work is completed or not # - error - if not None then work was completed with error # - elapsed_time - time took to complete the work # - shard_id - ID of the shard which run the work # - submission_id - ID of the submission which should be executed # # Additionally piece of work will have property specific to work type: # output_adversarial_batch_id for attack and output_classification_batch_id # for defense. Also upon completion of the work, worker may write # additional statistics field to the work. self._work = {} def serialize(self, fobj): """Serialize work pieces into file object.""" pickle.dump(self._work, fobj) def deserialize(self, fobj): """Deserialize work pieces from file object.""" self._work = pickle.load(fobj) @property def work(self): """Dictionary with all work pieces.""" return self._work def replace_work(self, value): """Replaces work with provided value. Generally this method should be called only by master, that's why it separated from the property self.work. Args: value: dictionary with new work pieces """ assert isinstance(value, dict) self._work = value def __len__(self): return len(self._work) def is_all_work_competed(self): """Returns whether all work pieces are completed or not.""" return all([w["is_completed"] for w in itervalues(self.work)]) def write_all_to_datastore(self): """Writes all work pieces into datastore. Each work piece is identified by ID. This method writes/updates only those work pieces which IDs are stored in this class. For examples, if this class has only work pieces with IDs '1' ... '100' and datastore already contains work pieces with IDs '50' ... '200' then this method will create new work pieces with IDs '1' ... '49', update work pieces with IDs '50' ... '100' and keep unchanged work pieces with IDs '101' ... '200'. """ client = self._datastore_client with client.no_transact_batch() as batch: parent_key = client.key(KIND_WORK_TYPE, self._work_type_entity_id) batch.put(client.entity(parent_key)) for work_id, work_val in iteritems(self._work): entity = client.entity( client.key(KIND_WORK, work_id, parent=parent_key) ) entity.update(work_val) batch.put(entity) def read_all_from_datastore(self): """Reads all work pieces from the datastore.""" self._work = {} client = self._datastore_client parent_key = client.key(KIND_WORK_TYPE, self._work_type_entity_id) for entity in client.query_fetch(kind=KIND_WORK, ancestor=parent_key): work_id = entity.key.flat_path[-1] self.work[work_id] = dict(entity) def _read_undone_shard_from_datastore(self, shard_id=None): """Reads undone worke pieces which are assigned to shard with given id.""" self._work = {} client = self._datastore_client parent_key = client.key(KIND_WORK_TYPE, self._work_type_entity_id) filters = [("is_completed", "=", False)] if shard_id is not None: filters.append(("shard_id", "=", shard_id)) for entity in client.query_fetch( kind=KIND_WORK, ancestor=parent_key, filters=filters ): work_id = entity.key.flat_path[-1] self.work[work_id] = dict(entity) if len(self._work) >= MAX_WORK_RECORDS_READ: break def read_undone_from_datastore(self, shard_id=None, num_shards=None): """Reads undone work from the datastore. If shard_id and num_shards are specified then this method will attempt to read undone work for shard with id shard_id. If no undone work was found then it will try to read shard (shard_id+1) and so on until either found shard with undone work or all shards are read. Args: shard_id: Id of the start shard num_shards: total number of shards Returns: id of the shard with undone work which was read. None means that work from all datastore was read. """ if shard_id is not None: shards_list = [(i + shard_id) % num_shards for i in range(num_shards)] else: shards_list = [] shards_list.append(None) for shard in shards_list: self._read_undone_shard_from_datastore(shard) if self._work: return shard return None def try_pick_piece_of_work(self, worker_id, submission_id=None): """Tries pick next unclaimed piece of work to do. Attempt to claim work piece is done using Cloud Datastore transaction, so only one worker can claim any work piece at a time. Args: worker_id: ID of current worker submission_id: if not None then this method will try to pick piece of work for this submission Returns: ID of the claimed work piece """ client = self._datastore_client unclaimed_work_ids = None if submission_id: unclaimed_work_ids = [ k for k, v in iteritems(self.work) if is_unclaimed(v) and (v["submission_id"] == submission_id) ] if not unclaimed_work_ids: unclaimed_work_ids = [k for k, v in iteritems(self.work) if is_unclaimed(v)] if unclaimed_work_ids: next_work_id = random.choice(unclaimed_work_ids) else: return None try: with client.transaction() as transaction: work_key = client.key( KIND_WORK_TYPE, self._work_type_entity_id, KIND_WORK, next_work_id ) work_entity = client.get(work_key, transaction=transaction) if not is_unclaimed(work_entity): return None work_entity["claimed_worker_id"] = worker_id work_entity["claimed_worker_start_time"] = get_integer_time() transaction.put(work_entity) except Exception: return None return next_work_id def update_work_as_completed( self, worker_id, work_id, other_values=None, error=None ): """Updates work piece in datastore as completed. Args: worker_id: ID of the worker which did the work work_id: ID of the work which was done other_values: dictionary with additonal values which should be saved with the work piece error: if not None then error occurred during computation of the work piece. In such case work will be marked as completed with error. Returns: whether work was successfully updated """ client = self._datastore_client try: with client.transaction() as transaction: work_key = client.key( KIND_WORK_TYPE, self._work_type_entity_id, KIND_WORK, work_id ) work_entity = client.get(work_key, transaction=transaction) if work_entity["claimed_worker_id"] != worker_id: return False work_entity["is_completed"] = True if other_values: work_entity.update(other_values) if error: work_entity["error"] = text_type(error) transaction.put(work_entity) except Exception: return False return True def compute_work_statistics(self): """Computes statistics from all work pieces stored in this class.""" result = {} for v in itervalues(self.work): submission_id = v["submission_id"] if submission_id not in result: result[submission_id] = { "completed": 0, "num_errors": 0, "error_messages": set(), "eval_times": [], "min_eval_time": None, "max_eval_time": None, "mean_eval_time": None, "median_eval_time": None, } if not v["is_completed"]: continue result[submission_id]["completed"] += 1 if "error" in v and v["error"]: result[submission_id]["num_errors"] += 1 result[submission_id]["error_messages"].add(v["error"]) else: result[submission_id]["eval_times"].append(float(v["elapsed_time"])) for v in itervalues(result): if v["eval_times"]: v["min_eval_time"] = np.min(v["eval_times"]) v["max_eval_time"] = np.max(v["eval_times"]) v["mean_eval_time"] = np.mean(v["eval_times"]) v["median_eval_time"] = np.median(v["eval_times"]) return result def __str__(self): buf = StringIO() buf.write(u'WorkType "{0}"\n'.format(self._work_type_entity_id)) for idx, (work_id, work_val) in enumerate(iteritems(self.work)): if idx >= TO_STR_MAX_WORK: buf.write(u" ...\n") break buf.write(u' Work "{0}"\n'.format(work_id)) buf.write(u" {0}\n".format(str(work_val))) return buf.getvalue() class AttackWorkPieces(WorkPiecesBase): """Subclass which represents work pieces for adversarial attacks.""" def __init__(self, datastore_client): """Initializes AttackWorkPieces.""" super(AttackWorkPieces, self).__init__( datastore_client=datastore_client, work_type_entity_id=ID_ATTACKS_WORK_ENTITY, ) def init_from_adversarial_batches(self, adv_batches): """Initializes work pieces from adversarial batches. Args: adv_batches: dict with adversarial batches, could be obtained as AversarialBatches.data """ for idx, (adv_batch_id, adv_batch_val) in enumerate(iteritems(adv_batches)): work_id = ATTACK_WORK_ID_PATTERN.format(idx) self.work[work_id] = { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": adv_batch_val["submission_id"], "shard_id": None, "output_adversarial_batch_id": adv_batch_id, } class DefenseWorkPieces(WorkPiecesBase): """Subclass which represents work pieces for adversarial defenses.""" def __init__(self, datastore_client): """Initializes DefenseWorkPieces.""" super(DefenseWorkPieces, self).__init__( datastore_client=datastore_client, work_type_entity_id=ID_DEFENSES_WORK_ENTITY, ) def init_from_class_batches(self, class_batches, num_shards=None): """Initializes work pieces from classification batches. Args: class_batches: dict with classification batches, could be obtained as ClassificationBatches.data num_shards: number of shards to split data into, if None then no sharding is done. """ shards_for_submissions = {} shard_idx = 0 for idx, (batch_id, batch_val) in enumerate(iteritems(class_batches)): work_id = DEFENSE_WORK_ID_PATTERN.format(idx) submission_id = batch_val["submission_id"] shard_id = None if num_shards: shard_id = shards_for_submissions.get(submission_id) if shard_id is None: shard_id = shard_idx % num_shards shards_for_submissions[submission_id] = shard_id shard_idx += 1 # Note: defense also might have following fields populated by worker: # stat_correct, stat_error, stat_target_class, stat_num_images self.work[work_id] = { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "submission_id": submission_id, "shard_id": shard_id, "output_classification_batch_id": batch_id, } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/master.py ================================================ """Master which prepares work for all workers. Evaluation of competition is split into work pieces. One work piece is a either evaluation of an attack on a batch of images or evaluation of a defense on a batch of adversarial images. Work pieces are run by workers. Master prepares work pieces for workers and writes them to the datastore. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import collections from collections import defaultdict import csv from io import BytesIO import logging import os import pickle import random import time from six import iteritems from six import iterkeys from six import itervalues from six.moves import input as input_str import eval_lib # List of allowed sizes of adversarial perturbation ALLOWED_EPS = [4, 8, 12, 16] # Batch size DEFAULT_BATCH_SIZE = 100 def print_header(text): """Prints header with given text and frame composed of '#' characters.""" print() print("#" * (len(text) + 4)) print("# " + text + " #") print("#" * (len(text) + 4)) print() def save_dict_to_file(filename, dictionary): """Saves dictionary as CSV file.""" with open(filename, "w") as f: writer = csv.writer(f) for k, v in iteritems(dictionary): writer.writerow([str(k), str(v)]) class EvaluationMaster(object): """Class which encapsulates logit of the master.""" def __init__( self, storage_client, datastore_client, round_name, dataset_name, blacklisted_submissions="", results_dir="", num_defense_shards=None, verbose=False, batch_size=DEFAULT_BATCH_SIZE, max_dataset_num_images=None, ): """Initializes EvaluationMaster. Args: storage_client: instance of eval_lib.CompetitionStorageClient datastore_client: instance of eval_lib.CompetitionDatastoreClient round_name: name of the current round dataset_name: name of the dataset, 'dev' or 'final' blacklisted_submissions: optional list of blacklisted submissions which should not be evaluated results_dir: local directory where results and logs should be written num_defense_shards: optional number of defense shards verbose: whether output should be verbose on not. If True, then methods of this class will print some additional information which is useful for debugging. batch_size: batch size to use max_dataset_num_images: maximum number of images from the dataset to use or None if entire dataset should be used. """ self.storage_client = storage_client self.datastore_client = datastore_client self.round_name = round_name self.dataset_name = dataset_name self.results_dir = results_dir if num_defense_shards: self.num_defense_shards = int(num_defense_shards) else: self.num_defense_shards = None self.verbose = verbose self.blacklisted_submissions = [ s.strip() for s in blacklisted_submissions.split(",") ] self.batch_size = batch_size self.max_dataset_num_images = max_dataset_num_images # init client classes self.submissions = eval_lib.CompetitionSubmissions( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=self.round_name, ) self.dataset_batches = eval_lib.DatasetBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, dataset_name=self.dataset_name, ) self.adv_batches = eval_lib.AversarialBatches( datastore_client=self.datastore_client ) self.class_batches = eval_lib.ClassificationBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=self.round_name, ) self.attack_work = eval_lib.AttackWorkPieces( datastore_client=self.datastore_client ) self.defense_work = eval_lib.DefenseWorkPieces( datastore_client=self.datastore_client ) def ask_when_work_is_populated(self, work): """When work is already populated asks whether we should continue. This method prints warning message that work is populated and asks whether user wants to continue or not. Args: work: instance of WorkPiecesBase Returns: True if we should continue and populate datastore, False if we should stop """ work.read_all_from_datastore() if work.work: print( "Work is already written to datastore.\n" "If you continue these data will be overwritten and " "possible corrupted." ) inp = input_str( "Do you want to continue? " '(type "yes" without quotes to confirm): ' ) return inp == "yes" else: return True def prepare_attacks(self): """Prepares all data needed for evaluation of attacks.""" print_header("PREPARING ATTACKS DATA") # verify that attacks data not written yet if not self.ask_when_work_is_populated(self.attack_work): return self.attack_work = eval_lib.AttackWorkPieces( datastore_client=self.datastore_client ) # prepare submissions print_header("Initializing submissions") self.submissions.init_from_storage_write_to_datastore() if self.verbose: print(self.submissions) # prepare dataset batches print_header("Initializing dataset batches") self.dataset_batches.init_from_storage_write_to_datastore( batch_size=self.batch_size, allowed_epsilon=ALLOWED_EPS, skip_image_ids=[], max_num_images=self.max_dataset_num_images, ) if self.verbose: print(self.dataset_batches) # prepare adversarial batches print_header("Initializing adversarial batches") self.adv_batches.init_from_dataset_and_submissions_write_to_datastore( dataset_batches=self.dataset_batches, attack_submission_ids=self.submissions.get_all_attack_ids(), ) if self.verbose: print(self.adv_batches) # prepare work pieces print_header("Preparing attack work pieces") self.attack_work.init_from_adversarial_batches(self.adv_batches.data) self.attack_work.write_all_to_datastore() if self.verbose: print(self.attack_work) def prepare_defenses(self): """Prepares all data needed for evaluation of defenses.""" print_header("PREPARING DEFENSE DATA") # verify that defense data not written yet if not self.ask_when_work_is_populated(self.defense_work): return self.defense_work = eval_lib.DefenseWorkPieces( datastore_client=self.datastore_client ) # load results of attacks self.submissions.init_from_datastore() self.dataset_batches.init_from_datastore() self.adv_batches.init_from_datastore() self.attack_work.read_all_from_datastore() # populate classification results print_header("Initializing classification batches") self.class_batches.init_from_adversarial_batches_write_to_datastore( self.submissions, self.adv_batches ) if self.verbose: print(self.class_batches) # populate work pieces print_header("Preparing defense work pieces") self.defense_work.init_from_class_batches( self.class_batches.data, num_shards=self.num_defense_shards ) self.defense_work.write_all_to_datastore() if self.verbose: print(self.defense_work) def _save_work_results(self, run_stats, scores, num_processed_images, filename): """Saves statistics about each submission. Saved statistics include score; number of completed and failed batches; min, max, average and median time needed to run one batch. Args: run_stats: dictionary with runtime statistics for submissions, can be generated by WorkPiecesBase.compute_work_statistics scores: dictionary mapping submission ids to scores num_processed_images: dictionary with number of successfully processed images by each submission, one of the outputs of ClassificationBatches.compute_classification_results filename: output filename """ with open(filename, "w") as f: writer = csv.writer(f) writer.writerow( [ "SubmissionID", "ExternalSubmissionId", "Score", "CompletedBatches", "BatchesWithError", "ProcessedImages", "MinEvalTime", "MaxEvalTime", "MedianEvalTime", "MeanEvalTime", "ErrorMsg", ] ) for submission_id in sorted(iterkeys(run_stats)): stat = run_stats.get( submission_id, collections.defaultdict(lambda: float("NaN")) ) external_id = self.submissions.get_external_id(submission_id) error_msg = "" while not error_msg and stat["error_messages"]: error_msg = stat["error_messages"].pop() if error_msg.startswith("Cant copy adversarial batch locally"): error_msg = "" writer.writerow( [ submission_id, external_id, scores.get(submission_id, None), stat["completed"], stat["num_errors"], num_processed_images.get(submission_id, None), stat["min_eval_time"], stat["max_eval_time"], stat["median_eval_time"], stat["mean_eval_time"], error_msg, ] ) def _save_sorted_results(self, run_stats, scores, image_count, filename): """Saves sorted (by score) results of the evaluation. Args: run_stats: dictionary with runtime statistics for submissions, can be generated by WorkPiecesBase.compute_work_statistics scores: dictionary mapping submission ids to scores image_count: dictionary with number of images processed by submission filename: output filename """ with open(filename, "w") as f: writer = csv.writer(f) writer.writerow( ["SubmissionID", "ExternalTeamId", "Score", "MedianTime", "ImageCount"] ) def get_second(x): """Returns second entry of a list/tuple""" return x[1] for s_id, score in sorted(iteritems(scores), key=get_second, reverse=True): external_id = self.submissions.get_external_id(s_id) stat = run_stats.get( s_id, collections.defaultdict(lambda: float("NaN")) ) writer.writerow( [ s_id, external_id, score, stat["median_eval_time"], image_count[s_id], ] ) def _read_dataset_metadata(self): """Reads dataset metadata. Returns: instance of DatasetMetadata """ blob = self.storage_client.get_blob( "dataset/" + self.dataset_name + "_dataset.csv" ) buf = BytesIO() blob.download_to_file(buf) buf.seek(0) return eval_lib.DatasetMetadata(buf) def compute_results(self): """Computes results (scores, stats, etc...) of competition evaluation. Results are saved into output directory (self.results_dir). Also this method saves all intermediate data into output directory as well, so it can resume computation if it was interrupted for some reason. This is useful because computatin of resuls could take many minutes. """ # read all data logging.info("Reading data from datastore") dataset_meta = self._read_dataset_metadata() self.submissions.init_from_datastore() self.dataset_batches.init_from_datastore() self.adv_batches.init_from_datastore() self.attack_work.read_all_from_datastore() if os.path.exists(os.path.join(self.results_dir, "defense_work.dump")): with open(os.path.join(self.results_dir, "defense_work.dump")) as f: self.defense_work.deserialize(f) else: self.defense_work.read_all_from_datastore() with open(os.path.join(self.results_dir, "defense_work.dump"), "w") as f: self.defense_work.serialize(f) if os.path.exists(os.path.join(self.results_dir, "class_batches.dump")): with open(os.path.join(self.results_dir, "class_batches.dump")) as f: self.class_batches.deserialize(f) else: self.class_batches.init_from_datastore() with open(os.path.join(self.results_dir, "class_batches.dump"), "w") as f: self.class_batches.serialize(f) # process data logging.info("Processing classification results") count_adv_images = self.adv_batches.count_generated_adv_examples() intermediate_files = [ "acc_matrix.dump", "error_matrix.dump", "hit_tc_matrix.dump", "classified_images_count.dump", ] if all( [ os.path.exists(os.path.join(self.results_dir, fname)) for fname in intermediate_files ] ): with open(os.path.join(self.results_dir, "acc_matrix.dump")) as f: acc_matrix = pickle.load(f) with open(os.path.join(self.results_dir, "error_matrix.dump")) as f: error_matrix = pickle.load(f) with open(os.path.join(self.results_dir, "hit_tc_matrix.dump")) as f: hit_tc_matrix = pickle.load(f) with open( os.path.join(self.results_dir, "classified_images_count.dump") ) as f: classified_images_count = pickle.load(f) else: ( acc_matrix, error_matrix, hit_tc_matrix, classified_images_count, ) = self.class_batches.compute_classification_results( self.adv_batches, self.dataset_batches, dataset_meta, self.defense_work ) with open(os.path.join(self.results_dir, "acc_matrix.dump"), "w") as f: pickle.dump(acc_matrix, f) with open(os.path.join(self.results_dir, "error_matrix.dump"), "w") as f: pickle.dump(error_matrix, f) with open(os.path.join(self.results_dir, "hit_tc_matrix.dump"), "w") as f: pickle.dump(hit_tc_matrix, f) with open( os.path.join(self.results_dir, "classified_images_count.dump"), "w" ) as f: pickle.dump(classified_images_count, f) # compute attacks and defenses which will be used for scoring logging.info("Computing attacks and defenses which are used for scoring") expected_num_adv_images = self.dataset_batches.count_num_images() attacks_to_use = [ k for k, v in iteritems(count_adv_images) if ( (v == expected_num_adv_images) and (k not in self.blacklisted_submissions) ) ] total_num_adversarial = sum(itervalues(count_adv_images)) defenses_to_use = [ k for k, v in iteritems(classified_images_count) if ( (v == total_num_adversarial) and (k not in self.blacklisted_submissions) ) ] logging.info( "Expected number of adversarial images: %d", expected_num_adv_images ) logging.info( "Number of attacks to use to score defenses: %d", len(attacks_to_use) ) logging.info( "Expected number of classification predictions: %d", total_num_adversarial ) logging.info( "Number of defenses to use to score attacks: %d", len(defenses_to_use) ) save_dict_to_file( os.path.join(self.results_dir, "count_adv_images.csv"), count_adv_images ) save_dict_to_file( os.path.join(self.results_dir, "classified_images_count.csv"), classified_images_count, ) # compute scores logging.info("Computing scores") attack_scores = defaultdict(lambda: 0) targeted_attack_scores = defaultdict(lambda: 0) defense_scores = defaultdict(lambda: 0) for defense_id in acc_matrix.dim0: for attack_id in acc_matrix.dim1: if attack_id in attacks_to_use: defense_scores[defense_id] += acc_matrix[defense_id, attack_id] if defense_id in defenses_to_use: if attack_id in self.submissions.targeted_attacks: targeted_attack_scores[attack_id] += hit_tc_matrix[ defense_id, attack_id ] else: attack_scores[attack_id] += error_matrix[defense_id, attack_id] # negate results of blacklisted submissions for s_id in self.blacklisted_submissions: if s_id in defense_scores: defense_scores[s_id] = -defense_scores[s_id] if s_id in attack_scores: attack_scores[s_id] = -attack_scores[s_id] if s_id in targeted_attack_scores: targeted_attack_scores[s_id] = -targeted_attack_scores[s_id] # save results logging.info("Saving results") all_attack_stats = self.attack_work.compute_work_statistics() nontargeted_attack_stats = { k: v for k, v in iteritems(all_attack_stats) if k in self.submissions.attacks } targeted_attack_stats = { k: v for k, v in iteritems(all_attack_stats) if k in self.submissions.targeted_attacks } defense_stats = self.defense_work.compute_work_statistics() self._save_work_results( nontargeted_attack_stats, attack_scores, count_adv_images, os.path.join(self.results_dir, "attack_results.csv"), ) self._save_work_results( targeted_attack_stats, targeted_attack_scores, count_adv_images, os.path.join(self.results_dir, "targeted_attack_results.csv"), ) self._save_work_results( defense_stats, defense_scores, classified_images_count, os.path.join(self.results_dir, "defense_results.csv"), ) self._save_sorted_results( nontargeted_attack_stats, attack_scores, count_adv_images, os.path.join(self.results_dir, "sorted_attack_results.csv"), ) self._save_sorted_results( targeted_attack_stats, targeted_attack_scores, count_adv_images, os.path.join(self.results_dir, "sorted_target_attack_results.csv"), ) self._save_sorted_results( defense_stats, defense_scores, classified_images_count, os.path.join(self.results_dir, "sorted_defense_results.csv"), ) defense_id_to_name = { k: self.submissions.get_external_id(k) for k in iterkeys(self.submissions.defenses) } attack_id_to_name = { k: self.submissions.get_external_id(k) for k in self.submissions.get_all_attack_ids() } acc_matrix.save_to_file( os.path.join(self.results_dir, "accuracy_matrix.csv"), remap_dim0=defense_id_to_name, remap_dim1=attack_id_to_name, ) error_matrix.save_to_file( os.path.join(self.results_dir, "error_matrix.csv"), remap_dim0=defense_id_to_name, remap_dim1=attack_id_to_name, ) hit_tc_matrix.save_to_file( os.path.join(self.results_dir, "hit_target_class_matrix.csv"), remap_dim0=defense_id_to_name, remap_dim1=attack_id_to_name, ) save_dict_to_file( os.path.join(self.results_dir, "defense_id_to_name.csv"), defense_id_to_name ) save_dict_to_file( os.path.join(self.results_dir, "attack_id_to_name.csv"), attack_id_to_name ) def _show_status_for_work(self, work): """Shows status for given work pieces. Args: work: instance of either AttackWorkPieces or DefenseWorkPieces """ work_count = len(work.work) work_completed = {} work_completed_count = 0 for v in itervalues(work.work): if v["is_completed"]: work_completed_count += 1 worker_id = v["claimed_worker_id"] if worker_id not in work_completed: work_completed[worker_id] = { "completed_count": 0, "last_update": 0.0, } work_completed[worker_id]["completed_count"] += 1 work_completed[worker_id]["last_update"] = max( work_completed[worker_id]["last_update"], v["claimed_worker_start_time"], ) print("Completed {0}/{1} work".format(work_completed_count, work_count)) for k in sorted(iterkeys(work_completed)): last_update_time = time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(work_completed[k]["last_update"]) ) print( "Worker {0}: completed {1} last claimed work at {2}".format( k, work_completed[k]["completed_count"], last_update_time ) ) def _export_work_errors(self, work, output_file): """Saves errors for given work pieces into file. Args: work: instance of either AttackWorkPieces or DefenseWorkPieces output_file: name of the output file """ errors = set() for v in itervalues(work.work): if v["is_completed"] and v["error"] is not None: errors.add(v["error"]) with open(output_file, "w") as f: for e in sorted(errors): f.write(e) f.write("\n") def show_status(self): """Shows current status of competition evaluation. Also this method saves error messages generated by attacks and defenses into attack_errors.txt and defense_errors.txt. """ print_header("Attack work statistics") self.attack_work.read_all_from_datastore() self._show_status_for_work(self.attack_work) self._export_work_errors( self.attack_work, os.path.join(self.results_dir, "attack_errors.txt") ) print_header("Defense work statistics") self.defense_work.read_all_from_datastore() self._show_status_for_work(self.defense_work) self._export_work_errors( self.defense_work, os.path.join(self.results_dir, "defense_errors.txt") ) def cleanup_failed_attacks(self): """Cleans up data of failed attacks.""" print_header("Cleaning up failed attacks") attacks_to_replace = {} self.attack_work.read_all_from_datastore() failed_submissions = set() error_msg = set() for k, v in iteritems(self.attack_work.work): if v["error"] is not None: attacks_to_replace[k] = dict(v) failed_submissions.add(v["submission_id"]) error_msg.add(v["error"]) attacks_to_replace[k].update( { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, } ) self.attack_work.replace_work(attacks_to_replace) print("Affected submissions:") print(" ".join(sorted(failed_submissions))) print("Error messages:") print(" ".join(sorted(error_msg))) print("") inp = input_str('Are you sure? (type "yes" without quotes to confirm): ') if inp != "yes": return self.attack_work.write_all_to_datastore() print("Work cleaned up") def cleanup_attacks_with_zero_images(self): """Cleans up data about attacks which generated zero images.""" print_header("Cleaning up attacks which generated 0 images.") # find out attack work to cleanup self.adv_batches.init_from_datastore() self.attack_work.read_all_from_datastore() new_attack_work = {} affected_adversarial_batches = set() for work_id, work in iteritems(self.attack_work.work): adv_batch_id = work["output_adversarial_batch_id"] img_count_adv_batch = len(self.adv_batches.data[adv_batch_id]["images"]) if (img_count_adv_batch < 100) and (work["elapsed_time"] < 500): affected_adversarial_batches.add(adv_batch_id) new_attack_work[work_id] = dict(work) new_attack_work[work_id].update( { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, } ) self.attack_work.replace_work(new_attack_work) print_header("Changes in attack works:") print(self.attack_work) # build list of classification batches self.class_batches.init_from_datastore() affected_class_batches = set() for k, v in iteritems(self.class_batches.data): if v["adversarial_batch_id"] in affected_adversarial_batches: affected_class_batches.add(k) # cleanup defense work on affected batches self.defense_work.read_all_from_datastore() new_defense_work = {} for k, v in iteritems(self.defense_work.work): if v["output_classification_batch_id"] in affected_class_batches: new_defense_work[k] = dict(v) new_defense_work[k].update( { "claimed_worker_id": None, "claimed_worker_start_time": None, "is_completed": False, "error": None, "elapsed_time": None, "stat_correct": None, "stat_error": None, "stat_target_class": None, "stat_num_images": None, } ) self.defense_work.replace_work(new_defense_work) print_header("Changes in defense works:") print(self.defense_work) print("") print("Total number of affected attack work: ", len(self.attack_work)) print("Total number of affected defense work: ", len(self.defense_work)) inp = input_str('Are you sure? (type "yes" without quotes to confirm): ') if inp != "yes": return print("Writing attacks work") self.attack_work.write_all_to_datastore() print("Writing defenses work") self.defense_work.write_all_to_datastore() print("Done!") def _cleanup_keys_with_confirmation(self, keys_to_delete): """Asks confirmation and then deletes entries with keys. Args: keys_to_delete: list of datastore keys for which entries should be deleted """ print("Round name: ", self.round_name) print("Number of entities to be deleted: ", len(keys_to_delete)) if not keys_to_delete: return if self.verbose: print("Entities to delete:") idx = 0 prev_key_prefix = None dots_printed_after_same_prefix = False for k in keys_to_delete: if idx >= 20: print(" ...") print(" ...") break key_prefix = ( k.flat_path[0:1] if k.flat_path[0] in [u"SubmissionType", u"WorkType"] else k.flat_path[0] ) if prev_key_prefix == key_prefix: if not dots_printed_after_same_prefix: print(" ...") dots_printed_after_same_prefix = True else: print(" ", k) dots_printed_after_same_prefix = False idx += 1 prev_key_prefix = key_prefix print() inp = input_str('Are you sure? (type "yes" without quotes to confirm): ') if inp != "yes": return with self.datastore_client.no_transact_batch() as batch: for k in keys_to_delete: batch.delete(k) print("Data deleted") def cleanup_defenses(self): """Cleans up all data about defense work in current round.""" print_header("CLEANING UP DEFENSES DATA") work_ancestor_key = self.datastore_client.key("WorkType", "AllDefenses") keys_to_delete = [ e.key for e in self.datastore_client.query_fetch(kind=u"ClassificationBatch") ] + [ e.key for e in self.datastore_client.query_fetch( kind=u"Work", ancestor=work_ancestor_key ) ] self._cleanup_keys_with_confirmation(keys_to_delete) def cleanup_datastore(self): """Cleans up datastore and deletes all information about current round.""" print_header("CLEANING UP ENTIRE DATASTORE") kinds_to_delete = [ u"Submission", u"SubmissionType", u"DatasetImage", u"DatasetBatch", u"AdversarialImage", u"AdversarialBatch", u"Work", u"WorkType", u"ClassificationBatch", ] keys_to_delete = [ e.key for k in kinds_to_delete for e in self.datastore_client.query_fetch(kind=k) ] self._cleanup_keys_with_confirmation(keys_to_delete) USAGE = """Use one of the following commands to run master: run_master.sh attack run_master.sh defense run_master.sh cleanup_defenses run_master.sh results run_master.sh status run_master.sh cleanup_datastore """ def main(args): """Main function which runs master.""" if args.blacklisted_submissions: logging.warning("BLACKLISTED SUBMISSIONS: %s", args.blacklisted_submissions) if args.limited_dataset: logging.info("Using limited dataset: 3 batches * 10 images") max_dataset_num_images = 30 batch_size = 10 else: logging.info("Using full dataset. Batch size: %d", DEFAULT_BATCH_SIZE) max_dataset_num_images = None batch_size = DEFAULT_BATCH_SIZE random.seed() print("\nRound: {0}\n".format(args.round_name)) eval_master = EvaluationMaster( storage_client=eval_lib.CompetitionStorageClient( args.project_id, args.storage_bucket ), datastore_client=eval_lib.CompetitionDatastoreClient( args.project_id, args.round_name ), round_name=args.round_name, dataset_name=args.dataset_name, blacklisted_submissions=args.blacklisted_submissions, results_dir=args.results_dir, num_defense_shards=args.num_defense_shards, verbose=args.verbose, batch_size=batch_size, max_dataset_num_images=max_dataset_num_images, ) if args.command == "attack": eval_master.prepare_attacks() elif args.command == "defense": eval_master.prepare_defenses() elif args.command == "cleanup_defenses": eval_master.cleanup_defenses() elif args.command == "results": eval_master.compute_results() elif args.command == "status": eval_master.show_status() elif args.command == "cleanup_datastore": eval_master.cleanup_datastore() elif args.command == "cleanup_failed_attacks": eval_master.cleanup_failed_attacks() elif args.command == "cleanup_attacks_with_zero_images": eval_master.cleanup_attacks_with_zero_images() else: print("Invalid command: ", args.command) print("") print(USAGE) if __name__ == "__main__": parser = argparse.ArgumentParser( description="Master which coordinates all workers." ) parser.add_argument( "command", help="Command to run. Possible commands include " '"attack", "defense", "scores", "status".', ) parser.add_argument( "--project_id", required=True, help="Your Google Cloud project ID." ) parser.add_argument( "--storage_bucket", required=True, help="Cloud Storage bucket to store competition data.", ) parser.add_argument( "--round_name", default="testing-round", required=False, help="Name of the round.", ) parser.add_argument( "--dataset_name", default="dev", required=False, help="Which dataset to use, either dev or final.", ) parser.add_argument( "--blacklisted_submissions", default="", required=False, help="Comma separated list of blacklisted submission " "IDs.", ) parser.add_argument( "--results_dir", required=True, help="Directory where to save results." ) parser.add_argument( "--num_defense_shards", default=10, required=False, help="Number of defense shards", ) parser.add_argument( "--limited_dataset", dest="limited_dataset", action="store_true" ) parser.add_argument( "--nolimited_dataset", dest="limited_dataset", action="store_false" ) parser.set_defaults(limited_dataset=False) parser.add_argument("--verbose", dest="verbose", action="store_true") parser.add_argument("--noverbose", dest="verbose", action="store_false") parser.set_defaults(verbose=False) parser.add_argument( "--log_file", default="", required=False, help="Location of the logfile." ) master_args = parser.parse_args() logging_args = { "format": "%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s -- %(message)s", "level": logging.INFO, "datefmt": "%Y-%m-%d %H:%M:%S", } if master_args.log_file: logging_args["filename"] = master_args.log_file logging_args["filemode"] = "w" logging.basicConfig(**logging_args) main(master_args) ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/run_worker_locally.sh ================================================ #!/bin/bash # # This script starts worker. Generally there is no need to manually runn this # script, it should be invoked during deployment of the worker to VM. # # However if you need to run this script manually, usage is following: # # run_worker_locally.sh WORKER_ID # # where WORKER_ID is numerical identifier of the worker. Typically workers are # identified by numbers from 0 to NUMBER_OF_WORKERS-1 # # Get worker ID from argumetns to run_worker_locally.sh WORKER_ID=$1 if [ -z ${WORKER_ID} ]; then echo "Worker ID is missing." exit 1 fi # cd to script directory cd "$( dirname "${BASH_SOURCE[0]}" )" # Read variables from config.sh source ../scripts/config.sh check_dataset_and_round_set # Run worekr source ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate python -B worker.py \ --worker_id=${WORKER_ID} \ --project_id="${GOOGLE_CLOUD_PROJECT_ID}" \ --storage_bucket="${GOOGLE_CLOUD_STORAGE_BUCKET}" \ --round_name="${ROUND_NAME}" \ --dataset_name="${DATASET}" \ --num_defense_shards="${NUM_DEFENSE_SHARDS}" &> ~/log.txt deactivate ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/start_worker_in_tmux.sh ================================================ #!/bin/bash # # Helper script which creates a tmux session, starts workers and opens log file # inside this session. # Should be only run automatically by start_workers.sh script # WORKER_ID=$1 if [ -z ${WORKER_ID} ]; then echo "Worker ID has to be provided" exit 1 fi cd ~/ tmux new-session -s run -d tmux rename-window -t run:0 "run" tmux new-window -t run:1 -n "view" sleep 2 tmux send-keys -t run:0 "eval_infra/code/run_worker_locally.sh ${WORKER_ID}" C-m sleep 2 tmux send-keys -t run:1 "tail -f log.txt" C-m ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/worker.py ================================================ """Worker which runs all computations on Cloud VMs. Evaluation of competition is split into work pieces. One work piece is a either evaluation of an attack on a batch of images or evaluation of a defense on a batch of adversarial images. All pieces of attack work are independent from each other and could be run in parallel. Same for pieces of defense work - they are independent from each other and could be run in parallel. But defense work could be run only after all attack work is completed. Worker first runs all attack pieces, by querying next piece of undone work and running it. After all attack pieces are done, worker runs all defense pieces in a similar way. Before workers could be started, datastore has to be populated by master with description of work to be done. See master.py for details. NOTE: Worker is designed to run on linux machine with NVidia docker installed. Worker generally needs administrative privilege to run properly. Also worker relies on very specific directory structure created in home directory. That's why it's highly recommended to run worker only in VM. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from builtins import int # long in python 2 import argparse import json import logging import os import random import shutil import subprocess import time import uuid from six import iteritems import eval_lib from cleverhans.utils import shell_call # Sleep time while waiting for next available piece of work SLEEP_TIME = 30 SLEEP_TIME_SHORT = 10 # Time limit to run one pice of work SUBMISSION_TIME_LIMIT = 500 # Set of local temporary directories and files LOCAL_EVAL_ROOT_DIR = os.path.expanduser("~/competition_eval") LOCAL_DATASET_DIR = os.path.expanduser("~/competition_eval/dataset_images") LOCAL_SUBMISSIONS_DIR = os.path.expanduser("~/competition_eval/submissions") LOCAL_INPUT_DIR = os.path.expanduser("~/competition_eval/input") LOCAL_OUTPUT_DIR = os.path.expanduser("~/competition_eval/output") LOCAL_PROCESSED_OUTPUT_DIR = os.path.expanduser("~/competition_eval/processed_output") LOCAL_ZIPPED_OUTPUT_DIR = os.path.expanduser("~/competition_eval/zipped_output") LOCAL_DATASET_METADATA_FILE = os.path.expanduser("~/competition_eval/dataset_meta.csv") LOCAL_DATASET_COPY = os.path.expanduser("~/competition_data/dataset") # Types of submissions TYPE_TARGETED = "targeted" TYPE_NONTARGETED = "nontargeted" TYPE_DEFENSE = "defense" # Extraction commands for various types of archive EXTRACT_COMMAND = { ".zip": ["unzip", "${src}", "-d", "${dst}"], ".tar": ["tar", "xvf", "${src}", "-C", "${dst}"], ".tar.gz": ["tar", "xvzf", "${src}", "-C", "${dst}"], } # Docker binary to use DOCKER_BINARY = "docker" DOCKER_NVIDIA_RUNTIME = "--runtime=nvidia" # Names of relevant fields in submission metadata file METADATA_CONTAINER = "container_gpu" METADATA_ENTRY_POINT = "entry_point" METADATA_TYPE = "type" # Mapping from submission type in metadata to submission type used in worker METADATA_JSON_TYPE_TO_TYPE = { "attack": TYPE_NONTARGETED, "targeted_attack": TYPE_TARGETED, "defense": TYPE_DEFENSE, } def make_directory_writable(dirname): """Makes directory readable and writable by everybody. If you run something inside Docker container and it writes files, then these files will be written as root user with restricted permissions. So to be able to read/modify these files outside of Docker you have to change permissions to be world readable and writable. Args: dirname: name of the directory Returns: True if operation was successfull """ shell_call( [ "docker", "run", "-v", "{0}:/output_dir".format(dirname), "busybox:1.27.2", "chmod", "-R", "a+rwx", "/output_dir", ] ) def sudo_remove_dirtree(dir_name): """Removes directory tree as a superuser. Args: dir_name: name of the directory to remove. This function is necessary to cleanup directories created from inside a Docker, since they usually written as a root, thus have to be removed as a root. """ try: subprocess.check_output(["sudo", "rm", "-rf", dir_name]) except subprocess.CalledProcessError as e: raise WorkerError("Can" "t remove directory {0}".format(dir_name), e) class WorkerError(Exception): """Error which happen during evaluation of submission. To simplify error handling, worker only raises this type of exception. Exceptions of different types raised by other modules encapsulated into WorkerError by the worker. """ def __init__(self, message, exc=None): """Initializes WorkerError. Args: message: error message exc: optional underlying exception. """ super(WorkerError, self).__init__() self.msg = message self.exc = exc def __str__(self): """Returns human readable string representation of the exception.""" if self.exc: return "{0}\nUnderlying exception:\n{1}".format(self.msg, self.exc) else: return self.msg def get_id_of_running_docker(container_name): """Returns ID of running docker container.""" return shell_call( [DOCKER_BINARY, "ps", "-q", "--filter=name={}".format(container_name)] ).strip() def is_docker_still_running(container_name): """Returns whether given Docker container is still running.""" return bool(get_id_of_running_docker(container_name)) def kill_docker_container(container_name): """Kills given docker container.""" docker_id = get_id_of_running_docker(container_name) shell_call([DOCKER_BINARY, "stop", docker_id]) class ExecutableSubmission(object): """Base class which is used to run submissions.""" def __init__(self, submission_id, submissions, storage_bucket): """Initializes ExecutableSubmission. Args: submission_id: ID of the submissions submissions: instance of CompetitionSubmissions with all submissions storage_bucket: storage bucket where all submissions are stored Raises: WorkerError: if submission was not found """ self.submission_id = submission_id self.storage_bucket = storage_bucket self.type = None self.submission = None if submission_id in submissions.attacks: self.type = TYPE_NONTARGETED self.submission = submissions.attacks[submission_id] elif submission_id in submissions.targeted_attacks: self.type = TYPE_TARGETED self.submission = submissions.targeted_attacks[submission_id] elif submission_id in submissions.defenses: self.type = TYPE_DEFENSE self.submission = submissions.defenses[submission_id] else: raise WorkerError( 'Submission with ID "{0}" not found'.format(submission_id) ) self.submission_dir = None self.extracted_submission_dir = None def download(self): """Method which downloads submission to local directory.""" # Structure of the download directory: # submission_dir=LOCAL_SUBMISSIONS_DIR/submission_id # submission_dir/s.ext <-- archived submission # submission_dir/extracted <-- extracted submission # Check whether submission is already there if self.extracted_submission_dir: return self.submission_dir = os.path.join(LOCAL_SUBMISSIONS_DIR, self.submission_id) if os.path.isdir(self.submission_dir) and os.path.isdir( os.path.join(self.submission_dir, "extracted") ): # submission already there, just re-read metadata self.extracted_submission_dir = os.path.join( self.submission_dir, "extracted" ) with open( os.path.join(self.extracted_submission_dir, "metadata.json"), "r" ) as f: meta_json = json.load(f) self.container_name = str(meta_json[METADATA_CONTAINER]) self.entry_point = str(meta_json[METADATA_ENTRY_POINT]) return # figure out submission location in the Cloud and determine extractor submission_cloud_path = os.path.join( "gs://", self.storage_bucket, self.submission.path ) extract_command_tmpl = None extension = None for k, v in iteritems(EXTRACT_COMMAND): if submission_cloud_path.endswith(k): extension = k extract_command_tmpl = v break if not extract_command_tmpl: raise WorkerError("Unsupported submission extension") # download archive try: os.makedirs(self.submission_dir) tmp_extract_dir = os.path.join(self.submission_dir, "tmp") os.makedirs(tmp_extract_dir) download_path = os.path.join(self.submission_dir, "s" + extension) try: logging.info( "Downloading submission from %s to %s", submission_cloud_path, download_path, ) shell_call(["gsutil", "cp", submission_cloud_path, download_path]) except subprocess.CalledProcessError as e: raise WorkerError("Can" "t copy submission locally", e) # extract archive try: shell_call(extract_command_tmpl, src=download_path, dst=tmp_extract_dir) except subprocess.CalledProcessError as e: # proceed even if extraction returned non zero error code, # sometimes it's just warning logging.warning( "Submission extraction returned non-zero error code. " "It may be just a warning, continuing execution. " "Error: %s", e, ) try: make_directory_writable(tmp_extract_dir) except subprocess.CalledProcessError as e: raise WorkerError("Can" "t make submission directory writable", e) # determine root of the submission tmp_root_dir = tmp_extract_dir root_dir_content = [d for d in os.listdir(tmp_root_dir) if d != "__MACOSX"] if len(root_dir_content) == 1 and os.path.isdir( os.path.join(tmp_root_dir, root_dir_content[0]) ): tmp_root_dir = os.path.join(tmp_root_dir, root_dir_content[0]) # move files to extract subdirectory self.extracted_submission_dir = os.path.join( self.submission_dir, "extracted" ) try: shell_call( ["mv", os.path.join(tmp_root_dir), self.extracted_submission_dir] ) except subprocess.CalledProcessError as e: raise WorkerError("Can" "t move submission files", e) # read metadata file try: with open( os.path.join(self.extracted_submission_dir, "metadata.json"), "r" ) as f: meta_json = json.load(f) except IOError as e: raise WorkerError( "Can" 't read metadata.json for submission "{0}"'.format( self.submission_id ), e, ) try: self.container_name = str(meta_json[METADATA_CONTAINER]) self.entry_point = str(meta_json[METADATA_ENTRY_POINT]) type_from_meta = METADATA_JSON_TYPE_TO_TYPE[meta_json[METADATA_TYPE]] except KeyError as e: raise WorkerError("Invalid metadata.json file", e) if type_from_meta != self.type: raise WorkerError( "Inconsistent submission type in metadata: " + type_from_meta + " vs " + self.type ) except WorkerError as e: self.extracted_submission_dir = None sudo_remove_dirtree(self.submission_dir) raise def temp_copy_extracted_submission(self): """Creates a temporary copy of extracted submission. When executed, submission is allowed to modify it's own directory. So to ensure that submission does not pass any data between runs, new copy of the submission is made before each run. After a run temporary copy of submission is deleted. Returns: directory where temporary copy is located """ tmp_copy_dir = os.path.join(self.submission_dir, "tmp_copy") shell_call( ["cp", "-R", os.path.join(self.extracted_submission_dir), tmp_copy_dir] ) return tmp_copy_dir def run_without_time_limit(self, cmd): """Runs docker command without time limit. Args: cmd: list with the command line arguments which are passed to docker binary Returns: how long it took to run submission in seconds Raises: WorkerError: if error occurred during execution of the submission """ cmd = [DOCKER_BINARY, "run", DOCKER_NVIDIA_RUNTIME] + cmd logging.info("Docker command: %s", " ".join(cmd)) start_time = time.time() retval = subprocess.call(cmd) elapsed_time_sec = int(time.time() - start_time) logging.info("Elapsed time of attack: %d", elapsed_time_sec) logging.info("Docker retval: %d", retval) if retval != 0: logging.warning("Docker returned non-zero retval: %d", retval) raise WorkerError("Docker returned non-zero retval " + str(retval)) return elapsed_time_sec def run_with_time_limit(self, cmd, time_limit=SUBMISSION_TIME_LIMIT): """Runs docker command and enforces time limit. Args: cmd: list with the command line arguments which are passed to docker binary after run time_limit: time limit, in seconds. Negative value means no limit. Returns: how long it took to run submission in seconds Raises: WorkerError: if error occurred during execution of the submission """ if time_limit < 0: return self.run_without_time_limit(cmd) container_name = str(uuid.uuid4()) cmd = [ DOCKER_BINARY, "run", DOCKER_NVIDIA_RUNTIME, "--detach", "--name", container_name, ] + cmd logging.info("Docker command: %s", " ".join(cmd)) logging.info("Time limit %d seconds", time_limit) retval = subprocess.call(cmd) start_time = time.time() elapsed_time_sec = 0 while is_docker_still_running(container_name): elapsed_time_sec = int(time.time() - start_time) if elapsed_time_sec < time_limit: time.sleep(1) else: kill_docker_container(container_name) logging.warning("Submission was killed because run out of time") logging.info("Elapsed time of submission: %d", elapsed_time_sec) logging.info("Docker retval: %d", retval) if retval != 0: logging.warning("Docker returned non-zero retval: %d", retval) raise WorkerError("Docker returned non-zero retval " + str(retval)) return elapsed_time_sec class AttackSubmission(ExecutableSubmission): """Class to run attack submissions.""" def __init__(self, submission_id, submissions, storage_bucket): """Initializes AttackSubmission. Args: submission_id: ID of the submission submissions: instance of CompetitionSubmissions with all submissions storage_bucket: storage bucket where all submissions are stored Raises: WorkerError: if submission has incorrect type """ super(AttackSubmission, self).__init__( submission_id, submissions, storage_bucket ) if (self.type != TYPE_TARGETED) and (self.type != TYPE_NONTARGETED): raise WorkerError( 'Incorrect attack type for submission "{0}"'.format(submission_id) ) def run(self, input_dir, output_dir, epsilon): """Runs attack inside Docker. Args: input_dir: directory with input (dataset). output_dir: directory where output (adversarial images) should be written. epsilon: maximum allowed size of adversarial perturbation, should be in range [0, 255]. Returns: how long it took to run submission in seconds """ logging.info("Running attack %s", self.submission_id) tmp_run_dir = self.temp_copy_extracted_submission() cmd = [ "--network=none", "-m=24g", "--cpus=3.75", "-v", "{0}:/input_images:ro".format(input_dir), "-v", "{0}:/output_images".format(output_dir), "-v", "{0}:/code".format(tmp_run_dir), "-w", "/code", self.container_name, "./" + self.entry_point, "/input_images", "/output_images", str(epsilon), ] elapsed_time_sec = self.run_with_time_limit(cmd) sudo_remove_dirtree(tmp_run_dir) return elapsed_time_sec class DefenseSubmission(ExecutableSubmission): """Helper class to run one defense submission.""" def __init__(self, submission_id, submissions, storage_bucket): """Initializes DefenseSubmission. Args: submission_id: ID of the submission submissions: instance of CompetitionSubmissions with all submissions storage_bucket: storage bucket where all submissions are stored Raises: WorkerError: if submission has incorrect type """ super(DefenseSubmission, self).__init__( submission_id, submissions, storage_bucket ) if self.type != TYPE_DEFENSE: raise WorkerError( 'Incorrect defense type for submission "{0}"'.format(submission_id) ) def run(self, input_dir, output_file_path): """Runs defense inside Docker. Args: input_dir: directory with input (adversarial images). output_file_path: path of the output file. Returns: how long it took to run submission in seconds """ logging.info("Running defense %s", self.submission_id) tmp_run_dir = self.temp_copy_extracted_submission() output_dir = os.path.dirname(output_file_path) output_filename = os.path.basename(output_file_path) cmd = [ "--network=none", "-m=24g", "--cpus=3.75", "-v", "{0}:/input_images:ro".format(input_dir), "-v", "{0}:/output_data".format(output_dir), "-v", "{0}:/code".format(tmp_run_dir), "-w", "/code", self.container_name, "./" + self.entry_point, "/input_images", "/output_data/" + output_filename, ] elapsed_time_sec = self.run_with_time_limit(cmd) sudo_remove_dirtree(tmp_run_dir) return elapsed_time_sec class EvaluationWorker(object): """Class which encapsulate logit of the worker. Main entry point of this class is EvaluationWorker.run_work method which performs cleanup of temporary directories, then runs EvaluationWorker.run_attacks and EvaluationWorker.run_defenses """ def __init__( self, worker_id, storage_client, datastore_client, storage_bucket, round_name, dataset_name, blacklisted_submissions="", num_defense_shards=None, ): """Initializes EvaluationWorker. Args: worker_id: ID of the worker storage_client: instance of eval_lib.CompetitionStorageClient datastore_client: instance of eval_lib.CompetitionDatastoreClient storage_bucket: name of the Google Cloud Storage bucket where all competition data is stored round_name: name of the competition round dataset_name: name of the dataset to use, typically 'dev' of 'final' blacklisted_submissions: optional list of blacklisted submissions which are excluded from evaluation num_defense_shards: optional number of shards to use for evaluation of defenses """ self.worker_id = int(worker_id) self.storage_client = storage_client self.datastore_client = datastore_client self.storage_bucket = storage_bucket self.round_name = round_name self.dataset_name = dataset_name self.blacklisted_submissions = [ s.strip() for s in blacklisted_submissions.split(",") ] if num_defense_shards: self.num_defense_shards = int(num_defense_shards) else: self.num_defense_shards = None logging.info("Number of defense shards: %s", str(self.num_defense_shards)) # init client classes self.submissions = eval_lib.CompetitionSubmissions( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=self.round_name, ) self.dataset_batches = eval_lib.DatasetBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, dataset_name=self.dataset_name, ) self.adv_batches = eval_lib.AversarialBatches( datastore_client=self.datastore_client ) self.attack_work = eval_lib.AttackWorkPieces( datastore_client=self.datastore_client ) self.defense_work = eval_lib.DefenseWorkPieces( datastore_client=self.datastore_client ) self.class_batches = eval_lib.ClassificationBatches( datastore_client=self.datastore_client, storage_client=self.storage_client, round_name=self.round_name, ) # whether data was initialized self.attacks_data_initialized = False self.defenses_data_initialized = False # dataset metadata self.dataset_meta = None def read_dataset_metadata(self): """Read `dataset_meta` field from bucket""" if self.dataset_meta: return shell_call( [ "gsutil", "cp", "gs://" + self.storage_client.bucket_name + "/" + "dataset/" + self.dataset_name + "_dataset.csv", LOCAL_DATASET_METADATA_FILE, ] ) with open(LOCAL_DATASET_METADATA_FILE, "r") as f: self.dataset_meta = eval_lib.DatasetMetadata(f) def fetch_attacks_data(self): """Initializes data necessary to execute attacks. This method could be called multiple times, only first call does initialization, subsequent calls are noop. """ if self.attacks_data_initialized: return # init data from datastore self.submissions.init_from_datastore() self.dataset_batches.init_from_datastore() self.adv_batches.init_from_datastore() # copy dataset locally if not os.path.exists(LOCAL_DATASET_DIR): os.makedirs(LOCAL_DATASET_DIR) eval_lib.download_dataset( self.storage_client, self.dataset_batches, LOCAL_DATASET_DIR, os.path.join(LOCAL_DATASET_COPY, self.dataset_name, "images"), ) # download dataset metadata self.read_dataset_metadata() # mark as initialized self.attacks_data_initialized = True def run_attack_work(self, work_id): """Runs one attack work. Args: work_id: ID of the piece of work to run Returns: elapsed_time_sec, submission_id - elapsed time and id of the submission Raises: WorkerError: if error occurred during execution. """ adv_batch_id = self.attack_work.work[work_id]["output_adversarial_batch_id"] adv_batch = self.adv_batches[adv_batch_id] dataset_batch_id = adv_batch["dataset_batch_id"] submission_id = adv_batch["submission_id"] epsilon = self.dataset_batches[dataset_batch_id]["epsilon"] logging.info( "Attack work piece: " 'dataset_batch_id="%s" submission_id="%s" ' "epsilon=%d", dataset_batch_id, submission_id, epsilon, ) if submission_id in self.blacklisted_submissions: raise WorkerError("Blacklisted submission") # get attack attack = AttackSubmission(submission_id, self.submissions, self.storage_bucket) attack.download() # prepare input input_dir = os.path.join(LOCAL_DATASET_DIR, dataset_batch_id) if attack.type == TYPE_TARGETED: # prepare file with target classes target_class_filename = os.path.join(input_dir, "target_class.csv") self.dataset_meta.save_target_classes_for_batch( target_class_filename, self.dataset_batches, dataset_batch_id ) # prepare output directory if os.path.exists(LOCAL_OUTPUT_DIR): sudo_remove_dirtree(LOCAL_OUTPUT_DIR) os.mkdir(LOCAL_OUTPUT_DIR) if os.path.exists(LOCAL_PROCESSED_OUTPUT_DIR): shutil.rmtree(LOCAL_PROCESSED_OUTPUT_DIR) os.mkdir(LOCAL_PROCESSED_OUTPUT_DIR) if os.path.exists(LOCAL_ZIPPED_OUTPUT_DIR): shutil.rmtree(LOCAL_ZIPPED_OUTPUT_DIR) os.mkdir(LOCAL_ZIPPED_OUTPUT_DIR) # run attack elapsed_time_sec = attack.run(input_dir, LOCAL_OUTPUT_DIR, epsilon) if attack.type == TYPE_TARGETED: # remove target class file os.remove(target_class_filename) # enforce epsilon and compute hashes image_hashes = eval_lib.enforce_epsilon_and_compute_hash( input_dir, LOCAL_OUTPUT_DIR, LOCAL_PROCESSED_OUTPUT_DIR, epsilon ) if not image_hashes: logging.warning("No images saved by the attack.") return elapsed_time_sec, submission_id # write images back to datastore # rename images and add information to adversarial batch for clean_image_id, hash_val in iteritems(image_hashes): # we will use concatenation of batch_id and image_id # as adversarial image id and as a filename of adversarial images adv_img_id = adv_batch_id + "_" + clean_image_id # rename the image os.rename( os.path.join(LOCAL_PROCESSED_OUTPUT_DIR, clean_image_id + ".png"), os.path.join(LOCAL_PROCESSED_OUTPUT_DIR, adv_img_id + ".png"), ) # populate values which will be written to datastore image_path = "{0}/adversarial_images/{1}/{1}.zip/{2}.png".format( self.round_name, adv_batch_id, adv_img_id ) # u'' + foo is a a python 2/3 compatible way of casting foo to unicode adv_batch["images"][adv_img_id] = { "clean_image_id": u"" + str(clean_image_id), "image_path": u"" + str(image_path), "image_hash": u"" + str(hash_val), } # archive all images and copy to storage zipped_images_filename = os.path.join( LOCAL_ZIPPED_OUTPUT_DIR, adv_batch_id + ".zip" ) try: logging.debug( "Compressing adversarial images to %s", zipped_images_filename ) shell_call( ["zip", "-j", "-r", zipped_images_filename, LOCAL_PROCESSED_OUTPUT_DIR] ) except subprocess.CalledProcessError as e: raise WorkerError("Can" "t make archive from adversarial iamges", e) # upload archive to storage dst_filename = "{0}/adversarial_images/{1}/{1}.zip".format( self.round_name, adv_batch_id ) logging.debug("Copying archive with adversarial images to %s", dst_filename) self.storage_client.new_blob(dst_filename).upload_from_filename( zipped_images_filename ) # writing adv batch to datastore logging.debug("Writing adversarial batch to datastore") self.adv_batches.write_single_batch_images_to_datastore(adv_batch_id) return elapsed_time_sec, submission_id def run_attacks(self): """Method which evaluates all attack work. In a loop this method queries not completed attack work, picks one attack work and runs it. """ logging.info("******** Start evaluation of attacks ********") prev_submission_id = None while True: # wait until work is available self.attack_work.read_all_from_datastore() if not self.attack_work.work: logging.info("Work is not populated, waiting...") time.sleep(SLEEP_TIME) continue if self.attack_work.is_all_work_competed(): logging.info("All attack work completed.") break # download all attacks data and dataset self.fetch_attacks_data() # pick piece of work work_id = self.attack_work.try_pick_piece_of_work( self.worker_id, submission_id=prev_submission_id ) if not work_id: logging.info("Failed to pick work, waiting...") time.sleep(SLEEP_TIME_SHORT) continue logging.info("Selected work_id: %s", work_id) # execute work try: elapsed_time_sec, prev_submission_id = self.run_attack_work(work_id) logging.info("Work %s is done", work_id) # indicate that work is completed is_work_update = self.attack_work.update_work_as_completed( self.worker_id, work_id, other_values={"elapsed_time": elapsed_time_sec}, ) except WorkerError as e: logging.info("Failed to run work:\n%s", str(e)) is_work_update = self.attack_work.update_work_as_completed( self.worker_id, work_id, error=str(e) ) if not is_work_update: logging.warning( "Can" 't update work "%s" as completed by worker %d', work_id, self.worker_id, ) logging.info("******** Finished evaluation of attacks ********") def fetch_defense_data(self): """Lazy initialization of data necessary to execute defenses.""" if self.defenses_data_initialized: return logging.info("Fetching defense data from datastore") # init data from datastore self.submissions.init_from_datastore() self.dataset_batches.init_from_datastore() self.adv_batches.init_from_datastore() # read dataset metadata self.read_dataset_metadata() # mark as initialized self.defenses_data_initialized = True def run_defense_work(self, work_id): """Runs one defense work. Args: work_id: ID of the piece of work to run Returns: elapsed_time_sec, submission_id - elapsed time and id of the submission Raises: WorkerError: if error occurred during execution. """ class_batch_id = self.defense_work.work[work_id][ "output_classification_batch_id" ] class_batch = self.class_batches.read_batch_from_datastore(class_batch_id) adversarial_batch_id = class_batch["adversarial_batch_id"] submission_id = class_batch["submission_id"] cloud_result_path = class_batch["result_path"] logging.info( "Defense work piece: " 'adversarial_batch_id="%s" submission_id="%s"', adversarial_batch_id, submission_id, ) if submission_id in self.blacklisted_submissions: raise WorkerError("Blacklisted submission") # get defense defense = DefenseSubmission( submission_id, self.submissions, self.storage_bucket ) defense.download() # prepare input - copy adversarial batch locally input_dir = os.path.join(LOCAL_INPUT_DIR, adversarial_batch_id) if os.path.exists(input_dir): sudo_remove_dirtree(input_dir) os.makedirs(input_dir) try: shell_call( [ "gsutil", "-m", "cp", # typical location of adv batch: # testing-round/adversarial_images/ADVBATCH000/ os.path.join( "gs://", self.storage_bucket, self.round_name, "adversarial_images", adversarial_batch_id, "*", ), input_dir, ] ) adv_images_files = os.listdir(input_dir) if (len(adv_images_files) == 1) and adv_images_files[0].endswith(".zip"): logging.info( "Adversarial batch is in zip archive %s", adv_images_files[0] ) shell_call( [ "unzip", os.path.join(input_dir, adv_images_files[0]), "-d", input_dir, ] ) os.remove(os.path.join(input_dir, adv_images_files[0])) adv_images_files = os.listdir(input_dir) logging.info("%d adversarial images copied", len(adv_images_files)) except (subprocess.CalledProcessError, IOError) as e: raise WorkerError("Can" "t copy adversarial batch locally", e) # prepare output directory if os.path.exists(LOCAL_OUTPUT_DIR): sudo_remove_dirtree(LOCAL_OUTPUT_DIR) os.mkdir(LOCAL_OUTPUT_DIR) output_filname = os.path.join(LOCAL_OUTPUT_DIR, "result.csv") # run defense elapsed_time_sec = defense.run(input_dir, output_filname) # evaluate defense result batch_result = eval_lib.analyze_one_classification_result( storage_client=None, file_path=output_filname, adv_batch=self.adv_batches.data[adversarial_batch_id], dataset_batches=self.dataset_batches, dataset_meta=self.dataset_meta, ) # copy result of the defense into storage try: shell_call( [ "gsutil", "cp", output_filname, os.path.join("gs://", self.storage_bucket, cloud_result_path), ] ) except subprocess.CalledProcessError as e: raise WorkerError("Can" "t result to Cloud Storage", e) return elapsed_time_sec, submission_id, batch_result def run_defenses(self): """Method which evaluates all defense work. In a loop this method queries not completed defense work, picks one defense work and runs it. """ logging.info("******** Start evaluation of defenses ********") prev_submission_id = None need_reload_work = True while True: # wait until work is available if need_reload_work: if self.num_defense_shards: shard_with_work = self.defense_work.read_undone_from_datastore( shard_id=(self.worker_id % self.num_defense_shards), num_shards=self.num_defense_shards, ) else: shard_with_work = self.defense_work.read_undone_from_datastore() logging.info( "Loaded %d records of undone work from shard %s", len(self.defense_work), str(shard_with_work), ) if not self.defense_work.work: logging.info("Work is not populated, waiting...") time.sleep(SLEEP_TIME) continue if self.defense_work.is_all_work_competed(): logging.info("All defense work completed.") break # download all defense data and dataset self.fetch_defense_data() need_reload_work = False # pick piece of work work_id = self.defense_work.try_pick_piece_of_work( self.worker_id, submission_id=prev_submission_id ) if not work_id: need_reload_work = True logging.info("Failed to pick work, waiting...") time.sleep(SLEEP_TIME_SHORT) continue logging.info("Selected work_id: %s", work_id) # execute work try: ( elapsed_time_sec, prev_submission_id, batch_result, ) = self.run_defense_work(work_id) logging.info("Work %s is done", work_id) # indicate that work is completed is_work_update = self.defense_work.update_work_as_completed( self.worker_id, work_id, other_values={ "elapsed_time": elapsed_time_sec, "stat_correct": batch_result[0], "stat_error": batch_result[1], "stat_target_class": batch_result[2], "stat_num_images": batch_result[3], }, ) except WorkerError as e: logging.info("Failed to run work:\n%s", str(e)) if str(e).startswith("Docker returned non-zero retval"): logging.info("Running nvidia-docker to ensure that GPU works") shell_call( ["nvidia-docker", "run", "--rm", "nvidia/cuda", "nvidia-smi"] ) is_work_update = self.defense_work.update_work_as_completed( self.worker_id, work_id, error=str(e) ) if not is_work_update: logging.warning( "Can" 't update work "%s" as completed by worker %d', work_id, self.worker_id, ) need_reload_work = True logging.info("******** Finished evaluation of defenses ********") def run_work(self): """Run attacks and defenses""" if os.path.exists(LOCAL_EVAL_ROOT_DIR): sudo_remove_dirtree(LOCAL_EVAL_ROOT_DIR) self.run_attacks() self.run_defenses() def main(args): """Main function which runs worker.""" title = "## Starting evaluation of round {0} ##".format(args.round_name) logging.info( "\n" + "#" * len(title) + "\n" + "#" * len(title) + "\n" + "##" + " " * (len(title) - 2) + "##" + "\n" + title + "\n" + "#" * len(title) + "\n" + "#" * len(title) + "\n" + "##" + " " * (len(title) - 2) + "##" + "\n" ) if args.blacklisted_submissions: logging.warning("BLACKLISTED SUBMISSIONS: %s", args.blacklisted_submissions) random.seed() logging.info("Running nvidia-docker to ensure that GPU works") shell_call( ["docker", "run", "--runtime=nvidia", "--rm", "nvidia/cuda", "nvidia-smi"] ) eval_worker = EvaluationWorker( worker_id=args.worker_id, storage_client=eval_lib.CompetitionStorageClient( args.project_id, args.storage_bucket ), datastore_client=eval_lib.CompetitionDatastoreClient( args.project_id, args.round_name ), storage_bucket=args.storage_bucket, round_name=args.round_name, dataset_name=args.dataset_name, blacklisted_submissions=args.blacklisted_submissions, num_defense_shards=args.num_defense_shards, ) eval_worker.run_work() if __name__ == "__main__": parser = argparse.ArgumentParser(description="Worker which executes work.") parser.add_argument( "--worker_id", required=True, type=int, help="Numerical ID of the worker." ) parser.add_argument( "--project_id", required=True, help="Your Google Cloud project ID." ) parser.add_argument( "--storage_bucket", required=True, help="Cloud Storage bucket to store competition data.", ) parser.add_argument( "--round_name", default="testing-round", required=False, help="Name of the round.", ) parser.add_argument( "--dataset_name", default="dev", required=False, help="Which dataset to use, either dev or final.", ) parser.add_argument( "--blacklisted_submissions", default="", required=False, help="Comma separated list of blacklisted submission " "IDs.", ) parser.add_argument( "--num_defense_shards", default=10, required=False, help="Number of defense shards", ) parser.add_argument( "--log_file", default="", required=False, help="Location of the logfile." ) worker_args = parser.parse_args() logging_args = { "format": "%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s -- %(message)s", "level": logging.INFO, "datefmt": "%Y-%m-%d %H:%M:%S", } if worker_args.log_file: logging_args["filename"] = worker_args.log_file logging_args["filemode"] = "a" logging.basicConfig(**logging_args) main(worker_args) ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/run_master.sh ================================================ #!/bin/bash # # Script runs master. # # Usage: # run_master.sh COMMAND # # Get master command from arguments to run_master.sh COMMAND=$1 if [ -z ${COMMAND} ]; then COMMAND=status fi # cd to script subdirectory cd "$( dirname "${BASH_SOURCE[0]}" )" # Read variables from config.sh source scripts/config.sh check_dataset_and_round_set # Create results directory if it does not exist mkdir -p ${MASTER_RESULTS_DIR} # Execute master in proper virtualenv cd code source ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate # NOTE: if you want to use only 30 images from the dataset with 10 images per # batch then add --limited_dataset flag to following command python -B master.py \ ${COMMAND} \ --project_id="${GOOGLE_CLOUD_PROJECT_ID}" \ --storage_bucket="${GOOGLE_CLOUD_STORAGE_BUCKET}" \ --round_name="${ROUND_NAME}" \ --dataset_name="${DATASET}" \ --results_dir="${MASTER_RESULTS_DIR}" \ --num_defense_shards="${NUM_DEFENSE_SHARDS}" \ --log_file="${MASTER_RESULTS_DIR}/log.txt" \ --verbose deactivate ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/config.sh ================================================ #!/bin/bash # # Constants and variables related to evaluation of the competition. # Please update them appropriately before running evaluation # ################################################################################ # Variables ################################################################################ # Google Cloud Project ID GOOGLE_CLOUD_PROJECT_ID="" # Google Cloud Storage bucket where all data related to competition are stored GOOGLE_CLOUD_STORAGE_BUCKET="" # Name of the zone where VMs are created GOOGLE_CLOUD_COMPUTE_ZONE="" # Google Cloud VM username GOOGLE_CLOUD_VM_USERNAME="${USER}" # Name of the VM snapshot which is used as reference images for all workers GOOGLE_CLOUD_REF_VM_SNAPSHOT="" # Name of the current round ROUND_NAME="" # Dataset to use DATASET="" # Number of shards to compute defense results # As a rule of thumb use NUM_DEFENSE_SHARDS equal to NUM_WORKERS/10 # Increase number of shards if you see that workers have periodic # transient errors while accessing datastore. NUM_DEFENSE_SHARDS=1 # Local directory where master will save results of the competition MASTER_RESULTS_DIR="${HOME}/adversarial_competition/results/${ROUND_NAME}" # Name of the python virtualenv which is used to run the master VIRTUALENV_NAME="nips_competition_env" ################################################################################ # Check that necessary variables are set # GOOGLE_CLOUD_PROJECT_ID and GOOGLE_CLOUD_STORAGE_BUCKET are checked every time # config is imported. # Few other variables are checked only when needed by provided helper functions. ################################################################################ if [[ -z ${GOOGLE_CLOUD_PROJECT_ID} ]]; then echo "GOOGLE_CLOUD_PROJECT_ID variable must be set in config.sh" exit 1 fi if [[ -z ${GOOGLE_CLOUD_STORAGE_BUCKET} ]]; then echo "GOOGLE_CLOUD_STORAGE_BUCKET variable must be set in config.sh" exit 1 fi function check_cloud_compute_zone_set() { if [[ -z ${GOOGLE_CLOUD_COMPUTE_ZONE} ]]; then echo "GOOGLE_CLOUD_COMPUTE_ZONE variable must be set in config.sh" exit 1 fi } function check_cloud_ref_vm_snapshot_set() { if [[ -z ${GOOGLE_CLOUD_REF_VM_SNAPSHOT} ]]; then echo "GOOGLE_CLOUD_REF_VM_SNAPSHOT variable must be set in config.sh" exit 1 fi } function check_dataset_and_round_set() { if [[ -z ${DATASET} ]]; then echo "DATASET variable must be set in config.sh" exit 1 fi if [[ -z ${ROUND_NAME} ]]; then echo "DATASET variable must be set in config.sh" exit 1 fi } ################################################################################ # Helper functions ################################################################################ function run_ssh_command() { check_cloud_compute_zone_set local machine_name=$1 local command=$2 gcloud compute --project "${GOOGLE_CLOUD_PROJECT_ID}" \ ssh --zone "${GOOGLE_CLOUD_COMPUTE_ZONE}" "${machine_name}" \ --command="${command}" } function scp_cloud_vm() { check_cloud_compute_zone_set local src=$1 local dst=$2 gcloud compute scp \ --project "${GOOGLE_CLOUD_PROJECT_ID}" \ --zone "${GOOGLE_CLOUD_COMPUTE_ZONE}" \ ${src} ${dst} } ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/copy_baselines.sh ================================================ #!/bin/bash # # Copies baselines to directory which correspond to current round # # Import config.sh source "$( dirname "${BASH_SOURCE[0]}" )/config.sh" check_dataset_and_round_set # Copy baselines gsutil cp gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/defense/* \ gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions/defense/ gsutil cp gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/targeted/* \ gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions/targeted/ gsutil cp gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/nontargeted/* \ gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions/nontargeted/ ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/copy_dataset_to_vm.sh ================================================ #!/bin/bash # # Script which copies dataset to VM # Usage: # copy_dataset_to_vm.sh DATASET_LOCAL_DIR DATASET_NAME VM_NAME # Where: # DATASET_LOCAL_DIR - local directory where dataset is located, # directory with dataset should contain file "${DATASET_NAME}_dataset.csv" # and subdirectory "images" with all dataset images # DATASET_NAME - name of the dataset, "dev" or "final" # VM_NAME - name of virtual machine where data should be copied into # # fail on first error set -e # Read variables from config.sh SCRIPT_DIR="$( dirname "${BASH_SOURCE[0]}" )" source "${SCRIPT_DIR}/config.sh" # Check arguments DATASET_DIR=$1 DATASET_NAME=$2 VM_NAME=$3 if [[ -z ${DATASET_DIR} ]] || [[ -z ${DATASET_NAME} ]] || [[ -z ${VM_NAME} ]]; then echo "Invalid usage, please run:" echo " copy_dataset_to_vm.sh DATASET_LOCAL_DIR DATASET_NAME VM_NAME" exit 1 fi # Archive dataset TMP_DIR=$(mktemp -d) cd ${DATASET_DIR} zip -r ${TMP_DIR}/dataset.zip ./ # Copy archive with dataset to VM scp_cloud_vm ${TMP_DIR}/dataset.zip "${GOOGLE_CLOUD_VM_USERNAME}@${VM_NAME}:~/" # Unpack dataset run_ssh_command ${VM_NAME} "rm -rf competition_data/dataset/${DATASET_NAME}" run_ssh_command ${VM_NAME} "mkdir -p competition_data/dataset/${DATASET_NAME}" run_ssh_command ${VM_NAME} "unzip dataset.zip -d competition_data/dataset/${DATASET_NAME}" # Cleanup run_ssh_command ${VM_NAME} "rm dataset.zip" rm -r ${TMP_DIR} echo "DONE!" ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/copy_eval_infra_to_vm.sh ================================================ #!/bin/bash # # Helper script which copies evaluation infrastructure to VM # Usage: # copy_eval_infra_to_vm.sh VM_NAME # # fail on first error set -e SCRIPT_DIR="$( dirname "${BASH_SOURCE[0]}" )" # Read variables from config.sh source "${SCRIPT_DIR}/config.sh" # Check arguments VM_NAME=$1 if [[ -z ${VM_NAME} ]]; then echo "Invalid usage, please provide name of VM:" echo " copy_eval_infra_to_vm.sh VM_NAME" exit 1 fi # Archive evaluation infrastucture TMP_DIR=$(mktemp -d) cd ${SCRIPT_DIR}/.. zip -r ${TMP_DIR}/eval_infra.zip ./ # Copy archive to VM scp_cloud_vm ${TMP_DIR}/eval_infra.zip "${GOOGLE_CLOUD_VM_USERNAME}@${VM_NAME}:~/" # Unpack eval_infra run_ssh_command ${VM_NAME} "rm -rf eval_infra" run_ssh_command ${VM_NAME} "unzip eval_infra.zip -d eval_infra" # Cleanup run_ssh_command ${VM_NAME} "rm eval_infra.zip" rm -r ${TMP_DIR} ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/create_workers.sh ================================================ #!/bin/bash # # Script which creates virtual machines for all workers. # Note that all virtual machines are creates in running state, thus you # will be billed for them. Also this script does not start evaluation, # you need to use start_workers.sh to actually start evaluation # of the competition. # # Usage: # create_workers.sh INDICES # Where INDICES is a string with space separated indices of workers to create # # Example: # create_workers.sh "1 3 4" # create workers with indices 1, 3 and 4 # create_workers.sh "$(seq 1 5)" # create workers with indices 1, 2, 3, 4, 5 # SCRIPT_DIR="$( dirname "${BASH_SOURCE[0]}" )" cd ${SCRIPT_DIR} source config.sh # Check that variables are set check_cloud_compute_zone_set check_cloud_ref_vm_snapshot_set # Check argument INDICES=$1 if [[ -z ${INDICES} ]] || [[ "$#" -ne 1 ]]; then echo "Invalid usage, please provide list of indices as single argument:" echo " create_workers.sh \"INDICES\"" exit 1 fi # Parameters of VM, feel free to change if you need different specs DISK_SIZE=200 # disk size in Gb MACHINE_TYPE="n1-highmem-4" # type of machine, determines CPU and amount of RAM GPU_TYPE="nvidia-tesla-k80" # type of GPU # Create all workers for idx in ${INDICES} do MACHINE_NAME=`printf "worker-%03g" ${idx}` echo "Creating worker ${MACHINE_NAME}" gcloud compute --project "${GOOGLE_CLOUD_PROJECT_ID}" \ disks create "${MACHINE_NAME}" --size "${DISK_SIZE}" \ --zone "${GOOGLE_CLOUD_COMPUTE_ZONE}" \ --source-snapshot "${GOOGLE_CLOUD_REF_VM_SNAPSHOT}" --type "pd-standard" gcloud beta compute --project "${GOOGLE_CLOUD_PROJECT_ID}" \ instances create "${MACHINE_NAME}" \ --zone "${GOOGLE_CLOUD_COMPUTE_ZONE}" \ --machine-type "${MACHINE_TYPE}" --subnet "default" \ --maintenance-policy "TERMINATE" \ --scopes "https://www.googleapis.com/auth/datastore","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring.write","https://www.googleapis.com/auth/trace.append","https://www.googleapis.com/auth/devstorage.read_write" \ --accelerator type=${GPU_TYPE},count=1 \ --min-cpu-platform "Automatic" \ --disk "name=${MACHINE_NAME},device-name=${MACHINE_NAME},mode=rw,boot=yes,auto-delete=yes" done ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/prepare_virtualenv.sh ================================================ #!/bin/bash # # Script prepares python virtualenv with all necessary libraries # # Fail on first error set -e # cd to script subdirectory cd "$( dirname "${BASH_SOURCE[0]}" )" # Read variables from config.sh source config.sh ################################################################################ # Create virtual env ################################################################################ cd ~/ rm -rf ~/.virtualenv/${VIRTUALENV_NAME} virtualenv --system-site-packages ~/.virtualenv/${VIRTUALENV_NAME} ################################################################################ # Install packages into virtualenv ################################################################################ source ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate pip install --upgrade google-api-python-client pip install google-cloud pip install pandas pip install Pillow pip install urllib3[secure] deactivate echo "ALL DONE!" ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/scp_cloud_vm.sh ================================================ #!/bin/bash # # Helper script which copies files to and from VM # Usage: # scp_cloud_vm.sh SRC DST # # Import config.sh source "$( dirname "${BASH_SOURCE[0]}" )/config.sh" # Copy files using function from config.sh scp_cloud_vm $1 $2 ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/start_workers.sh ================================================ #!/bin/bash # # Script which starts evaluation of the competition on all given workers. # Before running this script VMs with workers should be on, but worker binary # should not be running on the VMs. If unsure, reload all VMs (via Google Cloud # web UI) before running this script. # # Usage: # start_workers.sh INDICES # Where INDICES is a string with space separated indices of workers to start # # Example: # start_workers.sh "1 3 4" # start workers with indices 1, 3 and 4 # start_workers.sh "$(seq 1 5)" # start workers with indices 1, 2, 3, 4, 5 # SCRIPT_DIR="$( dirname "${BASH_SOURCE[0]}" )" cd ${SCRIPT_DIR} source config.sh check_cloud_compute_zone_set check_dataset_and_round_set # Check argument INDICES=$1 if [[ -z ${INDICES} ]] || [[ "$#" -ne 1 ]]; then echo "Invalid usage, please provide list of indices as single argument:" echo " create_workers.sh \"INDICES\"" exit 1 fi # Start workers for idx in ${INDICES} do MACHINE_NAME=`printf "worker-%03g" ${idx}` echo "Starting worker ${MACHINE_NAME}" # Copy current code of evaluation infrastructure to the worker ./copy_eval_infra_to_vm.sh ${MACHINE_NAME} # Start worker run_ssh_command ${MACHINE_NAME} \ "eval_infra/code/start_worker_in_tmux.sh ${idx}" # Sleep few seconds, so workers will be started with some delay. # This helps to reduce contention on Google Cloud Datastore. sleep 5 done ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/validation_tool/validate_and_copy_submissions.py ================================================ r"""Tool to validate all submission and copy them to proper location. Usage: python validate_and_copy_submissions.py \ --source_dir=SOURCE \ --target_dir=TARGET \ [--containers_file=CONTAINER_FILE] \ [--log_file=LOG_FILE] \ [--nouse_gpu] \ [--nocopy] Where: SOURCE - Google Cloud Storage directory with all submissions to verify. Submissions in the source directory could be structured any way, this tool will go though all subdirectories and look for zip, tar and tar.gz archives. TARGET - Target directory in Google Cloud Storage, typically it should be gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions CONTAINER_FILE - optional name of the file where to save list of all Docker containers used by all submissions. LOG_FILE - optional filename of the logfile. --nouse_gpu - if argument is provided then submission will be run on CPU, otherwise will be run on GPU. --nocopy - if argument is provided then submissions will be validated, but no copy will be performed. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import csv import logging import os import random import shutil import subprocess import tempfile from six import iteritems import validate_submission_lib ALLOWED_EXTENSIONS = [".zip", ".tar", ".tar.gz"] TYPE_ATTACK = "attack" TYPE_TARGETED_ATTACK = "targeted_attack" TYPE_DEFENSE = "defense" TYPE_TO_DIR = { "attack": "nontargeted", "targeted_attack": "targeted", "defense": "defense", } class ValidationStats(object): """Class which stores statistics about validation of the submissions.""" def __init__(self): # dictionary mapping submission_type to tuple (num_success, num_fail) self.stats = {} def _update_stat(self, submission_type, increase_success, increase_fail): """Common method to update submission statistics.""" stat = self.stats.get(submission_type, (0, 0)) stat = (stat[0] + increase_success, stat[1] + increase_fail) self.stats[submission_type] = stat def add_success(self, submission_type): """Add one successfull submission of given type.""" self._update_stat(submission_type, 1, 0) def add_failure(self, submission_type="unknown"): """Add one failed submission of given type.""" self._update_stat(submission_type, 0, 1) def log_stats(self): """Print statistics into log.""" logging.info("Validation statistics: ") for k, v in iteritems(self.stats): logging.info( "%s - %d valid out of %d total submissions", k, v[0], v[0] + v[1] ) class SubmissionValidator(object): """Helper class which performs validation of all submissions.""" def __init__( self, source_dir, target_dir, temp_dir, do_copy, use_gpu, containers_file=None ): """Initializes SubmissionValidator. Args: source_dir: source Google Cloud Storage directory with all submissions target_dir: target Google Cloud Storage directory where to copy submissions temp_dir: local temporary directory do_copy: if True then validate and copy submissions, if False then only validate use_gpu: if True then use GPU for validation, otherwise use CPU containers_file: optional name of the local text file where list of Docker containes of all submissions will be saved. """ self.source_dir = source_dir self.target_dir = target_dir self.do_copy = do_copy self.containers_file = containers_file self.list_of_containers = set() self.local_id_to_path_mapping_file = os.path.join( temp_dir, "id_to_path_mapping.csv" ) self.validate_dir = os.path.join(temp_dir, "validate") self.base_validator = validate_submission_lib.SubmissionValidator( self.validate_dir, use_gpu ) self.stats = ValidationStats() self.download_dir = os.path.join(temp_dir, "download") self.cur_submission_idx = 0 self.id_to_path_mapping = {} def copy_submission_locally(self, cloud_path): """Copies submission from Google Cloud Storage to local directory. Args: cloud_path: path of the submission in Google Cloud Storage Returns: name of the local file where submission is copied to """ local_path = os.path.join(self.download_dir, os.path.basename(cloud_path)) cmd = ["gsutil", "cp", cloud_path, local_path] if subprocess.call(cmd) != 0: logging.error("Can't copy submission locally") return None return local_path def copy_submission_to_destination(self, src_filename, dst_subdir, submission_id): """Copies submission to target directory. Args: src_filename: source filename of the submission dst_subdir: subdirectory of the target directory where submission should be copied to submission_id: ID of the submission, will be used as a new submission filename (before extension) """ extension = [e for e in ALLOWED_EXTENSIONS if src_filename.endswith(e)] if len(extension) != 1: logging.error("Invalid submission extension: %s", src_filename) return dst_filename = os.path.join( self.target_dir, dst_subdir, submission_id + extension[0] ) cmd = ["gsutil", "cp", src_filename, dst_filename] if subprocess.call(cmd) != 0: logging.error("Can't copy submission to destination") else: logging.info("Submission copied to: %s", dst_filename) def validate_and_copy_one_submission(self, submission_path): """Validates one submission and copies it to target directory. Args: submission_path: path in Google Cloud Storage of the submission file """ if os.path.exists(self.download_dir): shutil.rmtree(self.download_dir) os.makedirs(self.download_dir) if os.path.exists(self.validate_dir): shutil.rmtree(self.validate_dir) os.makedirs(self.validate_dir) logging.info( "\n" + ("#" * 80) + "\n# Processing submission: %s\n" + "#" * 80, submission_path, ) local_path = self.copy_submission_locally(submission_path) metadata = self.base_validator.validate_submission(local_path) if not metadata: logging.error('Submission "%s" is INVALID', submission_path) self.stats.add_failure() return submission_type = metadata["type"] container_name = metadata["container_gpu"] logging.info('Submission "%s" is VALID', submission_path) self.list_of_containers.add(container_name) self.stats.add_success(submission_type) if self.do_copy: submission_id = "{0:04}".format(self.cur_submission_idx) self.cur_submission_idx += 1 self.copy_submission_to_destination( submission_path, TYPE_TO_DIR[submission_type], submission_id ) self.id_to_path_mapping[submission_id] = submission_path def save_id_to_path_mapping(self): """Saves mapping from submission IDs to original filenames. This mapping is saved as CSV file into target directory. """ if not self.id_to_path_mapping: return with open(self.local_id_to_path_mapping_file, "w") as f: writer = csv.writer(f) writer.writerow(["id", "path"]) for k, v in sorted(iteritems(self.id_to_path_mapping)): writer.writerow([k, v]) cmd = [ "gsutil", "cp", self.local_id_to_path_mapping_file, os.path.join(self.target_dir, "id_to_path_mapping.csv"), ] if subprocess.call(cmd) != 0: logging.error("Can't copy id_to_path_mapping.csv to target directory") def run(self): """Runs validation of all submissions.""" cmd = ["gsutil", "ls", os.path.join(self.source_dir, "**")] try: files_list = subprocess.check_output(cmd).split("\n") except subprocess.CalledProcessError: logging.error("Can" "t read source directory") all_submissions = [ s for s in files_list if s.endswith(".zip") or s.endswith(".tar") or s.endswith(".tar.gz") ] for submission_path in all_submissions: self.validate_and_copy_one_submission(submission_path) self.stats.log_stats() self.save_id_to_path_mapping() if self.containers_file: with open(self.containers_file, "w") as f: f.write("\n".join(sorted(self.list_of_containers))) def main(args): """Validate all submissions and copy them into place""" random.seed() temp_dir = tempfile.mkdtemp() logging.info("Created temporary directory: %s", temp_dir) validator = SubmissionValidator( source_dir=args.source_dir, target_dir=args.target_dir, temp_dir=temp_dir, do_copy=args.copy, use_gpu=args.use_gpu, containers_file=args.containers_file, ) validator.run() logging.info("Deleting temporary directory: %s", temp_dir) subprocess.call(["rm", "-rf", temp_dir]) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Submission validation script.") parser.add_argument("--source_dir", required=True, help="Source directory.") parser.add_argument("--target_dir", required=True, help="Target directory.") parser.add_argument( "--log_file", default="", required=False, help="Location of the logfile." ) parser.add_argument( "--containers_file", default="", required=False, help="Local file with list of containers.", ) parser.add_argument("--copy", dest="copy", action="store_true") parser.add_argument("--nocopy", dest="copy", action="store_false") parser.set_defaults(copy=True) parser.add_argument("--use_gpu", dest="use_gpu", action="store_true") parser.add_argument("--nouse_gpu", dest="use_gpu", action="store_false") parser.set_defaults(use_gpu=True) command_line_args = parser.parse_args() logging_args = { "format": ( "%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s" " -- %(message)s" ), "level": logging.INFO, "datefmt": "%Y-%m-%d %H:%M:%S", } if command_line_args.log_file: logging_args["filename"] = command_line_args.log_file logging_args["filemode"] = "w" logging.basicConfig(**logging_args) main(command_line_args) ================================================ FILE: cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/validation_tool/validate_submission_lib.py ================================================ """Helper library which performs validation of the submission.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function from builtins import int import csv import json import logging import os import re import subprocess import sys import numpy as np from PIL import Image from six import iteritems EXTRACT_COMMAND = { ".zip": ["unzip", "${src}", "-d", "${dst}"], ".tar": ["tar", "xvf", "${src}", "-C", "${dst}"], ".tar.gz": ["tar", "xvzf", "${src}", "-C", "${dst}"], } ALLOWED_SUBMISSION_TYPES = ["attack", "targeted_attack", "defense"] REQUIRED_METADATA_JSON_FIELDS = ["entry_point", "container", "container_gpu", "type"] CMD_VARIABLE_RE = re.compile("^\\$\\{(\\w+)\\}$") BATCH_SIZE = 8 IMAGE_NAME_PATTERN = "IMG{0:04}.png" ALLOWED_EPS = [4, 8, 12, 16] MAX_SUBMISSION_SIZE_ZIPPED = 8 * 1024 * 1024 * 1024 # 8 GiB MAX_SUBMISSION_SIZE_UNPACKED = 16 * 1024 * 1024 * 1024 # 16 GiB MAX_DOCKER_IMAGE_SIZE = 8 * 1024 * 1024 * 1024 # 8 GiB def get_extract_command_template(filename): """Returns extraction command based on the filename extension.""" for k, v in iteritems(EXTRACT_COMMAND): if filename.endswith(k): return v return None def shell_call(command, **kwargs): """Calls shell command with parameter substitution. Args: command: command to run as a list of tokens **kwargs: dirctionary with substitutions Returns: whether command was successful, i.e. returned 0 status code Example of usage: shell_call(['cp', '${A}', '${B}'], A='src_file', B='dst_file') will call shell command: cp src_file dst_file """ command = list(command) for i in range(len(command)): m = CMD_VARIABLE_RE.match(command[i]) if m: var_id = m.group(1) if var_id in kwargs: command[i] = kwargs[var_id] return subprocess.call(command) == 0 def make_directory_writable(dirname): """Makes directory readable and writable by everybody. Args: dirname: name of the directory Returns: True if operation was successfull If you run something inside Docker container and it writes files, then these files will be written as root user with restricted permissions. So to be able to read/modify these files outside of Docker you have to change permissions to be world readable and writable. """ retval = shell_call( [ "docker", "run", "-v", "{0}:/output_dir".format(dirname), "busybox:1.27.2", "chmod", "-R", "a+rwx", "/output_dir", ] ) if not retval: logging.error("Failed to change permissions on directory: %s", dirname) return retval def load_defense_output(filename): """Loads output of defense from given file.""" result = {} with open(filename) as f: for row in csv.reader(f): try: image_filename = row[0] if not image_filename.endswith(".png"): image_filename += ".png" label = int(row[1]) except (IndexError, ValueError): continue result[image_filename] = label return result class SubmissionValidator(object): """Class which performs validation of the submission.""" def __init__(self, temp_dir, use_gpu): """Initializes instance of SubmissionValidator. Args: temp_dir: temporary working directory use_gpu: whether to use GPU """ self._temp_dir = temp_dir self._use_gpu = use_gpu self._tmp_extracted_dir = os.path.join(self._temp_dir, "tmp_extracted") self._extracted_submission_dir = os.path.join(self._temp_dir, "extracted") self._sample_input_dir = os.path.join(self._temp_dir, "input") self._sample_output_dir = os.path.join(self._temp_dir, "output") def _prepare_temp_dir(self): """Cleans up and prepare temporary directory.""" if not shell_call(["sudo", "rm", "-rf", os.path.join(self._temp_dir, "*")]): logging.error("Failed to cleanup temporary directory.") sys.exit(1) # NOTE: we do not create self._extracted_submission_dir # this is intentional because self._tmp_extracted_dir or it's subdir # will be renames into self._extracted_submission_dir os.mkdir(self._tmp_extracted_dir) os.mkdir(self._sample_input_dir) os.mkdir(self._sample_output_dir) # make output dir world writable shell_call(["chmod", "a+rwX", "-R", self._sample_output_dir]) def _extract_submission(self, filename): """Extracts submission and moves it into self._extracted_submission_dir.""" # verify filesize file_size = os.path.getsize(filename) if file_size > MAX_SUBMISSION_SIZE_ZIPPED: logging.error( "Submission archive size %d is exceeding limit %d", file_size, MAX_SUBMISSION_SIZE_ZIPPED, ) return False # determime archive type exctract_command_tmpl = get_extract_command_template(filename) if not exctract_command_tmpl: logging.error( "Input file has to be zip, tar or tar.gz archive; however " "found: %s", filename, ) return False # extract archive submission_dir = os.path.dirname(filename) submission_basename = os.path.basename(filename) logging.info("Extracting archive %s", filename) retval = shell_call( [ "docker", "run", "--network=none", "-v", "{0}:/input_dir".format(submission_dir), "-v", "{0}:/output_dir".format(self._tmp_extracted_dir), "busybox:1.27.2", ] + exctract_command_tmpl, src=os.path.join("/input_dir", submission_basename), dst="/output_dir", ) if not retval: logging.error("Failed to extract submission from file %s", filename) return False if not make_directory_writable(self._tmp_extracted_dir): return False # find submission root root_dir = self._tmp_extracted_dir root_dir_content = [d for d in os.listdir(root_dir) if d != "__MACOSX"] if len(root_dir_content) == 1 and os.path.isdir( os.path.join(root_dir, root_dir_content[0]) ): logging.info( 'Looks like submission root is in subdirectory "%s" of ' "the archive", root_dir_content[0], ) root_dir = os.path.join(root_dir, root_dir_content[0]) # Move files to self._extracted_submission_dir. # At this point self._extracted_submission_dir does not exist, # so following command will simply rename root_dir into # self._extracted_submission_dir if not shell_call(["mv", root_dir, self._extracted_submission_dir]): logging.error("Can" "t move submission files from root directory") return False return True def _verify_submission_size(self): submission_size = 0 for dirname, _, filenames in os.walk(self._extracted_submission_dir): for f in filenames: submission_size += os.path.getsize(os.path.join(dirname, f)) logging.info("Unpacked submission size: %d", submission_size) if submission_size > MAX_SUBMISSION_SIZE_UNPACKED: logging.error( "Submission size exceeding limit %d", MAX_SUBMISSION_SIZE_UNPACKED ) return submission_size <= MAX_SUBMISSION_SIZE_UNPACKED def _load_and_verify_metadata(self): """Loads and verifies metadata. Returns: dictionaty with metadata or None if metadata not found or invalid """ metadata_filename = os.path.join( self._extracted_submission_dir, "metadata.json" ) if not os.path.isfile(metadata_filename): logging.error("metadata.json not found") return None try: with open(metadata_filename, "r") as f: metadata = json.load(f) except IOError as e: logging.error("Failed to load metadata: %s", e) return None for field_name in REQUIRED_METADATA_JSON_FIELDS: if field_name not in metadata: logging.error("Field %s not found in metadata", field_name) return None # Verify submission type if metadata["type"] not in ALLOWED_SUBMISSION_TYPES: logging.error("Invalid submission type in metadata: %s", metadata["type"]) return None # Check submission entry point entry_point = metadata["entry_point"] if not os.path.isfile( os.path.join(self._extracted_submission_dir, entry_point) ): logging.error("Entry point not found: %s", entry_point) return None if not entry_point.endswith(".sh"): logging.warning( "Entry point is not an .sh script. " "This is not necessarily a problem, but if submission " "won" "t run double check entry point first: %s", entry_point, ) # Metadata verified return metadata def _verify_docker_image_size(self, image_name): """Verifies size of Docker image. Args: image_name: name of the Docker image. Returns: True if image size is within the limits, False otherwise. """ shell_call(["docker", "pull", image_name]) try: image_size = subprocess.check_output( ["docker", "inspect", "--format={{.Size}}", image_name] ).strip() image_size = int(image_size) except (ValueError, subprocess.CalledProcessError) as e: logging.error("Failed to determine docker image size: %s", e) return False logging.info("Size of docker image %s is %d", image_name, image_size) if image_size > MAX_DOCKER_IMAGE_SIZE: logging.error("Image size exceeds limit %d", MAX_DOCKER_IMAGE_SIZE) return image_size <= MAX_DOCKER_IMAGE_SIZE def _prepare_sample_data(self, submission_type): """Prepares sample data for the submission. Args: submission_type: type of the submission. """ # write images images = np.random.randint( 0, 256, size=[BATCH_SIZE, 299, 299, 3], dtype=np.uint8 ) for i in range(BATCH_SIZE): Image.fromarray(images[i, :, :, :]).save( os.path.join(self._sample_input_dir, IMAGE_NAME_PATTERN.format(i)) ) # write target class for targeted attacks if submission_type == "targeted_attack": target_classes = np.random.randint(1, 1001, size=[BATCH_SIZE]) target_class_filename = os.path.join( self._sample_input_dir, "target_class.csv" ) with open(target_class_filename, "w") as f: for i in range(BATCH_SIZE): f.write( (IMAGE_NAME_PATTERN + ",{1}\n").format(i, target_classes[i]) ) def _run_submission(self, metadata): """Runs submission inside Docker container. Args: metadata: dictionary with submission metadata Returns: True if status code of Docker command was success (i.e. zero), False otherwise. """ container_name = ( metadata["container_gpu"] if self._use_gpu else metadata["container"] ) if metadata["type"] == "defense": cmd = [ "--network=none", "-m=24g", "-v", "{0}:/input_images:ro".format(self._sample_input_dir), "-v", "{0}:/output_data".format(self._sample_output_dir), "-v", "{0}:/code".format(self._extracted_submission_dir), "-w", "/code", container_name, "./" + metadata["entry_point"], "/input_images", "/output_data/result.csv", ] else: epsilon = np.random.choice(ALLOWED_EPS) cmd = [ "--network=none", "-m=24g", "-v", "{0}:/input_images:ro".format(self._sample_input_dir), "-v", "{0}:/output_images".format(self._sample_output_dir), "-v", "{0}:/code".format(self._extracted_submission_dir), "-w", "/code", container_name, "./" + metadata["entry_point"], "/input_images", "/output_images", str(epsilon), ] if self._use_gpu: cmd = ["docker", "run", "--runtime=nvidia"] + cmd else: cmd = ["docker", "run"] + cmd logging.info("Command to run submission: %s", " ".join(cmd)) result = shell_call(cmd) make_directory_writable(self._extracted_submission_dir) make_directory_writable(self._sample_output_dir) return result def _verify_output(self, submission_type): """Verifies correctness of the submission output. Args: submission_type: type of the submission Returns: True if output looks valid """ result = True if submission_type == "defense": try: image_classification = load_defense_output( os.path.join(self._sample_output_dir, "result.csv") ) expected_keys = [ IMAGE_NAME_PATTERN.format(i) for i in range(BATCH_SIZE) ] if set(image_classification.keys()) != set(expected_keys): logging.error("Classification results are not saved for all images") result = False except IOError as e: logging.error("Failed to read defense output file: %s", e) result = False else: for i in range(BATCH_SIZE): image_filename = os.path.join( self._sample_output_dir, IMAGE_NAME_PATTERN.format(i) ) try: img = np.array(Image.open(image_filename).convert("RGB")) if list(img.shape) != [299, 299, 3]: logging.error( "Invalid image size %s for image %s", str(img.shape), image_filename, ) result = False except IOError as e: result = False return result def validate_submission(self, filename): """Validates submission. Args: filename: submission filename Returns: submission metadata or None if submission is invalid """ self._prepare_temp_dir() # Convert filename to be absolute path, relative path might cause problems # with mounting directory in Docker filename = os.path.abspath(filename) # extract submission if not self._extract_submission(filename): return None # verify submission size if not self._verify_submission_size(): return None # Load metadata metadata = self._load_and_verify_metadata() if not metadata: return None submission_type = metadata["type"] # verify docker container size if not self._verify_docker_image_size(metadata["container_gpu"]): return None # Try to run submission on sample data self._prepare_sample_data(submission_type) if not self._run_submission(metadata): logging.error("Failure while running submission") return None if not self._verify_output(submission_type): logging.warning( "Some of the outputs of your submission are invalid or " "missing. You submission still will be evaluation " "but you might get lower score." ) return metadata ================================================ FILE: cleverhans_v3.1.0/examples/robust_vision_benchmark/README.md ================================================ ## CleverHans Example Submission to the Robust Vision Benchmark Using the wrappers in this repository, submitting a CleverHans attack to the [Robust Vision Benchmark](https://robust.vision/benchmark) requires just [a few lines of code](cleverhans_attack_example/main.py). The full example can be found in the `cleverhans_attack_example` folder. ### Testing an attack Just install the latest version of the [robust-vision-benchmark python package](https://github.com/bethgelab/robust-vision-benchmark) using ```bash pip install --upgrade robust-vision-benchmark ``` and run ```bash rvb-test-attack cleverhans_attack_example/ ``` to test the attack. Once the test succeeds, you can **[submit your attack](https://github.com/bethgelab/robust-vision-benchmark)**. ================================================ FILE: cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/Dockerfile ================================================ FROM python:3.6 # set workdir to the home directory WORKDIR /root # install required packages RUN pip3 install --no-cache-dir foolbox RUN pip3 install --no-cache-dir robust_vision_benchmark RUN pip3 install --no-cache-dir -e git+http://github.com/tensorflow/cleverhans.git#egg=cleverhans RUN pip3 install tensorflow # add your model script COPY main.py main.py COPY utils.py utils.py CMD ["python3", "./main.py"] ================================================ FILE: cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/main.py ================================================ #!/usr/bin/env python3 import numpy as np from cleverhans.attacks import FastGradientMethod from robust_vision_benchmark import attack_server from utils import cleverhans_attack_wrapper def attack(model, session, a): fgsm = FastGradientMethod(model, sess=session) image = a.original_image[np.newaxis] return fgsm.generate_np(image) attack_server(cleverhans_attack_wrapper(attack)) ================================================ FILE: cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/requirements.txt ================================================ numpy tensorflow ================================================ FILE: cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/utils.py ================================================ import cleverhans.model import tensorflow as tf import numpy as np def cleverhans_attack_wrapper(cleverhans_attack_fn, reset=True): def attack(a): session = tf.Session() with session.as_default(): model = RVBCleverhansModel(a) adversarial_image = cleverhans_attack_fn(model, session, a) adversarial_image = np.squeeze(adversarial_image, axis=0) if reset: # optionally, reset to ignore other adversarials # found during the search a._reset() # run predictions to make sure the returned adversarial # is taken into account min_, max_ = a.bounds() adversarial_image = np.clip(adversarial_image, min_, max_) a.predictions(adversarial_image) return attack def py_func_grad(func, inp, Tout, stateful=True, name=None, grad=None): """Custom py_func with gradient support""" # Need to generate a unique name to avoid duplicates: rnd_name = "PyFuncGrad" + str(np.random.randint(0, 1e8)) tf.RegisterGradient(rnd_name)(grad) g = tf.get_default_graph() with g.gradient_override_map({"PyFunc": rnd_name, "PyFuncStateless": rnd_name}): return tf.py_func(func, inp, Tout, stateful=stateful, name=name) class RVBCleverhansModel(cleverhans.model.Model): """This is a cleverhans model that wraps a robust vision benchmark model.""" def __init__(self, adversarial, **kwargs): del kwargs cleverhans.model.Model.__init__( self, "model", self.adversarial.nb_classes(), locals() ) self.adversarial = adversarial def fprop(self, x): return {self.O_LOGITS: self._logits_op(x)} def _logits_op(self, x, name=None): with tf.name_scope(name, "logits", [x]) as name: nb_classes = self.adversarial.nb_classes() def _backward_py(gradient_y, x): x = np.squeeze(x, axis=0) gradient_y = np.squeeze(gradient_y, axis=0) gradient_x = self.adversarial.backward(gradient_y, x) gradient_x = gradient_x.astype(np.float32) return gradient_x[np.newaxis] def _backward_tf(op, grad): images = op.inputs[0] gradient_x = tf.py_func(_backward_py, [grad, images], tf.float32) gradient_x.set_shape(images.shape) return gradient_x def _forward_py(x): predictions = self.adversarial.batch_predictions(x, strict=False)[0] predictions = predictions.astype(np.float32) return predictions op = py_func_grad( _forward_py, [x], [tf.float32], name=name, grad=_backward_tf ) logits = op[0] logits.set_shape((x.shape[0], nb_classes)) return logits ================================================ FILE: cleverhans_v3.1.0/examples/test_imagenet_attacks.py ================================================ """Test attack success against ImageNet models for a few images. Many of the tests require using flags to specify a pre-trained ImageNet model, as well as image data. The easiest way to provide these is using the data from cleverhans/examples/nips17_adversarial_competition, and then the default flag values will just work. Setup: see SETUP_INSTRUCTIONS """ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import csv import os import unittest import numpy as np from six.moves import xrange import tensorflow as tf from tensorflow.contrib import slim # The following line is affected by a pylint bug when using python3 and tf 1.12 from tensorflow.contrib.slim.nets import inception # pylint: disable=no-name-in-module from PIL import Image from cleverhans.attacks import SPSA from cleverhans.devtools.checks import CleverHansTest from cleverhans.model import Model from cleverhans.utils import CLEVERHANS_ROOT SETUP_INSTRUCTIONS = """ $ ./examples/nips17_adversarial_competition/dev_toolkit/download_data.sh """ DEFAULT_INCEPTION_PATH = os.path.join( CLEVERHANS_ROOT, ( "examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/" "inception_v3.ckpt" ), ) tf.flags.DEFINE_string("master", "", "The address of the TensorFlow master to use.") tf.flags.DEFINE_string( "checkpoint_path", DEFAULT_INCEPTION_PATH, "Path to checkpoint for inception network.", ) tf.flags.DEFINE_string( "input_image_dir", os.path.join( CLEVERHANS_ROOT, "examples/nips17_adversarial_competition/dataset/images" ), "Path to image directory.", ) tf.flags.DEFINE_string( "metadata_file_path", os.path.join( CLEVERHANS_ROOT, "examples/nips17_adversarial_competition/dataset/dev_dataset.csv", ), "Path to metadata file.", ) FLAGS = tf.flags.FLAGS def load_images(input_dir, metadata_file_path, batch_shape): """Retrieve numpy arrays of images and labels, read from a directory.""" num_images = batch_shape[0] with open(metadata_file_path) as input_file: reader = csv.reader(input_file) header_row = next(reader) rows = list(reader) row_idx_image_id = header_row.index("ImageId") row_idx_true_label = header_row.index("TrueLabel") images = np.zeros(batch_shape) labels = np.zeros(num_images, dtype=np.int32) for idx in xrange(num_images): row = rows[idx] filepath = os.path.join(input_dir, row[row_idx_image_id] + ".png") with tf.gfile.Open(filepath, "rb") as f: image = np.array(Image.open(f).convert("RGB")).astype(np.float) / 255.0 images[idx, :, :, :] = image labels[idx] = int(row[row_idx_true_label]) return images, labels class InceptionModel(Model): """Model class for CleverHans library.""" def __init__(self, nb_classes): super(InceptionModel, self).__init__( nb_classes=nb_classes, needs_dummy_fprop=True ) self.built = False def __call__(self, x_input, return_logits=False): """Constructs model and return probabilities for given input.""" reuse = True if self.built else None with slim.arg_scope(inception.inception_v3_arg_scope()): # Inception preprocessing uses [-1, 1]-scaled input. x_input = x_input * 2.0 - 1.0 _, end_points = inception.inception_v3( x_input, num_classes=self.nb_classes, is_training=False, reuse=reuse ) self.built = True self.logits = end_points["Logits"] # Strip off the extra reshape op at the output self.probs = end_points["Predictions"].op.inputs[0] if return_logits: return self.logits else: return self.probs def get_logits(self, x_input): return self(x_input, return_logits=True) def get_probs(self, x_input): return self(x_input) def _top_1_accuracy(logits, labels): return tf.reduce_mean(tf.cast(tf.nn.in_top_k(logits, labels, 1), tf.float32)) class TestInception(CleverHansTest): def test_clean_accuracy(self): """Check model is accurate on unperturbed images.""" input_dir = FLAGS.input_image_dir metadata_file_path = FLAGS.metadata_file_path num_images = 16 batch_shape = (num_images, 299, 299, 3) images, labels = load_images(input_dir, metadata_file_path, batch_shape) nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=batch_shape) y_label = tf.placeholder(tf.int32, shape=(num_images,)) model = InceptionModel(nb_classes) logits = model.get_logits(x_input) acc = _top_1_accuracy(logits, y_label) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: acc_val = sess.run(acc, feed_dict={x_input: images, y_label: labels}) tf.logging.info("Accuracy: %s", acc_val) assert acc_val > 0.8 class TestSPSA(CleverHansTest): def test_attack_bounds(self): """Check SPSA respects perturbation limits.""" epsilon = 4.0 / 255 input_dir = FLAGS.input_image_dir metadata_file_path = FLAGS.metadata_file_path num_images = 8 batch_shape = (num_images, 299, 299, 3) images, labels = load_images(input_dir, metadata_file_path, batch_shape) nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=(1,) + batch_shape[1:]) y_label = tf.placeholder(tf.int32, shape=(1,)) model = InceptionModel(nb_classes) attack = SPSA(model) x_adv = attack.generate( x_input, y=y_label, epsilon=epsilon, num_steps=10, early_stop_loss_threshold=-1.0, spsa_samples=32, spsa_iters=1, is_debug=True, ) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) with tf.train.MonitoredSession(session_creator=session_creator) as sess: for i in xrange(num_images): x_expanded = np.expand_dims(images[i], axis=0) y_expanded = np.expand_dims(labels[i], axis=0) adv_image = sess.run( x_adv, feed_dict={x_input: x_expanded, y_label: y_expanded} ) diff = adv_image - images[i] assert np.max(np.abs(diff)) < epsilon + 1e-4 assert np.max(adv_image < 1.0 + 1e-4) assert np.min(adv_image > -1e-4) def test_attack_success(self): """Check SPSA creates misclassified images.""" epsilon = 4.0 / 255 input_dir = FLAGS.input_image_dir metadata_file_path = FLAGS.metadata_file_path num_images = 8 batch_shape = (num_images, 299, 299, 3) images, labels = load_images(input_dir, metadata_file_path, batch_shape) nb_classes = 1001 tf.logging.set_verbosity(tf.logging.INFO) with tf.Graph().as_default(): # Prepare graph x_input = tf.placeholder(tf.float32, shape=(1,) + batch_shape[1:]) y_label = tf.placeholder(tf.int32, shape=(1,)) model = InceptionModel(nb_classes) attack = SPSA(model) x_adv = attack.generate( x_input, y=y_label, epsilon=epsilon, num_steps=30, early_stop_loss_threshold=-1.0, spsa_samples=32, spsa_iters=16, is_debug=True, ) logits = model.get_logits(x_adv) acc = _top_1_accuracy(logits, y_label) # Run computation saver = tf.train.Saver(slim.get_model_variables()) session_creator = tf.train.ChiefSessionCreator( scaffold=tf.train.Scaffold(saver=saver), checkpoint_filename_with_path=FLAGS.checkpoint_path, master=FLAGS.master, ) num_correct = 0.0 with tf.train.MonitoredSession(session_creator=session_creator) as sess: for i in xrange(num_images): feed_dict_i = { x_input: np.expand_dims(images[i], axis=0), y_label: np.expand_dims(labels[i], axis=0), } acc_val = sess.run(acc, feed_dict=feed_dict_i) tf.logging.info("Accuracy: %s", acc_val) num_correct += acc_val assert (num_correct / num_images) < 0.1 if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/scripts/compute_accuracy.py ================================================ #!/usr/bin/env python3 """ compute_accuracy.py Usage: compute_accuracy.py model.joblib where model.joblib is a file created by cleverhans.serial.save containing a picklable cleverhans.model.Model instance. This script will run the model on a variety of types of data and print out the accuracy for each data type. clean : Clean data semantic : Semantic adversarial examples pgd: PGD adversarial examples This script works by running a single attack on each example. This is useful for quick evaluation during development, but for final publication it would be better to use attack bundling. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import time import tensorflow as tf from cleverhans.attacks import ProjectedGradientDescent, Semantic from cleverhans.compat import flags from cleverhans.evaluation import accuracy from cleverhans.serial import load from cleverhans.utils import set_log_level from cleverhans.utils_tf import infer_devices from cleverhans.utils_tf import silence silence() devices = infer_devices() num_devices = len(devices) BATCH_SIZE = 128 TRAIN_START = 0 TRAIN_END = 60000 TEST_START = 0 TEST_END = 10000 WHICH_SET = "test" NB_ITER = 40 BASE_EPS_ITER = None # Differs by dataset FLAGS = flags.FLAGS def print_accuracies( filepath, train_start=TRAIN_START, train_end=TRAIN_END, test_start=TEST_START, test_end=TEST_END, batch_size=BATCH_SIZE, which_set=WHICH_SET, base_eps_iter=BASE_EPS_ITER, nb_iter=NB_ITER, ): """ Load a saved model and print out its accuracy on different data distributions This function works by running a single attack on each example. This provides a reasonable estimate of the true failure rate quickly, so long as the model does not suffer from gradient masking. However, this estimate is mostly intended for development work and not for publication. A more accurate estimate may be obtained by running an attack bundler instead. :param filepath: path to model to evaluate :param train_start: index of first training set example to use :param train_end: index of last training set example to use :param test_start: index of first test set example to use :param test_end: index of last test set example to use :param batch_size: size of evaluation batches :param which_set: 'train' or 'test' :param base_eps_iter: step size if the data were in [0,1] (Step size will be rescaled proportional to the actual data range) :param nb_iter: Number of iterations of PGD to run per class """ # Set TF random seed to improve reproducibility tf.set_random_seed(20181014) set_log_level(logging.INFO) sess = tf.Session() with sess.as_default(): model = load(filepath) assert len(model.get_params()) > 0 factory = model.dataset_factory factory.kwargs["train_start"] = train_start factory.kwargs["train_end"] = train_end factory.kwargs["test_start"] = test_start factory.kwargs["test_end"] = test_end dataset = factory() x_data, y_data = dataset.get_set(which_set) impl(sess, model, dataset, factory, x_data, y_data, base_eps_iter, nb_iter) def impl( sess, model, dataset, factory, x_data, y_data, base_eps_iter=BASE_EPS_ITER, nb_iter=NB_ITER, batch_size=BATCH_SIZE, ): """ The actual implementation of the evaluation. :param sess: tf.Session :param model: cleverhans.model.Model :param dataset: cleverhans.dataset.Dataset :param factory: the dataset factory corresponding to `dataset` :param x_data: numpy array of input examples :param y_data: numpy array of class labels :param base_eps_iter: step size for PGD if data were in [0, 1] :param nb_iter: number of PGD iterations :returns: dict mapping string adversarial example names to accuracies """ center = dataset.kwargs["center"] max_val = dataset.kwargs["max_val"] value_range = max_val * (1.0 + center) min_value = 0.0 - center * max_val if "CIFAR" in str(factory.cls): base_eps = 8.0 / 255.0 if base_eps_iter is None: base_eps_iter = 2.0 / 255.0 elif "MNIST" in str(factory.cls): base_eps = 0.3 if base_eps_iter is None: base_eps_iter = 0.1 else: raise NotImplementedError(str(factory.cls)) pgd_params = { "eps": base_eps * value_range, "eps_iter": base_eps_iter * value_range, "nb_iter": nb_iter, "clip_min": min_value, "clip_max": max_val, } semantic = Semantic(model, center, max_val, sess) pgd = ProjectedGradientDescent(model, sess=sess) jobs = [ ("clean", None, None, None), ("Semantic", semantic, None, None), ("pgd", pgd, pgd_params, None), ] out = {} for job in jobs: name, attack, attack_params, job_batch_size = job if job_batch_size is None: job_batch_size = batch_size t1 = time.time() acc = accuracy( sess, model, x_data, y_data, batch_size=job_batch_size, devices=devices, attack=attack, attack_params=attack_params, ) t2 = time.time() out[name] = acc print("Accuracy on " + name + " examples: ", acc) print("Evaluation took", t2 - t1, "seconds") return out def main(argv=None): """ Print accuracies """ try: _name_of_script, filepath = argv except ValueError: raise ValueError(argv) print_accuracies( filepath=filepath, test_start=FLAGS.test_start, test_end=FLAGS.test_end, which_set=FLAGS.which_set, nb_iter=FLAGS.nb_iter, base_eps_iter=FLAGS.base_eps_iter, batch_size=FLAGS.batch_size, ) if __name__ == "__main__": flags.DEFINE_integer( "train_start", TRAIN_START, "Starting point (inclusive)" "of range of train examples to use", ) flags.DEFINE_integer( "train_end", TRAIN_END, "Ending point (non-inclusive) " "of range of train examples to use", ) flags.DEFINE_integer( "test_start", TEST_START, "Starting point (inclusive) " "of range of test examples to use", ) flags.DEFINE_integer( "test_end", TEST_END, "End point (non-inclusive) of " "range of test examples to use", ) flags.DEFINE_integer("nb_iter", NB_ITER, "Number of iterations of PGD") flags.DEFINE_string("which_set", WHICH_SET, '"train" or "test"') flags.DEFINE_integer("batch_size", BATCH_SIZE, "Batch size for most jobs") flags.DEFINE_float( "base_eps_iter", BASE_EPS_ITER, "epsilon per iteration, if data were in [0, 1]" ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/scripts/make_confidence_report.py ================================================ #!/usr/bin/env python3 """ make_confidence_report.py Usage: python make_confidence_report.py model.joblib where model.joblib is a file created by cleverhans.serial.save containing a picklable cleverhans.model.Model instance. This script will run the model on a variety of types of data and save an instance of cleverhans.confidence_report.ConfidenceReport to model_report.joblib. The report can be later loaded by another script using cleverhans.serial.load. This script puts the following entries in the report: clean : Clean data semantic : Semantic adversarial examples mc: MaxConfidence adversarial examples This script works by running a single MaxConfidence attack on each example. ( https://openreview.net/forum?id=H1g0piA9tQ ) This provides a reasonable estimate of the true failure rate quickly, so long as the model does not suffer from gradient masking. However, this estimate is mostly intended for development work and not for publication. A more accurate estimate may be obtained by running make_confidence_report_bundled.py instead. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import tensorflow as tf from cleverhans.utils_tf import silence silence() # silence call must precede this imports. pylint doesn't like that # pylint: disable=C0413 from cleverhans.compat import flags from cleverhans.confidence_report import make_confidence_report from cleverhans.confidence_report import BATCH_SIZE from cleverhans.confidence_report import MC_BATCH_SIZE from cleverhans.confidence_report import TRAIN_START from cleverhans.confidence_report import TRAIN_END from cleverhans.confidence_report import TEST_START from cleverhans.confidence_report import TEST_END from cleverhans.confidence_report import WHICH_SET from cleverhans.confidence_report import NB_ITER from cleverhans.confidence_report import BASE_EPS_ITER from cleverhans.confidence_report import REPORT_PATH from cleverhans.confidence_report import SAVE_ADVX FLAGS = flags.FLAGS def main(argv=None): """ Make a confidence report and save it to disk. """ try: _name_of_script, filepath = argv except ValueError: raise ValueError(argv) make_confidence_report( filepath=filepath, test_start=FLAGS.test_start, test_end=FLAGS.test_end, which_set=FLAGS.which_set, report_path=FLAGS.report_path, mc_batch_size=FLAGS.mc_batch_size, nb_iter=FLAGS.nb_iter, base_eps_iter=FLAGS.base_eps_iter, batch_size=FLAGS.batch_size, save_advx=FLAGS.save_advx, ) if __name__ == "__main__": flags.DEFINE_integer( "train_start", TRAIN_START, "Starting point (inclusive)" "of range of train examples to use", ) flags.DEFINE_integer( "train_end", TRAIN_END, "Ending point (non-inclusive) " "of range of train examples to use", ) flags.DEFINE_integer( "test_start", TEST_START, "Starting point (inclusive) " "of range of test examples to use", ) flags.DEFINE_integer( "test_end", TEST_END, "End point (non-inclusive) of " "range of test examples to use", ) flags.DEFINE_integer("nb_iter", NB_ITER, "Number of iterations of PGD") flags.DEFINE_string("which_set", WHICH_SET, '"train" or "test"') flags.DEFINE_string("report_path", REPORT_PATH, "Path to save to") flags.DEFINE_integer("mc_batch_size", MC_BATCH_SIZE, "Batch size for MaxConfidence") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Batch size for most jobs") flags.DEFINE_float( "base_eps_iter", BASE_EPS_ITER, "epsilon per iteration, if data were in [0, 1]" ) flags.DEFINE_integer( "save_advx", SAVE_ADVX, "If True, saves the adversarial examples to the " "filesystem.", ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/scripts/make_confidence_report_bundle_examples.py ================================================ #!/usr/bin/env python3 """ make_confidence_report_bundle_examples.py Usage: make_confidence_report_bundle_examples.py model.joblib a.npy make_confidence_report_bundle_examples.py model.joblib a.npy b.npy c.npy where model.joblib is a file created by cleverhans.serial.save containing a picklable cleverhans.model.Model instance and each examples_i.npy is a saved numpy array containing adversarial examples for a whole dataset. Usually example_i.npy is the output of make_confidence_report.py or make_confidence_report_bundled.py. This script uses max-confidence attack bundling ( https://openreview.net/forum?id=H1g0piA9tQ ) to combine adversarial example datasets that were created earlier. It will save a ConfidenceReport to to model_bundled_examples_report.joblib. The report can be later loaded by another script using cleverhans.serial.load. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import warnings import numpy as np import tensorflow as tf from cleverhans.utils_tf import silence # We need to disable pylint's complaints about import order because `silence` # works only if it is called before the other imports. # pylint: disable=C0413 silence() from cleverhans.attack_bundling import bundle_examples_with_goal, MaxConfidence from cleverhans import serial from cleverhans.compat import flags from cleverhans.confidence_report import BATCH_SIZE from cleverhans.confidence_report import TRAIN_START, TRAIN_END from cleverhans.confidence_report import TEST_START, TEST_END from cleverhans.confidence_report import WHICH_SET FLAGS = flags.FLAGS def main(argv=None): """ Make a confidence report and save it to disk. """ assert len(argv) >= 3 _name_of_script = argv[0] model_filepath = argv[1] adv_x_filepaths = argv[2:] sess = tf.Session() with sess.as_default(): model = serial.load(model_filepath) factory = model.dataset_factory factory.kwargs["train_start"] = FLAGS.train_start factory.kwargs["train_end"] = FLAGS.train_end factory.kwargs["test_start"] = FLAGS.test_start factory.kwargs["test_end"] = FLAGS.test_end dataset = factory() adv_x_list = [np.load(filepath) for filepath in adv_x_filepaths] x, y = dataset.get_set(FLAGS.which_set) for adv_x in adv_x_list: assert adv_x.shape == x.shape, (adv_x.shape, x.shape) # Make sure these were made for the right dataset with right scaling # arguments, etc. assert adv_x.min() >= 0.0 - dataset.kwargs["center"] * dataset.max_val assert adv_x.max() <= dataset.max_val data_range = dataset.max_val * (1.0 + dataset.kwargs["center"]) if adv_x.max() - adv_x.min() <= 0.8 * data_range: warnings.warn( "Something is weird. Your adversarial examples use " "less than 80% of the data range." "This might mean you generated them for a model with " "inputs in [0, 1] and are now using them for a model " "with inputs in [0, 255] or something like that. " "Or it could be OK if you're evaluating on a very small " "batch." ) report_path = FLAGS.report_path if report_path is None: suffix = "_bundled_examples_report.joblib" assert model_filepath.endswith(".joblib") report_path = model_filepath[: -len(".joblib")] + suffix goal = MaxConfidence() bundle_examples_with_goal( sess, model, adv_x_list, y, goal, report_path, batch_size=FLAGS.batch_size ) if __name__ == "__main__": flags.DEFINE_string("report_path", None, "Report path") flags.DEFINE_integer( "train_start", TRAIN_START, "Starting point (inclusive)" "of range of train examples to use", ) flags.DEFINE_integer( "train_end", TRAIN_END, "Ending point (non-inclusive) " "of range of train examples to use", ) flags.DEFINE_integer( "test_start", TEST_START, "Starting point " "(inclusive) of range of test examples to use", ) flags.DEFINE_integer( "test_end", TEST_END, "End point (non-inclusive) of " "range of test examples to use", ) flags.DEFINE_string("which_set", WHICH_SET, '"train" or "test"') flags.DEFINE_integer("batch_size", BATCH_SIZE, "batch size") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/scripts/make_confidence_report_bundled.py ================================================ #!/usr/bin/env python3 """ make_confidence_report_bundled.py Usage: python make_confidence_report_bundled.py model.joblib where model.joblib is a file created by cleverhans.serial.save containing a picklable cleverhans.model.Model instance. This script will run the model on clean data and bundled adversarial examples ( https://openreview.net/forum?id=H1g0piA9tQ ) for a max norm threat model on the dataset the model was trained on. It will save a ConfidenceReport to to model_bundled_report.joblib. The report can be later loaded by another script using cleverhans.serial.load. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import tensorflow as tf from cleverhans.utils_tf import silence # The silence() call must precede other imports in order to silence them. # pylint does not like it but that's how it has to be. # pylint: disable=C0413 silence() from cleverhans.compat import flags from cleverhans.confidence_report import make_confidence_report_bundled from cleverhans.confidence_report import BATCH_SIZE from cleverhans.confidence_report import TRAIN_START, TRAIN_END from cleverhans.confidence_report import TEST_START, TEST_END from cleverhans.confidence_report import WHICH_SET from cleverhans.confidence_report import RECIPE from cleverhans.confidence_report import REPORT_PATH FLAGS = flags.FLAGS def main(argv=None): """ Make a confidence report and save it to disk. """ try: _name_of_script, filepath = argv except ValueError: raise ValueError(argv) print(filepath) make_confidence_report_bundled( filepath=filepath, test_start=FLAGS.test_start, test_end=FLAGS.test_end, which_set=FLAGS.which_set, recipe=FLAGS.recipe, report_path=FLAGS.report_path, batch_size=FLAGS.batch_size, ) if __name__ == "__main__": flags.DEFINE_integer( "train_start", TRAIN_START, "Starting point (inclusive)" "of range of train examples to use", ) flags.DEFINE_integer( "train_end", TRAIN_END, "Ending point (non-inclusive) " "of range of train examples to use", ) flags.DEFINE_integer( "test_start", TEST_START, "Starting point (inclusive) " "of range of test examples to use", ) flags.DEFINE_integer( "test_end", TEST_END, "End point (non-inclusive) of " "range of test examples to use", ) flags.DEFINE_string( "recipe", RECIPE, "Name of function from attack_bundling" " to run" ) flags.DEFINE_string("which_set", WHICH_SET, '"train" or "test"') flags.DEFINE_string("report_path", REPORT_PATH, "Report path") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Batch size") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/scripts/make_confidence_report_spsa.py ================================================ #!/usr/bin/env python3 """ make_confidence_report.py Usage: python make_confidence_report_spsa.py model.joblib where model.joblib is a file created by cleverhans.serial.save containing a picklable cleverhans.model.Model instance. This script will run the model on a variety of types of data and save a ConfidenceReport to model_report.joblib. The report can be later loaded by another script using cleverhans.serial.load. This script puts the following entries in the report: clean : Clean data mc: MaxConfidence SPSA adversarial examples This script works by running a single MaxConfidence attack on each example. ( https://openreview.net/forum?id=H1g0piA9tQ ) The MaxConfidence attack uses the SPSA optimizer. This is not intended to be a generic strong attack; rather it is intended to be a test for gradient masking. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import logging import numpy as np import tensorflow as tf from cleverhans.utils_tf import silence silence() # The call to silence() must precede the other imports or they will log. # pylint does not like this. # pylint: disable=C0413 from cleverhans.attacks import SPSA from cleverhans.attack_bundling import spsa_max_confidence_recipe from cleverhans.serial import load from cleverhans.utils import set_log_level from cleverhans.compat import flags from cleverhans.confidence_report import BATCH_SIZE from cleverhans.confidence_report import TRAIN_START from cleverhans.confidence_report import TRAIN_END from cleverhans.confidence_report import TEST_START from cleverhans.confidence_report import TEST_END from cleverhans.confidence_report import WHICH_SET from cleverhans.confidence_report import REPORT_PATH NB_ITER_SPSA = 80 SPSA_SAMPLES = SPSA.DEFAULT_SPSA_SAMPLES FLAGS = flags.FLAGS def make_confidence_report_spsa( filepath, train_start=TRAIN_START, train_end=TRAIN_END, test_start=TEST_START, test_end=TEST_END, batch_size=BATCH_SIZE, which_set=WHICH_SET, report_path=REPORT_PATH, nb_iter=NB_ITER_SPSA, spsa_samples=SPSA_SAMPLES, spsa_iters=SPSA.DEFAULT_SPSA_ITERS, ): """ Load a saved model, gather its predictions, and save a confidence report. This function works by running a single MaxConfidence attack on each example, using SPSA as the underyling optimizer. This is not intended to be a strong generic attack. It is intended to be a test to uncover gradient masking. :param filepath: path to model to evaluate :param train_start: index of first training set example to use :param train_end: index of last training set example to use :param test_start: index of first test set example to use :param test_end: index of last test set example to use :param batch_size: size of evaluation batches :param which_set: 'train' or 'test' :param nb_iter: Number of iterations of PGD to run per class :param spsa_samples: Number of samples for SPSA """ # Set TF random seed to improve reproducibility tf.set_random_seed(1234) # Set logging level to see debug information set_log_level(logging.INFO) # Create TF session sess = tf.Session() if report_path is None: assert filepath.endswith(".joblib") report_path = filepath[: -len(".joblib")] + "_spsa_report.joblib" with sess.as_default(): model = load(filepath) assert len(model.get_params()) > 0 factory = model.dataset_factory factory.kwargs["train_start"] = train_start factory.kwargs["train_end"] = train_end factory.kwargs["test_start"] = test_start factory.kwargs["test_end"] = test_end dataset = factory() center = dataset.kwargs["center"] center = np.float32(center) max_val = dataset.kwargs["max_val"] max_val = np.float32(max_val) value_range = max_val * (1.0 + center) min_value = np.float32(0.0 - center * max_val) if "CIFAR" in str(factory.cls): base_eps = 8.0 / 255.0 elif "MNIST" in str(factory.cls): base_eps = 0.3 else: raise NotImplementedError(str(factory.cls)) eps = np.float32(base_eps * value_range) clip_min = min_value clip_max = max_val x_data, y_data = dataset.get_set(which_set) nb_classes = dataset.NB_CLASSES spsa_max_confidence_recipe( sess, model, x_data, y_data, nb_classes, eps, clip_min, clip_max, nb_iter, report_path, spsa_samples=spsa_samples, spsa_iters=spsa_iters, eval_batch_size=batch_size, ) def main(argv=None): """ Make a confidence report and save it to disk. """ try: _name_of_script, filepath = argv except ValueError: raise ValueError(argv) make_confidence_report_spsa( filepath=filepath, test_start=FLAGS.test_start, test_end=FLAGS.test_end, which_set=FLAGS.which_set, report_path=FLAGS.report_path, nb_iter=FLAGS.nb_iter, batch_size=FLAGS.batch_size, spsa_samples=FLAGS.spsa_samples, spsa_iters=FLAGS.spsa_iters, ) if __name__ == "__main__": flags.DEFINE_integer("spsa_samples", SPSA_SAMPLES, "Number samples for SPSA") flags.DEFINE_integer( "spsa_iters", SPSA.DEFAULT_SPSA_ITERS, "Passed to SPSA.generate" ) flags.DEFINE_integer( "train_start", TRAIN_START, "Starting point (inclusive)" "of range of train examples to use", ) flags.DEFINE_integer( "train_end", TRAIN_END, "Ending point (non-inclusive) " "of range of train examples to use", ) flags.DEFINE_integer( "test_start", TEST_START, "Starting point (inclusive) of range" " of test examples to use", ) flags.DEFINE_integer( "test_end", TEST_END, "End point (non-inclusive) of range" " of test examples to use", ) flags.DEFINE_integer("nb_iter", NB_ITER_SPSA, "Number of iterations of SPSA") flags.DEFINE_string("which_set", WHICH_SET, '"train" or "test"') flags.DEFINE_string("report_path", REPORT_PATH, "Path to save to") flags.DEFINE_integer("batch_size", BATCH_SIZE, "Batch size for most jobs") tf.app.run() ================================================ FILE: cleverhans_v3.1.0/scripts/plot_success_fail_curve.py ================================================ #!/usr/bin/env python3 """ Plots a success-fail curve ( https://openreview.net/forum?id=H1g0piA9tQ ) Usage: plot_success_fail_curve.py model.joblib plot_success_fail_curve.py model1.joblib model2.joblib This script is mostly intended to rapidly visualize success-fail curves during model development and testing. To make nicely labeled plots formatted to fit the page / column of a publication, you should probably write your own script that calls some of the same plotting commands. """ from matplotlib import pyplot import tensorflow as tf from cleverhans.utils_tf import silence silence() # silence call must precede this imports. pylint doesn't like that # pylint: disable=C0413 from cleverhans.compat import flags from cleverhans.plot.success_fail import DEFAULT_FAIL_NAMES from cleverhans.plot.success_fail import plot_report_from_path FLAGS = flags.FLAGS def main(argv=None): """Takes the path to a directory with reports and renders success fail plots.""" report_paths = argv[1:] fail_names = FLAGS.fail_names.split(",") for report_path in report_paths: plot_report_from_path(report_path, label=report_path, fail_names=fail_names) pyplot.legend() pyplot.xlim(-0.01, 1.0) pyplot.ylim(0.0, 1.0) pyplot.show() if __name__ == "__main__": flags.DEFINE_string( "fail_names", ",".join(DEFAULT_FAIL_NAMES), "Names of adversarial datasets for failure rate", ) tf.app.run() ================================================ FILE: cleverhans_v3.1.0/scripts/print_report.py ================================================ #!/usr/bin/env python3 """ print_report.py Usage: print_report.py model_report.joblib Prints out some basic statistics stored in a pickled ConfidenceReport """ import sys import warnings from cleverhans.confidence_report import ConfidenceReport from cleverhans.serial import load if len(sys.argv) == 2: # pylint doesn't realize that sys.argv will change at runtime # pylint:disable=unbalanced-tuple-unpacking _, path = sys.argv else: raise ValueError("Wrong number of arguments") the_report = load(path) def current(report): """ The current implementation of report printing. :param report: ConfidenceReport """ if hasattr(report, "completed"): if report.completed: print("Report completed") else: print("REPORT NOT COMPLETED") else: warnings.warn( "This report does not indicate whether it is completed. Support for reports without a `completed`" "field may be dropped on or after 2019-05-11." ) for key in report: covered = report[key].confidence > 0.5 wrong = 1.0 - report[key].correctness failure_rate = (covered * wrong).mean() print(key, "failure rate at t=.5", failure_rate) print(key, "accuracy at t=0", report[key].correctness.mean()) def deprecated(report): """ The deprecated implementation of report printing. :param report: dict """ warnings.warn( "Printing dict-based reports is deprecated. This function " "is included only to support a private development branch " "and may be removed without warning." ) for key in report: confidence_name = "confidence" correctness_name = "correctness" if confidence_name not in report[key]: confidence_name = "all_probs" correctness_name = "correctness_mask" warnings.warn( "'all_probs' is used only to temporarily support " "the private development branch. This name can be " "removed at any time without warning." ) covered = report[key][confidence_name] > 0.5 wrong = 1.0 - report[key][correctness_name] failure_rate = (covered * wrong).mean() print(key, "failure rate at t=.5", failure_rate) print(key, "accuracy at t=0", report[key][correctness_name].mean()) if isinstance(the_report, ConfidenceReport): current(the_report) else: deprecated(the_report) ================================================ FILE: cleverhans_v3.1.0/scripts/show_images.py ================================================ #!/usr/bin/env python3 """ Loads an ndarray containing a batch of images and displays it. Usage: show_images.py file.npy """ import sys import numpy as np from cleverhans.plot.image import show, make_grid # pylint has a bug here, thinks sys.argv is empty _, path = sys.argv # pylint: disable=E0632 image_batch = np.load(path) grid = make_grid(image_batch) show(grid) ================================================ FILE: cleverhans_v3.1.0/setup.py ================================================ from setuptools import find_packages from setuptools import setup setup( name="cleverhans", version="3.0.1", url="https://github.com/tensorflow/cleverhans", license="MIT", install_requires=[ "nose", "pycodestyle", "scipy", "matplotlib", "mnist ~= 0.2", "numpy", "tensorflow-probability", "joblib", ], # Explicit dependence on TensorFlow is not supported. # See https://github.com/tensorflow/tensorflow/issues/7166 extras_require={ "tf": ["tensorflow>=1.0.0"], "tf_gpu": ["tensorflow-gpu>=1.0.0"], "pytorch": ["torch>=1.1.0", "torchvision==0.3.0"], }, packages=find_packages(), ) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_attack_bundling.py ================================================ """ Tests for cleverhans.attack_bundling """ import numpy as np from cleverhans.attack_bundling import AttackConfig from cleverhans.attack_bundling import Misclassify from cleverhans.attack_bundling import unfinished_attack_configs def test_unfinished_attack_configs(): """ Test that tracking of which attack configs are unfinished is correct """ new_work_goal = {} work_before = {} run_counts = {} expected_unfinished = [] expected_finished = [] easy_finished = AttackConfig(None, None) new_work_goal[easy_finished] = 1 work_before[easy_finished] = np.array([0, 0]) run_counts[easy_finished] = np.array([1, 1]) expected_finished.append(easy_finished) easy_unfinished = AttackConfig(None, None) new_work_goal[easy_unfinished] = 1 work_before[easy_unfinished] = np.array([0, 0]) run_counts[easy_unfinished] = np.array([0, 0]) expected_unfinished.append(easy_unfinished) only_partly_finished = AttackConfig(None, None) new_work_goal[only_partly_finished] = 1 work_before[only_partly_finished] = np.array([0, 0]) run_counts[only_partly_finished] = np.array([1, 0]) expected_unfinished.append(only_partly_finished) work_not_new = AttackConfig(None, None) new_work_goal[work_not_new] = 1 work_before[work_not_new] = np.array([1, 1]) run_counts[work_not_new] = np.array([1, 1]) expected_unfinished.append(work_not_new) actual_unfinished = unfinished_attack_configs( new_work_goal, work_before, run_counts ) assert all(e in actual_unfinished for e in expected_unfinished) assert all(e not in actual_unfinished for e in expected_finished) def test_misclassify_request_examples(): """ Test Misclassify.request_examples """ cfg = AttackConfig(None, None) goal = Misclassify(new_work_goal={cfg: 1}) correctness = np.array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=np.bool) run_counts = np.array([1, 1, 1, 0, 0, 0, 1, 1, 1, 0], dtype=np.int64) criteria = {"correctness": correctness} batch_size = 3 idxs = goal.request_examples(cfg, criteria, {cfg: run_counts}, batch_size) assert idxs.shape == (batch_size,) idxs = list(idxs) for already_misclassified in [0, 2, 4, 6, 8]: assert already_misclassified not in idxs for already_run in [1, 7]: assert already_run not in idxs for needed in [3, 5, 9]: assert needed in idxs ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_attacks.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import functools import unittest import numpy as np from nose.plugins.skip import SkipTest import tensorflow as tf # pylint bug on next line import tensorflow.contrib.slim as slim # pylint: disable=no-name-in-module from cleverhans.devtools.checks import CleverHansTest from cleverhans import attacks from cleverhans.attacks import Attack, SPSA from cleverhans.attacks import FastGradientMethod from cleverhans.attacks import BasicIterativeMethod from cleverhans.attacks import MomentumIterativeMethod from cleverhans.attacks import VirtualAdversarialMethod from cleverhans.attacks import SaliencyMapMethod from cleverhans.attacks import CarliniWagnerL2 from cleverhans.attacks import ElasticNetMethod from cleverhans.attacks import DeepFool from cleverhans.attacks import MadryEtAl from cleverhans.attacks import ProjectedGradientDescent from cleverhans.attacks import FastFeatureAdversaries from cleverhans.attacks import LBFGS from cleverhans.attacks import SpatialTransformationMethod from cleverhans.attacks import HopSkipJumpAttack from cleverhans.attacks import SparseL1Descent from cleverhans.initializers import HeReLuNormalInitializer from cleverhans.model import Model class SimpleModel(Model): """ A very simple neural network """ def __init__(self, scope="simple", nb_classes=2, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): w1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.as_dtype(x.dtype)) w2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.as_dtype(x.dtype)) h1 = tf.nn.sigmoid(tf.matmul(x, w1)) res = tf.matmul(h1, w2) return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)} class TrivialModel(Model): """ A linear model with two weights """ def __init__(self, scope="trivial", nb_classes=2, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): w1 = tf.constant([[1, -1]], dtype=tf.float32) res = tf.matmul(x, w1) return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)} class DummyModel(Model): """ A simple model based on slim """ def __init__(self, scope="dummy_model", nb_classes=10, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): net = slim.flatten(x) net = slim.fully_connected(net, 60) logits = slim.fully_connected(net, 10, activation_fn=None) return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits)} class TestAttackClassInitArguments(CleverHansTest): def test_model(self): sess = tf.Session() # Exception is thrown when model does not have __call__ attribute with self.assertRaises(Exception) as context: model = tf.placeholder(tf.float32, shape=(None, 10)) Attack(model, sess=sess) self.assertTrue(context.exception) def test_sess(self): # Test that it is permitted to provide no session. # The session still needs to be created prior to running the attack. # TODO: does anyone know why we need to make an unused session and put it in a with statement? with tf.Session(): Attack(Model("model", 10, {}), sess=None) def test_sess_generate_np(self): model = Model("model", 10, {}) class DummyAttack(Attack): def generate(self, x, **kwargs): return x # Test that generate_np is NOT permitted without a session. # The session still needs to be created prior to running the attack. # TODO: does anyone know why we need to make an unused session and put it in a with statement? with tf.Session(): attack = DummyAttack(model, sess=None) with self.assertRaises(Exception) as context: attack.generate_np(0.0) self.assertTrue(context.exception) class TestParseParams(CleverHansTest): def test_parse(self): sess = tf.Session() test_attack = Attack(Model("model", 10, {}), sess=sess) self.assertTrue(test_attack.parse_params({})) class TestVirtualAdversarialMethod(CleverHansTest): def setUp(self): super(TestVirtualAdversarialMethod, self).setUp() self.sess = tf.Session() self.sess.as_default() self.model = DummyModel("virtual_adv_dummy_model") self.attack = VirtualAdversarialMethod(self.model, sess=self.sess) # initialize model with tf.name_scope("virtual_adv_dummy_model"): self.model.get_probs(tf.placeholder(tf.float32, shape=(None, 1000))) self.sess.run(tf.global_variables_initializer()) def test_parse_params(self): self.attack.parse_params() # test default values self.assertEqual(self.attack.eps, 2.0) self.assertEqual(self.attack.num_iterations, 1) self.assertEqual(self.attack.xi, 1e-6) self.assertEqual(self.attack.clip_min, None) self.assertEqual(self.attack.clip_max, None) def test_generate_np(self): x_val = np.random.rand(100, 1000) perturbation = self.attack.generate_np(x_val) - x_val perturbation_norm = np.sqrt(np.sum(perturbation ** 2, axis=1)) # test perturbation norm self.assertClose(perturbation_norm, self.attack.eps) class CommonAttackProperties(CleverHansTest): """ Abstract base class shared by the tests for many attacks that want to check the same properties. """ def setUp(self): # Inheritance doesn't really work with tests. # nosetests always wants to run this class because it is a # CleverHansTest subclass, but this class is meant to just # be abstract. # Before this class was the tests for FastGradientMethod but # people kept inheriting from it for other attacks so it was # impossible to write tests specifically for FastGradientMethod. # pylint: disable=unidiomatic-typecheck if type(self) is CommonAttackProperties: raise SkipTest() super(CommonAttackProperties, self).setUp() self.sess = tf.Session() self.model = SimpleModel() def generate_adversarial_examples_np(self, ord, eps, **kwargs): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, eps=eps, ord=ord, clip_min=-5, clip_max=5, **kwargs ) if ord == np.inf: delta = np.max(np.abs(x_adv - x_val), axis=1) elif ord == 1: delta = np.sum(np.abs(x_adv - x_val), axis=1) elif ord == 2: delta = np.sum(np.square(x_adv - x_val), axis=1) ** 0.5 return x_val, x_adv, delta def help_generate_np_gives_adversarial_example(self, ord, eps=0.5, **kwargs): x_val, x_adv, delta = self.generate_adversarial_examples_np(ord, eps, **kwargs) self.assertLess(np.max(np.abs(delta - eps)), 1e-3) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.max(np.mean(orig_labs == new_labs)), 0.5) def test_invalid_input(self): x_val = -np.ones((2, 2), dtype="float32") with self.assertRaises(tf.errors.InvalidArgumentError) as context: self.attack.generate_np(x_val, eps=1.0, clip_min=0.0, clip_max=1.0) self.assertTrue(context.exception) def test_generate_np_gives_adversarial_example_linfinity(self): self.help_generate_np_gives_adversarial_example(np.infty) def test_generate_np_gives_adversarial_example_l1(self): self.help_generate_np_gives_adversarial_example(1) def test_generate_np_gives_adversarial_example_l2(self): self.help_generate_np_gives_adversarial_example(2) def test_generate_respects_dtype(self): self.attack = FastGradientMethod(self.model, sess=self.sess, dtypestr="float64") x = tf.placeholder(dtype=tf.float64, shape=(100, 2)) x_adv = self.attack.generate(x) self.assertEqual(x_adv.dtype, tf.float64) def test_targeted_generate_np_gives_adversarial_example(self): random_labs = np.random.random_integers(0, 1, 100) random_labs_one_hot = np.zeros((100, 2)) random_labs_one_hot[np.arange(100), random_labs] = 1 try: _, x_adv, delta = self.generate_adversarial_examples_np( eps=0.5, ord=np.inf, y_target=random_labs_one_hot ) except NotImplementedError: raise SkipTest() self.assertLessEqual(np.max(delta), 0.5001) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(random_labs == new_labs) > 0.7) def test_generate_np_can_be_called_with_different_eps(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) for eps in [0.1, 0.2, 0.3, 0.4]: x_adv = self.attack.generate_np( x_val, eps=eps, ord=np.inf, clip_min=-5.0, clip_max=5.0 ) delta = np.max(np.abs(x_adv - x_val), axis=1) self.assertLessEqual(np.max(delta), eps + 1e-4) def test_generate_can_be_called_with_different_eps(self): # It is crtical that this test uses generate and not generate_np. # All the other tests use generate_np. Even though generate_np calls # generate, it does so in a very standardized way, e.g. with eps # always converted to a tensorflow placeholder, so the other tests # based on generate_np do not exercise the generate API very well. x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x = tf.placeholder(tf.float32, x_val.shape) for eps in [0.1, 0.2, 0.3, 0.4]: x_adv = self.attack.generate( x, eps=eps, ord=np.inf, clip_min=-5.0, clip_max=5.0 ) x_adv = self.sess.run(x_adv, feed_dict={x: x_val}) delta = np.max(np.abs(x_adv - x_val), axis=1) self.assertLessEqual(np.max(delta), eps + 1e-4) def test_generate_np_clip_works_as_expected(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, eps=0.5, ord=np.inf, clip_min=-0.2, clip_max=0.1, sanity_checks=False ) self.assertClose(np.min(x_adv), -0.2) self.assertClose(np.max(x_adv), 0.1) class TestFastGradientMethod(CommonAttackProperties): def setUp(self): super(TestFastGradientMethod, self).setUp() self.attack = FastGradientMethod(self.model, sess=self.sess) class TestOptimizeLinear(CleverHansTest): """ Tests for the `optimize_linear` function """ def setUp(self): super(TestOptimizeLinear, self).setUp() self.sess = tf.Session() self.model = SimpleModel() def test_optimize_linear_linf(self): grad = tf.placeholder(tf.float32, shape=[1, 2]) # Build the graph for the attack eta = attacks.optimize_linear(grad, eps=1.0, ord=np.inf) objective = tf.reduce_sum(grad * eta) grad_val = np.array([[1.0, -2.0]]) eta, objective = self.sess.run([eta, objective], feed_dict={grad: grad_val}) # Make sure the objective is optimal. # This is the solution obtained by doing the algebra by hand. self.assertClose(objective, np.abs(grad_val).sum()) # Make sure the constraint is respected. # Also, for a linear function, the constraint will always be tight. self.assertClose(np.abs(eta), 1.0) def test_optimize_linear_l2(self): grad = tf.placeholder(tf.float32, shape=[1, 2]) # Build the graph for the attack eta = attacks.optimize_linear(grad, eps=1.0, ord=2) objective = tf.reduce_sum(grad * eta) grad_val = np.array([[np.sqrt(0.5), -np.sqrt(0.5)]]) eta, objective = self.sess.run([eta, objective], feed_dict={grad: grad_val}) # Make sure the objective is optimal. # This is the solution obtained by doing the algebra by hand. self.assertClose(objective, 1.0) # Make sure the constraint is respected. # Also, for a linear function, the constraint will always be tight. self.assertClose(np.sqrt(np.square(eta).sum()), 1.0) def test_optimize_linear_l1(self): # This test makes sure that `optimize_linear` actually finds the optimal # perturbation for ord=1. # A common misconcpetion is that FGM for ord=1 consists of dividing # the gradient by its L1 norm. # If you do that for the problem in this unit test, you'll get an # objective function value of ~1.667. The optimal result is 2. # We need just one example in the batch and two features to show the # common misconception is suboptimal. grad = tf.placeholder(tf.float32, shape=[1, 2]) # Build the graph for the attack eta = attacks.optimize_linear(grad, eps=1.0, ord=1) objective = tf.reduce_sum(grad * eta) # Make sure the largest entry of the gradient for the test case is # negative, to catch # the potential bug where we forget to handle the sign of the gradient eta, objective = self.sess.run( [eta, objective], feed_dict={grad: np.array([[1.0, -2.0]])} ) # Make sure the objective is optimal. # This is the solution obtained by doing the algebra by hand. self.assertClose(objective, 2.0) # Make sure the constraint is respected. # Also, for a linear function, the constraint will always be tight. self.assertClose(np.abs(eta).sum(), 1.0) def test_optimize_linear_l1_ties(self): # This test makes sure that `optimize_linear` handles ties in gradient # magnitude correctly when ord=1. # We need just one example in the batch and two features to construct # a tie. grad = tf.placeholder(tf.float32, shape=[1, 2]) # Build the graph for the attack eta = attacks.optimize_linear(grad, eps=1.0, ord=1) objective = tf.reduce_sum(grad * eta) # Run a test case with a tie for largest absolute value. # Make one feature negative to make sure we're checking for ties in # absolute value, not raw value. eta, objective = self.sess.run( [eta, objective], feed_dict={grad: np.array([[2.0, -2.0]])} ) # Make sure the objective is optimal. # This is the solution obtained by doing the algebra by hand. self.assertClose(objective, 2.0) # Make sure the constraint is respected. # Also, for a linear function, the constraint will always be tight. self.assertClose(np.abs(eta).sum(), 1.0) class TestSPSA(CleverHansTest): def setUp(self): super(TestSPSA, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = SPSA(self.model, sess=self.sess) def test_attack_strength(self): n_samples = 10 x_val = np.random.rand(n_samples, 2) x_val = np.array(x_val, dtype=np.float32) # The SPSA attack currently uses non-one-hot labels # TODO: change this to use standard cleverhans label conventions feed_labs = np.random.randint(0, 2, n_samples) x_input = tf.placeholder(tf.float32, shape=(1, 2)) y_label = tf.placeholder(tf.int32, shape=(1,)) x_adv_op = self.attack.generate( x_input, y=y_label, epsilon=0.5, num_steps=100, batch_size=64, spsa_iters=1, clip_min=0.0, clip_max=1.0, ) all_x_adv = [] for i in range(n_samples): x_adv_np = self.sess.run( x_adv_op, feed_dict={ x_input: np.expand_dims(x_val[i], axis=0), y_label: np.expand_dims(feed_labs[i], axis=0), }, ) all_x_adv.append(x_adv_np[0]) x_adv = np.vstack(all_x_adv) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(feed_labs == new_labs) < 0.1) def test_attack_strength_np(self): # Same test as test_attack_strength, but uses generate_np interface n_samples = 10 x_val = np.random.rand(n_samples, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.random.randint(0, 2, n_samples, dtype="int32") all_x_adv = [] for i in range(n_samples): x_adv_np = self.attack.generate_np( np.expand_dims(x_val[i], axis=0), y=np.expand_dims(feed_labs[i], axis=0), eps=0.5, nb_iter=100, spsa_samples=64, spsa_iters=1, clip_min=0.0, clip_max=1.0, ) all_x_adv.append(x_adv_np[0]) x_adv = np.vstack(all_x_adv) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(feed_labs == new_labs), 0.1) def test_attack_strength_np_batched(self): # Same test as test_attack_strength_np, but batched n_samples = 10 x_val = np.random.rand(n_samples, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.random.randint(0, 2, n_samples, dtype="int32") x_adv = self.attack.generate_np( x_val, y=feed_labs, eps=0.5, nb_iter=100, spsa_samples=64, spsa_iters=1, clip_min=0.0, clip_max=1.0, ) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(feed_labs == new_labs), 0.1) def test_label_argument_int64(self): x_val = np.random.rand(1, 2) x_val = np.array(x_val, dtype=np.float32) # Try calling alternating with int32 and int64 and ensure it works for dtype in [np.int32, np.int64, np.int32, np.int64]: self.attack.generate_np( x_val, y=np.zeros(1, dtype=dtype), eps=0.5, nb_iter=5, spsa_samples=64, spsa_iters=1, clip_min=0.0, clip_max=1.0, ) class TestProjectedGradientDescent(CommonAttackProperties): def setUp(self): super(TestProjectedGradientDescent, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = ProjectedGradientDescent(self.model, sess=self.sess) def test_generate_np_gives_adversarial_example_linfinity(self): self.help_generate_np_gives_adversarial_example( ord=np.infty, eps=0.5, nb_iter=20 ) def test_generate_np_gives_adversarial_example_l1(self): try: self.help_generate_np_gives_adversarial_example(ord=1, eps=0.5, nb_iter=20) except NotImplementedError: raise SkipTest() def test_generate_np_gives_adversarial_example_l2(self): self.help_generate_np_gives_adversarial_example(ord=2, eps=0.5, nb_iter=20) def test_do_not_reach_lp_boundary(self): """ Make sure that iterative attack don't reach boundary of Lp neighbourhood if nb_iter * eps_iter is relatively small compared to epsilon. """ for ord in [1, 2, np.infty]: try: _, _, delta = self.generate_adversarial_examples_np( ord=ord, eps=0.5, nb_iter=10, eps_iter=0.01 ) except NotImplementedError: # Don't raise SkipTest because it will skip the rest of the for loop continue self.assertTrue(np.max(0.5 - delta) > 0.25) def test_attack_strength_linf(self): """ If clipping is not done at each iteration (not passing clip_min and clip_max to fgm), this attack fails by np.mean(orig_labels == new_labels) == .39. """ x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # sanity checks turned off because this test initializes outside # the valid range. x_adv = self.attack.generate_np( x_val, eps=1.0, ord=np.inf, clip_min=0.5, clip_max=0.7, nb_iter=5, sanity_checks=False, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(orig_labs == new_labs), 0.1) def test_attack_strength_l2(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # sanity checks turned off because this test initializes outside # the valid range. x_adv = self.attack.generate_np( x_val, eps=1, ord=2, clip_min=0.5, clip_max=0.7, nb_iter=5, sanity_checks=False, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(orig_labs == new_labs), 0.1) def test_grad_clip_l2(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # sanity checks turned off because this test initializes outside # the valid range. x_adv = self.attack.generate_np( x_val, eps=1, ord=2, clip_min=0.5, clip_max=0.7, clip_grad=True, nb_iter=10, sanity_checks=False, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(orig_labs == new_labs), 0.1) def test_clip_eta_linf(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, ord=np.inf, eps=1.0, eps_iter=0.1, nb_iter=5 ) delta = np.max(np.abs(x_adv - x_val), axis=1) self.assertLessEqual(np.max(delta), 1.0) def test_clip_eta_l2(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np(x_val, ord=2, eps=1.0, eps_iter=0.1, nb_iter=5) delta = np.sqrt(np.sum(np.square(x_adv - x_val), axis=1)) # this projection is less numerically stable so give it some slack self.assertLessEqual(np.max(delta), 1.0 + 1e-6) def test_generate_np_gives_clipped_adversarial_examples(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) for ord in [1, 2, np.infty]: try: x_adv = self.attack.generate_np( x_val, ord=ord, eps=1.0, eps_iter=0.1, nb_iter=5, clip_min=-0.2, clip_max=0.3, sanity_checks=False, ) self.assertLess(-0.201, np.min(x_adv)) self.assertLess(np.max(x_adv), 0.301) except NotImplementedError: # Don't raise SkipTest because it will skip the rest of the for loop continue def test_generate_np_does_not_cache_graph_computation_for_nb_iter(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # Call it once x_adv = self.attack.generate_np( x_val, eps=1.0, ord=np.inf, clip_min=-5.0, clip_max=5.0, nb_iter=10 ) # original labels np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) # new labels np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) # Call it again ok = [False] old_grads = tf.gradients try: def fn(*x, **y): ok[0] = True return old_grads(*x, **y) tf.gradients = fn x_adv = self.attack.generate_np( x_val, eps=1.0, ord=np.inf, clip_min=-5.0, clip_max=5.0, nb_iter=11 ) finally: tf.gradients = old_grads # original labels np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) # new labels np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(ok[0]) def test_multiple_initial_random_step(self): """ This test generates multiple adversarial examples until an adversarial example is generated with a different label compared to the original label. This is the procedure suggested in Madry et al. (2017). This test will fail if an initial random step is not taken (error>0.5). """ x_val = np.array(np.random.rand(100, 2), dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs_multi = orig_labs.copy() # Generate multiple adversarial examples for _ in range(10): x_adv = self.attack.generate_np( x_val, eps=0.5, eps_iter=0.05, clip_min=0.5, clip_max=0.7, nb_iter=2, sanity_checks=False, ) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) # Examples for which we have not found adversarial examples I = orig_labs == new_labs_multi new_labs_multi[I] = new_labs[I] self.assertLess(np.mean(orig_labs == new_labs_multi), 0.5) class TestSparseL1Descent(CleverHansTest): def setUp(self): super(TestSparseL1Descent, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = SparseL1Descent(self.model, sess=self.sess) def generate_adversarial_examples_np(self, eps, **kwargs): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, eps=eps, clip_min=-5, clip_max=5, **kwargs ) delta = np.sum(np.abs(x_adv - x_val), axis=1) return x_val, x_adv, delta def help_generate_np_gives_adversarial_example(self, eps=2.0, **kwargs): x_val, x_adv, delta = self.generate_adversarial_examples_np(eps, **kwargs) self.assertLess(np.max(np.abs(delta - eps)), 1e-3) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.max(np.mean(orig_labs == new_labs)), 0.5) def test_invalid_input(self): x_val = -np.ones((2, 2), dtype="float32") with self.assertRaises(tf.errors.InvalidArgumentError) as context: self.attack.generate_np(x_val, eps=10.0, clip_min=0.0, clip_max=1.0) self.assertTrue(context.exception) def test_generate_np_gives_adversarial_example(self): self.help_generate_np_gives_adversarial_example() def test_targeted_generate_np_gives_adversarial_example(self): random_labs = np.random.random_integers(0, 1, 100) random_labs_one_hot = np.zeros((100, 2)) random_labs_one_hot[np.arange(100), random_labs] = 1 _, x_adv, delta = self.generate_adversarial_examples_np( eps=10, y_target=random_labs_one_hot ) self.assertLessEqual(np.max(delta), 10.001) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(random_labs == new_labs) > 0.7) def test_generate_np_can_be_called_with_different_eps(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) for eps in [10, 20, 30, 40]: x_adv = self.attack.generate_np(x_val, eps=eps, clip_min=-5.0, clip_max=5.0) delta = np.max(np.abs(x_adv - x_val), axis=1) self.assertLessEqual(np.max(delta), eps + 1e-4) def test_generate_can_be_called_with_different_eps(self): # It is crtical that this test uses generate and not generate_np. # All the other tests use generate_np. Even though generate_np calls # generate, it does so in a very standardized way, e.g. with eps # always converted to a tensorflow placeholder, so the other tests # based on generate_np do not exercise the generate API very well. x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x = tf.placeholder(tf.float32, x_val.shape) for eps in [10, 20, 30, 40]: x_adv = self.attack.generate(x, eps=eps, clip_min=-5.0, clip_max=5.0) x_adv = self.sess.run(x_adv, feed_dict={x: x_val}) delta = np.max(np.abs(x_adv - x_val), axis=1) self.assertLessEqual(np.max(delta), eps + 1e-4) def test_generate_np_clip_works_as_expected(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, eps=10, nb_iter=20, rand_init=True, clip_min=-0.2, clip_max=0.1, sanity_checks=False, ) self.assertClose(np.min(x_adv), -0.2) self.assertClose(np.max(x_adv), 0.1) def test_do_not_reach_lp_boundary(self): """ Make sure that iterative attack don't reach boundary of Lp neighbourhood if nb_iter * eps_iter is relatively small compared to epsilon. """ _, _, delta = self.generate_adversarial_examples_np( eps=0.5, nb_iter=10, eps_iter=0.01 ) self.assertTrue(np.max(0.5 - delta) > 0.25) def test_generate_np_gives_clipped_adversarial_examples(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, eps=1.0, eps_iter=0.1, nb_iter=5, clip_min=-0.2, clip_max=0.3, sanity_checks=False, ) self.assertLess(-0.201, np.min(x_adv)) self.assertLess(np.max(x_adv), 0.301) def test_generate_np_does_not_cache_graph_computation_for_nb_iter(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # Call it once x_adv = self.attack.generate_np( x_val, eps=1.0, clip_min=-5.0, clip_max=5.0, nb_iter=10 ) # original labels np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) # new labels np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) # Call it again ok = [False] old_grads = tf.gradients try: def fn(*x, **y): ok[0] = True return old_grads(*x, **y) tf.gradients = fn x_adv = self.attack.generate_np( x_val, eps=1.0, clip_min=-5.0, clip_max=5.0, nb_iter=11 ) finally: tf.gradients = old_grads # original labels np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) # new labels np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(ok[0]) def test_clip_eta(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np(x_val, eps=1.0, eps_iter=0.1, nb_iter=5) delta = np.sum(np.abs(x_adv - x_val), axis=1) # this projection is less numerically stable so give it some slack self.assertLessEqual(np.max(delta), 1.0 + 1e-6) def test_attack_strength(self): """ Without clipped gradients, we achieve np.mean(orig_labels == new_labels) == 0.31. """ x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # sanity checks turned off because this test initializes outside # the valid range. x_adv = self.attack.generate_np( x_val, eps=10.0, rand_init=True, clip_min=0.5, clip_max=0.7, nb_iter=10, sanity_checks=False, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(orig_labs == new_labs), 0.5) self.assertGreater(np.mean(orig_labs == new_labs), 0.2) def test_grad_clip(self): """ With clipped gradients, we achieve np.mean(orig_labels == new_labels) == 0.0 """ x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # sanity checks turned off because this test initializes outside # the valid range. x_adv = self.attack.generate_np( x_val, eps=10.0, rand_init=True, clip_min=0.5, clip_max=0.7, clip_grad=True, nb_iter=10, sanity_checks=False, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertLess(np.mean(orig_labs == new_labs), 0.1) def test_sparsity(self): # use a model with larger input dimensionality for this test. self.model = DummyModel("sparse_l1_descent_dummy_model") self.attack = SparseL1Descent(self.model, sess=self.sess) # initialize model with tf.name_scope("sparse_l1_descent_dummy_model"): self.model.get_probs(tf.placeholder(tf.float32, shape=(None, 1000))) self.sess.run(tf.global_variables_initializer()) x_val = np.random.rand(100, 1000) x_val = np.array(x_val, dtype=np.float32) for q in [1, 9, 25.8, 50, 75.4, 90.2, 99, 99.9]: x_adv = self.attack.generate_np( x_val, eps=5.0, grad_sparsity=q, nb_iter=1, sanity_checks=False ) numzero = np.sum(x_adv - x_val == 0, axis=-1) self.assertAlmostEqual(q * 1000.0 / 100.0, np.mean(numzero), delta=1) def test_grad_sparsity_checks(self): # test that the attacks allows `grad_sparsity` to be specified as a scalar # in (0, 100) or as a vector. x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) # scalar values out of range with self.assertRaises(ValueError) as context: self.attack.generate(x_val, sanity_checks=False, grad_sparsity=0) self.assertTrue(context.exception) with self.assertRaises(ValueError) as context: self.attack.generate(x_val, sanity_checks=False, grad_sparsity=100) self.assertTrue(context.exception) # sparsity as 2D array should fail with self.assertRaises(ValueError) as context: gs = tf.random.uniform(shape=(100, 2), minval=90, maxval=99) self.attack.generate(x_val, sanity_checks=False, grad_sparsity=gs) self.assertTrue(context.exception) # sparsity as 1D array should succeed gs = tf.random.uniform(shape=(100,), minval=90, maxval=99) x_adv = self.attack.generate(x_val, sanity_checks=False, grad_sparsity=gs) self.assertTrue(np.array_equal(x_adv.get_shape().as_list(), [100, 2])) # sparsity vector of wrong size should fail with self.assertRaises(ValueError) as context: gs = tf.random.uniform(shape=(101,), minval=90, maxval=99) x_adv = self.attack.generate(x_val, sanity_checks=False, grad_sparsity=gs) self.assertTrue(context.exception) class TestCarliniWagnerL2(CleverHansTest): def setUp(self): super(TestCarliniWagnerL2, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = CarliniWagnerL2(self.model, sess=self.sess) def test_generate_np_untargeted_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=10, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_np_targeted_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1 x_adv = self.attack.generate_np( x_val, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=100, y_target=feed_labs, ) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9) def test_generate_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), orig_labs] = 1 x = tf.placeholder(tf.float32, x_val.shape) y = tf.placeholder(tf.float32, feed_labs.shape) x_adv_p = self.attack.generate( x, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=100, y=y, ) self.assertEqual(x_val.shape, x_adv_p.shape) x_adv = self.sess.run(x_adv_p, {x: x_val, y: feed_labs}) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_np_gives_clipped_adversarial_examples(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, max_iterations=10, binary_search_steps=1, learning_rate=1e-3, initial_const=1, clip_min=-0.2, clip_max=0.3, batch_size=100, ) self.assertTrue(-0.201 < np.min(x_adv)) self.assertTrue(np.max(x_adv) < 0.301) def test_generate_np_high_confidence_targeted_examples(self): trivial_model = TrivialModel() for CONFIDENCE in [0, 2.3]: x_val = np.random.rand(10, 1) - 0.5 x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((10, 2)) feed_labs[np.arange(10), np.random.randint(0, 2, 10)] = 1 attack = CarliniWagnerL2(trivial_model, sess=self.sess) x_adv = attack.generate_np( x_val, max_iterations=100, binary_search_steps=2, learning_rate=1e-2, initial_const=1, clip_min=-10, clip_max=10, confidence=CONFIDENCE, y_target=feed_labs, batch_size=10, ) new_labs = self.sess.run(trivial_model.get_logits(x_adv)) good_labs = new_labs[np.arange(10), np.argmax(feed_labs, axis=1)] bad_labs = new_labs[np.arange(10), 1 - np.argmax(feed_labs, axis=1)] self.assertClose(CONFIDENCE, np.min(good_labs - bad_labs), atol=1e-1) self.assertTrue( np.mean(np.argmax(new_labs, axis=1) == np.argmax(feed_labs, axis=1)) > 0.9 ) def test_generate_np_high_confidence_untargeted_examples(self): trivial_model = TrivialModel() for CONFIDENCE in [0, 2.3]: x_val = np.random.rand(10, 1) - 0.5 x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax( self.sess.run(trivial_model.get_logits(x_val)), axis=1 ) attack = CarliniWagnerL2(trivial_model, sess=self.sess) x_adv = attack.generate_np( x_val, max_iterations=100, binary_search_steps=2, learning_rate=1e-2, initial_const=1, clip_min=-10, clip_max=10, confidence=CONFIDENCE, batch_size=10, ) new_labs = self.sess.run(trivial_model.get_logits(x_adv)) good_labs = new_labs[np.arange(10), 1 - orig_labs] bad_labs = new_labs[np.arange(10), orig_labs] self.assertTrue(np.mean(np.argmax(new_labs, axis=1) == orig_labs) == 0) self.assertTrue( np.isclose(0, np.min(good_labs - (bad_labs + CONFIDENCE)), atol=1e-1) ) class TestElasticNetMethod(CleverHansTest): def setUp(self): super(TestElasticNetMethod, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = ElasticNetMethod(self.model, sess=self.sess) def test_generate_np_untargeted_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=10, ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_np_targeted_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1 x_adv = self.attack.generate_np( x_val, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=100, y_target=feed_labs, ) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9) def test_generate_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), orig_labs] = 1 x = tf.placeholder(tf.float32, x_val.shape) y = tf.placeholder(tf.float32, feed_labs.shape) x_adv_p = self.attack.generate( x, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=100, y=y, ) self.assertEqual(x_val.shape, x_adv_p.shape) x_adv = self.sess.run(x_adv_p, {x: x_val, y: feed_labs}) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_np_gives_clipped_adversarial_examples(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, max_iterations=10, binary_search_steps=1, learning_rate=1e-3, initial_const=1, clip_min=-0.2, clip_max=0.3, batch_size=100, ) self.assertTrue(-0.201 < np.min(x_adv)) self.assertTrue(np.max(x_adv) < 0.301) def test_generate_np_high_confidence_targeted_examples(self): trivial_model = TrivialModel() for CONFIDENCE in [0, 2.3]: x_val = np.random.rand(10, 1) - 0.5 x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((10, 2)) feed_labs[np.arange(10), np.random.randint(0, 2, 10)] = 1 attack = CarliniWagnerL2(trivial_model, sess=self.sess) x_adv = attack.generate_np( x_val, max_iterations=100, binary_search_steps=2, learning_rate=1e-2, initial_const=1, clip_min=-10, clip_max=10, confidence=CONFIDENCE, y_target=feed_labs, batch_size=10, ) new_labs = self.sess.run(trivial_model.get_logits(x_adv)) good_labs = new_labs[np.arange(10), np.argmax(feed_labs, axis=1)] bad_labs = new_labs[np.arange(10), 1 - np.argmax(feed_labs, axis=1)] self.assertTrue( np.isclose(0, np.min(good_labs - (bad_labs + CONFIDENCE)), atol=1e-1) ) self.assertTrue( np.mean(np.argmax(new_labs, axis=1) == np.argmax(feed_labs, axis=1)) > 0.9 ) def test_generate_np_high_confidence_untargeted_examples(self): trivial_model = TrivialModel() for CONFIDENCE in [0, 2.3]: x_val = np.random.rand(10, 1) - 0.5 x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax( self.sess.run(trivial_model.get_logits(x_val)), axis=1 ) attack = CarliniWagnerL2(trivial_model, sess=self.sess) x_adv = attack.generate_np( x_val, max_iterations=100, binary_search_steps=2, learning_rate=1e-2, initial_const=1, clip_min=-10, clip_max=10, confidence=CONFIDENCE, batch_size=10, ) new_labs = self.sess.run(trivial_model.get_logits(x_adv)) good_labs = new_labs[np.arange(10), 1 - orig_labs] bad_labs = new_labs[np.arange(10), orig_labs] self.assertTrue(np.mean(np.argmax(new_labs, axis=1) == orig_labs) == 0) self.assertTrue( np.isclose(0, np.min(good_labs - (bad_labs + CONFIDENCE)), atol=1e-1) ) class TestSaliencyMapMethod(CleverHansTest): def setUp(self): super(TestSaliencyMapMethod, self).setUp() self.sess = tf.Session() self.sess.as_default() self.model = DummyModel() self.attack = SaliencyMapMethod(self.model, sess=self.sess) # initialize model with tf.name_scope("dummy_model"): self.model.get_logits(tf.placeholder(tf.float32, shape=(None, 1000))) self.sess.run(tf.global_variables_initializer()) self.attack = SaliencyMapMethod(self.model, sess=self.sess) def test_generate_np_targeted_gives_adversarial_example(self): x_val = np.random.rand(10, 1000) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((10, 10)) feed_labs[np.arange(10), np.random.randint(0, 9, 10)] = 1 x_adv = self.attack.generate_np( x_val, clip_min=-5.0, clip_max=5.0, y_target=feed_labs ) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) worked = np.mean(np.argmax(feed_labs, axis=1) == new_labs) self.assertTrue(worked > 0.9) class TestDeepFool(CleverHansTest): def setUp(self): super(TestDeepFool, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = DeepFool(self.model, sess=self.sess) def test_generate_np_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, overshoot=0.02, max_iter=50, nb_candidate=2, clip_min=-5, clip_max=5 ) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) x = tf.placeholder(tf.float32, x_val.shape) x_adv_p = self.attack.generate( x, overshoot=0.02, max_iter=50, nb_candidate=2, clip_min=-5, clip_max=5 ) self.assertEqual(x_val.shape, x_adv_p.shape) x_adv = self.sess.run(x_adv_p, {x: x_val}) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_np_gives_clipped_adversarial_examples(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) x_adv = self.attack.generate_np( x_val, overshoot=0.02, max_iter=50, nb_candidate=2, clip_min=-0.2, clip_max=0.3, ) self.assertTrue(-0.201 < np.min(x_adv)) self.assertTrue(np.max(x_adv) < 0.301) class TestMomentumIterativeMethod(TestProjectedGradientDescent): def setUp(self): super(TestMomentumIterativeMethod, self).setUp() self.attack = MomentumIterativeMethod(self.model, sess=self.sess) def test_generate_np_can_be_called_with_different_decay_factor(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) for decay_factor in [0.0, 0.5, 1.0]: x_adv = self.attack.generate_np( x_val, eps=0.5, ord=np.inf, decay_factor=decay_factor, clip_min=-5.0, clip_max=5.0, ) delta = np.max(np.abs(x_adv - x_val), axis=1) self.assertClose(delta, 0.5) def test_multiple_initial_random_step(self): # There is no initial random step, so nothing to test here pass class TestMadryEtAl(CleverHansTest): def setUp(self): super(TestMadryEtAl, self).setUp() self.model = DummyModel("madryetal_dummy_model") self.sess = tf.Session() def test_attack_can_be_constructed(self): # The test passes if this does not raise an exception self.attack = MadryEtAl(self.model, sess=self.sess) class TestBasicIterativeMethod(CleverHansTest): def setUp(self): super(TestBasicIterativeMethod, self).setUp() self.model = DummyModel("bim_dummy_model") self.sess = tf.Session() def test_attack_can_be_constructed(self): # The test passes if this raises no exceptions self.attack = BasicIterativeMethod(self.model, sess=self.sess) class TestFastFeatureAdversaries(CleverHansTest): def setUp(self): super(TestFastFeatureAdversaries, self).setUp() def make_imagenet_cnn(input_shape=(None, 224, 224, 3)): """ Similar CNN to AlexNet. """ class ModelImageNetCNN(Model): def __init__(self, scope, nb_classes=1000, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs my_conv = functools.partial( tf.layers.conv2d, kernel_size=3, strides=2, padding="valid", activation=tf.nn.relu, kernel_initializer=HeReLuNormalInitializer, ) my_dense = functools.partial( tf.layers.dense, kernel_initializer=HeReLuNormalInitializer ) with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): for depth in [96, 256, 384, 384, 256]: x = my_conv(x, depth) y = tf.layers.flatten(x) y = my_dense(y, 4096, tf.nn.relu) y = fc7 = my_dense(y, 4096, tf.nn.relu) y = my_dense(y, 1000) return { "fc7": fc7, self.O_LOGITS: y, self.O_PROBS: tf.nn.softmax(logits=y), } return ModelImageNetCNN("imagenet") self.input_shape = [10, 224, 224, 3] self.sess = tf.Session() self.model = make_imagenet_cnn(self.input_shape) self.attack = FastFeatureAdversaries(self.model, sess=self.sess) def test_attack_strength(self): """ This test generates a random source and guide and feeds them in a randomly initialized CNN. Checks if an adversarial example can get at least 50% closer to the guide compared to the original distance of the source and the guide. """ tf.set_random_seed(1234) input_shape = self.input_shape x_src = tf.abs(tf.random_uniform(input_shape, 0.0, 1.0)) x_guide = tf.abs(tf.random_uniform(input_shape, 0.0, 1.0)) layer = "fc7" attack_params = { "eps": 5.0 / 256, "clip_min": 0.0, "clip_max": 1.0, "nb_iter": 10, "eps_iter": 0.005, "layer": layer, } x_adv = self.attack.generate(x_src, x_guide, **attack_params) h_adv = self.model.fprop(x_adv)[layer] h_src = self.model.fprop(x_src)[layer] h_guide = self.model.fprop(x_guide)[layer] init = tf.global_variables_initializer() self.sess.run(init) ha, hs, hg, _xa, _xs, _xg = self.sess.run( [h_adv, h_src, h_guide, x_adv, x_src, x_guide] ) d_as = np.sqrt(((hs - ha) * (hs - ha)).sum()) d_ag = np.sqrt(((hg - ha) * (hg - ha)).sum()) d_sg = np.sqrt(((hg - hs) * (hg - hs)).sum()) print( "L2 distance between source and adversarial example `%s`: %.4f" % (layer, d_as) ) print( "L2 distance between guide and adversarial example `%s`: %.4f" % (layer, d_ag) ) print("L2 distance between source and guide `%s`: %.4f" % (layer, d_sg)) print("d_ag/d_sg*100 `%s`: %.4f" % (layer, d_ag * 100 / d_sg)) self.assertTrue(d_ag * 100 / d_sg < 50.0) class TestLBFGS(CleverHansTest): def setUp(self): super(TestLBFGS, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = LBFGS(self.model, sess=self.sess) def test_generate_np_targeted_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1 x_adv = self.attack.generate_np( x_val, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=100, y_target=feed_labs, ) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9) def test_generate_targeted_gives_adversarial_example(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1 x = tf.placeholder(tf.float32, x_val.shape) y = tf.placeholder(tf.float32, feed_labs.shape) x_adv_p = self.attack.generate( x, max_iterations=100, binary_search_steps=3, initial_const=1, clip_min=-5, clip_max=5, batch_size=100, y_target=y, ) self.assertEqual(x_val.shape, x_adv_p.shape) x_adv = self.sess.run(x_adv_p, {x: x_val, y: feed_labs}) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9) def test_generate_np_gives_clipped_adversarial_examples(self): x_val = np.random.rand(100, 2) x_val = np.array(x_val, dtype=np.float32) feed_labs = np.zeros((100, 2)) feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1 x_adv = self.attack.generate_np( x_val, max_iterations=10, binary_search_steps=1, initial_const=1, clip_min=-0.2, clip_max=0.3, batch_size=100, y_target=feed_labs, ) self.assertTrue(-0.201 < np.min(x_adv)) self.assertTrue(np.max(x_adv) < 0.301) class SimpleSpatialBrightPixelModel(Model): """ If there is a bright pixel in the image returns the first class. Otherwise returns the second class. Spatial attack should push the bright pixels off of the image. """ def __init__(self, scope="simple_spatial", nb_classes=2, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs flat_x = slim.flatten(x) first_logit = tf.reduce_max(flat_x, axis=1) second_logit = tf.ones_like(first_logit) * 0.5 res = tf.stack([second_logit, first_logit], axis=1) return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)} @unittest.skipIf( [int(v) for v in tf.__version__.split(".")[:2]] < [1, 6], "SpatialAttack requires tf 1.6 or higher", ) class TestSpatialTransformationMethod(CleverHansTest): """Tests for SpatialTransformationMethod""" def setUp(self): """ Allocate session, model, and attack + initialize tf Variables """ super(TestSpatialTransformationMethod, self).setUp() self.sess = tf.Session() self.model = SimpleSpatialBrightPixelModel() self.attack = SpatialTransformationMethod(self.model, sess=self.sess) # initialize model with tf.name_scope("dummy_model_spatial"): self.model.get_logits(tf.placeholder(tf.float32, shape=(None, 2, 2, 1))) self.sess.run(tf.global_variables_initializer()) def test_no_transformation(self): """Test that setting transformation params to 0. is a no-op""" x_val = np.random.rand(100, 2, 2, 1) x_val = np.array(x_val, dtype=np.float32) x = tf.placeholder(tf.float32, shape=(None, 2, 2, 1)) x_adv_p = self.attack.generate( x, batch_size=100, dx_min=0.0, dx_max=0.0, n_dxs=1, dy_min=0.0, dy_max=0.0, n_dys=1, angle_min=0, angle_max=0, n_angles=1, ) x_adv = self.sess.run(x_adv_p, {x: x_val}) self.assertClose(x_adv, x_val) def test_push_pixels_off_image(self): """Test that the attack pushes some pixels off the image""" x_val = np.random.rand(100, 2, 2, 1) x_val = np.array(x_val, dtype=np.float32) # The correct answer is that they are bright # So the attack must push the pixels off the edge y = np.zeros([100, 2]) y[:, 0] = 1.0 x = tf.placeholder(tf.float32, shape=(None, 2, 2, 1)) x_adv_p = self.attack.generate( x, y=y, batch_size=100, dx_min=-0.5, dx_max=0.5, n_dxs=3, dy_min=-0.5, dy_max=0.5, n_dys=3, angle_min=0, angle_max=0, n_angles=1, ) x_adv = self.sess.run(x_adv_p, {x: x_val}) old_labs = np.argmax(y, axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) print(np.mean(old_labs == new_labs)) self.assertTrue(np.mean(old_labs == new_labs) < 0.3) def test_keep_pixels_on_image(self): """Test that the attack does not push some pixels off the image""" x_val = np.random.rand(100, 2, 2, 1) x_val = np.array(x_val, dtype=np.float32) # The correct answer is that they are NOT bright # So the attack must NOT push the pixels off the edge y = np.zeros([100, 2]) y[:, 0] = 1.0 x = tf.placeholder(tf.float32, shape=(None, 2, 2, 1)) x_adv_p = self.attack.generate( x, y=y, batch_size=100, dx_min=-0.5, dx_max=0.5, n_dxs=3, dy_min=-0.5, dy_max=0.5, n_dys=3, angle_min=0, angle_max=0, n_angles=1, ) x_adv = self.sess.run(x_adv_p, {x: x_val}) old_labs = np.argmax(y, axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) print(np.mean(old_labs == new_labs)) self.assertTrue(np.mean(old_labs == new_labs) < 0.3) class TestHopSkipJumpAttack(CleverHansTest): """Tests for Test HopSkipJumpAttack""" def setUp(self): super(TestHopSkipJumpAttack, self).setUp() self.sess = tf.Session() self.model = SimpleModel() self.attack = HopSkipJumpAttack(self.model, sess=self.sess) def test_generate_np_untargeted_l2(self): x_val = np.random.rand(50, 2) x_val = np.array(x_val, dtype=np.float32) bapp_params = { "constraint": "l2", "stepsize_search": "geometric_progression", "num_iterations": 10, "verbose": True, } x_adv = self.attack.generate_np(x_val, **bapp_params) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_untargeted_linf(self): x_val = np.random.rand(50, 2) x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) # Requires input to have batchsize 1. x = tf.placeholder(tf.float32, [1, 2]) bapp_params = { "constraint": "linf", "stepsize_search": "grid_search", "num_iterations": 10, "verbose": True, } x_adv_p = self.attack.generate(x, **bapp_params) self.assertEqual(x_adv_p.shape, [1, 2]) x_adv = [] for single_x_val in x_val: single_x_adv = self.sess.run(x_adv_p, {x: np.expand_dims(single_x_val, 0)}) x_adv.append(single_x_adv) x_adv = np.concatenate(x_adv, axis=0) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(orig_labs == new_labs) < 0.1) def test_generate_np_targeted_linf(self): x_val = np.random.rand(200, 2) x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) x_val_pos = x_val[orig_labs == 1] x_val_neg = x_val[orig_labs == 0] x_val_under_attack = np.concatenate((x_val_pos[:25], x_val_neg[:25]), axis=0) y_target = np.eye(2)[np.concatenate((np.zeros(25), np.ones(25))).astype(int)] image_target = np.concatenate((x_val_neg[25:50], x_val_pos[25:50]), axis=0) bapp_params = { "constraint": "linf", "stepsize_search": "geometric_progression", "num_iterations": 10, "verbose": True, "y_target": y_target, "image_target": image_target, } x_adv = self.attack.generate_np(x_val_under_attack, **bapp_params) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(np.argmax(y_target, axis=1) == new_labs) > 0.9) def test_generate_targeted_l2(self): # Create data in numpy arrays. x_val = np.random.rand(200, 2) x_val = np.array(x_val, dtype=np.float32) orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1) x_val_pos = x_val[orig_labs == 1] x_val_neg = x_val[orig_labs == 0] x_val_under_attack = np.concatenate((x_val_pos[:25], x_val_neg[:25]), axis=0) y_target = np.eye(2)[np.concatenate((np.zeros(25), np.ones(25))).astype(int)] image_target = np.concatenate((x_val_neg[25:50], x_val_pos[25:50]), axis=0) # Create placeholders. # Require input has batchsize 1. x = tf.placeholder(tf.float32, [1, 2]) y_target_ph = tf.placeholder(tf.float32, [1, 2]) image_target_ph = tf.placeholder(tf.float32, [1, 2]) # Create graph. bapp_params = { "constraint": "l2", "stepsize_search": "grid_search", "num_iterations": 10, "verbose": True, "y_target": y_target_ph, "image_target": image_target_ph, } x_adv_p = self.attack.generate(x, **bapp_params) self.assertEqual(x_adv_p.shape, [1, 2]) # Generate adversarial examples. x_adv = [] for i, single_x_val in enumerate(x_val_under_attack): print(image_target.shape, y_target.shape) single_x_adv = self.sess.run( x_adv_p, { x: np.expand_dims(single_x_val, 0), y_target_ph: np.expand_dims(y_target[i], 0), image_target_ph: np.expand_dims(image_target[i], 0), }, ) x_adv.append(single_x_adv) x_adv = np.concatenate(x_adv, axis=0) new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1) self.assertTrue(np.mean(np.argmax(y_target, axis=1) == new_labs) > 0.9) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_attacks_tf.py ================================================ """Tests of cleverhans.attacks_tf """ # pylint: disable=missing-docstring from functools import partial import unittest import numpy as np import tensorflow as tf from cleverhans.devtools.checks import CleverHansTest from cleverhans.attacks_tf import ( fgm, pgd_attack, UnrolledAdam, UnrolledGradientDescent, parallel_apply_transformations, ) from cleverhans.devtools.mocks import random_feed_dict from cleverhans.model import Model class SimpleModel(Model): """ A very simple neural network """ def __init__(self, scope="simple", nb_classes=2, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): w1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.as_dtype(x.dtype)) w2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.as_dtype(x.dtype)) h1 = tf.nn.sigmoid(tf.matmul(x, w1)) res = tf.matmul(h1, w2) return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)} class TestAttackTF(CleverHansTest): def setUp(self): super(TestAttackTF, self).setUp() self.sess = tf.Session() self.model = SimpleModel() def test_fgm_gradient_max(self): input_dim = 2 nb_classes = 3 batch_size = 4 rng = np.random.RandomState([2017, 8, 23]) x = tf.placeholder(tf.float32, [batch_size, input_dim]) weights = tf.placeholder(tf.float32, [input_dim, nb_classes]) logits = tf.matmul(x, weights) probs = tf.nn.softmax(logits) adv_x = fgm(x, probs) random_example = rng.randint(batch_size) random_feature = rng.randint(input_dim) output = tf.slice(adv_x, [random_example, random_feature], [1, 1]) (dx,) = tf.gradients(output, x) # The following line catches GitHub issue #243 self.assertIsNotNone(dx) dx = self.sess.run(dx, feed_dict=random_feed_dict(rng, [x, weights])) ground_truth = np.zeros((batch_size, input_dim)) ground_truth[random_example, random_feature] = 1.0 self.assertClose(dx, ground_truth) def helper_pgd_attack( self, unrolled_optimizer, targeted, nb_iters=20, epsilon=0.5, clip_min=-5.0, clip_max=5.0, assert_threshold=0.5, ): def loss_fn(input_image, label, targeted): res = self.model.fprop(input_image) logits = res[self.model.O_LOGITS] multiplier = 1.0 if targeted else -1.0 return multiplier * tf.nn.sparse_softmax_cross_entropy_with_logits( labels=label, logits=logits ) x_val_ph = tf.placeholder(tf.float32, shape=[100, 2]) x_val = np.random.randn(100, 2).astype(np.float32) init_model_output = self.model.fprop(x_val_ph) init_model_logits = init_model_output[self.model.O_LOGITS] if targeted: labels = np.random.random_integers(0, 1, size=(100,)) else: labels = tf.stop_gradient(tf.argmax(init_model_logits, axis=1)) def _project_perturbation( perturbation, epsilon, input_image, clip_min, clip_max ): clipped_perturbation = tf.clip_by_value(perturbation, -epsilon, epsilon) new_image = tf.clip_by_value( input_image + clipped_perturbation, clip_min, clip_max ) return new_image - input_image x_adv = pgd_attack( loss_fn=partial(loss_fn, targeted=targeted), input_image=x_val_ph, label=labels, epsilon=epsilon, num_steps=nb_iters, optimizer=unrolled_optimizer, project_perturbation=_project_perturbation, clip_min=clip_min, clip_max=clip_max, ) final_model_output = self.model.fprop(x_adv) final_model_logits = final_model_output[self.model.O_LOGITS] if not targeted: logits1, logits2 = self.sess.run( [init_model_logits, final_model_logits], feed_dict={x_val_ph: x_val} ) preds1 = np.argmax(logits1, axis=1) preds2 = np.argmax(logits2, axis=1) self.assertTrue( np.mean(preds1 == preds2) < assert_threshold, np.mean(preds1 == preds2) ) else: logits_adv = self.sess.run(final_model_logits, feed_dict={x_val_ph: x_val}) preds_adv = np.argmax(logits_adv, axis=1) self.assertTrue(np.mean(labels == preds_adv) > assert_threshold) def test_pgd_untargeted_attack_with_adam_optimizer(self): unrolled_optimizer = UnrolledAdam(lr=0.1) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=False, epsilon=0.5, nb_iters=20, clip_min=-10.0, clip_max=10.0, assert_threshold=0.7, ) def test_stronger_pgd_untargeted_attack_with_adam_optimizer(self): unrolled_optimizer = UnrolledAdam(lr=0.1) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=False, epsilon=5.0, nb_iters=100, clip_min=-10.0, clip_max=10.0, assert_threshold=0.1, ) def test_pgd_targeted_attack_with_adam_optimizer(self): unrolled_optimizer = UnrolledAdam(lr=0.1) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=True, epsilon=0.5, nb_iters=20, clip_min=-10.0, clip_max=10.0, assert_threshold=0.7, ) def test_stronger_pgd_targeted_attack_with_adam_optimizer(self): unrolled_optimizer = UnrolledAdam(lr=0.1) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=True, epsilon=5.0, nb_iters=100, clip_min=-10.0, clip_max=10.0, assert_threshold=0.9, ) def test_pgd_untargeted_attack_with_sgd_optimizer(self): unrolled_optimizer = UnrolledGradientDescent(lr=1000.0) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=False, epsilon=0.5, nb_iters=20, clip_min=-10.0, clip_max=10.0, assert_threshold=0.6, ) def test_stronger_pgd_untargeted_attack_with_sgd_optimizer(self): unrolled_optimizer = UnrolledGradientDescent(lr=1000.0) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=False, epsilon=5.0, nb_iters=100, clip_min=-10.0, clip_max=10.0, assert_threshold=0.1, ) def test_pgd_targeted_attack_with_sgd_optimizer(self): unrolled_optimizer = UnrolledGradientDescent(lr=1000.0) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=True, epsilon=0.5, nb_iters=20, clip_min=-10.0, clip_max=10.0, assert_threshold=0.6, ) def test_stronger_pgd_targeted_attack_with_sgd_optimizer(self): unrolled_optimizer = UnrolledGradientDescent(lr=1000.0) self.helper_pgd_attack( unrolled_optimizer=unrolled_optimizer, targeted=True, epsilon=5.0, nb_iters=100, clip_min=-10.0, clip_max=10.0, assert_threshold=0.9, ) @unittest.skip("This test requires human inspection of the images") def test_parallel_apply(self): def _save_image_to_png(image_np, filename): from PIL import Image import os dirname = os.path.dirname(filename) if not os.path.exists(dirname): os.makedirs(dirname) if image_np.shape[-1] == 3: img = Image.fromarray(np.uint8(image_np * 255.0), "RGB") else: img = Image.fromarray(np.uint8(image_np[:, :, 0] * 255.0), "L") img.save(filename) x = tf.ones([3, 200, 200, 3]) transforms = [ [0.2, 0, 20], [0, 0, 0], # [-0.2, 0, 20], # [-0.4, 0, 20], ] transformed_ims = parallel_apply_transformations( x, transforms, black_border_size=30 ) worst_sample_idx = tf.convert_to_tensor([0, 1, 1]) batch_size = tf.shape(x)[0] keys = tf.stack( [tf.range(batch_size, dtype=tf.int32), tf.cast(worst_sample_idx, tf.int32)], axis=1, ) transformed_ims_bshwc = tf.einsum("sbhwc->bshwc", transformed_ims) after_lookup = tf.gather_nd(transformed_ims_bshwc, keys) # BHWC with tf.Session() as sess: img_batch_np = sess.run(after_lookup)[:, :, :, :] for i, img in enumerate(img_batch_np): filename = "/tmp/test_image%s.png" % (i) _save_image_to_png(img, filename) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_confidence_report.py ================================================ """ Tests for cleverhans.confidence_report """ import numpy as np import tensorflow as tf from cleverhans.attacks import Noise from cleverhans.attack_bundling import AttackConfig from cleverhans.attack_bundling import bundle_attacks from cleverhans.attack_bundling import Misclassify from cleverhans.confidence_report import ConfidenceReport from cleverhans.confidence_report import ConfidenceReportEntry from cleverhans.confidence_report import make_confidence_report_bundled from cleverhans.devtools.mocks import SimpleDataset from cleverhans.picklable_model import MLP, Linear from cleverhans import serial def test_confidence_report(): """ Test that we can make a confidence report, put an entry in it, and get that entry back out """ report = ConfidenceReport() entry = ConfidenceReportEntry( correctness=np.array([True, False]), confidence=np.array([0.9, 0.1]) ) report["clean"] = entry assert report["clean"] is entry def test_make_confidence_report_bundled(): """ A very simple test that just makes sure make_confidence_report_bundled can run without crashing """ sess = tf.Session() try: nb_classes = 3 nb_features = 2 batch_size = 5 nb_test_examples = batch_size * 2 layer = Linear(num_hid=nb_classes) model = MLP(layers=[layer], input_shape=(None, nb_features)) dataset = SimpleDataset(test_end=nb_test_examples, nb_classes=nb_classes) model.dataset_factory = dataset.get_factory() filepath = ".test_model.joblib" with sess.as_default(): sess.run(tf.global_variables_initializer()) serial.save(filepath, model) def recipe( sess, model, x, y, nb_classes, eps, clip_min, clip_max, eps_iter, nb_iter, report_path, eps_iter_small, batch_size, ): """ Mock recipe that just runs the Noise attack so the test runs fast """ attack_configs = [AttackConfig(Noise(model, sess), {"eps": eps})] new_work_goal = {config: 1 for config in attack_configs} goals = [Misclassify(new_work_goal=new_work_goal)] bundle_attacks( sess, model, x, y, attack_configs, goals, report_path, attack_batch_size=batch_size, eval_batch_size=batch_size, ) make_confidence_report_bundled( filepath, test_end=nb_test_examples, recipe=recipe, base_eps=0.1, base_eps_iter=0.01, batch_size=batch_size, ) finally: sess.close() def test_save_load_confidence_report(): """ Test that a confidence report can be loaded and saved. """ report = ConfidenceReport() num_examples = 2 clean_correctness = np.zeros((num_examples,), dtype=np.bool) clean_confidence = np.zeros((num_examples,), dtype=np.float32) adv_correctness = clean_correctness.copy() adv_confidence = clean_confidence.copy() report["clean"] = ConfidenceReportEntry(clean_correctness, clean_confidence) report["adv"] = ConfidenceReportEntry(adv_correctness, adv_confidence) report.completed = True filepath = ".test_confidence_report.joblib" serial.save(filepath, report) report = serial.load(filepath) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_dataset.py ================================================ """Tests for cleverhans.dataset""" from cleverhans.dataset import Dataset from cleverhans.devtools.checks import CleverHansTest class LightweightDataset(Dataset): """ A dataset that does not actually load any data so it is cheap to run in tests. """ class TestDataset(CleverHansTest): """ Tests for the Dataset class """ def test_factory(self): """test_factory: Test that dataset->factory->dataset preserves type""" d1 = LightweightDataset() factory = d1.get_factory() d2 = factory() self.assertTrue(type(d1) is type(d2)) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_defenses.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import unittest import numpy as np import tensorflow as tf from cleverhans.attacks import FastGradientMethod from cleverhans.loss import CrossEntropy, MixUp, FeaturePairing from cleverhans.devtools.checks import CleverHansTest from cleverhans.model import Model class SimpleModel(Model): """ A very simple neural network """ def __init__(self, scope="simple", nb_classes=2, **kwargs): del kwargs Model.__init__(self, scope, nb_classes, locals()) def fprop(self, x, **kwargs): del kwargs with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE): w1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.as_dtype(x.dtype)) w2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.as_dtype(x.dtype)) h1 = tf.nn.sigmoid(tf.matmul(x, w1)) res = tf.matmul(h1, w2) return { self.O_FEATURES: [h1, res], self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res), } class TestDefenses(CleverHansTest): def setUp(self): super(TestDefenses, self).setUp() self.model = SimpleModel() self.vx = np.array(((1, -1), (-1, 1)), "f") self.vy = np.array(((1, 0), (0, 1)), "f") self.x = tf.placeholder(tf.float32, [None, 2], "x") self.y = tf.placeholder(tf.float32, [None, 2], "y") def test_xe(self): loss = CrossEntropy(self.model, smoothing=0.0) l = loss.fprop(self.x, self.y) with tf.Session() as sess: vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) self.assertClose(vl1, sum([2.210599660, 1.53666997]) / 2.0, atol=1e-6) self.assertClose(vl2, sum([2.210599660, 1.53666997]) / 2.0, atol=1e-6) def test_xe_smoothing(self): loss = CrossEntropy(self.model, smoothing=0.1) l = loss.fprop(self.x, self.y) with tf.Session() as sess: vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) self.assertClose(vl1, sum([2.10587597, 1.47194624]) / 2.0, atol=1e-6) self.assertClose(vl2, sum([2.10587597, 1.47194624]) / 2.0, atol=1e-6) def test_mixup(self): def eval_loss(l, count=1000): with tf.Session() as sess: vl = np.zeros(2, "f") for _ in range(count): vl += sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) return vl / count loss = MixUp(self.model, beta=1.0) vl = eval_loss(loss.fprop(self.x, self.y)) self.assertClose(vl, [1.23, 1.23], atol=5e-2) loss = MixUp(self.model, beta=0.5) vl = eval_loss(loss.fprop(self.x, self.y)) self.assertClose(vl, [1.40, 1.40], atol=5e-2) def test_feature_pairing(self): sess = tf.Session() fgsm = FastGradientMethod(self.model, sess=sess) def attack(x): return fgsm.generate(x) loss = FeaturePairing(self.model, weight=0.1, attack=attack) l = loss.fprop(self.x, self.y) vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) self.assertClose(vl1, sum([4.296023369, 2.963884830]) / 2.0, atol=1e-6) self.assertClose(vl2, sum([4.296023369, 2.963884830]) / 2.0, atol=1e-6) loss = FeaturePairing(self.model, weight=10.0, attack=attack) l = loss.fprop(self.x, self.y) vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy}) self.assertClose(vl1, sum([4.333082676, 3.00094414]) / 2.0, atol=1e-6) self.assertClose(vl2, sum([4.333082676, 3.00094414]) / 2.0, atol=1e-6) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_evaluation.py ================================================ """Tests for cleverhans.evaluation""" from cleverhans.devtools.checks import CleverHansTest from cleverhans.evaluation import _CorrectFactory from cleverhans.model import Model class TestEvaluation(CleverHansTest): """Tests for cleverhans.evaluation""" def test_cache(self): """test_cache: Test that _CorrectFactory can be cached""" model = Model() factory_1 = _CorrectFactory(model) factory_2 = _CorrectFactory(model) cache = {} cache[factory_1] = True self.assertTrue(factory_2 in cache) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_mnist_blackbox.py ================================================ # pylint: disable=missing-docstring import unittest import numpy as np # pylint bug on next line from tensorflow.python.client import device_lib # pylint: disable=no-name-in-module from cleverhans.devtools.checks import CleverHansTest HAS_GPU = "GPU" in {x.device_type for x in device_lib.list_local_devices()} class TestMNISTBlackboxF(CleverHansTest): def test_mnist_blackbox(self): import tensorflow as tf from cleverhans_tutorials import mnist_blackbox # Run the MNIST tutorial on a dataset of reduced size, reduced number # of data augmentations, increased substitute holdout for faster runtime. mnist_blackbox_args = { "train_start": 0, "train_end": 5000, "test_start": 0, "test_end": 2000, "data_aug": 1, "holdout": 1000, "nb_epochs": 2, "nb_epochs_s": 6, } g = tf.Graph() with g.as_default(): np.random.seed(42) report = mnist_blackbox.mnist_blackbox(**mnist_blackbox_args) # Check accuracy values contained in the AccuracyReport object self.assertTrue(report["bbox"] > 0.7, report["bbox"]) self.assertTrue(report["sub"] > 0.7, report["sub"]) self.assertTrue( report["bbox_on_sub_adv_ex"] < 0.3, report["bbox_on_sub_adv_ex"] ) g = tf.Graph() with g.as_default(): np.random.seed(42) report_2 = mnist_blackbox.mnist_blackbox(**mnist_blackbox_args) atol_fac = 1e-2 if HAS_GPU else 1e-6 self.assertClose(report["bbox"], report_2["bbox"], atol=atol_fac * 1) self.assertClose(report["sub"], report_2["sub"], atol=atol_fac * 1) self.assertClose( report["bbox_on_sub_adv_ex"], report_2["bbox_on_sub_adv_ex"], atol=atol_fac * 1, ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_cw.py ================================================ # pylint: disable=missing-docstring import unittest import numpy as np from cleverhans.devtools.checks import CleverHansTest class TestMNISTTutorialCW(CleverHansTest): def test_mnist_tutorial_cw(self): import tensorflow as tf from cleverhans_tutorials import mnist_tutorial_cw # Run the MNIST tutorial on a dataset of reduced size # and disable visualization. cw_tutorial_args = { "train_start": 0, "train_end": 10000, "test_start": 0, "test_end": 1666, "viz_enabled": False, } g = tf.Graph() with g.as_default(): np.random.seed(42) report = mnist_tutorial_cw.mnist_tutorial_cw(**cw_tutorial_args) # Check accuracy values contained in the AccuracyReport object self.assertGreater(report.clean_train_clean_eval, 0.85) self.assertEqual(report.clean_train_adv_eval, 0.00) # There is no adversarial training in the CW tutorial self.assertEqual(report.adv_train_clean_eval, 0.0) self.assertEqual(report.adv_train_adv_eval, 0.0) g = tf.Graph() with g.as_default(): np.random.seed(42) report_2 = mnist_tutorial_cw.mnist_tutorial_cw(**cw_tutorial_args) atol_fac = 1e-6 self.assertClose( report.train_clean_train_clean_eval, report_2.train_clean_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_clean_train_adv_eval, report_2.train_clean_train_adv_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_clean_eval, report_2.train_adv_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_adv_eval, report_2.train_adv_train_adv_eval, atol=atol_fac * 1, ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_jsma.py ================================================ # pylint: disable=missing-docstring import unittest import numpy as np from cleverhans.devtools.checks import CleverHansTest class TestMNISTTutorialJSMA(CleverHansTest): def test_mnist_tutorial_jsma(self): import tensorflow as tf from cleverhans_tutorials import mnist_tutorial_jsma # Run the MNIST tutorial on a dataset of reduced size # and disable visualization. jsma_tutorial_args = { "train_start": 0, "train_end": 1000, "test_start": 0, "test_end": 1666, "viz_enabled": False, "source_samples": 1, "nb_epochs": 2, } g = tf.Graph() with g.as_default(): np.random.seed(42) report = mnist_tutorial_jsma.mnist_tutorial_jsma(**jsma_tutorial_args) # Check accuracy values contained in the AccuracyReport object # We already have JSMA tests in test_attacks.py, so just sanity # check the values here. self.assertTrue(report.clean_train_clean_eval > 0.65) self.assertTrue(report.clean_train_adv_eval < 0.25) # There is no adversarial training in the JSMA tutorial self.assertTrue(report.adv_train_clean_eval == 0.0) self.assertTrue(report.adv_train_adv_eval == 0.0) g = tf.Graph() with g.as_default(): np.random.seed(42) report_2 = mnist_tutorial_jsma.mnist_tutorial_jsma(**jsma_tutorial_args) atol_fac = 1e-6 self.assertClose( report.train_clean_train_clean_eval, report_2.train_clean_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_clean_train_adv_eval, report_2.train_clean_train_adv_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_clean_eval, report_2.train_adv_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_adv_eval, report_2.train_adv_train_adv_eval, atol=atol_fac * 1, ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_keras.py ================================================ # pylint: disable=missing-docstring import unittest import numpy as np # pylint bug on next line from tensorflow.python.client import device_lib # pylint: disable=no-name-in-module from cleverhans.devtools.checks import CleverHansTest HAS_GPU = "GPU" in {x.device_type for x in device_lib.list_local_devices()} class TestMNISTTutorialKeras(CleverHansTest): def test_mnist_tutorial_keras(self): import tensorflow as tf from cleverhans_tutorials import mnist_tutorial_keras # Run the MNIST tutorial on a dataset of reduced size test_dataset_indices = { "train_start": 0, "train_end": 5000, "test_start": 0, "test_end": 333, "nb_epochs": 2, "testing": True, } g = tf.Graph() with g.as_default(): np.random.seed(42) report = mnist_tutorial_keras.mnist_tutorial(**test_dataset_indices) # Check accuracy values contained in the AccuracyReport object self.assertTrue(report.train_clean_train_clean_eval > 0.90) self.assertTrue(report.train_clean_train_adv_eval < 0.05) self.assertTrue(report.train_adv_train_clean_eval > 0.90) self.assertTrue(report.train_adv_train_adv_eval > 0.30) atol_fac = 5e-2 if HAS_GPU else 1e-6 g = tf.Graph() with g.as_default(): np.random.seed(42) report_2 = mnist_tutorial_keras.mnist_tutorial(**test_dataset_indices) self.assertClose( report.train_clean_train_clean_eval, report_2.train_clean_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_clean_train_adv_eval, report_2.train_clean_train_adv_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_clean_eval, report_2.train_adv_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_adv_eval, report_2.train_adv_train_adv_eval, atol=atol_fac * 1, ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_keras_tf.py ================================================ # pylint: disable=missing-docstring import unittest import numpy as np # pylint bug on next line from tensorflow.python.client import device_lib # pylint: disable=no-name-in-module from cleverhans.devtools.checks import CleverHansTest HAS_GPU = "GPU" in {x.device_type for x in device_lib.list_local_devices()} class TestMNISTTutorialKerasTF(CleverHansTest): def test_mnist_tutorial_keras_tf(self): import tensorflow as tf from cleverhans_tutorials import mnist_tutorial_keras_tf # Run the MNIST tutorial on a dataset of reduced size test_dataset_indices = { "train_start": 0, "train_end": 5000, "test_start": 0, "test_end": 333, "nb_epochs": 3, "train_dir": "/tmp", "filename": "mnist.ckpt", "load_model": False, "testing": True, } g = tf.Graph() with g.as_default(): np.random.seed(42) report = mnist_tutorial_keras_tf.mnist_tutorial(**test_dataset_indices) # Check accuracy values contained in the AccuracyReport object self.assertTrue(report.train_clean_train_clean_eval > 0.90) self.assertTrue(report.train_clean_train_adv_eval < 0.05) self.assertTrue(report.train_adv_train_clean_eval > 0.90) self.assertTrue(report.train_adv_train_adv_eval > 0.30) atol_fac = 2e-2 if HAS_GPU else 1e-6 g = tf.Graph() with g.as_default(): np.random.seed(42) report_2 = mnist_tutorial_keras_tf.mnist_tutorial(**test_dataset_indices) self.assertClose( report.train_clean_train_clean_eval, report_2.train_clean_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_clean_train_adv_eval, report_2.train_clean_train_adv_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_clean_eval, report_2.train_adv_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_adv_eval, report_2.train_adv_train_adv_eval, atol=atol_fac * 1, ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_tf.py ================================================ # pylint: disable=missing-docstring import unittest import numpy as np # pylint bug on next line from tensorflow.python.client import device_lib # pylint: disable=no-name-in-module from cleverhans.devtools.checks import CleverHansTest HAS_GPU = "GPU" in {x.device_type for x in device_lib.list_local_devices()} class TestMNISTTutorialTF(CleverHansTest): def test_mnist_tutorial_tf(self): import tensorflow as tf from cleverhans_tutorials import mnist_tutorial_tf # Run the MNIST tutorial on a dataset of reduced size test_dataset_indices = { "train_start": 0, "train_end": 5000, "test_start": 0, "test_end": 333, "nb_epochs": 2, "testing": True, } g = tf.Graph() with g.as_default(): np.random.seed(42) report = mnist_tutorial_tf.mnist_tutorial( num_threads=1, **test_dataset_indices ) # Check accuracy values contained in the AccuracyReport object self.assertGreater(report.train_clean_train_clean_eval, 0.97) self.assertLess(report.train_clean_train_adv_eval, 0.05) self.assertGreater(report.train_adv_train_clean_eval, 0.93) self.assertGreater(report.train_adv_train_adv_eval, 0.4) # Check that the tutorial is deterministic (seeded properly) atol_fac = 2e-2 if HAS_GPU else 1e-6 g = tf.Graph() with g.as_default(): np.random.seed(42) report_2 = mnist_tutorial_tf.mnist_tutorial( num_threads=1, **test_dataset_indices ) self.assertClose( report.train_clean_train_clean_eval, report_2.train_clean_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_clean_train_adv_eval, report_2.train_clean_train_adv_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_clean_eval, report_2.train_adv_train_clean_eval, atol=atol_fac * 1, ) self.assertClose( report.train_adv_train_adv_eval, report_2.train_adv_train_adv_eval, atol=atol_fac * 1, ) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_model.py ================================================ """ Tests for cleverhans.model """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import unittest from cleverhans.model import Model, CallableModelWrapper class TestModelClass(unittest.TestCase): """ Tests for cleverhans.model.Model """ # pylint: disable=missing-docstring def test_get_logits(self): # Define empty model model = Model("model", 10, {}) x = [] # Exception is thrown when `get_logits` not implemented with self.assertRaises(Exception) as context: model.get_logits(x) self.assertTrue(context.exception) def test_get_probs(self): # Define empty model model = Model("model", 10, {}) x = [] # Exception is thrown when `get_probs` not implemented with self.assertRaises(Exception) as context: model.get_probs(x) self.assertTrue(context.exception) def test_fprop(self): # Define empty model model = Model("model", 10, {}) x = [] # Exception is thrown when `fprop` not implemented with self.assertRaises(Exception) as context: model.fprop(x) self.assertTrue(context.exception) class TestCallableModelWrapperInitArguments(unittest.TestCase): """ Tests for CallableModelWrapper's init argument """ def test_output_layer(self): """ Test that the CallableModelWrapper can be constructed without causing Exceptions """ def model(**kwargs): """Mock model""" del kwargs return True # The following two calls should not raise Exceptions CallableModelWrapper(model, "probs") CallableModelWrapper(model, "logits") if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_picklable_model.py ================================================ """Tests for cleverhans.picklable_model""" import numpy as np import tensorflow as tf from cleverhans.devtools.checks import CleverHansTest from cleverhans.picklable_model import Dropout from cleverhans.picklable_model import MLP from cleverhans.picklable_model import PerImageStandardize class TestPerImageStandardize(CleverHansTest): """ Tests for the PerImageStandardize class. """ def setUp(self): """ Set up session and build model graph """ super(TestPerImageStandardize, self).setUp() self.input_shape = (128, 32, 32, 3) self.sess = tf.Session() self.model = MLP( input_shape=self.input_shape, layers=[PerImageStandardize(name="output")] ) self.x = tf.placeholder(shape=self.input_shape, dtype=tf.float32) self.y = self.model.get_layer(self.x, "output") self.y_true = tf.map_fn(tf.image.per_image_standardization, self.x) def run_and_check_output(self, x): """ Make sure y and y_true evaluate to the same value """ y, y_true = self.sess.run([self.y, self.y_true], feed_dict={self.x: x}) self.assertClose(y, y_true) def test_random_inputs(self): """ Test on random inputs """ x = np.random.rand(*self.input_shape) self.run_and_check_output(x) def test_ones_inputs(self): """ Test with input set to all ones. """ x = np.ones(self.input_shape) self.run_and_check_output(x) class TestDropout(CleverHansTest): """ Tests for the Dropout class """ def test_no_drop(self): """test_no_drop: Make sure dropout does nothing by default (so it does not cause stochasticity at test time)""" model = MLP(input_shape=[1, 1], layers=[Dropout(name="output")]) x = tf.constant([[1]], dtype=tf.float32) y = model.get_layer(x, "output") sess = tf.Session() # Do multiple runs because dropout is stochastic for _ in range(10): y_value = sess.run(y) self.assertClose(y_value, 1.0) def test_drop(self): """test_drop: Make sure dropout is activated successfully""" # We would like to configure the test to deterministically drop, # so that the test does not need to use multiple runs. # However, tf.nn.dropout divides by include_prob, so zero or # infinitesimal include_prob causes NaNs. # 1e-8 does not cause NaNs and shouldn't be a significant source # of test flakiness relative to dependency downloads failing, etc. model = MLP( input_shape=[1, 1], layers=[Dropout(name="output", include_prob=1e-8)] ) x = tf.constant([[1]], dtype=tf.float32) y = model.get_layer(x, "output", dropout=True) sess = tf.Session() y_value = sess.run(y) # Subject to very rare random failure because include_prob is not exact 0 self.assertClose(y_value, 0.0) def test_override(self): """test_override: Make sure dropout_dict changes dropout probabilities successfully.""" # We would like to configure the test to deterministically drop, # so that the test does not need to use multiple runs. # However, tf.nn.dropout divides by include_prob, so zero or # infinitesimal include_prob causes NaNs. # For this test, random failure to drop will not cause the test to fail. # The stochastic version should not even run if everything is working # right. model = MLP( input_shape=[1, 1], layers=[Dropout(name="output", include_prob=1e-8)] ) x = tf.constant([[1]], dtype=tf.float32) dropout_dict = {"output": 1.0} y = model.get_layer(x, "output", dropout=True, dropout_dict=dropout_dict) sess = tf.Session() y_value = sess.run(y) self.assertClose(y_value, 1.0) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_projected_gradient_descent.py ================================================ """Tests for the ProjectGradientDescent attack """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from nose.tools import assert_raises import tensorflow as tf from cleverhans.attacks import ProjectedGradientDescent from cleverhans.model import Model def test_no_logits(): """test_no_logits: Check that a model without logits causes an error""" batch_size = 2 nb_classes = 3 class NoLogitsModel(Model): """ A model that neither defines logits nor makes it possible to find logits by inspecting the inputs to a softmax op. """ def fprop(self, x, **kwargs): return {"probs": tf.ones((batch_size, nb_classes)) / nb_classes} model = NoLogitsModel() sess = tf.Session() attack = ProjectedGradientDescent(model, sess=sess) x = tf.ones((batch_size, 3)) assert_raises(NotImplementedError, attack.generate, x) def test_rejects_callable(): """test_rejects_callable: Check that callables are not accepted as models""" def model(x): """Mock model""" return x sess = tf.Session() assert_raises(TypeError, ProjectedGradientDescent, model, sess) if __name__ == "__main__": test_rejects_callable() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_serial.py ================================================ """Tests for cleverhans.serial""" import numpy as np import tensorflow as tf from cleverhans.devtools.checks import CleverHansTest from cleverhans.serial import PicklableVariable from cleverhans.serial import load from cleverhans.serial import save class TestSerial(CleverHansTest): """ Tests for cleverhans.serial """ def test_save_and_load_var(self): """test_save_and_load_var: Test that we can save and load a PicklableVariable with joblib """ sess = tf.Session() with sess.as_default(): x = np.ones(1) xv = PicklableVariable(x) xv.var.initializer.run() save("/tmp/var.joblib", xv) sess.run(tf.assign(xv.var, np.ones(1) * 2)) new_xv = load("/tmp/var.joblib") self.assertClose(sess.run(xv.var), np.ones(1) * 2) self.assertClose(sess.run(new_xv.var), np.ones(1)) ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_utils.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import unittest import numpy as np from cleverhans import utils from cleverhans.utils_keras import cnn_model from cleverhans.utils_keras import KerasModelWrapper class TestUtils(unittest.TestCase): def test_to_categorical_with_nb_classes_arg(self): vec = np.asarray([0]) cat = np.asarray([[1, 0, 0]]) self.assertTrue(np.all(utils.to_categorical(vec, 3) == cat)) def test_random_targets_vector(self): # Test utils.random_targets with a vector of labels as the input gt_labels = np.asarray([0, 1, 2, 3]) rt = utils.random_targets(gt_labels, 5) # Make sure random_targets returns a one-hot encoded labels self.assertTrue(len(rt.shape) == 2) rt_labels = np.argmax(rt, axis=1) # Make sure all labels are different from the correct labels self.assertTrue(np.all(rt_labels != gt_labels)) def test_random_targets_one_hot(self): # Test utils.random_targets with one-hot encoded labels as the input gt = np.asarray( [[0, 0, 1, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 1, 0], [1, 0, 0, 0, 0]] ) gt_labels = np.argmax(gt, axis=1) rt = utils.random_targets(gt, 5) # Make sure random_targets returns a one-hot encoded labels self.assertTrue(len(rt.shape) == 2) rt_labels = np.argmax(rt, axis=1) # Make sure all labels are different from the correct labels self.assertTrue(np.all(rt_labels != gt_labels)) def test_random_targets_one_hot_single_label(self): # Test utils.random_targets with a single one-hot encoded label gt = np.asarray([0, 0, 1, 0, 0]) gt = gt.reshape((1, 5)) gt_labels = np.argmax(gt, axis=1) rt = utils.random_targets(gt, 5) # Make sure random_targets returns a one-hot encoded labels self.assertTrue(len(rt.shape) == 2) rt_labels = np.argmax(rt, axis=1) # Make sure all labels are different from the correct labels self.assertTrue(np.all(rt_labels != gt_labels)) def test_other_classes_neg_class_ind(self): with self.assertRaises(Exception) as context: utils.other_classes(10, -1) self.assertTrue(context.exception) def test_other_classes_invalid_class_ind(self): with self.assertRaises(Exception) as context: utils.other_classes(5, 8) self.assertTrue(context.exception) def test_other_classes_return_val(self): res = utils.other_classes(5, 2) res_expected = [0, 1, 3, 4] self.assertTrue(res == res_expected) def test_get_logits_over_interval(self): import tensorflow as tf model = cnn_model() wrap = KerasModelWrapper(model) fgsm_params = {"eps": 0.5} img = np.ones(shape=(28, 28, 1)) num_points = 21 with tf.Session() as sess: tf.global_variables_initializer().run() logits = utils.get_logits_over_interval( sess, wrap, img, fgsm_params, min_epsilon=-10, max_epsilon=10, num_points=num_points, ) self.assertEqual(logits.shape[0], num_points) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_utils_keras.py ================================================ # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import unittest import numpy as np # Weird imports / assignment because the normal import syntax doesn't work for tf.keras in tf 1.8 from tensorflow import keras # pylint:disable=wrong-import-position Sequential = keras.models.Sequential Dense = keras.layers.Dense Activation = keras.layers.Activation from cleverhans.utils_keras import KerasModelWrapper class TestKerasModelWrapper(unittest.TestCase): def setUp(self): import tensorflow as tf def dummy_model(): input_shape = (100,) return Sequential( [ Dense(20, name="l1", input_shape=input_shape), Dense(10, name="l2"), Activation("softmax", name="softmax"), ] ) self.sess = tf.Session() self.sess.as_default() self.model = dummy_model() def test_softmax_layer_name_is_softmax(self): model = KerasModelWrapper(self.model) softmax_name = model._get_softmax_name() self.assertEqual(softmax_name, "softmax") def test_logit_layer_name_is_logits(self): model = KerasModelWrapper(self.model) logits_name = model._get_logits_name() self.assertEqual(logits_name, "l2") def test_get_logits(self): import tensorflow as tf model = KerasModelWrapper(self.model) x = tf.placeholder(tf.float32, shape=(None, 100)) preds = model.get_probs(x) logits = model.get_logits(x) x_val = np.random.rand(2, 100) tf.global_variables_initializer().run(session=self.sess) p_val, logits = self.sess.run([preds, logits], feed_dict={x: x_val}) p_gt = np.exp(logits) / np.sum(np.exp(logits), axis=1, keepdims=True) self.assertTrue(np.allclose(p_val, p_gt, atol=1e-6)) def test_get_probs(self): import tensorflow as tf model = KerasModelWrapper(self.model) x = tf.placeholder(tf.float32, shape=(None, 100)) preds = model.get_probs(x) x_val = np.random.rand(2, 100) tf.global_variables_initializer().run(session=self.sess) p_val = self.sess.run(preds, feed_dict={x: x_val}) self.assertTrue(np.allclose(np.sum(p_val, axis=1), 1, atol=1e-6)) self.assertTrue(np.all(p_val >= 0)) self.assertTrue(np.all(p_val <= 1)) def test_get_layer_names(self): model = KerasModelWrapper(self.model) layer_names = model.get_layer_names() self.assertEqual(layer_names, ["l1", "l2", "softmax"]) def test_fprop(self): import tensorflow as tf model = KerasModelWrapper(self.model) x = tf.placeholder(tf.float32, shape=(None, 100)) out_dict = model.fprop(x) self.assertEqual(set(out_dict.keys()), set(["l1", "l2", "softmax"])) # Test the dimension of the hidden represetation self.assertEqual(int(out_dict["l1"].shape[1]), 20) self.assertEqual(int(out_dict["l2"].shape[1]), 10) # Test the caching x2 = tf.placeholder(tf.float32, shape=(None, 100)) out_dict2 = model.fprop(x2) self.assertEqual(set(out_dict2.keys()), set(["l1", "l2", "softmax"])) self.assertEqual(int(out_dict2["l1"].shape[1]), 20) if __name__ == "__main__": unittest.main() ================================================ FILE: cleverhans_v3.1.0/tests_tf/test_utils_tf.py ================================================ """Tests for cleverhans.utils_tf""" # pylint: disable=missing-docstring from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import numpy as np import tensorflow as tf from cleverhans import utils_tf from cleverhans.devtools.checks import CleverHansTest def numpy_kl_with_logits(p_logits, q_logits): def numpy_softmax(logits): logits -= np.max(logits, axis=1, keepdims=True) exp_logits = np.exp(logits) return exp_logits / np.sum(exp_logits, axis=1, keepdims=True) p = numpy_softmax(p_logits) log_p = p_logits - np.log(np.sum(np.exp(p_logits), axis=1, keepdims=True)) log_q = q_logits - np.log(np.sum(np.exp(q_logits), axis=1, keepdims=True)) return (p * (log_p - log_q)).sum(axis=1).mean() class TestUtilsTF(CleverHansTest): """Test class for utils_tf""" def setUp(self): super(TestUtilsTF, self).setUp() self.sess = tf.Session() def test_clip_by_value_numpy_dtype(self): # Test that it's possible to use clip_by_value while mixing numpy and tf clip_min = np.zeros((1,)) clip_max = tf.ones((1,)) x = tf.ones((1,)) # The point of this test is just to make sure the casting logic doesn't raise an exception utils_tf.clip_by_value(x, clip_min, clip_max) def test_l2_batch_normalize(self): x = tf.random_normal((100, 1000)) x_norm = self.sess.run(utils_tf.l2_batch_normalize(x)) self.assertClose(np.sum(x_norm ** 2, axis=1), 1, atol=1e-6) def test_kl_with_logits(self): p_logits = tf.placeholder(tf.float32, shape=(100, 20)) q_logits = tf.placeholder(tf.float32, shape=(100, 20)) p_logits_np = np.random.normal(0, 10, size=(100, 20)) q_logits_np = np.random.normal(0, 10, size=(100, 20)) kl_div_tf = self.sess.run( utils_tf.kl_with_logits(p_logits, q_logits), feed_dict={p_logits: p_logits_np, q_logits: q_logits_np}, ) kl_div_ref = numpy_kl_with_logits(p_logits_np, q_logits_np) self.assertClose(kl_div_ref, kl_div_tf) def test_clip_eta_norm_0(self): """test_clip_eta_norm_0: Test that `clip_eta` still works when the norm of `eta` is zero. This used to cause a divide by zero for ord 1 and ord 2.""" eta = tf.zeros((5, 3)) self.assertTrue(eta.dtype == tf.float32, eta.dtype) eps = 0.25 for ord_arg in [np.inf, 1, 2]: try: clipped = utils_tf.clip_eta(eta, ord_arg, eps) except NotImplementedError: # Don't raise SkipTest, it skips the rest of the for loop continue clipped = self.sess.run(clipped) self.assertTrue(not np.any(np.isinf(clipped))) self.assertTrue(not np.any(np.isnan(clipped)), (ord_arg, clipped)) def test_clip_eta_goldilocks(self): """test_clip_eta_goldilocks: Test that the clipping handles perturbations that are too small, just right, and too big correctly""" eta = tf.constant([[2.0], [3.0], [4.0]]) self.assertTrue(eta.dtype == tf.float32, eta.dtype) eps = 3.0 for ord_arg in [np.inf, 1, 2]: for sign in [-1.0, 1.0]: try: clipped = utils_tf.clip_eta(eta * sign, ord_arg, eps) except NotImplementedError: # Don't raise SkipTest, it skips the rest of the for loop continue clipped_value = self.sess.run(clipped) gold = sign * np.array([[2.0], [3.0], [3.0]]) self.assertClose(clipped_value, gold) (grad,) = tf.gradients(clipped, eta) grad_value = self.sess.run(grad) # Note: the second 1. is debatable (the left-sided derivative # and the right-sided derivative do not match, so formally # the derivative is not defined). This test makes sure that # we at least handle this oddity consistently across all the # argument values we test gold = sign * np.array([[1.0], [1.0], [0.0]]) self.assertClose(grad_value, gold) def test_zero_out_clipped_grads(self): """ test_zero_out_clipped_grads: Test that gradient gets zeroed out at positions where no progress can be made due to clipping. """ clip_min = -1 clip_max = 1 eta = tf.constant([[0.0], [-1.0], [1], [0.5], [-1], [1], [-0.9], [0.9]]) grad = tf.constant([[1.0], [-1.0], [1.0], [1.0], [1.0], [-1.0], [-1.0], [1.0]]) grad2 = self.sess.run( utils_tf.zero_out_clipped_grads(grad, eta, clip_min, clip_max) ) expected = np.asarray( [[1.0], [0.0], [0.0], [1.0], [1.0], [-1.0], [-1.0], [1.0]] ) self.assertClose(grad2, expected) def test_random_lp_vector_linf(self): """ test_random_lp_sample_linf: Test that `random_lp_vector` returns random samples in the l-inf ball. """ eps = 0.5 d = 10 r = self.sess.run(utils_tf.random_lp_vector((1000, d), np.infty, eps)) # test that some values are close to the boundaries self.assertLessEqual(np.max(r), eps) self.assertGreaterEqual(np.max(r), 0.95 * eps) self.assertGreaterEqual(np.min(r), -eps) self.assertLessEqual(np.min(r), -0.95 * eps) # test that the mean value of each feature is close to zero means = np.mean(r, axis=0) self.assertClose(means, np.zeros(d), atol=0.05) def test_random_lp_srandom_lp_vector_l1_l2(self): """ test_random_lp_vector_l1_l2: Test that `random_lp_vector` returns random samples in an l1 or l2 ball. """ eps = 0.5 d = 10 for ord in [1, 2]: r = self.sess.run(utils_tf.random_lp_vector((1000, d), ord, eps)) norms = np.linalg.norm(r, axis=-1, ord=ord) # test that some values are close to the boundaries self.assertLessEqual(np.max(norms), eps) self.assertGreaterEqual(np.max(norms), 0.95 * eps) # The expected norm is eps * Exp[U[0,1]^(1/d)] where U is a standard # uniform random variable and d is the dimension. The second term is # equal to the expected value of a Beta(d, 1) variable which is d/(d+1). expected_mean_norm = eps * (d / (d + 1.0)) self.assertClose(np.mean(norms), expected_mean_norm, atol=0.02) ================================================ FILE: defenses/README.md ================================================ # Defenses This folder contains implementations of defenses (as standalone scripts) in one of the three frameworks (JAX, PyTorch, TF2) or if it is framework independent then this code should go to the generic folder. Each defense should be implemented as a script that helps reproduce results reported in the paper introducing the defense. The goal is for these scripts to be authoritative ways to reproduce the defense. ================================================ FILE: defenses/generic/README.md ================================================ # Generic Defenses (framework independent) This folder contains implementations of defenses (as standalone scripts) that are implemented in a framework independent way (for example, it uses the numpy library only or can handle support for all major deep learning libraries). ================================================ FILE: defenses/generic/__init__.py ================================================ ================================================ FILE: defenses/jax/README.md ================================================ # Defenses implemented with JAX ================================================ FILE: defenses/tf2/README.md ================================================ # Defenses implemented with TensorFlow 2 ================================================ FILE: defenses/torch/README.md ================================================ # Defenses implemented with PyTorch ================================================ FILE: defenses/torch/audio/input_tranformation/resampling.py ================================================ import torchaudio import librosa # There exist a limitation of this defense that it may lead to the problem of aliasing, and we can use the narrowband sample rate # rather than downsampling followed by upsampling. # resampling reference https://core.ac.uk/download/pdf/228298313.pdf # resampling input transformation defense for audio T = torchaudio.transforms # Read audio file audio_data = librosa.load(files, sr=16000)[0][-19456:] audio_data = torch.tensor(audio_data).float().to(device) # Discarding samples from a waveform during downsampling could remove a significant portion of the adversarial perturbation, thereby prevents an adversarial attack. # resample the audio files to 8kHz from 16kHz sample = T.Resample(16000, 8000, resampling_method="sinc_interpolation") audio_resample_1 = sample(audio_data) # resample the audio back to 16kHz sample = T.Resample(8000, 16000, resampling_method="sinc_interpolation") # Give audio_resample_2 as input to the asr model audio_resample_2 = sample(audio_resample_1) ================================================ FILE: docs/.nojekyll ================================================ ================================================ FILE: docs/README.html ================================================ <no title> — CleverHans documentation

# Generate documentation

To generate the documentation do: make github

The documentation files will be copied to the cleverhans/docs directory.

### Preparation

Please do: pip install sphinx

Add a .nojekyll file in the cleverhans/docs directory. When GitHub sees a .nojekyll file, it serves the root index.html file. The .nojekyll file indicates that we are not using Jekyll as our static site generator in this repository.

### Enable GitHub Pages for the GitHub repository

  1. Go to the repository on the GitHub website and make sure you are logged in.

  2. Add a /docs directory to the master branch. Otherwise you do not get the master branch /docs folder for the Source option in the drop-down list.

  3. Click the Settings tab. You first go to the Options section.

  4. Scroll down to the GitHub Pages section and choose the drop-down list under Source. Note: Your choices will differ based on whether you’re in a User repo or an Org repository.

  5. To keep source and output HTML separate, choose master branch /docs folder for Source.

### Build Sphinx locally and publish on GitHub Pages

We keep the source docsource and output docs separate, but still are able to publish on GitHub Pages and preview builds locally.

We have the following option in the Makefile:

```
github:

@make html @cp -a _build/html/. ../docs

```

Thus, we can run make github from the docsource directory to generate a local preview and move the docs where GitHub wants to serve them from.

### Hacks

If you cannot build the docs for attacks, uncomment import tensorflow_addons as tfa in cleverhans/attacks/spsa.py.

Otherwise:

`angular2html WARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised: cannot import name 'keras_tensor' `

It is convenient to create a virtual environment to install all the specific libraries (e.g. virutalen cleverhans).

================================================ FILE: docs/_modules/abc.html ================================================ abc — CleverHans documentation

Source code for abc

# Copyright 2007 Google, Inc. All Rights Reserved.
# Licensed to PSF under a Contributor Agreement.

"""Abstract Base Classes (ABCs) according to PEP 3119."""

from _weakrefset import WeakSet


def abstractmethod(funcobj):
    """A decorator indicating abstract methods.

    Requires that the metaclass is ABCMeta or derived from it.  A
    class that has a metaclass derived from ABCMeta cannot be
    instantiated unless all of its abstract methods are overridden.
    The abstract methods can be called using any of the normal
    'super' call mechanisms.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractmethod
            def my_abstract_method(self, ...):
                ...
    """
    funcobj.__isabstractmethod__ = True
    return funcobj


class abstractclassmethod(classmethod):
    """
    A decorator indicating abstract classmethods.

    Similar to abstractmethod.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractclassmethod
            def my_abstract_classmethod(cls, ...):
                ...

    'abstractclassmethod' is deprecated. Use 'classmethod' with
    'abstractmethod' instead.
    """

    __isabstractmethod__ = True

    def __init__(self, callable):
        callable.__isabstractmethod__ = True
        super().__init__(callable)


class abstractstaticmethod(staticmethod):
    """
    A decorator indicating abstract staticmethods.

    Similar to abstractmethod.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractstaticmethod
            def my_abstract_staticmethod(...):
                ...

    'abstractstaticmethod' is deprecated. Use 'staticmethod' with
    'abstractmethod' instead.
    """

    __isabstractmethod__ = True

    def __init__(self, callable):
        callable.__isabstractmethod__ = True
        super().__init__(callable)


class abstractproperty(property):
    """
    A decorator indicating abstract properties.

    Requires that the metaclass is ABCMeta or derived from it.  A
    class that has a metaclass derived from ABCMeta cannot be
    instantiated unless all of its abstract properties are overridden.
    The abstract properties can be called using any of the normal
    'super' call mechanisms.

    Usage:

        class C(metaclass=ABCMeta):
            @abstractproperty
            def my_abstract_property(self):
                ...

    This defines a read-only property; you can also define a read-write
    abstract property using the 'long' form of property declaration:

        class C(metaclass=ABCMeta):
            def getx(self): ...
            def setx(self, value): ...
            x = abstractproperty(getx, setx)

    'abstractproperty' is deprecated. Use 'property' with 'abstractmethod'
    instead.
    """

    __isabstractmethod__ = True


[docs]class ABCMeta(type): """Metaclass for defining Abstract Base Classes (ABCs). Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in class. You can also register unrelated concrete classes (even built-in classes) and unrelated ABCs as 'virtual subclasses' -- these and their descendants will be considered subclasses of the registering ABC by the built-in issubclass() function, but the registering ABC won't show up in their MRO (Method Resolution Order) nor will method implementations defined by the registering ABC be callable (not even via super()). """ # A global counter that is incremented each time a class is # registered as a virtual subclass of anything. It forces the # negative cache to be cleared before its next use. # Note: this counter is private. Use `abc.get_cache_token()` for # external code. _abc_invalidation_counter = 0 def __new__(mcls, name, bases, namespace, **kwargs): cls = super().__new__(mcls, name, bases, namespace, **kwargs) # Compute set of abstract method names abstracts = {name for name, value in namespace.items() if getattr(value, "__isabstractmethod__", False)} for base in bases: for name in getattr(base, "__abstractmethods__", set()): value = getattr(cls, name, None) if getattr(value, "__isabstractmethod__", False): abstracts.add(name) cls.__abstractmethods__ = frozenset(abstracts) # Set up inheritance registry cls._abc_registry = WeakSet() cls._abc_cache = WeakSet() cls._abc_negative_cache = WeakSet() cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter return cls
[docs] def register(cls, subclass): """Register a virtual subclass of an ABC. Returns the subclass, to allow usage as a class decorator. """ if not isinstance(subclass, type): raise TypeError("Can only register classes") if issubclass(subclass, cls): return subclass # Already a subclass # Subtle: test for cycles *after* testing for "already a subclass"; # this means we allow X.register(X) and interpret it as a no-op. if issubclass(cls, subclass): # This would create a cycle, which is bad for the algorithm below raise RuntimeError("Refusing to create an inheritance cycle") cls._abc_registry.add(subclass) ABCMeta._abc_invalidation_counter += 1 # Invalidate negative cache return subclass
def _dump_registry(cls, file=None): """Debug helper to print the ABC registry.""" print("Class: %s.%s" % (cls.__module__, cls.__qualname__), file=file) print("Inv.counter: %s" % ABCMeta._abc_invalidation_counter, file=file) for name in sorted(cls.__dict__): if name.startswith("_abc_"): value = getattr(cls, name) if isinstance(value, WeakSet): value = set(value) print("%s: %r" % (name, value), file=file) def __instancecheck__(cls, instance): """Override for isinstance(instance, cls).""" # Inline the cache checking subclass = instance.__class__ if subclass in cls._abc_cache: return True subtype = type(instance) if subtype is subclass: if (cls._abc_negative_cache_version == ABCMeta._abc_invalidation_counter and subclass in cls._abc_negative_cache): return False # Fall back to the subclass check. return cls.__subclasscheck__(subclass) return any(cls.__subclasscheck__(c) for c in {subclass, subtype}) def __subclasscheck__(cls, subclass): """Override for issubclass(subclass, cls).""" # Check cache if subclass in cls._abc_cache: return True # Check negative cache; may have to invalidate if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter: # Invalidate the negative cache cls._abc_negative_cache = WeakSet() cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter elif subclass in cls._abc_negative_cache: return False # Check the subclass hook ok = cls.__subclasshook__(subclass) if ok is not NotImplemented: assert isinstance(ok, bool) if ok: cls._abc_cache.add(subclass) else: cls._abc_negative_cache.add(subclass) return ok # Check if it's a direct subclass if cls in getattr(subclass, '__mro__', ()): cls._abc_cache.add(subclass) return True # Check if it's a subclass of a registered class (recursive) for rcls in cls._abc_registry: if issubclass(subclass, rcls): cls._abc_cache.add(subclass) return True # Check if it's a subclass of a subclass (recursive) for scls in cls.__subclasses__(): if issubclass(subclass, scls): cls._abc_cache.add(subclass) return True # No dice; update negative cache cls._abc_negative_cache.add(subclass) return False
class ABC(metaclass=ABCMeta): """Helper class that provides a standard way to create an ABC using inheritance. """ pass def get_cache_token(): """Returns the current ABC cache token. The token is an opaque object (supporting equality testing) identifying the current version of the ABC cache for virtual subclasses. The token changes with every call to ``register()`` on any ABC. """ return ABCMeta._abc_invalidation_counter
================================================ FILE: docs/_modules/cleverhans/attacks/attack.html ================================================ cleverhans.attacks.attack — CleverHans documentation

Source code for cleverhans.attacks.attack

"""
The Attack interface.
"""

from abc import ABCMeta
import collections
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.compat import reduce_max
from cleverhans.model import Model
from cleverhans import utils

_logger = utils.create_logger("cleverhans.attacks.attack")


[docs]class Attack(object): """ Abstract base class for all attack classes. """ __metaclass__ = ABCMeta def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ :param model: An instance of the cleverhans.model.Model class. :param sess: The (possibly optional) tf.Session to run graphs in. :param dtypestr: Floating point precision to use (change to float64 to avoid numerical instabilities). :param back: (deprecated and will be removed on or after 2019-03-26). The backend to use. Currently 'tf' is the only option. """ if 'back' in kwargs: if kwargs['back'] == 'tf': warnings.warn("Argument back to attack constructors is not needed" " anymore and will be removed on or after 2019-03-26." " All attacks are implemented using TensorFlow.") else: raise ValueError("Backend argument must be 'tf' and is now deprecated" "It will be removed on or after 2019-03-26.") self.tf_dtype = tf.as_dtype(dtypestr) self.np_dtype = np.dtype(dtypestr) if sess is not None and not isinstance(sess, tf.Session): raise TypeError("sess is not an instance of tf.Session") from cleverhans import attacks_tf attacks_tf.np_dtype = self.np_dtype attacks_tf.tf_dtype = self.tf_dtype if not isinstance(model, Model): raise TypeError("The model argument should be an instance of" " the cleverhans.model.Model class.") # Prepare attributes self.model = model self.sess = sess self.dtypestr = dtypestr # We are going to keep track of old graphs and cache them. self.graphs = {} # When calling generate_np, arguments in the following set should be # fed into the graph, as they are not structural items that require # generating a new graph. # This dict should map names of arguments to the types they should # have. # (Usually, the target class will be a feedable keyword argument.) self.feedable_kwargs = tuple() # When calling generate_np, arguments in the following set should NOT # be fed into the graph, as they ARE structural items that require # generating a new graph. # This list should contain the names of the structural arguments. self.structural_kwargs = []
[docs] def generate(self, x, **kwargs): """ Generate the attack's symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator. :param x: The model's symbolic inputs. :param **kwargs: optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names: clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified. If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input. For other concepts, it's generally a good idea to read other classes and check for name consistency. :return: A symbolic representation of the adversarial examples. """ error = "Sub-classes must implement generate." raise NotImplementedError(error) # Include an unused return so pylint understands the method signature return x
[docs] def construct_graph(self, fixed, feedable, x_val, hash_key): """ Construct the graph required to run the attack through generate_np. :param fixed: Structural elements that require defining a new graph. :param feedable: Arguments that can be fed to the same graph when they take different values. :param x_val: symbolic adversarial example :param hash_key: the key used to store this graph in our cache """ # try our very best to create a TF placeholder for each of the # feedable keyword arguments, and check the types are one of # the allowed types class_name = str(self.__class__).split(".")[-1][:-2] _logger.info("Constructing new graph for attack " + class_name) # remove the None arguments, they are just left blank for k in list(feedable.keys()): if feedable[k] is None: del feedable[k] # process all of the rest and create placeholders for them new_kwargs = dict(x for x in fixed.items()) for name, value in feedable.items(): given_type = value.dtype if isinstance(value, np.ndarray): if value.ndim == 0: # This is pretty clearly not a batch of data new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name) else: # Assume that this is a batch of data, make the first axis variable # in size new_shape = [None] + list(value.shape[1:]) new_kwargs[name] = tf.placeholder(given_type, new_shape, name=name) elif isinstance(value, utils.known_number_types): new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name) else: raise ValueError("Could not identify type of argument " + name + ": " + str(value)) # x is a special placeholder we always want to have x_shape = [None] + list(x_val.shape)[1:] x = tf.placeholder(self.tf_dtype, shape=x_shape) # now we generate the graph that we want x_adv = self.generate(x, **new_kwargs) self.graphs[hash_key] = (x, new_kwargs, x_adv) if len(self.graphs) >= 10: warnings.warn("Calling generate_np() with multiple different " "structural parameters is inefficient and should" " be avoided. Calling generate() is preferred.")
[docs] def generate_np(self, x_val, **kwargs): """ Generate adversarial examples and return them as a NumPy array. Sub-classes *should not* implement this method unless they must perform special handling of arguments. :param x_val: A NumPy array with the original inputs. :param **kwargs: optional parameters used by child classes. :return: A NumPy array holding the adversarial examples. """ if self.sess is None: raise ValueError("Cannot use `generate_np` when no `sess` was" " provided") packed = self.construct_variables(kwargs) fixed, feedable, _, hash_key = packed if hash_key not in self.graphs: self.construct_graph(fixed, feedable, x_val, hash_key) else: # remove the None arguments, they are just left blank for k in list(feedable.keys()): if feedable[k] is None: del feedable[k] x, new_kwargs, x_adv = self.graphs[hash_key] feed_dict = {x: x_val} for name in feedable: feed_dict[new_kwargs[name]] = feedable[name] return self.sess.run(x_adv, feed_dict)
[docs] def construct_variables(self, kwargs): """ Construct the inputs to the attack graph to be used by generate_np. :param kwargs: Keyword arguments to generate_np. :return: Structural arguments Feedable arguments Output of `arg_type` describing feedable arguments A unique key """ if isinstance(self.feedable_kwargs, dict): warnings.warn("Using a dict for `feedable_kwargs is deprecated." "Switch to using a tuple." "It is not longer necessary to specify the types " "of the arguments---we build a different graph " "for each received type." "Using a dict may become an error on or after " "2019-04-18.") feedable_names = tuple(sorted(self.feedable_kwargs.keys())) else: feedable_names = self.feedable_kwargs if not isinstance(feedable_names, tuple): raise TypeError("Attack.feedable_kwargs should be a tuple, but " "for subclass " + str(type(self)) + " it is " + str(self.feedable_kwargs) + " of type " + str(type(self.feedable_kwargs))) # the set of arguments that are structural properties of the attack # if these arguments are different, we must construct a new graph fixed = dict( (k, v) for k, v in kwargs.items() if k in self.structural_kwargs) # the set of arguments that are passed as placeholders to the graph # on each call, and can change without constructing a new graph feedable = {k: v for k, v in kwargs.items() if k in feedable_names} for k in feedable: if isinstance(feedable[k], (float, int)): feedable[k] = np.array(feedable[k]) for key in kwargs: if key not in fixed and key not in feedable: raise ValueError(str(type(self)) + ": Undeclared argument: " + key) feed_arg_type = arg_type(feedable_names, feedable) if not all(isinstance(value, collections.Hashable) for value in fixed.values()): # we have received a fixed value that isn't hashable # this means we can't cache this graph for later use, # and it will have to be discarded later hash_key = None else: # create a unique key for this set of fixed paramaters hash_key = tuple(sorted(fixed.items())) + tuple([feed_arg_type]) return fixed, feedable, feed_arg_type, hash_key
[docs] def get_or_guess_labels(self, x, kwargs): """ Get the label to use in generating an adversarial example for x. The kwargs are fed directly from the kwargs of the attack. If 'y' is in kwargs, then assume it's an untargeted attack and use that as the label. If 'y_target' is in kwargs and is not none, then assume it's a targeted attack and use that as the label. Otherwise, use the model's prediction as the label and perform an untargeted attack. """ if 'y' in kwargs and 'y_target' in kwargs: raise ValueError("Can not set both 'y' and 'y_target'.") elif 'y' in kwargs: labels = kwargs['y'] elif 'y_target' in kwargs and kwargs['y_target'] is not None: labels = kwargs['y_target'] else: preds = self.model.get_probs(x) preds_max = reduce_max(preds, 1, keepdims=True) original_predictions = tf.to_float(tf.equal(preds, preds_max)) labels = tf.stop_gradient(original_predictions) del preds if isinstance(labels, np.ndarray): nb_classes = labels.shape[1] else: nb_classes = labels.get_shape().as_list()[1] return labels, nb_classes
[docs] def parse_params(self, params=None): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param params: a dictionary of attack-specific parameters :return: True when parsing was successful """ if params is not None: warnings.warn("`params` is unused and will be removed " " on or after 2019-04-26.") return True
def arg_type(arg_names, kwargs): """ Returns a hashable summary of the types of arg_names within kwargs. :param arg_names: tuple containing names of relevant arguments :param kwargs: dict mapping string argument names to values. These must be values for which we can create a tf placeholder. Currently supported: numpy darray or something that can ducktype it returns: API contract is to return a hashable object describing all structural consequences of argument values that can otherwise be fed into a graph of fixed structure. Currently this is implemented as a tuple of tuples that track: - whether each argument was passed - whether each argument was passed and not None - the dtype of each argument Callers shouldn't rely on the exact structure of this object, just its hashability and one-to-one mapping between graph structures. """ assert isinstance(arg_names, tuple) passed = tuple(name in kwargs for name in arg_names) passed_and_not_none = [] for name in arg_names: if name in kwargs: passed_and_not_none.append(kwargs[name] is not None) else: passed_and_not_none.append(False) passed_and_not_none = tuple(passed_and_not_none) dtypes = [] for name in arg_names: if name not in kwargs: dtypes.append(None) continue value = kwargs[name] if value is None: dtypes.append(None) continue assert hasattr(value, 'dtype'), type(value) dtype = value.dtype if not isinstance(dtype, np.dtype): dtype = dtype.as_np_dtype assert isinstance(dtype, np.dtype) dtypes.append(dtype) dtypes = tuple(dtypes) return (passed, passed_and_not_none, dtypes)
================================================ FILE: docs/_modules/cleverhans/attacks/basic_iterative_method.html ================================================ cleverhans.attacks.basic_iterative_method — CleverHans documentation

Source code for cleverhans.attacks.basic_iterative_method

"""
The BasicIterativeMethod attack.
"""

from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent


[docs]class BasicIterativeMethod(ProjectedGradientDescent): """ The BasicIterativeMethod attack. """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(BasicIterativeMethod, self).__init__(model, sess=sess, dtypestr=dtypestr, default_rand_init=False, **kwargs)
================================================ FILE: docs/_modules/cleverhans/attacks/carlini_wagner_l2.html ================================================ cleverhans.attacks.carlini_wagner_l2 — CleverHans documentation

Source code for cleverhans.attacks.carlini_wagner_l2

"""The CarliniWagnerL2 attack
"""
# pylint: disable=missing-docstring
import logging

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, reduce_max
from cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits
from cleverhans import utils

np_dtype = np.dtype('float32')
tf_dtype = tf.as_dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.carlini_wagner_l2")
_logger.setLevel(logging.INFO)


[docs]class CarliniWagnerL2(Attack): """ This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644 At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(CarliniWagnerL2, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y', 'y_target') self.structural_kwargs = [ 'batch_size', 'confidence', 'targeted', 'learning_rate', 'binary_search_steps', 'max_iterations', 'abort_early', 'initial_const', 'clip_min', 'clip_max' ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' self.parse_params(**kwargs) labels, nb_classes = self.get_or_guess_labels(x, kwargs) attack = CWL2(self.sess, self.model, self.batch_size, self.confidence, 'y_target' in kwargs, self.learning_rate, self.binary_search_steps, self.max_iterations, self.abort_early, self.initial_const, self.clip_min, self.clip_max, nb_classes, x.get_shape().as_list()[1:]) def cw_wrap(x_val, y_val): return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(cw_wrap, [x, labels], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, y=None, y_target=None, batch_size=1, confidence=0, learning_rate=5e-3, binary_search_steps=5, max_iterations=1000, abort_early=True, initial_const=1e-2, clip_min=0, clip_max=1): """ :param y: (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns. :param y_target: (optional) A tensor with the target labels for a targeted attack. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param batch_size: Number of attacks to run simultaneously. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.batch_size = batch_size self.confidence = confidence self.learning_rate = learning_rate self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max
def ZERO(): return np.asarray(0., dtype=np_dtype) class CWL2(object): def __init__(self, sess, model, batch_size, confidence, targeted, learning_rate, binary_search_steps, max_iterations, abort_early, initial_const, clip_min, clip_max, num_labels, shape): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param model: a cleverhans.model.Model object. :param batch_size: Number of attacks to run simultaneously. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param targeted: boolean controlling the behavior of the adversarial examples produced. If set to False, they will be misclassified in any wrong class. If set to True, they will be misclassified in a chosen target class. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum). :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the pururbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. :param clip_min: (optional float) Minimum input component value. :param clip_max: (optional float) Maximum input component value. :param num_labels: the number of classes in the model's output. :param shape: the shape of the model's input tensor. """ self.sess = sess self.TARGETED = targeted self.LEARNING_RATE = learning_rate self.MAX_ITERATIONS = max_iterations self.BINARY_SEARCH_STEPS = binary_search_steps self.ABORT_EARLY = abort_early self.CONFIDENCE = confidence self.initial_const = initial_const self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.model = model self.repeat = binary_search_steps >= 10 self.shape = shape = tuple([batch_size] + list(shape)) # the variable we're going to optimize over modifier = tf.Variable(np.zeros(shape, dtype=np_dtype)) # these are variables to be more efficient in sending data to tf self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name='timg') self.tlab = tf.Variable( np.zeros((batch_size, num_labels)), dtype=tf_dtype, name='tlab') self.const = tf.Variable( np.zeros(batch_size), dtype=tf_dtype, name='const') # and here's what we use to assign them self.assign_timg = tf.placeholder(tf_dtype, shape, name='assign_timg') self.assign_tlab = tf.placeholder( tf_dtype, (batch_size, num_labels), name='assign_tlab') self.assign_const = tf.placeholder( tf_dtype, [batch_size], name='assign_const') # the resulting instance, tanh'd to keep bounded from clip_min # to clip_max self.newimg = (tf.tanh(modifier + self.timg) + 1) / 2 self.newimg = self.newimg * (clip_max - clip_min) + clip_min # prediction BEFORE-SOFTMAX of the model self.output = model.get_logits(self.newimg) # distance to the input data self.other = (tf.tanh(self.timg) + 1) / \ 2 * (clip_max - clip_min) + clip_min self.l2dist = reduce_sum( tf.square(self.newimg - self.other), list(range(1, len(shape)))) # compute the probability of the label class versus the maximum other real = reduce_sum((self.tlab) * self.output, 1) other = reduce_max((1 - self.tlab) * self.output - self.tlab * 10000, 1) if self.TARGETED: # if targeted, optimize for making the other class most likely loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE) else: # if untargeted, optimize for making this class least likely. loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE) # sum up the losses self.loss2 = reduce_sum(self.l2dist) self.loss1 = reduce_sum(self.const * loss1) self.loss = self.loss1 + self.loss2 # Setup the adam optimizer and keep track of variables we're creating start_vars = set(x.name for x in tf.global_variables()) optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE) self.train = optimizer.minimize(self.loss, var_list=[modifier]) end_vars = tf.global_variables() new_vars = [x for x in end_vars if x.name not in start_vars] # these are the variables to initialize when we run self.setup = [] self.setup.append(self.timg.assign(self.assign_timg)) self.setup.append(self.tlab.assign(self.assign_tlab)) self.setup.append(self.const.assign(self.assign_const)) self.init = tf.variables_initializer(var_list=[modifier] + new_vars) def attack(self, imgs, targets): """ Perform the L_2 attack on the given instance for the given targets. If self.targeted is true, then the targets represents the target labels If self.targeted is false, then targets are the original class labels """ r = [] for i in range(0, len(imgs), self.batch_size): _logger.debug( ("Running CWL2 attack on instance %s of %s", i, len(imgs))) r.extend( self.attack_batch(imgs[i:i + self.batch_size], targets[i:i + self.batch_size])) return np.array(r) def attack_batch(self, imgs, labs): """ Run the attack on a batch of instance and labels. """ def compare(x, y): if not isinstance(x, (float, int, np.int64)): x = np.copy(x) if self.TARGETED: x[y] -= self.CONFIDENCE else: x[y] += self.CONFIDENCE x = np.argmax(x) if self.TARGETED: return x == y else: return x != y batch_size = self.batch_size oimgs = np.clip(imgs, self.clip_min, self.clip_max) # re-scale instances to be within range [0, 1] imgs = (imgs - self.clip_min) / (self.clip_max - self.clip_min) imgs = np.clip(imgs, 0, 1) # now convert to [-1, 1] imgs = (imgs * 2) - 1 # convert to tanh-space imgs = np.arctanh(imgs * .999999) # set the lower and upper bounds accordingly lower_bound = np.zeros(batch_size) CONST = np.ones(batch_size) * self.initial_const upper_bound = np.ones(batch_size) * 1e10 # placeholders for the best l2, score, and instance attack found so far o_bestl2 = [1e10] * batch_size o_bestscore = [-1] * batch_size o_bestattack = np.copy(oimgs) for outer_step in range(self.BINARY_SEARCH_STEPS): # completely reset adam's internal state. self.sess.run(self.init) batch = imgs[:batch_size] batchlab = labs[:batch_size] bestl2 = [1e10] * batch_size bestscore = [-1] * batch_size _logger.debug(" Binary search step %s of %s", outer_step, self.BINARY_SEARCH_STEPS) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1: CONST = upper_bound # set the variables so that we don't have to send them over again self.sess.run( self.setup, { self.assign_timg: batch, self.assign_tlab: batchlab, self.assign_const: CONST }) prev = 1e6 for iteration in range(self.MAX_ITERATIONS): # perform the attack _, l, l2s, scores, nimg = self.sess.run([ self.train, self.loss, self.l2dist, self.output, self.newimg ]) if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: _logger.debug((" Iteration {} of {}: loss={:.3g} " + "l2={:.3g} f={:.3g}").format( iteration, self.MAX_ITERATIONS, l, np.mean(l2s), np.mean(scores))) # check if we should abort search if we're getting nowhere. if self.ABORT_EARLY and \ iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: if l > prev * .9999: msg = " Failed to make progress; stop early" _logger.debug(msg) break prev = l # adjust the best result found so far for e, (l2, sc, ii) in enumerate(zip(l2s, scores, nimg)): lab = np.argmax(batchlab[e]) if l2 < bestl2[e] and compare(sc, lab): bestl2[e] = l2 bestscore[e] = np.argmax(sc) if l2 < o_bestl2[e] and compare(sc, lab): o_bestl2[e] = l2 o_bestscore[e] = np.argmax(sc) o_bestattack[e] = ii # adjust the constant as needed for e in range(batch_size): if compare(bestscore[e], np.argmax(batchlab[e])) and \ bestscore[e] != -1: # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug(" Successfully generated adversarial examples " + "on {} of {} instances.".format( sum(upper_bound < 1e9), batch_size)) o_bestl2 = np.array(o_bestl2) mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9])) _logger.debug(" Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestl2 = np.array(o_bestl2) return o_bestattack
================================================ FILE: docs/_modules/cleverhans/attacks/deep_fool.html ================================================ cleverhans.attacks.deep_fool — CleverHans documentation

Source code for cleverhans.attacks.deep_fool

"""The DeepFool attack

"""
import copy
import logging
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.model import Model, wrapper_warning_logits, CallableModelWrapper
from cleverhans import utils
from cleverhans import utils_tf

np_dtype = np.dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.deep_fool")
_logger.setLevel(logging.INFO)

[docs]class DeepFool(Attack): """ DeepFool is an untargeted & iterative attack which is based on an iterative linearization of the classifier. The implementation here is w.r.t. the L2 norm. Paper link: "https://arxiv.org/pdf/1511.04599.pdf" :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Create a DeepFool instance. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(DeepFool, self).__init__(model, sess, dtypestr, **kwargs) self.structural_kwargs = [ 'overshoot', 'max_iter', 'clip_max', 'clip_min', 'nb_candidate' ]
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' from cleverhans.utils_tf import jacobian_graph # Parse and save attack-specific parameters assert self.parse_params(**kwargs) # Define graph wrt to this input placeholder logits = self.model.get_logits(x) self.nb_classes = logits.get_shape().as_list()[-1] assert self.nb_candidate <= self.nb_classes, \ 'nb_candidate should not be greater than nb_classes' preds = tf.reshape( tf.nn.top_k(logits, k=self.nb_candidate)[0], [-1, self.nb_candidate]) # grads will be the shape [batch_size, nb_candidate, image_size] grads = tf.stack(jacobian_graph(preds, x, self.nb_candidate), axis=1) # Define graph def deepfool_wrap(x_val): """deepfool function for py_func""" return deepfool_batch(self.sess, x, preds, logits, grads, x_val, self.nb_candidate, self.overshoot, self.max_iter, self.clip_min, self.clip_max, self.nb_classes) wrap = tf.py_func(deepfool_wrap, [x], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, nb_candidate=10, overshoot=0.02, max_iter=50, clip_min=0., clip_max=1., **kwargs): """ :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for deepfool :param clip_min: Minimum component value for clipping :param clip_max: Maximum component value for clipping """ self.nb_candidate = nb_candidate self.overshoot = overshoot self.max_iter = max_iter self.clip_min = clip_min self.clip_max = clip_max if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
def deepfool_batch(sess, x, pred, logits, grads, X, nb_candidate, overshoot, max_iter, clip_min, clip_max, nb_classes, feed=None): """ Applies DeepFool to a batch of inputs :param sess: TF session :param x: The input placeholder :param pred: The model's sorted symbolic output of logits, only the top nb_candidate classes are contained :param logits: The model's unnormalized output tensor (the input to the softmax layer) :param grads: Symbolic gradients of the top nb_candidate classes, procuded from gradient_graph :param X: Numpy array with sample inputs :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for DeepFool :param clip_min: Minimum value for components of the example returned :param clip_max: Maximum value for components of the example returned :param nb_classes: Number of model output classes :return: Adversarial examples """ X_adv = deepfool_attack( sess, x, pred, logits, grads, X, nb_candidate, overshoot, max_iter, clip_min, clip_max, feed=feed) return np.asarray(X_adv, dtype=np_dtype) def deepfool_attack(sess, x, predictions, logits, grads, sample, nb_candidate, overshoot, max_iter, clip_min, clip_max, feed=None): """ TensorFlow implementation of DeepFool. Paper link: see https://arxiv.org/pdf/1511.04599.pdf :param sess: TF session :param x: The input placeholder :param predictions: The model's sorted symbolic output of logits, only the top nb_candidate classes are contained :param logits: The model's unnormalized output tensor (the input to the softmax layer) :param grads: Symbolic gradients of the top nb_candidate classes, procuded from gradient_graph :param sample: Numpy array with sample input :param nb_candidate: The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation. :param overshoot: A termination criterion to prevent vanishing updates :param max_iter: Maximum number of iteration for DeepFool :param clip_min: Minimum value for components of the example returned :param clip_max: Maximum value for components of the example returned :return: Adversarial examples """ adv_x = copy.copy(sample) # Initialize the loop variables iteration = 0 current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed) if current.shape == (): current = np.array([current]) w = np.squeeze(np.zeros(sample.shape[1:])) # same shape as original image r_tot = np.zeros(sample.shape) original = current # use original label as the reference _logger.debug( "Starting DeepFool attack up to %s iterations", max_iter) # Repeat this main loop until we have achieved misclassification while (np.any(current == original) and iteration < max_iter): if iteration % 5 == 0 and iteration > 0: _logger.info("Attack result at iteration %s is %s", iteration, current) gradients = sess.run(grads, feed_dict={x: adv_x}) predictions_val = sess.run(predictions, feed_dict={x: adv_x}) for idx in range(sample.shape[0]): pert = np.inf if current[idx] != original[idx]: continue for k in range(1, nb_candidate): w_k = gradients[idx, k, ...] - gradients[idx, 0, ...] f_k = predictions_val[idx, k] - predictions_val[idx, 0] # adding value 0.00001 to prevent f_k = 0 pert_k = (abs(f_k) + 0.00001) / np.linalg.norm(w_k.flatten()) if pert_k < pert: pert = pert_k w = w_k r_i = pert * w / np.linalg.norm(w) r_tot[idx, ...] = r_tot[idx, ...] + r_i adv_x = np.clip(r_tot + sample, clip_min, clip_max) current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed) if current.shape == (): current = np.array([current]) # Update loop variables iteration = iteration + 1 # need more revision, including info like how many succeed _logger.info("Attack result at iteration %s is %s", iteration, current) _logger.info("%s out of %s become adversarial examples at iteration %s", sum(current != original), sample.shape[0], iteration) # need to clip this image into the given range adv_x = np.clip((1 + overshoot) * r_tot + sample, clip_min, clip_max) return adv_x
================================================ FILE: docs/_modules/cleverhans/attacks/elastic_net_method.html ================================================ cleverhans.attacks.elastic_net_method — CleverHans documentation

Source code for cleverhans.attacks.elastic_net_method

"""The ElasticNetMethod attack.
"""
# pylint: disable=missing-docstring
import logging

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, reduce_max
from cleverhans.model import Model, CallableModelWrapper, wrapper_warning_logits
from cleverhans import utils

np_dtype = np.dtype('float32')
tf_dtype = tf.as_dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.elastic_net_method")
_logger.setLevel(logging.INFO)


def ZERO():
  return np.asarray(0., dtype=np_dtype)


[docs]class ElasticNetMethod(Attack): """ This attack features L1-oriented adversarial examples and includes the C&W L2 attack as a special case (when beta is set to 0). Adversarial examples attain similar performance to those generated by the C&W L2 attack in the white-box case, and more importantly, have improved transferability properties and complement adversarial training. Paper link: https://arxiv.org/abs/1709.04114 :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(ElasticNetMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y', 'y_target') self.structural_kwargs = [ 'beta', 'decision_rule', 'batch_size', 'confidence', 'targeted', 'learning_rate', 'binary_search_steps', 'max_iterations', 'abort_early', 'initial_const', 'clip_min', 'clip_max' ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' self.parse_params(**kwargs) labels, nb_classes = self.get_or_guess_labels(x, kwargs) attack = EAD(self.sess, self.model, self.beta, self.decision_rule, self.batch_size, self.confidence, 'y_target' in kwargs, self.learning_rate, self.binary_search_steps, self.max_iterations, self.abort_early, self.initial_const, self.clip_min, self.clip_max, nb_classes, x.get_shape().as_list()[1:]) def ead_wrap(x_val, y_val): return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(ead_wrap, [x, labels], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, y=None, y_target=None, beta=1e-2, decision_rule='EN', batch_size=1, confidence=0, learning_rate=1e-2, binary_search_steps=9, max_iterations=1000, abort_early=False, initial_const=1e-3, clip_min=0, clip_max=1): """ :param y: (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns. :param y_target: (optional) A tensor with the target labels for a targeted attack. :param beta: Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion :param decision_rule: EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param batch_size: Number of attacks to run simultaneously. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set 'initial_const' to a large value and fix this param to 1 for speed. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet) :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.beta = beta self.decision_rule = decision_rule self.batch_size = batch_size self.confidence = confidence self.learning_rate = learning_rate self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.abort_early = abort_early self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max
class EAD(object): def __init__(self, sess, model, beta, decision_rule, batch_size, confidence, targeted, learning_rate, binary_search_steps, max_iterations, abort_early, initial_const, clip_min, clip_max, num_labels, shape): """ EAD Attack Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param model: a cleverhans.model.Model object. :param beta: Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion :param decision_rule: EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion. :param batch_size: Number of attacks to run simultaneously. :param confidence: Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial. :param targeted: boolean controlling the behavior of the adversarial examples produced. If set to False, they will be misclassified in any wrong class. If set to True, they will be misclassified in a chosen target class. :param learning_rate: The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set 'initial_const' to a large value and fix this param to 1 for speed. :param max_iterations: The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results. :param abort_early: If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet) :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value. :param clip_min: (optional float) Minimum input component value. :param clip_max: (optional float) Maximum input component value. :param num_labels: the number of classes in the model's output. :param shape: the shape of the model's input tensor. """ self.sess = sess self.TARGETED = targeted self.LEARNING_RATE = learning_rate self.MAX_ITERATIONS = max_iterations self.BINARY_SEARCH_STEPS = binary_search_steps self.ABORT_EARLY = abort_early self.CONFIDENCE = confidence self.initial_const = initial_const self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.model = model self.decision_rule = decision_rule self.beta = beta self.beta_t = tf.cast(self.beta, tf_dtype) self.repeat = binary_search_steps >= 10 self.shape = shape = tuple([batch_size] + list(shape)) # these are variables to be more efficient in sending data to tf self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name='timg') self.newimg = tf.Variable( np.zeros(shape), dtype=tf_dtype, name='newimg') self.slack = tf.Variable( np.zeros(shape), dtype=tf_dtype, name='slack') self.tlab = tf.Variable( np.zeros((batch_size, num_labels)), dtype=tf_dtype, name='tlab') self.const = tf.Variable( np.zeros(batch_size), dtype=tf_dtype, name='const') # and here's what we use to assign them self.assign_timg = tf.placeholder(tf_dtype, shape, name='assign_timg') self.assign_newimg = tf.placeholder( tf_dtype, shape, name='assign_newimg') self.assign_slack = tf.placeholder( tf_dtype, shape, name='assign_slack') self.assign_tlab = tf.placeholder( tf_dtype, (batch_size, num_labels), name='assign_tlab') self.assign_const = tf.placeholder( tf_dtype, [batch_size], name='assign_const') self.global_step = tf.Variable(0, trainable=False) self.global_step_t = tf.cast(self.global_step, tf_dtype) # Fast Iterative Shrinkage Thresholding self.zt = tf.divide(self.global_step_t, self.global_step_t + tf.cast(3, tf_dtype)) cond1 = tf.cast(tf.greater(tf.subtract(self.slack, self.timg), self.beta_t), tf_dtype) cond2 = tf.cast(tf.less_equal(tf.abs(tf.subtract(self.slack, self.timg)), self.beta_t), tf_dtype) cond3 = tf.cast(tf.less(tf.subtract(self.slack, self.timg), tf.negative(self.beta_t)), tf_dtype) upper = tf.minimum(tf.subtract(self.slack, self.beta_t), tf.cast(self.clip_max, tf_dtype)) lower = tf.maximum(tf.add(self.slack, self.beta_t), tf.cast(self.clip_min, tf_dtype)) self.assign_newimg = tf.multiply(cond1, upper) self.assign_newimg += tf.multiply(cond2, self.timg) self.assign_newimg += tf.multiply(cond3, lower) self.assign_slack = self.assign_newimg self.assign_slack += tf.multiply(self.zt, self.assign_newimg - self.newimg) # -------------------------------- self.setter = tf.assign(self.newimg, self.assign_newimg) self.setter_y = tf.assign(self.slack, self.assign_slack) # prediction BEFORE-SOFTMAX of the model self.output = model.get_logits(self.newimg) self.output_y = model.get_logits(self.slack) # distance to the input data self.l2dist = reduce_sum(tf.square(self.newimg-self.timg), list(range(1, len(shape)))) self.l2dist_y = reduce_sum(tf.square(self.slack-self.timg), list(range(1, len(shape)))) self.l1dist = reduce_sum(tf.abs(self.newimg-self.timg), list(range(1, len(shape)))) self.l1dist_y = reduce_sum(tf.abs(self.slack-self.timg), list(range(1, len(shape)))) self.elasticdist = self.l2dist + tf.multiply(self.l1dist, self.beta_t) self.elasticdist_y = self.l2dist_y + tf.multiply(self.l1dist_y, self.beta_t) if self.decision_rule == 'EN': self.crit = self.elasticdist self.crit_p = 'Elastic' else: self.crit = self.l1dist self.crit_p = 'L1' # compute the probability of the label class versus the maximum other real = reduce_sum((self.tlab) * self.output, 1) real_y = reduce_sum((self.tlab) * self.output_y, 1) other = reduce_max((1 - self.tlab) * self.output - (self.tlab * 10000), 1) other_y = reduce_max((1 - self.tlab) * self.output_y - (self.tlab * 10000), 1) if self.TARGETED: # if targeted, optimize for making the other class most likely loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE) loss1_y = tf.maximum(ZERO(), other_y - real_y + self.CONFIDENCE) else: # if untargeted, optimize for making this class least likely. loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE) loss1_y = tf.maximum(ZERO(), real_y - other_y + self.CONFIDENCE) # sum up the losses self.loss21 = reduce_sum(self.l1dist) self.loss21_y = reduce_sum(self.l1dist_y) self.loss2 = reduce_sum(self.l2dist) self.loss2_y = reduce_sum(self.l2dist_y) self.loss1 = reduce_sum(self.const * loss1) self.loss1_y = reduce_sum(self.const * loss1_y) self.loss_opt = self.loss1_y + self.loss2_y self.loss = self.loss1+self.loss2+tf.multiply(self.beta_t, self.loss21) self.learning_rate = tf.train.polynomial_decay( self.LEARNING_RATE, self.global_step, self.MAX_ITERATIONS, 0, power=0.5) # Setup the optimizer and keep track of variables we're creating start_vars = set(x.name for x in tf.global_variables()) optimizer = tf.train.GradientDescentOptimizer(self.learning_rate) self.train = optimizer.minimize(self.loss_opt, var_list=[self.slack], global_step=self.global_step) end_vars = tf.global_variables() new_vars = [x for x in end_vars if x.name not in start_vars] # these are the variables to initialize when we run self.setup = [] self.setup.append(self.timg.assign(self.assign_timg)) self.setup.append(self.tlab.assign(self.assign_tlab)) self.setup.append(self.const.assign(self.assign_const)) var_list = [self.global_step]+[self.slack]+[self.newimg]+new_vars self.init = tf.variables_initializer(var_list=var_list) def attack(self, imgs, targets): """ Perform the EAD attack on the given instance for the given targets. If self.targeted is true, then the targets represents the target labels If self.targeted is false, then targets are the original class labels """ batch_size = self.batch_size r = [] for i in range(0, len(imgs) // batch_size): _logger.debug( ("Running EAD attack on instance %s of %s", i * batch_size, len(imgs))) r.extend( self.attack_batch( imgs[i * batch_size:(i + 1) * batch_size], targets[i * batch_size:(i + 1) * batch_size])) if len(imgs) % batch_size != 0: last_elements = len(imgs) - (len(imgs) % batch_size) _logger.debug( ("Running EAD attack on instance %s of %s", last_elements, len(imgs))) temp_imgs = np.zeros((batch_size, ) + imgs.shape[2:]) temp_targets = np.zeros((batch_size, ) + targets.shape[2:]) temp_imgs[:(len(imgs) % batch_size)] = imgs[last_elements:] temp_targets[:(len(imgs) % batch_size)] = targets[last_elements:] temp_data = self.attack_batch(temp_imgs, temp_targets) r.extend(temp_data[:(len(imgs) % batch_size)], targets[last_elements:]) return np.array(r) def attack_batch(self, imgs, labs): """ Run the attack on a batch of instance and labels. """ def compare(x, y): if not isinstance(x, (float, int, np.int64)): x = np.copy(x) if self.TARGETED: x[y] -= self.CONFIDENCE else: x[y] += self.CONFIDENCE x = np.argmax(x) if self.TARGETED: return x == y else: return x != y batch_size = self.batch_size imgs = np.clip(imgs, self.clip_min, self.clip_max) # set the lower and upper bounds accordingly lower_bound = np.zeros(batch_size) CONST = np.ones(batch_size) * self.initial_const upper_bound = np.ones(batch_size) * 1e10 # placeholders for the best en, score, and instance attack found so far o_bestdst = [1e10] * batch_size o_bestscore = [-1] * batch_size o_bestattack = np.copy(imgs) for outer_step in range(self.BINARY_SEARCH_STEPS): # completely reset the optimizer's internal state. self.sess.run(self.init) batch = imgs[:batch_size] batchlab = labs[:batch_size] bestdst = [1e10] * batch_size bestscore = [-1] * batch_size _logger.debug(" Binary search step %s of %s", outer_step, self.BINARY_SEARCH_STEPS) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1: CONST = upper_bound # set the variables so that we don't have to send them over again self.sess.run( self.setup, { self.assign_timg: batch, self.assign_tlab: batchlab, self.assign_const: CONST }) self.sess.run(self.setter, {self.assign_newimg: batch}) self.sess.run(self.setter_y, {self.assign_slack: batch}) prev = 1e6 for iteration in range(self.MAX_ITERATIONS): # perform the attack self.sess.run([self.train]) self.sess.run([self.setter, self.setter_y]) l, l2s, l1s, crit, scores, nimg = self.sess.run([self.loss, self.l2dist, self.l1dist, self.crit, self.output, self.newimg]) if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: _logger.debug((" Iteration {} of {}: loss={:.3g} " + "l2={:.3g} l1={:.3g} f={:.3g}").format( iteration, self.MAX_ITERATIONS, l, np.mean(l2s), np.mean(l1s), np.mean(scores))) # check if we should abort search if we're getting nowhere. if self.ABORT_EARLY and \ iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0: if l > prev * .9999: msg = " Failed to make progress; stop early" _logger.debug(msg) break prev = l # adjust the best result found so far for e, (dst, sc, ii) in enumerate(zip(crit, scores, nimg)): lab = np.argmax(batchlab[e]) if dst < bestdst[e] and compare(sc, lab): bestdst[e] = dst bestscore[e] = np.argmax(sc) if dst < o_bestdst[e] and compare(sc, lab): o_bestdst[e] = dst o_bestscore[e] = np.argmax(sc) o_bestattack[e] = ii # adjust the constant as needed for e in range(batch_size): if compare(bestscore[e], np.argmax(batchlab[e])) and \ bestscore[e] != -1: # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug(" Successfully generated adversarial examples " + "on {} of {} instances.".format( sum(upper_bound < 1e9), batch_size)) o_bestdst = np.array(o_bestdst) mean = np.mean(np.sqrt(o_bestdst[o_bestdst < 1e9])) _logger.debug(self.crit_p + " Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestdst = np.array(o_bestdst) return o_bestattack
================================================ FILE: docs/_modules/cleverhans/attacks/fast_feature_adversaries.html ================================================ cleverhans.attacks.fast_feature_adversaries — CleverHans documentation

Source code for cleverhans.attacks.fast_feature_adversaries

"""
The FastFeatureAdversaries attack
"""
# pylint: disable=missing-docstring
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum
from cleverhans.model import Model
from cleverhans.utils_tf import clip_eta


[docs]class FastFeatureAdversaries(Attack): """ This is a fast implementation of "Feature Adversaries", an attack against a target internal representation of a model. "Feature adversaries" were originally introduced in (Sabour et al. 2016), where the optimization was done using LBFGS. Paper link: https://arxiv.org/abs/1511.05122 This implementation is similar to "Basic Iterative Method" (Kurakin et al. 2016) but applied to the internal representations. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a FastFeatureAdversaries instance. """ super(FastFeatureAdversaries, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'clip_min', 'clip_max') self.structural_kwargs = ['ord', 'nb_iter', 'layer'] assert isinstance(self.model, Model)
[docs] def parse_params(self, layer=None, eps=0.3, eps_iter=0.05, nb_iter=10, ord=np.inf, clip_min=None, clip_max=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param layer: (required str) name of the layer to target. :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.layer = layer self.eps = eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.ord = ord self.clip_min = clip_min self.clip_max = clip_max # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs] def attack_single_step(self, x, eta, g_feat): """ TensorFlow implementation of the Fast Feature Gradient. This is a single step attack similar to Fast Gradient Method that attacks an internal representation. :param x: the input placeholder :param eta: A tensor the same shape as x that holds the perturbation. :param g_feat: model's internal tensor for guide :return: a tensor for the adversarial example """ adv_x = x + eta a_feat = self.model.fprop(adv_x)[self.layer] # feat.shape = (batch, c) or (batch, w, h, c) axis = list(range(1, len(a_feat.shape))) # Compute loss # This is a targeted attack, hence the negative sign loss = -reduce_sum(tf.square(a_feat - g_feat), axis) # Define gradient of loss wrt input grad, = tf.gradients(loss, adv_x) # Multiply by constant epsilon scaled_signed_grad = self.eps_iter * tf.sign(grad) # Add perturbation to original example to obtain adversarial example adv_x = adv_x + scaled_signed_grad # If clipping is needed, # reset all values outside of [clip_min, clip_max] if (self.clip_min is not None) and (self.clip_max is not None): adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) adv_x = tf.stop_gradient(adv_x) eta = adv_x - x eta = clip_eta(eta, self.ord, self.eps) return eta
[docs] def generate(self, x, g, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param g: The target value of the symbolic representation :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) g_feat = self.model.fprop(g)[self.layer] # Initialize loop variables eta = tf.random_uniform( tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype) eta = clip_eta(eta, self.ord, self.eps) def cond(i, _): return tf.less(i, self.nb_iter) def body(i, e): new_eta = self.attack_single_step(x, e, g_feat) return i + 1, new_eta _, eta = tf.while_loop(cond, body, (tf.zeros([]), eta), back_prop=True, maximum_iterations=self.nb_iter) # Define adversarial example (and clip if necessary) adv_x = x + eta if self.clip_min is not None and self.clip_max is not None: adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x
================================================ FILE: docs/_modules/cleverhans/attacks/fast_gradient_method.html ================================================ cleverhans.attacks.fast_gradient_method — CleverHans documentation

Source code for cleverhans.attacks.fast_gradient_method

"""
The FastGradientMethod attack.
"""

import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_max, reduce_sum, softmax_cross_entropy_with_logits
from cleverhans import utils_tf


[docs]class FastGradientMethod(Attack): """ This attack was originally implemented by Goodfellow et al. (2014) with the infinity norm (and is known as the "Fast Gradient Sign Method"). This implementation extends the attack to other norms, and is therefore called the Fast Gradient Method. Paper link: https://arxiv.org/abs/1412.6572 :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a FastGradientMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(FastGradientMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'y', 'y_target', 'clip_min', 'clip_max') self.structural_kwargs = ['ord', 'sanity_checks', 'clip_grad', 'loss_fn']
[docs] def generate(self, x, **kwargs): """ Returns the graph for Fast Gradient Method adversarial examples. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) return fgm( x, self.model.get_logits(x), y=labels, eps=self.eps, ord=self.ord, loss_fn=self.loss_fn, clip_min=self.clip_min, clip_max=self.clip_max, clip_grad=self.clip_grad, targeted=(self.y_target is not None), sanity_checks=self.sanity_checks)
[docs] def parse_params(self, eps=0.3, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, y=None, y_target=None, clip_min=None, clip_max=None, clip_grad=False, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) attack step size (input variation) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param y: (optional) A tensor with the true labels. Only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input) """ # Save attack-specific parameters self.eps = eps self.ord = ord self.loss_fn = loss_fn self.y = y self.y_target = y_target self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad self.sanity_checks = sanity_checks if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, int(1), int(2)]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs]def fgm(x, logits, y=None, eps=0.3, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True): """ TensorFlow implementation of the Fast Gradient Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param eps: the epsilon (input variation parameter) :param ord: (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param clip_min: Minimum float value for adversarial example components :param clip_max: Maximum float value for adversarial example components :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(utils_tf.assert_greater_equal( x, tf.cast(clip_min, x.dtype))) if clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype))) # Make sure the caller has not passed probs by accident assert logits.op.type != 'Softmax' if y is None: # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(logits, 1, keepdims=True) y = tf.to_float(tf.equal(logits, preds_max)) y = tf.stop_gradient(y) y = y / reduce_sum(y, 1, keepdims=True) # Compute loss loss = loss_fn(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input grad, = tf.gradients(loss, x) if clip_grad: grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max) optimal_perturbation = optimize_linear(grad, eps, ord) # Add perturbation to original example to obtain adversarial example adv_x = x + optimal_perturbation # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs]def optimize_linear(grad, eps, ord=np.inf): """ Solves for the optimal input to a linear function under a norm constraint. Optimal_perturbation = argmax_{eta, ||eta||_{ord} < eps} dot(eta, grad) :param grad: tf tensor containing a batch of gradients :param eps: float scalar specifying size of constraint region :param ord: int specifying order of norm :returns: tf tensor containing optimal perturbation """ # In Python 2, the `list` call in the following line is redundant / harmless. # In Python 3, the `list` call is needed to convert the iterator returned by `range` into a list. red_ind = list(range(1, len(grad.get_shape()))) avoid_zero_div = 1e-12 if ord == np.inf: # Take sign of gradient optimal_perturbation = tf.sign(grad) # The following line should not change the numerical results. # It applies only because `optimal_perturbation` is the output of # a `sign` op, which has zero derivative anyway. # It should not be applied for the other norms, where the # perturbation has a non-zero derivative. optimal_perturbation = tf.stop_gradient(optimal_perturbation) elif ord == 1: abs_grad = tf.abs(grad) sign = tf.sign(grad) max_abs_grad = tf.reduce_max(abs_grad, red_ind, keepdims=True) tied_for_max = tf.to_float(tf.equal(abs_grad, max_abs_grad)) num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True) optimal_perturbation = sign * tied_for_max / num_ties elif ord == 2: square = tf.maximum(avoid_zero_div, reduce_sum(tf.square(grad), reduction_indices=red_ind, keepdims=True)) optimal_perturbation = grad / tf.sqrt(square) else: raise NotImplementedError("Only L-inf, L1 and L2 norms are " "currently implemented.") # Scale perturbation to be the solution for the norm=eps rather than # norm=1 problem scaled_perturbation = utils_tf.mul(eps, optimal_perturbation) return scaled_perturbation
================================================ FILE: docs/_modules/cleverhans/attacks/hop_skip_jump_attack.html ================================================ cleverhans.attacks.hop_skip_jump_attack — CleverHans documentation

Source code for cleverhans.attacks.hop_skip_jump_attack

""" Boundary Attack++
"""
import logging
import numpy as np
import tensorflow as tf
from warnings import warn
from cleverhans.attacks import Attack
from cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits
from cleverhans import utils, utils_tf

np_dtype = np.dtype('float32')
tf_dtype = tf.as_dtype('float32')

_logger = utils.create_logger("cleverhans.attacks.hop_skip_jump_attack")
_logger.setLevel(logging.INFO)


[docs]class HopSkipJumpAttack(Attack): """ HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright. It is a decision-based attack that requires access to output labels of a model alone. Paper link: https://arxiv.org/abs/1904.02144 At a high level, this attack is an iterative attack composed of three steps: Binary search to approach the boundary; gradient estimation; stepsize search. HopSkipJumpAttack requires fewer model queries than Boundary Attack which was based on rejective sampling. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor. see parse_params for details. """ def __init__(self, model, sess, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(HopSkipJumpAttack, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y_target', 'image_target') self.structural_kwargs = [ 'stepsize_search', 'clip_min', 'clip_max', 'constraint', 'num_iterations', 'initial_num_evals', 'max_num_evals', 'batch_size', 'verbose', 'gamma', ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See `parse_params` """ self.parse_params(**kwargs) shape = [int(i) for i in x.get_shape().as_list()[1:]] assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' _check_first_dimension(x, 'input') if self.y_target is not None: _check_first_dimension(self.y_target, 'y_target') assert self.image_target is not None, \ 'Require a target image for targeted attack.' _check_first_dimension(self.image_target, 'image_target') # Set shape and d. self.shape = shape self.d = int(np.prod(shape)) # Set binary search threshold. if self.constraint == 'l2': self.theta = self.gamma / (np.sqrt(self.d) * self.d) else: self.theta = self.gamma / (self.d * self.d) # Construct input placeholder and output for decision function. self.input_ph = tf.placeholder( tf_dtype, [None] + list(self.shape), name='input_image') self.logits = self.model.get_logits(self.input_ph) def hsja_wrap(x, target_label, target_image): """ Wrapper to use tensors as input and output. """ return np.array(self._hsja(x, target_label, target_image), dtype=self.np_dtype) if self.y_target is not None: # targeted attack that requires target label and image. wrap = tf.py_func(hsja_wrap, [x[0], self.y_target[0], self.image_target[0]], self.tf_dtype) else: if self.image_target is not None: # untargeted attack with an initialized image. wrap = tf.py_func(lambda x, target_image: hsja_wrap(x, None, target_image), [x[0], self.image_target[0]], self.tf_dtype) else: # untargeted attack without an initialized image. wrap = tf.py_func(lambda x: hsja_wrap(x, None, None), [x[0]], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def generate_np(self, x, **kwargs): """ Generate adversarial images in a for loop. :param y: An array of shape (n, nb_classes) for true labels. :param y_target: An array of shape (n, nb_classes) for target labels. Required for targeted attack. :param image_target: An array of shape (n, **image shape) for initial target images. Required for targeted attack. See parse_params for other kwargs. """ x_adv = [] if 'image_target' in kwargs and kwargs['image_target'] is not None: image_target = np.copy(kwargs['image_target']) else: image_target = None if 'y_target' in kwargs and kwargs['y_target'] is not None: y_target = np.copy(kwargs['y_target']) else: y_target = None for i, x_single in enumerate(x): img = np.expand_dims(x_single, axis=0) if image_target is not None: single_img_target = np.expand_dims(image_target[i], axis=0) kwargs['image_target'] = single_img_target if y_target is not None: single_y_target = np.expand_dims(y_target[i], axis=0) kwargs['y_target'] = single_y_target adv_img = super(HopSkipJumpAttack, self).generate_np(img, **kwargs) x_adv.append(adv_img) return np.concatenate(x_adv, axis=0)
[docs] def parse_params(self, y_target=None, image_target=None, initial_num_evals=100, max_num_evals=10000, stepsize_search='geometric_progression', num_iterations=64, gamma=1.0, constraint='l2', batch_size=128, verbose=True, clip_min=0, clip_max=1): """ :param y: A tensor of shape (1, nb_classes) for true labels. :param y_target: A tensor of shape (1, nb_classes) for target labels. Required for targeted attack. :param image_target: A tensor of shape (1, **image shape) for initial target images. Required for targeted attack. :param initial_num_evals: initial number of evaluations for gradient estimation. :param max_num_evals: maximum number of evaluations for gradient estimation. :param stepsize_search: How to search for stepsize; choices are 'geometric_progression', 'grid_search'. 'geometric progression' initializes the stepsize by ||x_t - x||_p / sqrt(iteration), and keep decreasing by half until reaching the target side of the boundary. 'grid_search' chooses the optimal epsilon over a grid, in the scale of ||x_t - x||_p. :param num_iterations: The number of iterations. :param gamma: The binary search threshold theta is gamma / d^{3/2} for l2 attack and gamma / d^2 for linf attack. :param constraint: The distance to optimize; choices are 'l2', 'linf'. :param batch_size: batch_size for model prediction. :param verbose: (boolean) Whether distance at each step is printed. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # ignore the y and y_target argument self.y_target = y_target self.image_target = image_target self.initial_num_evals = initial_num_evals self.max_num_evals = max_num_evals self.stepsize_search = stepsize_search self.num_iterations = num_iterations self.gamma = gamma self.constraint = constraint self.batch_size = batch_size self.clip_min = clip_min self.clip_max = clip_max self.verbose = verbose
def _hsja(self, sample, target_label, target_image): """ Main algorithm for HopSkipJumpAttack. Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sample: input image. Without the batchsize dimension. :param target_label: integer for targeted attack, None for nontargeted attack. Without the batchsize dimension. :param target_image: an array with the same size as sample, or None. Without the batchsize dimension. Output: perturbed image. """ # Original label required for untargeted attack. if target_label is None: original_label = np.argmax( self.sess.run(self.logits, feed_dict={self.input_ph: sample[None]}) ) else: target_label = np.argmax(target_label) def decision_function(images): """ Decision function output 1 on the desired side of the boundary, 0 otherwise. """ images = clip_image(images, self.clip_min, self.clip_max) prob = [] for i in range(0, len(images), self.batch_size): batch = images[i:i+self.batch_size] prob_i = self.sess.run(self.logits, feed_dict={self.input_ph: batch}) prob.append(prob_i) prob = np.concatenate(prob, axis=0) if target_label is None: return np.argmax(prob, axis=1) != original_label else: return np.argmax(prob, axis=1) == target_label # Initialize. if target_image is None: perturbed = initialize(decision_function, sample, self.shape, self.clip_min, self.clip_max) else: perturbed = target_image # Project the initialization to the boundary. perturbed, dist_post_update = binary_search_batch(sample, np.expand_dims(perturbed, 0), decision_function, self.shape, self.constraint, self.theta) dist = compute_distance(perturbed, sample, self.constraint) for j in np.arange(self.num_iterations): current_iteration = j + 1 # Choose delta. delta = select_delta(dist_post_update, current_iteration, self.clip_max, self.clip_min, self.d, self.theta, self.constraint) # Choose number of evaluations. num_evals = int(min([self.initial_num_evals * np.sqrt(j+1), self.max_num_evals])) # approximate gradient. gradf = approximate_gradient(decision_function, perturbed, num_evals, delta, self.constraint, self.shape, self.clip_min, self.clip_max) if self.constraint == 'linf': update = np.sign(gradf) else: update = gradf # search step size. if self.stepsize_search == 'geometric_progression': # find step size. epsilon = geometric_progression_for_stepsize(perturbed, update, dist, decision_function, current_iteration) # Update the sample. perturbed = clip_image(perturbed + epsilon * update, self.clip_min, self.clip_max) # Binary search to return to the boundary. perturbed, dist_post_update = binary_search_batch(sample, perturbed[None], decision_function, self.shape, self.constraint, self.theta) elif self.stepsize_search == 'grid_search': # Grid search for stepsize. epsilons = np.logspace(-4, 0, num=20, endpoint=True) * dist epsilons_shape = [20] + len(self.shape) * [1] perturbeds = perturbed + epsilons.reshape(epsilons_shape) * update perturbeds = clip_image(perturbeds, self.clip_min, self.clip_max) idx_perturbed = decision_function(perturbeds) if np.sum(idx_perturbed) > 0: # Select the perturbation that yields the minimum distance # after binary search. perturbed, dist_post_update = binary_search_batch(sample, perturbeds[idx_perturbed], decision_function, self.shape, self.constraint, self.theta) # compute new distance. dist = compute_distance(perturbed, sample, self.constraint) if self.verbose: print('iteration: {:d}, {:s} distance {:.4E}'.format( j+1, self.constraint, dist)) perturbed = np.expand_dims(perturbed, 0) return perturbed
[docs]def BoundaryAttackPlusPlus(model, sess, dtypestr='float32', **kwargs): """ A previous name used for HopSkipJumpAttack. """ warn("BoundaryAttackPlusPlus will be removed after 2019-12-08; use HopSkipJumpAttack.") return HopSkipJumpAttack(model, sess, dtypestr, **kwargs)
def _check_first_dimension(x, tensor_name): message = "Tensor {} should have batch_size of 1.".format(tensor_name) if x.get_shape().as_list()[0] is None: check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1, message=message) with tf.control_dependencies([check_batch]): x = tf.identity(x) elif x.get_shape().as_list()[0] != 1: raise ValueError(message) def clip_image(image, clip_min, clip_max): """ Clip an image, or an image batch, with upper and lower threshold. """ return np.minimum(np.maximum(clip_min, image), clip_max) def compute_distance(x_ori, x_pert, constraint='l2'): """ Compute the distance between two images. """ if constraint == 'l2': dist = np.linalg.norm(x_ori - x_pert) elif constraint == 'linf': dist = np.max(abs(x_ori - x_pert)) return dist def approximate_gradient(decision_function, sample, num_evals, delta, constraint, shape, clip_min, clip_max): """ Gradient direction estimation """ # Generate random vectors. noise_shape = [num_evals] + list(shape) if constraint == 'l2': rv = np.random.randn(*noise_shape) elif constraint == 'linf': rv = np.random.uniform(low=-1, high=1, size=noise_shape) axis = tuple(range(1, 1 + len(shape))) rv = rv / np.sqrt(np.sum(rv ** 2, axis=axis, keepdims=True)) perturbed = sample + delta * rv perturbed = clip_image(perturbed, clip_min, clip_max) rv = (perturbed - sample) / delta # query the model. decisions = decision_function(perturbed) decision_shape = [len(decisions)] + [1] * len(shape) fval = 2 * decisions.astype(np_dtype).reshape(decision_shape) - 1.0 # Baseline subtraction (when fval differs) if np.mean(fval) == 1.0: # label changes. gradf = np.mean(rv, axis=0) elif np.mean(fval) == -1.0: # label not change. gradf = - np.mean(rv, axis=0) else: fval = fval - np.mean(fval) gradf = np.mean(fval * rv, axis=0) # Get the gradient direction. gradf = gradf / np.linalg.norm(gradf) return gradf def project(original_image, perturbed_images, alphas, shape, constraint): """ Projection onto given l2 / linf balls in a batch. """ alphas_shape = [len(alphas)] + [1] * len(shape) alphas = alphas.reshape(alphas_shape) if constraint == 'l2': projected = (1-alphas) * original_image + alphas * perturbed_images elif constraint == 'linf': projected = clip_image( perturbed_images, original_image - alphas, original_image + alphas ) return projected def binary_search_batch(original_image, perturbed_images, decision_function, shape, constraint, theta): """ Binary search to approach the boundary. """ # Compute distance between each of perturbed image and original image. dists_post_update = np.array([ compute_distance( original_image, perturbed_image, constraint ) for perturbed_image in perturbed_images]) # Choose upper thresholds in binary searchs based on constraint. if constraint == 'linf': highs = dists_post_update # Stopping criteria. thresholds = np.minimum(dists_post_update * theta, theta) else: highs = np.ones(len(perturbed_images)) thresholds = theta lows = np.zeros(len(perturbed_images)) while np.max((highs - lows) / thresholds) > 1: # projection to mids. mids = (highs + lows) / 2.0 mid_images = project(original_image, perturbed_images, mids, shape, constraint) # Update highs and lows based on model decisions. decisions = decision_function(mid_images) lows = np.where(decisions == 0, mids, lows) highs = np.where(decisions == 1, mids, highs) out_images = project(original_image, perturbed_images, highs, shape, constraint) # Compute distance of the output image to select the best choice. # (only used when stepsize_search is grid_search.) dists = np.array([ compute_distance( original_image, out_image, constraint ) for out_image in out_images]) idx = np.argmin(dists) dist = dists_post_update[idx] out_image = out_images[idx] return out_image, dist def initialize(decision_function, sample, shape, clip_min, clip_max): """ Efficient Implementation of BlendedUniformNoiseAttack in Foolbox. """ success = 0 num_evals = 0 # Find a misclassified random noise. while True: random_noise = np.random.uniform(clip_min, clip_max, size=shape) success = decision_function(random_noise[None])[0] if success: break num_evals += 1 message = "Initialization failed! Try to use a misclassified image as `target_image`" assert num_evals < 1e4, message # Binary search to minimize l2 distance to original image. low = 0.0 high = 1.0 while high - low > 0.001: mid = (high + low) / 2.0 blended = (1 - mid) * sample + mid * random_noise success = decision_function(blended[None])[0] if success: high = mid else: low = mid initialization = (1 - high) * sample + high * random_noise return initialization def geometric_progression_for_stepsize(x, update, dist, decision_function, current_iteration): """ Geometric progression to search for stepsize. Keep decreasing stepsize by half until reaching the desired side of the boundary. """ epsilon = dist / np.sqrt(current_iteration) while True: updated = x + epsilon * update success = decision_function(updated[None])[0] if success: break else: epsilon = epsilon / 2.0 return epsilon def select_delta(dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint): """ Choose the delta at the scale of distance between x and perturbed sample. """ if current_iteration == 1: delta = 0.1 * (clip_max - clip_min) else: if constraint == 'l2': delta = np.sqrt(d) * theta * dist_post_update elif constraint == 'linf': delta = d * theta * dist_post_update return delta
================================================ FILE: docs/_modules/cleverhans/attacks/lbfgs.html ================================================ cleverhans.attacks.lbfgs — CleverHans documentation

Source code for cleverhans.attacks.lbfgs

"""The LBFGS attack
"""

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, softmax_cross_entropy_with_logits
from cleverhans.model import CallableModelWrapper, Model, wrapper_warning
from cleverhans import utils
from cleverhans import utils_tf

_logger = utils.create_logger("cleverhans.attacks.lbfgs")
tf_dtype = tf.as_dtype('float32')


[docs]class LBFGS(Attack): """ LBFGS is the first adversarial attack for convolutional neural networks, and is a target & iterative attack. Paper link: "https://arxiv.org/pdf/1312.6199.pdf" :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess, dtypestr='float32', **kwargs): if not isinstance(model, Model): wrapper_warning() model = CallableModelWrapper(model, 'probs') super(LBFGS, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y_target',) self.structural_kwargs = [ 'batch_size', 'binary_search_steps', 'max_iterations', 'initial_const', 'clip_min', 'clip_max' ]
[docs] def generate(self, x, **kwargs): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See `parse_params` """ assert self.sess is not None, \ 'Cannot use `generate` when no `sess` was provided' self.parse_params(**kwargs) if self.y_target is None: self.y_target, nb_classes = self.get_or_guess_labels(x, kwargs) self.targeted_attack = False else: _, nb_classes = self.get_or_guess_labels(x, kwargs) self.targeted_attack = True attack = LBFGS_impl( self.sess, x, self.model.get_logits(x), self.y_target, self.targeted_attack, self.binary_search_steps, self.max_iterations, self.initial_const, self.clip_min, self.clip_max, nb_classes, self.batch_size) def lbfgs_wrap(x_val, y_val): """ Wrapper creating TensorFlow interface for use with py_func """ return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype) wrap = tf.py_func(lbfgs_wrap, [x, self.y_target], self.tf_dtype) wrap.set_shape(x.get_shape()) return wrap
[docs] def parse_params(self, y_target=None, batch_size=1, binary_search_steps=5, max_iterations=1000, initial_const=1e-2, clip_min=0, clip_max=1): """ :param y_target: (optional) A tensor with the one-hot target labels. :param batch_size: The number of inputs to include in a batch and process simultaneously. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification. :param max_iterations: The maximum number of iterations. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and cross-entropy loss of the classification. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ self.y_target = y_target self.batch_size = batch_size self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max
class LBFGS_impl(object): """ Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param sess: a TF session. :param x: A tensor with the inputs. :param logits: A tensor with model's output logits. :param targeted_label: A tensor with the target labels. :param binary_search_steps: The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification. :param max_iterations: The maximum number of iterations. :param initial_const: The initial tradeoff-constant to use to tune the relative importance of size of the purturbation and cross-entropy loss of the classification. :param clip_min: Minimum input component value :param clip_max: Maximum input component value :param num_labels: The number of classes in the model's output. :param batch_size: Number of attacks to run simultaneously. """ def __init__(self, sess, x, logits, targeted_label, targeted_attack, binary_search_steps, max_iterations, initial_const, clip_min, clip_max, nb_classes, batch_size): self.sess = sess self.x = x self.logits = logits assert logits.op.type != 'Softmax' self.targeted_label = targeted_label self.targeted_attack = targeted_attack self.binary_search_steps = binary_search_steps self.max_iterations = max_iterations self.initial_const = initial_const self.clip_min = clip_min self.clip_max = clip_max self.batch_size = batch_size self.repeat = self.binary_search_steps >= 10 self.shape = tuple([self.batch_size] + list(self.x.get_shape().as_list()[1:])) self.ori_img = tf.Variable( np.zeros(self.shape), dtype=tf_dtype, name='ori_img') self.const = tf.Variable( np.zeros(self.batch_size), dtype=tf_dtype, name='const') self.score = softmax_cross_entropy_with_logits( labels=self.targeted_label, logits=self.logits) self.l2dist = reduce_sum(tf.square(self.x - self.ori_img)) # small self.const will result small adversarial perturbation # targeted attack aims at minimize loss against target label # untargeted attack aims at maximize loss against True label if self.targeted_attack: self.loss = reduce_sum(self.score * self.const) + self.l2dist else: self.loss = -reduce_sum(self.score * self.const) + self.l2dist self.grad, = tf.gradients(self.loss, self.x) def attack(self, x_val, targets): """ Perform the attack on the given instance for the given targets. """ def lbfgs_objective(adv_x, self, targets, oimgs, CONST): """ returns the function value and the gradient for fmin_l_bfgs_b """ loss = self.sess.run( self.loss, feed_dict={ self.x: adv_x.reshape(oimgs.shape), self.targeted_label: targets, self.ori_img: oimgs, self.const: CONST }) grad = self.sess.run( self.grad, feed_dict={ self.x: adv_x.reshape(oimgs.shape), self.targeted_label: targets, self.ori_img: oimgs, self.const: CONST }) return loss, grad.flatten().astype(float) def attack_success(out, target, targeted_attack): """ returns attack result """ if targeted_attack: return out == target else: return out != target # begin the main part for the attack from scipy.optimize import fmin_l_bfgs_b oimgs = np.clip(x_val, self.clip_min, self.clip_max) CONST = np.ones(self.batch_size) * self.initial_const # set the lower and upper bounds accordingly lower_bound = np.zeros(self.batch_size) upper_bound = np.ones(self.batch_size) * 1e10 # set the box constraints for the optimization function clip_min = self.clip_min * np.ones(oimgs.shape[:]) clip_max = self.clip_max * np.ones(oimgs.shape[:]) clip_bound = list(zip(clip_min.flatten(), clip_max.flatten())) # placeholders for the best l2 and instance attack found so far o_bestl2 = [1e10] * self.batch_size o_bestattack = np.copy(oimgs) for outer_step in range(self.binary_search_steps): _logger.debug(" Binary search step %s of %s", outer_step, self.binary_search_steps) # The last iteration (if we run many steps) repeat the search once. if self.repeat and outer_step == self.binary_search_steps - 1: CONST = upper_bound # optimization function adv_x, _, __ = fmin_l_bfgs_b( lbfgs_objective, oimgs.flatten().astype(float), args=(self, targets, oimgs, CONST), bounds=clip_bound, maxiter=self.max_iterations, iprint=0) adv_x = adv_x.reshape(oimgs.shape) assert np.amax(adv_x) <= self.clip_max and \ np.amin(adv_x) >= self.clip_min, \ 'fmin_l_bfgs_b returns are invalid' # adjust the best result (i.e., the adversarial example with the # smallest perturbation in terms of L_2 norm) found so far preds = np.atleast_1d( utils_tf.model_argmax(self.sess, self.x, self.logits, adv_x)) _logger.debug("predicted labels are %s", preds) l2s = np.zeros(self.batch_size) for i in range(self.batch_size): l2s[i] = np.sum(np.square(adv_x[i] - oimgs[i])) for e, (l2, pred, ii) in enumerate(zip(l2s, preds, adv_x)): if l2 < o_bestl2[e] and attack_success(pred, np.argmax(targets[e]), self.targeted_attack): o_bestl2[e] = l2 o_bestattack[e] = ii # adjust the constant as needed for e in range(self.batch_size): if attack_success(preds[e], np.argmax(targets[e]), self.targeted_attack): # success, divide const by two upper_bound[e] = min(upper_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: # failure, either multiply by 10 if no solution found yet # or do binary search with the known upper bound lower_bound[e] = max(lower_bound[e], CONST[e]) if upper_bound[e] < 1e9: CONST[e] = (lower_bound[e] + upper_bound[e]) / 2 else: CONST[e] *= 10 _logger.debug(" Successfully generated adversarial examples " "on %s of %s instances.", sum(upper_bound < 1e9), self.batch_size) o_bestl2 = np.array(o_bestl2) mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9])) _logger.debug(" Mean successful distortion: {:.4g}".format(mean)) # return the best solution found o_bestl2 = np.array(o_bestl2) return o_bestattack
================================================ FILE: docs/_modules/cleverhans/attacks/madry_et_al.html ================================================ cleverhans.attacks.madry_et_al — CleverHans documentation

Source code for cleverhans.attacks.madry_et_al

"""
The MadryEtAl attack
"""

from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent


[docs]class MadryEtAl(ProjectedGradientDescent): """ The attack from Madry et al 2017 """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(MadryEtAl, self).__init__(model, sess=sess, dtypestr=dtypestr, default_rand_init=True, **kwargs)
================================================ FILE: docs/_modules/cleverhans/attacks/max_confidence.html ================================================ cleverhans.attacks.max_confidence — CleverHans documentation

Source code for cleverhans.attacks.max_confidence

"""The MaxConfidence attack.
"""
import warnings

import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent
from cleverhans.model import Model


[docs]class MaxConfidence(Attack): """ The MaxConfidence attack. An attack designed for use against models that use confidence thresholding as a defense. If the underlying optimizer is optimal, this attack procedure gives the optimal failure rate for every confidence threshold t > 0.5. Publication: https://openreview.net/forum?id=H1g0piA9tQ :param model: cleverhans.model.Model :param sess: optional tf.session.Session :param base_attacker: cleverhans.attacks.Attack """ def __init__(self, model, sess=None, base_attacker=None): if not isinstance(model, Model): raise TypeError("Model must be cleverhans.model.Model, got " + str(type(model))) super(MaxConfidence, self).__init__(model, sess) if base_attacker is None: self.base_attacker = ProjectedGradientDescent(model, sess=sess) else: self.base_attacker = base_attacker self.structural_kwargs = self.base_attacker.structural_kwargs self.feedable_kwargs = self.base_attacker.feedable_kwargs
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: Keyword arguments for the base attacker """ assert self.parse_params(**kwargs) labels, _nb_classes = self.get_or_guess_labels(x, kwargs) adv_x = self.attack(x, labels) return adv_x
[docs] def parse_params(self, y=None, nb_classes=10, **kwargs): self.y = y self.nb_classes = nb_classes self.params = kwargs if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs] def attack(self, x, true_y): """ Runs the untargeted attack. :param x: The input :param true_y: The correct label for `x`. This attack aims to produce misclassification. """ adv_x_cls = [] prob_cls = [] m = tf.shape(x)[0] true_y_idx = tf.argmax(true_y, axis=1) expanded_x = tf.concat([x] * self.nb_classes, axis=0) target_ys = [tf.to_float(tf.one_hot(tf.ones(m, dtype=tf.int32) * cls, self.nb_classes)) for cls in range(self.nb_classes)] target_y = tf.concat(target_ys, axis=0) adv_x_cls = self.attack_class(expanded_x, target_y) expanded_all_probs = self.model.get_probs(adv_x_cls) adv_x_list = tf.split(adv_x_cls, self.nb_classes) all_probs_list = tf.split(expanded_all_probs, self.nb_classes) for cls in range(self.nb_classes): target_y = target_ys[cls] all_probs = all_probs_list[cls] # We don't actually care whether we hit the target class. # We care about the probability of the most likely wrong class cur_prob_cls = tf.reduce_max(all_probs - true_y, axis=1) # Knock out examples that are correctly classified. # This is not needed to be optimal for t >= 0.5, but may as well do it # to get better failure rate at lower thresholds. chosen_cls = tf.argmax(all_probs, axis=1) eligible = tf.to_float(tf.not_equal(true_y_idx, chosen_cls)) cur_prob_cls = cur_prob_cls * eligible prob_cls.append(cur_prob_cls) probs = tf.concat([tf.expand_dims(e, 1) for e in prob_cls], axis=1) # Don't need to censor here because we knocked out the true class above # probs = probs - true_y most_confident = tf.argmax(probs, axis=1) fused_mask = tf.one_hot(most_confident, self.nb_classes) masks = tf.split(fused_mask, num_or_size_splits=self.nb_classes, axis=1) shape = [m] + [1] * (len(x.get_shape()) - 1) reshaped_masks = [tf.reshape(mask, shape) for mask in masks] out = sum(adv_x * rmask for adv_x, rmask in zip(adv_x_list, reshaped_masks)) return out
[docs] def attack_class(self, x, target_y): """ Run the attack on a specific target class. :param x: tf Tensor. The input example. :param target_y: tf Tensor. The attacker's desired target class. Returns: A targeted adversarial example, intended to be classified as the target class. """ adv = self.base_attacker.generate(x, y_target=target_y, **self.params) return adv
================================================ FILE: docs/_modules/cleverhans/attacks/momentum_iterative_method.html ================================================ cleverhans.attacks.momentum_iterative_method — CleverHans documentation

Source code for cleverhans.attacks.momentum_iterative_method

"""The MomentumIterativeMethod attack.
"""

import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.attacks.fast_gradient_method import optimize_linear
from cleverhans.compat import reduce_sum, reduce_mean, softmax_cross_entropy_with_logits
from cleverhans import utils_tf


[docs]class MomentumIterativeMethod(Attack): """ The Momentum Iterative Method (Dong et al. 2017). This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks and Targeted Adversarial Attacks. The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1710.06081.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a MomentumIterativeMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(MomentumIterativeMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'y', 'y_target', 'clip_min', 'clip_max') self.structural_kwargs = [ 'ord', 'nb_iter', 'decay_factor', 'sanity_checks', 'clip_grad']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: Keyword arguments. See `parse_params` for documentation. """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))) if self.clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))) # Initialize loop variables momentum = tf.zeros_like(x) adv_x = x # Fix labels to the first model predictions for loss computation y, _nb_classes = self.get_or_guess_labels(x, kwargs) y = y / reduce_sum(y, 1, keepdims=True) targeted = (self.y_target is not None) def cond(i, _, __): """Iterate until number of iterations completed""" return tf.less(i, self.nb_iter) def body(i, ax, m): """Do a momentum step""" logits = self.model.get_logits(ax) loss = softmax_cross_entropy_with_logits(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input grad, = tf.gradients(loss, ax) # Normalize current gradient and add it to the accumulated gradient red_ind = list(range(1, len(grad.get_shape()))) avoid_zero_div = tf.cast(1e-12, grad.dtype) grad = grad / tf.maximum( avoid_zero_div, reduce_mean(tf.abs(grad), red_ind, keepdims=True)) m = self.decay_factor * m + grad optimal_perturbation = optimize_linear(m, self.eps_iter, self.ord) if self.ord == 1: raise NotImplementedError("This attack hasn't been tested for ord=1." "It's not clear that FGM makes a good inner " "loop step for iterative optimization since " "it updates just one coordinate at a time.") # Update and clip adversarial example in current iteration ax = ax + optimal_perturbation ax = x + utils_tf.clip_eta(ax - x, self.ord, self.eps) if self.clip_min is not None and self.clip_max is not None: ax = utils_tf.clip_by_value(ax, self.clip_min, self.clip_max) ax = tf.stop_gradient(ax) return i + 1, ax, m _, adv_x, _ = tf.while_loop( cond, body, (tf.zeros([]), adv_x, momentum), back_prop=True, maximum_iterations=self.nb_iter) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs] def parse_params(self, eps=0.3, eps_iter=0.06, nb_iter=10, y=None, ord=np.inf, decay_factor=1.0, clip_min=None, clip_max=None, y_target=None, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param decay_factor: (optional) Decay factor for the momentum term. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.eps = eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.ord = ord self.decay_factor = decay_factor self.clip_min = clip_min self.clip_max = clip_max self.sanity_checks = sanity_checks if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: docs/_modules/cleverhans/attacks/noise.html ================================================ cleverhans.attacks.noise — CleverHans documentation

Source code for cleverhans.attacks.noise

"""The Noise attack

"""
import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack


[docs]class Noise(Attack): """ A weak attack that just picks a random point in the attacker's action space. When combined with an attack bundling function, this can be used to implement random search. References: https://arxiv.org/abs/1802.00420 recommends random search to help identify gradient masking. https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part of an attack bundling recipe combining many different optimizers to yield a stronger optimizer. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(Noise, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'clip_min', 'clip_max') self.structural_kwargs = ['ord']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) if self.ord != np.inf: raise NotImplementedError(self.ord) eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: assert self.clip_min is not None and self.clip_max is not None adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return adv_x
[docs] def parse_params(self, eps=0.3, ord=np.inf, clip_min=None, clip_max=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value """ # Save attack-specific parameters self.eps = eps self.ord = ord self.clip_min = clip_min self.clip_max = clip_max # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf]: raise ValueError("Norm order must be np.inf") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: docs/_modules/cleverhans/attacks/projected_gradient_descent.html ================================================ cleverhans.attacks.projected_gradient_descent — CleverHans documentation

Source code for cleverhans.attacks.projected_gradient_descent

"""
The ProjectedGradientDescent attack.
"""

import warnings

import numpy as np
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.attacks.fast_gradient_method import FastGradientMethod
from cleverhans import utils_tf
from cleverhans.compat import softmax_cross_entropy_with_logits
from cleverhans.utils_tf import clip_eta, random_lp_vector


[docs]class ProjectedGradientDescent(Attack): """ This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param default_rand_init: whether to use random initialization by default :param kwargs: passed through to super constructor """ FGM_CLASS = FastGradientMethod def __init__(self, model, sess=None, dtypestr='float32', default_rand_init=True, **kwargs): """ Create a ProjectedGradientDescent instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(ProjectedGradientDescent, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'y', 'y_target', 'clip_min', 'clip_max') self.structural_kwargs = ['ord', 'nb_iter', 'rand_init', 'clip_grad', 'sanity_checks', 'loss_fn'] self.default_rand_init = default_rand_init
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))) if self.clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))) # Initialize loop variables if self.rand_init: eta = random_lp_vector(tf.shape(x), self.ord, tf.cast(self.rand_init_eps, x.dtype), dtype=x.dtype) else: eta = tf.zeros(tf.shape(x)) # Clip eta eta = clip_eta(eta, self.ord, self.eps) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) if self.y_target is not None: y = self.y_target targeted = True elif self.y is not None: y = self.y targeted = False else: model_preds = self.model.get_probs(x) preds_max = tf.reduce_max(model_preds, 1, keepdims=True) y = tf.to_float(tf.equal(model_preds, preds_max)) y = tf.stop_gradient(y) targeted = False del model_preds y_kwarg = 'y_target' if targeted else 'y' fgm_params = { 'eps': self.eps_iter, y_kwarg: y, 'ord': self.ord, 'loss_fn': self.loss_fn, 'clip_min': self.clip_min, 'clip_max': self.clip_max, 'clip_grad': self.clip_grad } if self.ord == 1: raise NotImplementedError("FGM is not a good inner loop step for PGD " " when ord=1, because ord=1 FGM changes only " " one pixel at a time. Use the SparseL1Descent " " attack instead, which allows fine-grained " " control over the sparsity of the gradient " " updates.") # Use getattr() to avoid errors in eager execution attacks FGM = self.FGM_CLASS( self.model, sess=getattr(self, 'sess', None), dtypestr=self.dtypestr) def cond(i, _): """Iterate until requested number of iterations is completed""" return tf.less(i, self.nb_iter) def body(i, adv_x): """Do a projected gradient step""" adv_x = FGM.generate(adv_x, **fgm_params) # Clipping perturbation eta to self.ord norm ball eta = adv_x - x eta = clip_eta(eta, self.ord, self.eps) adv_x = x + eta # Redo the clipping. # FGM already did it, but subtracting and re-adding eta can add some # small numerical error. if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return i + 1, adv_x _, adv_x = tf.while_loop(cond, body, (tf.zeros([]), adv_x), back_prop=True, maximum_iterations=self.nb_iter) # Asserts run only on CPU. # When multi-GPU eval code tries to force all PGD ops onto GPU, this # can cause an error. common_dtype = tf.float32 asserts.append(utils_tf.assert_less_equal(tf.cast(self.eps_iter, dtype=common_dtype), tf.cast(self.eps, dtype=common_dtype))) if self.ord == np.inf and self.clip_min is not None: # The 1e-6 is needed to compensate for numerical error. # Without the 1e-6 this fails when e.g. eps=.2, clip_min=.5, # clip_max=.7 asserts.append(utils_tf.assert_less_equal(tf.cast(self.eps, x.dtype), 1e-6 + tf.cast(self.clip_max, x.dtype) - tf.cast(self.clip_min, x.dtype))) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs] def parse_params(self, eps=0.3, eps_iter=0.05, nb_iter=10, y=None, ord=np.inf, loss_fn=softmax_cross_entropy_with_logits, clip_min=None, clip_max=None, y_target=None, rand_init=None, rand_init_eps=None, clip_grad=False, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param ord: (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param rand_init: (optional) Start the gradient descent from a point chosen uniformly at random in the norm ball of radius rand_init_eps :param rand_init_eps: (optional float) size of the norm ball from which the initial starting point is chosen. Defaults to eps :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param sanity_checks: bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the tests intentionally configure the attack strangely) """ # Save attack-specific parameters self.eps = eps if rand_init is None: rand_init = self.default_rand_init self.rand_init = rand_init if rand_init_eps is None: rand_init_eps = self.eps self.rand_init_eps = rand_init_eps self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.ord = ord self.loss_fn = loss_fn self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad if isinstance(eps, float) and isinstance(eps_iter, float): # If these are both known at compile time, we can check before anything # is run. If they are tf, we can't check them yet. assert eps_iter <= eps, (eps_iter, eps) if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") # Check if order of the norm is acceptable given current implementation if self.ord not in [np.inf, 1, 2]: raise ValueError("Norm order must be either np.inf, 1, or 2.") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") self.sanity_checks = sanity_checks if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: docs/_modules/cleverhans/attacks/saliency_map_method.html ================================================ cleverhans.attacks.saliency_map_method — CleverHans documentation

Source code for cleverhans.attacks.saliency_map_method

"""The SalienceMapMethod attack
"""
# pylint: disable=missing-docstring
import warnings

import numpy as np
from six.moves import xrange
import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_sum, reduce_max, reduce_any

tf_dtype = tf.as_dtype('float32')


[docs]class SaliencyMapMethod(Attack): """ The Jacobian-based Saliency Map Method (Papernot et al. 2016). Paper link: https://arxiv.org/pdf/1511.07528.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor :note: When not using symbolic implementation in `generate`, `sess` should be provided """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a SaliencyMapMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(SaliencyMapMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('y_target',) self.structural_kwargs = [ 'theta', 'gamma', 'clip_max', 'clip_min', 'symbolic_impl' ]
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) if self.symbolic_impl: # Create random targets if y_target not provided if self.y_target is None: from random import randint def random_targets(gt): result = gt.copy() nb_s = gt.shape[0] nb_classes = gt.shape[1] for i in range(nb_s): result[i, :] = np.roll(result[i, :], randint(1, nb_classes - 1)) return result labels, nb_classes = self.get_or_guess_labels(x, kwargs) self.y_target = tf.py_func(random_targets, [labels], self.tf_dtype) self.y_target.set_shape([None, nb_classes]) x_adv = jsma_symbolic( x, model=self.model, y_target=self.y_target, theta=self.theta, gamma=self.gamma, clip_min=self.clip_min, clip_max=self.clip_max) else: raise NotImplementedError("The jsma_batch function has been removed." " The symbolic_impl argument to SaliencyMapMethod will be removed" " on 2019-07-18 or after. Any code that depends on the non-symbolic" " implementation of the JSMA should be revised. Consider using" " SaliencyMapMethod.generate_np() instead.") return x_adv
[docs] def parse_params(self, theta=1., gamma=1., clip_min=0., clip_max=1., y_target=None, symbolic_impl=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param theta: (optional float) Perturbation introduced to modified components (can be positive or negative) :param gamma: (optional float) Maximum percentage of perturbed features :param clip_min: (optional float) Minimum component value for clipping :param clip_max: (optional float) Maximum component value for clipping :param y_target: (optional) Target tensor if the attack is targeted """ self.theta = theta self.gamma = gamma self.clip_min = clip_min self.clip_max = clip_max self.y_target = y_target self.symbolic_impl = symbolic_impl if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
def jsma_batch(*args, **kwargs): raise NotImplementedError( "The jsma_batch function has been removed. Any code that depends on it should be revised.") def jsma_symbolic(x, y_target, model, theta, gamma, clip_min, clip_max): """ TensorFlow implementation of the JSMA (see https://arxiv.org/abs/1511.07528 for details about the algorithm design choices). :param x: the input placeholder :param y_target: the target tensor :param model: a cleverhans.model.Model object. :param theta: delta for each feature adjustment :param gamma: a float between 0 - 1 indicating the maximum distortion percentage :param clip_min: minimum value for components of the example returned :param clip_max: maximum value for components of the example returned :return: a tensor for the adversarial example """ nb_classes = int(y_target.shape[-1].value) nb_features = int(np.product(x.shape[1:]).value) if x.dtype == tf.float32 and y_target.dtype == tf.int64: y_target = tf.cast(y_target, tf.int32) if x.dtype == tf.float32 and y_target.dtype == tf.float64: warnings.warn("Downcasting labels---this should be harmless unless" " they are smoothed") y_target = tf.cast(y_target, tf.float32) max_iters = np.floor(nb_features * gamma / 2) increase = bool(theta > 0) tmp = np.ones((nb_features, nb_features), int) np.fill_diagonal(tmp, 0) zero_diagonal = tf.constant(tmp, tf_dtype) # Compute our initial search domain. We optimize the initial search domain # by removing all features that are already at their maximum values (if # increasing input features---otherwise, at their minimum value). if increase: search_domain = tf.reshape( tf.cast(x < clip_max, tf_dtype), [-1, nb_features]) else: search_domain = tf.reshape( tf.cast(x > clip_min, tf_dtype), [-1, nb_features]) # Loop variables # x_in: the tensor that holds the latest adversarial outputs that are in # progress. # y_in: the tensor for target labels # domain_in: the tensor that holds the latest search domain # cond_in: the boolean tensor to show if more iteration is needed for # generating adversarial samples def condition(x_in, y_in, domain_in, i_in, cond_in): # Repeat the loop until we have achieved misclassification or # reaches the maximum iterations return tf.logical_and(tf.less(i_in, max_iters), cond_in) # Same loop variables as above def body(x_in, y_in, domain_in, i_in, cond_in): # Create graph for model logits and predictions logits = model.get_logits(x_in) preds = tf.nn.softmax(logits) preds_onehot = tf.one_hot(tf.argmax(preds, axis=1), depth=nb_classes) # create the Jacobian graph list_derivatives = [] for class_ind in xrange(nb_classes): derivatives = tf.gradients(logits[:, class_ind], x_in) list_derivatives.append(derivatives[0]) grads = tf.reshape( tf.stack(list_derivatives), shape=[nb_classes, -1, nb_features]) # Compute the Jacobian components # To help with the computation later, reshape the target_class # and other_class to [nb_classes, -1, 1]. # The last dimention is added to allow broadcasting later. target_class = tf.reshape( tf.transpose(y_in, perm=[1, 0]), shape=[nb_classes, -1, 1]) other_classes = tf.cast(tf.not_equal(target_class, 1), tf_dtype) grads_target = reduce_sum(grads * target_class, axis=0) grads_other = reduce_sum(grads * other_classes, axis=0) # Remove the already-used input features from the search space # Subtract 2 times the maximum value from those value so that # they won't be picked later increase_coef = (4 * int(increase) - 2) \ * tf.cast(tf.equal(domain_in, 0), tf_dtype) target_tmp = grads_target target_tmp -= increase_coef \ * reduce_max(tf.abs(grads_target), axis=1, keepdims=True) target_sum = tf.reshape(target_tmp, shape=[-1, nb_features, 1]) \ + tf.reshape(target_tmp, shape=[-1, 1, nb_features]) other_tmp = grads_other other_tmp += increase_coef \ * reduce_max(tf.abs(grads_other), axis=1, keepdims=True) other_sum = tf.reshape(other_tmp, shape=[-1, nb_features, 1]) \ + tf.reshape(other_tmp, shape=[-1, 1, nb_features]) # Create a mask to only keep features that match conditions if increase: scores_mask = ((target_sum > 0) & (other_sum < 0)) else: scores_mask = ((target_sum < 0) & (other_sum > 0)) # Create a 2D numpy array of scores for each pair of candidate features scores = tf.cast(scores_mask, tf_dtype) \ * (-target_sum * other_sum) * zero_diagonal # Extract the best two pixels best = tf.argmax( tf.reshape(scores, shape=[-1, nb_features * nb_features]), axis=1) p1 = tf.mod(best, nb_features) p2 = tf.floordiv(best, nb_features) p1_one_hot = tf.one_hot(p1, depth=nb_features) p2_one_hot = tf.one_hot(p2, depth=nb_features) # Check if more modification is needed for each sample mod_not_done = tf.equal(reduce_sum(y_in * preds_onehot, axis=1), 0) cond = mod_not_done & (reduce_sum(domain_in, axis=1) >= 2) # Update the search domain cond_float = tf.reshape(tf.cast(cond, tf_dtype), shape=[-1, 1]) to_mod = (p1_one_hot + p2_one_hot) * cond_float domain_out = domain_in - to_mod # Apply the modification to the images to_mod_reshape = tf.reshape( to_mod, shape=([-1] + x_in.shape[1:].as_list())) if increase: x_out = tf.minimum(clip_max, x_in + to_mod_reshape * theta) else: x_out = tf.maximum(clip_min, x_in - to_mod_reshape * theta) # Increase the iterator, and check if all misclassifications are done i_out = tf.add(i_in, 1) cond_out = reduce_any(cond) return x_out, y_in, domain_out, i_out, cond_out # Run loop to do JSMA x_adv, _, _, _, _ = tf.while_loop( condition, body, [x, y_target, search_domain, 0, True], parallel_iterations=1) return x_adv
================================================ FILE: docs/_modules/cleverhans/attacks/semantic.html ================================================ cleverhans.attacks.semantic — CleverHans documentation

Source code for cleverhans.attacks.semantic

"""Semantic adversarial examples
"""

from cleverhans.attacks.attack import Attack


[docs]class Semantic(Attack): """ Semantic adversarial examples https://arxiv.org/abs/1703.06857 Note: data must either be centered (so that the negative image can be made by simple negation) or must be in the interval [-1, 1] :param model: cleverhans.model.Model :param center: bool If True, assumes data has 0 mean so the negative image is just negation. If False, assumes data is in the interval [0, max_val] :param max_val: float Maximum value allowed in the input data :param sess: optional tf.Session :param dtypestr: dtype of data :param kwargs: passed through to the super constructor """ def __init__(self, model, center, max_val=1., sess=None, dtypestr='float32', **kwargs): super(Semantic, self).__init__(model, sess, dtypestr, **kwargs) self.center = center self.max_val = max_val if hasattr(model, 'dataset_factory'): if 'center' in model.dataset_factory.kwargs: assert center == model.dataset_factory.kwargs['center']
[docs] def generate(self, x, **kwargs): if self.center: return -x return self.max_val - x
================================================ FILE: docs/_modules/cleverhans/attacks/sparse_l1_descent.html ================================================ cleverhans.attacks.sparse_l1_descent — CleverHans documentation

Source code for cleverhans.attacks.sparse_l1_descent

"""
The SparseL1Descent attack.
"""

import warnings
from distutils.version import LooseVersion

import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans import utils_tf
from cleverhans.utils_tf import clip_eta, random_lp_vector
from cleverhans.compat import reduce_max, reduce_sum, \
  softmax_cross_entropy_with_logits


[docs]class SparseL1Descent(Attack): """ This class implements a variant of Projected Gradient Descent for the l1-norm (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2 cases covered by the ProjectedGradientDescent class, because the steepest descent direction for the l1-norm is too sparse (it updates a single coordinate in the adversarial perturbation in each step). This attack has an additional parameter that controls the sparsity of the update step. For moderately sparse update steps, the attack vastly outperforms Projected Steepest Descent and is competitive with other attacks targeted at the l1-norm such as the ElasticNetMethod attack (which is much more computationally expensive). Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a SparseL1Descent instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ super(SparseL1Descent, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'eps_iter', 'y', 'y_target', 'clip_min', 'clip_max', 'grad_sparsity') self.structural_kwargs = ['nb_iter', 'rand_init', 'clip_grad', 'sanity_checks']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) asserts = [] # If a data range was specified, check that the input was in that range if self.clip_min is not None: asserts.append(utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))) if self.clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))) # Initialize loop variables if self.rand_init: eta = random_lp_vector(tf.shape(x), ord=1, eps=tf.cast(self.eps, x.dtype), dtype=x.dtype) else: eta = tf.zeros(tf.shape(x)) # Clip eta eta = clip_eta(eta, ord=1, eps=self.eps) adv_x = x + eta if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) if self.y_target is not None: y = self.y_target targeted = True elif self.y is not None: y = self.y targeted = False else: model_preds = self.model.get_probs(x) preds_max = tf.reduce_max(model_preds, 1, keepdims=True) y = tf.to_float(tf.equal(model_preds, preds_max)) y = tf.stop_gradient(y) targeted = False del model_preds y_kwarg = 'y_target' if targeted else 'y' def cond(i, _): """Iterate until requested number of iterations is completed""" return tf.less(i, self.nb_iter) def body(i, adv_x): """Do a projected gradient step""" labels, _ = self.get_or_guess_labels(adv_x, {y_kwarg: y}) logits = self.model.get_logits(adv_x) adv_x = sparse_l1_descent(adv_x, logits, y=labels, eps=self.eps_iter, q=self.grad_sparsity, clip_min=self.clip_min, clip_max=self.clip_max, clip_grad=self.clip_grad, targeted=(self.y_target is not None), sanity_checks=self.sanity_checks) # Clipping perturbation eta to the l1-ball eta = adv_x - x eta = clip_eta(eta, ord=1, eps=self.eps) adv_x = x + eta # Redo the clipping. # Subtracting and re-adding eta can add some small numerical error. if self.clip_min is not None or self.clip_max is not None: adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max) return i + 1, adv_x _, adv_x = tf.while_loop(cond, body, (tf.zeros([]), adv_x), back_prop=True, maximum_iterations=self.nb_iter) # Asserts run only on CPU. # When multi-GPU eval code tries to force all PGD ops onto GPU, this # can cause an error. common_dtype = tf.float32 asserts.append(utils_tf.assert_less_equal(tf.cast(self.eps_iter, dtype=common_dtype), tf.cast(self.eps, dtype=common_dtype))) if self.sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
[docs] def parse_params(self, eps=10.0, eps_iter=1.0, nb_iter=20, y=None, clip_min=None, clip_max=None, y_target=None, rand_init=False, clip_grad=False, grad_sparsity=99, sanity_checks=True, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float) maximum distortion of adversarial example compared to original input :param eps_iter: (optional float) step size for each attack iteration :param nb_iter: (optional int) Number of attack iterations. :param y: (optional) A tensor with the true labels. :param y_target: (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded. :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param grad_sparsity (optional) Relative sparsity of the gradient update step, in percent. Only gradient values larger than this percentile are retained. This parameter can be a scalar, or a vector of the same length as the input batch dimension. :param sanity_checks: bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the tests intentionally configure the attack strangely) """ # Save attack-specific parameters self.eps = eps self.rand_init = rand_init self.eps_iter = eps_iter self.nb_iter = nb_iter self.y = y self.y_target = y_target self.clip_min = clip_min self.clip_max = clip_max self.clip_grad = clip_grad self.grad_sparsity = grad_sparsity if isinstance(eps, float) and isinstance(eps_iter, float): # If these are both known at compile time, we can check before anything # is run. If they are tf, we can't check them yet. assert eps_iter <= eps, (eps_iter, eps) if self.y is not None and self.y_target is not None: raise ValueError("Must not set both y and y_target") if self.clip_grad and (self.clip_min is None or self.clip_max is None): raise ValueError("Must set clip_min and clip_max if clip_grad is set") # The grad_sparsity argument governs the sparsity of the gradient # update. It indicates the percentile value above which gradient entries # are retained. It can be specified as a scalar or as a 1-dimensional # vector of the same size as the input's batch dimension. if isinstance(self.grad_sparsity, int) or \ isinstance(self.grad_sparsity, float): if not 0 < self.grad_sparsity < 100: raise ValueError("grad_sparsity should be in (0, 100)") else: self.grad_sparsity = tf.convert_to_tensor(self.grad_sparsity) if len(self.grad_sparsity.shape) > 1: raise ValueError("grad_sparsity should either be a scalar or a vector") self.sanity_checks = sanity_checks if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
def sparse_l1_descent(x, logits, y=None, eps=1.0, q=99, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True): """ TensorFlow implementation of the Dense L1 Descent Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted is true, then provide the target label. Otherwise, only provide this parameter if you'd like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the "label leaking" effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded. :param eps: the epsilon (input variation parameter) :param q: the percentile above which gradient values are retained. Either a scalar or a vector of same length as the input batch dimension. :param clip_min: Minimum float value for adversarial example components :param clip_max: Maximum float value for adversarial example components :param clip_grad: (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out. :param targeted: Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y. :return: a tensor for the adversarial example """ asserts = [] # If a data range was specified, check that the input was in that range if clip_min is not None: asserts.append(utils_tf.assert_greater_equal( x, tf.cast(clip_min, x.dtype))) if clip_max is not None: asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype))) # Make sure the caller has not passed probs by accident assert logits.op.type != 'Softmax' if y is None: # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(logits, 1, keepdims=True) y = tf.to_float(tf.equal(logits, preds_max)) y = tf.stop_gradient(y) y = y / reduce_sum(y, 1, keepdims=True) # Compute loss loss = softmax_cross_entropy_with_logits(labels=y, logits=logits) if targeted: loss = -loss # Define gradient of loss wrt input grad, = tf.gradients(loss, x) if clip_grad: grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max) red_ind = list(range(1, len(grad.get_shape()))) dim = tf.reduce_prod(tf.shape(x)[1:]) abs_grad = tf.reshape(tf.abs(grad), (-1, dim)) # if q is a scalar, broadcast it to a vector of same length as the batch dim q = tf.cast(tf.broadcast_to(q, tf.shape(x)[0:1]), tf.float32) k = tf.cast(tf.floor(q / 100 * tf.cast(dim, tf.float32)), tf.int32) # `tf.sort` is much faster than `tf.contrib.distributions.percentile`. # For TF <= 1.12, use `tf.nn.top_k` as `tf.sort` is not implemented. if LooseVersion(tf.__version__) <= LooseVersion('1.12.0'): # `tf.sort` is only available in TF 1.13 onwards sorted_grad = -tf.nn.top_k(-abs_grad, k=dim, sorted=True)[0] else: sorted_grad = tf.sort(abs_grad, axis=-1) idx = tf.stack((tf.range(tf.shape(abs_grad)[0]), k), -1) percentiles = tf.gather_nd(sorted_grad, idx) tied_for_max = tf.greater_equal(abs_grad, tf.expand_dims(percentiles, -1)) tied_for_max = tf.reshape(tf.cast(tied_for_max, x.dtype), tf.shape(grad)) num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True) optimal_perturbation = tf.sign(grad) * tied_for_max / num_ties # Add perturbation to original example to obtain adversarial example adv_x = x + utils_tf.mul(eps, optimal_perturbation) # If clipping is needed, reset all values outside of [clip_min, clip_max] if (clip_min is not None) or (clip_max is not None): # We don't currently support one-sided clipping assert clip_min is not None and clip_max is not None adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max) if sanity_checks: with tf.control_dependencies(asserts): adv_x = tf.identity(adv_x) return adv_x
================================================ FILE: docs/_modules/cleverhans/attacks/spatial_transformation_method.html ================================================ cleverhans.attacks.spatial_transformation_method — CleverHans documentation

Source code for cleverhans.attacks.spatial_transformation_method

"""The SpatialTransformationMethod attack
"""
import warnings

from cleverhans.attacks.attack import Attack


[docs]class SpatialTransformationMethod(Attack): """ Spatial transformation attack """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Create a SpatialTransformationMethod instance. Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ super(SpatialTransformationMethod, self).__init__( model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('n_samples', 'dx_min', 'dx_max', 'n_dxs', 'dy_min', 'dy_max', 'n_dys', 'angle_min', 'angle_max', 'n_angles', 'black_border_size')
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) from cleverhans.attacks_tf import spm labels, _ = self.get_or_guess_labels(x, kwargs) return spm( x, self.model, y=labels, n_samples=self.n_samples, dx_min=self.dx_min, dx_max=self.dx_max, n_dxs=self.n_dxs, dy_min=self.dy_min, dy_max=self.dy_max, n_dys=self.n_dys, angle_min=self.angle_min, angle_max=self.angle_max, n_angles=self.n_angles, black_border_size=self.black_border_size)
[docs] def parse_params(self, n_samples=None, dx_min=-0.1, dx_max=0.1, n_dxs=2, dy_min=-0.1, dy_max=0.1, n_dys=2, angle_min=-30, angle_max=30, n_angles=6, black_border_size=0, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param n_samples: (optional) The number of transformations sampled to construct the attack. Set it to None to run full grid attack. :param dx_min: (optional float) Minimum translation ratio along x-axis. :param dx_max: (optional float) Maximum translation ratio along x-axis. :param n_dxs: (optional int) Number of discretized translation ratios along x-axis. :param dy_min: (optional float) Minimum translation ratio along y-axis. :param dy_max: (optional float) Maximum translation ratio along y-axis. :param n_dys: (optional int) Number of discretized translation ratios along y-axis. :param angle_min: (optional float) Largest counter-clockwise rotation angle. :param angle_max: (optional float) Largest clockwise rotation angle. :param n_angles: (optional int) Number of discretized angles. :param black_border_size: (optional int) size of the black border in pixels. """ self.n_samples = n_samples self.dx_min = dx_min self.dx_max = dx_max self.n_dxs = n_dxs self.dy_min = dy_min self.dy_max = dy_max self.n_dys = n_dys self.angle_min = angle_min self.angle_max = angle_max self.n_angles = n_angles self.black_border_size = black_border_size if self.dx_min < -1 or self.dy_min < -1 or \ self.dx_max > 1 or self.dy_max > 1: raise ValueError("The value of translation must be bounded " "within [-1, 1]") if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
================================================ FILE: docs/_modules/cleverhans/attacks/spsa.html ================================================ cleverhans.attacks.spsa — CleverHans documentation

Source code for cleverhans.attacks.spsa

"""The SPSA attack
"""
# pylint: disable=missing-docstring
import warnings

import numpy as np
from six.moves import xrange
import tensorflow as tf
# import tensorflow_addons as tfa

from cleverhans.attacks.attack import Attack
from cleverhans.compat import reduce_mean, reduce_sum, reduce_max
from cleverhans.model import Model
from cleverhans import utils_tf

tf_dtype = tf.as_dtype('float32')


[docs]class SPSA(Attack): """ This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions. :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ DEFAULT_SPSA_SAMPLES = 128 DEFAULT_SPSA_ITERS = 1 DEFAULT_DELTA = 0.01 DEFAULT_LEARNING_RATE = 0.01 def __init__(self, model, sess=None, dtypestr='float32', **kwargs): super(SPSA, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'clip_min', 'clip_max', 'y', 'y_target') self.structural_kwargs = [ 'nb_iter', 'spsa_samples', 'spsa_iters', 'early_stop_loss_threshold', 'is_debug', 'is_targeted', ] assert isinstance(self.model, Model)
[docs] def generate(self, x, y=None, y_target=None, eps=None, clip_min=None, clip_max=None, nb_iter=None, is_targeted=None, early_stop_loss_threshold=None, learning_rate=DEFAULT_LEARNING_RATE, delta=DEFAULT_DELTA, spsa_samples=DEFAULT_SPSA_SAMPLES, batch_size=None, spsa_iters=DEFAULT_SPSA_ITERS, is_debug=False, epsilon=None, num_steps=None): """ Generate symbolic graph for adversarial examples. :param x: The model's symbolic inputs. Must be a batch of size 1. :param y: A Tensor or None. The index of the correct label. :param y_target: A Tensor or None. The index of the target label in a targeted attack. :param eps: The size of the maximum perturbation, measured in the L-infinity norm. :param clip_min: If specified, the minimum input value :param clip_max: If specified, the maximum input value :param nb_iter: The number of optimization steps. :param early_stop_loss_threshold: A float or None. If specified, the attack will end as soon as the loss is below `early_stop_loss_threshold`. :param learning_rate: Learning rate of ADAM optimizer. :param delta: Perturbation size used for SPSA approximation. :param spsa_samples: Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is `spsa_samples * spsa_iters` :param batch_size: Deprecated param that is an alias for spsa_samples :param spsa_iters: Number of model evaluations before performing an update, where each evaluation is on `spsa_samples` different inputs. :param is_debug: If True, print the adversarial loss after each update. :param epsilon: Deprecated alias for `eps` :param num_steps: Deprecated alias for `nb_iter`. :param is_targeted: Deprecated argument. Ignored. """ if epsilon is not None: if eps is not None: raise ValueError("Should not specify both eps and its deprecated " "alias, epsilon") warnings.warn("`epsilon` is deprecated. Switch to `eps`. `epsilon` may " "be removed on or after 2019-04-15.") eps = epsilon del epsilon if num_steps is not None: if nb_iter is not None: raise ValueError("Should not specify both nb_iter and its deprecated " "alias, num_steps") warnings.warn("`num_steps` is deprecated. Switch to `nb_iter`. " "`num_steps` may be removed on or after 2019-04-15.") nb_iter = num_steps del num_steps assert nb_iter is not None if (y is not None) + (y_target is not None) != 1: raise ValueError("Must specify exactly one of y (untargeted attack, " "cause the input not to be classified as this true " "label) and y_target (targeted attack, cause the " "input to be classified as this target label).") if is_targeted is not None: warnings.warn("`is_targeted` is deprecated. Simply do not specify it." " It may become an error to specify it on or after " "2019-04-15.") assert is_targeted == y_target is not None is_targeted = y_target is not None if x.get_shape().as_list()[0] is None: check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1) with tf.control_dependencies([check_batch]): x = tf.identity(x) elif x.get_shape().as_list()[0] != 1: raise ValueError("For SPSA, input tensor x must have batch_size of 1.") if batch_size is not None: warnings.warn( 'The "batch_size" argument to SPSA is deprecated, and will ' 'be removed on 2019-03-17. ' 'Please use spsa_samples instead.') spsa_samples = batch_size optimizer = SPSAAdam( lr=learning_rate, delta=delta, num_samples=spsa_samples, num_iters=spsa_iters) def loss_fn(x, label): """ Margin logit loss, with correct sign for targeted vs untargeted loss. """ logits = self.model.get_logits(x) loss_multiplier = 1 if is_targeted else -1 return loss_multiplier * margin_logit_loss( logits, label, nb_classes=self.model.nb_classes or logits.get_shape()[-1]) y_attack = y_target if is_targeted else y adv_x = projected_optimization( loss_fn, x, y_attack, eps, num_steps=nb_iter, optimizer=optimizer, early_stop_loss_threshold=early_stop_loss_threshold, is_debug=is_debug, clip_min=clip_min, clip_max=clip_max ) return adv_x
[docs] def generate_np(self, x_val, **kwargs): if "epsilon" in kwargs: warnings.warn("Using deprecated argument: see `generate`") assert "eps" not in kwargs kwargs["eps"] = kwargs["epsilon"] del kwargs["epsilon"] assert "eps" in kwargs if "num_steps" in kwargs: warnings.warn("Using deprecated argument: see `generate`") assert "nb_iter" not in kwargs kwargs["nb_iter"] = kwargs["num_steps"] del kwargs["num_steps"] if 'y' in kwargs and kwargs['y'] is not None: assert kwargs['y'].dtype in [np.int32, np.int64] if 'y_target' in kwargs and kwargs['y_target'] is not None: assert kwargs['y_target'].dtype in [np.int32, np.int64] # Call self.generate() sequentially for each image in the batch x_adv = [] batch_size = x_val.shape[0] y = kwargs.pop('y', [None] * batch_size) assert len(x_val) == len(y), '# of images and labels should match' for x_single, y_single in zip(x_val, y): x = np.expand_dims(x_single, axis=0) adv_img = super(SPSA, self).generate_np(x, y=y_single, **kwargs) x_adv.append(adv_img) return np.concatenate(x_adv, axis=0)
def _project_perturbation(perturbation, epsilon, input_image, clip_min=None, clip_max=None): """Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into hypercube such that the resulting adversarial example is between clip_min and clip_max, if applicable. """ if clip_min is None or clip_max is None: raise NotImplementedError("_project_perturbation currently has clipping " "hard-coded in.") # Ensure inputs are in the correct range with tf.control_dependencies([ utils_tf.assert_less_equal(input_image, tf.cast(clip_max, input_image.dtype)), utils_tf.assert_greater_equal(input_image, tf.cast(clip_min, input_image.dtype)) ]): clipped_perturbation = utils_tf.clip_by_value( perturbation, -epsilon, epsilon) new_image = utils_tf.clip_by_value( input_image + clipped_perturbation, clip_min, clip_max) return new_image - input_image class TensorOptimizer(object): """Optimizer for Tensors rather than tf.Variables. TensorOptimizers implement optimizers where the values being optimized are ordinary Tensors, rather than Variables. TF Variables can have strange behaviors when being assigned multiple times within a single sess.run() call, particularly in Distributed TF, so this avoids thinking about those issues. These are helper classes for the `projected_optimization` method. Apart from not using Variables, they follow an interface very similar to tf.Optimizer. """ def _compute_gradients(self, loss_fn, x, unused_optim_state): """Compute a new value of `x` to minimize `loss_fn`. Args: loss_fn: a callable that takes `x`, a batch of images, and returns a batch of loss values. `x` will be optimized to minimize `loss_fn(x)`. x: A list of Tensors, the values to be updated. This is analogous to the `var_list` argument in standard TF Optimizer. unused_optim_state: A (possibly nested) dict, containing any state info needed for the optimizer. Returns: new_x: A list of Tensors, the same length as `x`, which are updated new_optim_state: A dict, with the same structure as `optim_state`, which have been updated. """ # Assumes `x` is a list, # and contains a tensor representing a batch of images assert len(x) == 1 and isinstance(x, list), \ 'x should be a list and contain only one image tensor' x = x[0] loss = reduce_mean(loss_fn(x), axis=0) return tf.gradients(loss, x) def _apply_gradients(self, grads, x, optim_state): """ Given a gradient, make one optimization step. :param grads: list of tensors, same length as `x`, containing the corresponding gradients :param x: list of tensors to update :param optim_state: dict Returns: new_x: list of tensors, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ raise NotImplementedError( "_apply_gradients should be defined in each subclass") def minimize(self, loss_fn, x, optim_state): """ Analogous to tf.Optimizer.minimize :param loss_fn: tf Tensor, representing the loss to minimize :param x: list of Tensor, analogous to tf.Optimizer's var_list :param optim_state: A possibly nested dict, containing any optimizer state. Returns: new_x: list of Tensor, updated version of `x` new_optim_state: dict, updated version of `optim_state` """ grads = self._compute_gradients(loss_fn, x, optim_state) return self._apply_gradients(grads, x, optim_state) def init_state(self, x): """Returns the initial state of the optimizer. Args: x: A list of Tensors, which will be optimized. Returns: A dictionary, representing the initial state of the optimizer. """ raise NotImplementedError( "init_state should be defined in each subclass") class TensorGradientDescent(TensorOptimizer): """Vanilla Gradient Descent TensorOptimizer.""" def __init__(self, lr): self._lr = lr def init_state(self, x): return {} def _apply_gradients(self, grads, x, optim_state): new_x = [None] * len(x) for i in xrange(len(x)): new_x[i] = x[i] - self._lr * grads[i] return new_x, optim_state class TensorAdam(TensorOptimizer): """The Adam optimizer defined in https://arxiv.org/abs/1412.6980.""" def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-9): self._lr = lr self._beta1 = beta1 self._beta2 = beta2 self._epsilon = epsilon def init_state(self, x): """ Initialize t, m, and u """ optim_state = {} optim_state["t"] = 0. optim_state["m"] = [tf.zeros_like(v) for v in x] optim_state["u"] = [tf.zeros_like(v) for v in x] return optim_state def _apply_gradients(self, grads, x, optim_state): """Refer to parent class documentation.""" new_x = [None] * len(x) new_optim_state = { "t": optim_state["t"] + 1., "m": [None] * len(x), "u": [None] * len(x) } t = new_optim_state["t"] for i in xrange(len(x)): g = grads[i] m_old = optim_state["m"][i] u_old = optim_state["u"][i] new_optim_state["m"][i] = ( self._beta1 * m_old + (1. - self._beta1) * g) new_optim_state["u"][i] = ( self._beta2 * u_old + (1. - self._beta2) * g * g) m_hat = new_optim_state["m"][i] / (1. - tf.pow(self._beta1, t)) u_hat = new_optim_state["u"][i] / (1. - tf.pow(self._beta2, t)) new_x[i] = ( x[i] - self._lr * m_hat / (tf.sqrt(u_hat) + self._epsilon)) return new_x, new_optim_state class SPSAAdam(TensorAdam): """Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666. Gradients estimates are computed using Simultaneous Perturbation Stochastic Approximation (SPSA), combined with the ADAM update rule. """ def __init__(self, lr=0.01, delta=0.01, num_samples=128, num_iters=1, compare_to_analytic_grad=False): super(SPSAAdam, self).__init__(lr=lr) assert num_samples % 2 == 0, "number of samples must be even" self._delta = delta self._num_samples = num_samples // 2 # Since we mirror +/- delta later self._num_iters = num_iters self._compare_to_analytic_grad = compare_to_analytic_grad def _get_delta(self, x, delta): x_shape = x.get_shape().as_list() delta_x = delta * tf.sign( tf.random_uniform( [self._num_samples] + x_shape[1:], minval=-1., maxval=1., dtype=tf_dtype)) return delta_x def _compute_gradients(self, loss_fn, x, unused_optim_state): """Compute gradient estimates using SPSA.""" # Assumes `x` is a list, containing a [1, H, W, C] image # If static batch dimension is None, tf.reshape to batch size 1 # so that static shape can be inferred assert len(x) == 1 static_x_shape = x[0].get_shape().as_list() if static_x_shape[0] is None: x[0] = tf.reshape(x[0], [1] + static_x_shape[1:]) assert x[0].get_shape().as_list()[0] == 1 x = x[0] x_shape = x.get_shape().as_list() def body(i, grad_array): delta = self._delta delta_x = self._get_delta(x, delta) delta_x = tf.concat([delta_x, -delta_x], axis=0) loss_vals = tf.reshape( loss_fn(x + delta_x), [2 * self._num_samples] + [1] * (len(x_shape) - 1)) avg_grad = reduce_mean(loss_vals * delta_x, axis=0) / delta avg_grad = tf.expand_dims(avg_grad, axis=0) new_grad_array = grad_array.write(i, avg_grad) return i + 1, new_grad_array def cond(i, _): return i < self._num_iters _, all_grads = tf.while_loop( cond, body, loop_vars=[ 0, tf.TensorArray(size=self._num_iters, dtype=tf_dtype) ], back_prop=False, parallel_iterations=1) avg_grad = reduce_sum(all_grads.stack(), axis=0) return [avg_grad] def margin_logit_loss(model_logits, label, nb_classes=10, num_classes=None): """Computes difference between logit for `label` and next highest logit. The loss is high when `label` is unlikely (targeted by default). This follows the same interface as `loss_fn` for TensorOptimizer and projected_optimization, i.e. it returns a batch of loss values. """ if num_classes is not None: warnings.warn("`num_classes` is depreciated. Switch to `nb_classes`." " `num_classes` may be removed on or after 2019-04-23.") nb_classes = num_classes del num_classes if 'int' in str(label.dtype): logit_mask = tf.one_hot(label, depth=nb_classes, axis=-1) else: logit_mask = label if 'int' in str(logit_mask.dtype): logit_mask = tf.to_float(logit_mask) try: label_logits = reduce_sum(logit_mask * model_logits, axis=-1) except TypeError: raise TypeError("Could not take row-wise dot product between " "logit mask, of dtype " + str(logit_mask.dtype) + " and model_logits, of dtype " + str(model_logits.dtype)) logits_with_target_label_neg_inf = model_logits - logit_mask * 99999 highest_nonlabel_logits = reduce_max( logits_with_target_label_neg_inf, axis=-1) loss = highest_nonlabel_logits - label_logits return loss def _apply_black_border(x, border_size): orig_height = x.get_shape().as_list()[1] orig_width = x.get_shape().as_list()[2] x = tf.image.resize_images(x, (orig_width - 2*border_size, orig_height - 2*border_size)) return tf.pad(x, [[0, 0], [border_size, border_size], [border_size, border_size], [0, 0]], 'CONSTANT') def _apply_transformation(inputs): x, trans = inputs[0], inputs[1] dx, dy, angle = trans[0], trans[1], trans[2] height = x.get_shape().as_list()[1] width = x.get_shape().as_list()[2] # Pad the image to prevent two-step rotation / translation from truncating # corners max_dist_from_center = np.sqrt(height**2+width**2) / 2 min_edge_from_center = float(np.min([height, width])) / 2 padding = np.ceil(max_dist_from_center - min_edge_from_center).astype(np.int32) x = tf.pad(x, [[0, 0], [padding, padding], [padding, padding], [0, 0]], 'CONSTANT') # Apply rotation angle *= np.pi / 180 x = tfa.image.rotate(x, angle, interpolation='BILINEAR') # Apply translation dx_in_px = -dx * height dy_in_px = -dy * width translation = tf.convert_to_tensor([dx_in_px, dy_in_px]) try: x = tfa.image.translate(x, translation, interpolation='BILINEAR') except AttributeError as e: print("WARNING: SpatialAttack requires tf 1.6 or higher") raise e x = tfa.image.translate(x, translation, interpolation='BILINEAR') return tf.image.resize_image_with_crop_or_pad(x, height, width) def spm(x, model, y=None, n_samples=None, dx_min=-0.1, dx_max=0.1, n_dxs=5, dy_min=-0.1, dy_max=0.1, n_dys=5, angle_min=-30, angle_max=30, n_angles=31, black_border_size=0): """ TensorFlow implementation of the Spatial Transformation Method. :return: a tensor for the adversarial example """ if y is None: preds = model.get_probs(x) # Using model predictions as ground truth to avoid label leaking preds_max = reduce_max(preds, 1, keepdims=True) y = tf.to_float(tf.equal(preds, preds_max)) y = tf.stop_gradient(y) del preds y = y / reduce_sum(y, 1, keepdims=True) # Define the range of transformations dxs = np.linspace(dx_min, dx_max, n_dxs) dys = np.linspace(dy_min, dy_max, n_dys) angles = np.linspace(angle_min, angle_max, n_angles) if n_samples is None: import itertools transforms = list(itertools.product(*[dxs, dys, angles])) else: sampled_dxs = np.random.choice(dxs, n_samples) sampled_dys = np.random.choice(dys, n_samples) sampled_angles = np.random.choice(angles, n_samples) transforms = zip(sampled_dxs, sampled_dys, sampled_angles) transformed_ims = parallel_apply_transformations( x, transforms, black_border_size) def _compute_xent(x): preds = model.get_logits(x) return tf.nn.softmax_cross_entropy_with_logits_v2( labels=y, logits=preds) all_xents = tf.map_fn( _compute_xent, transformed_ims, parallel_iterations=1) # Must be 1 to avoid keras race conditions # Return the adv_x with worst accuracy # all_xents is n_total_samples x batch_size (SB) all_xents = tf.stack(all_xents) # SB # We want the worst case sample, with the largest xent_loss worst_sample_idx = tf.argmax(all_xents, axis=0) # B batch_size = tf.shape(x)[0] keys = tf.stack([ tf.range(batch_size, dtype=tf.int32), tf.cast(worst_sample_idx, tf.int32) ], axis=1) transformed_ims_bshwc = tf.einsum('sbhwc->bshwc', transformed_ims) after_lookup = tf.gather_nd(transformed_ims_bshwc, keys) # BHWC return after_lookup def parallel_apply_transformations(x, transforms, black_border_size=0): """ Apply image transformations in parallel. :param transforms: TODO :param black_border_size: int, size of black border to apply Returns: Transformed images """ transforms = tf.convert_to_tensor(transforms, dtype=tf.float32) x = _apply_black_border(x, black_border_size) num_transforms = transforms.get_shape().as_list()[0] im_shape = x.get_shape().as_list()[1:] # Pass a copy of x and a transformation to each iteration of the map_fn # callable tiled_x = tf.reshape( tf.tile(x, [num_transforms, 1, 1, 1]), [num_transforms, -1] + im_shape) elems = [tiled_x, transforms] transformed_ims = tf.map_fn( _apply_transformation, elems, dtype=tf.float32, parallel_iterations=1, # Must be 1 to avoid keras race conditions ) return transformed_ims
[docs]def projected_optimization(loss_fn, input_image, label, epsilon, num_steps, clip_min=None, clip_max=None, optimizer=TensorAdam(), project_perturbation=_project_perturbation, early_stop_loss_threshold=None, is_debug=False): """Generic projected optimization, generalized to work with approximate gradients. Used for e.g. the SPSA attack. Args: :param loss_fn: A callable which takes `input_image` and `label` as arguments, and returns a batch of loss values. Same interface as TensorOptimizer. :param input_image: Tensor, a batch of images :param label: Tensor, a batch of labels :param epsilon: float, the L-infinity norm of the maximum allowable perturbation :param num_steps: int, the number of steps of gradient descent :param clip_min: float, minimum pixel value :param clip_max: float, maximum pixel value :param optimizer: A `TensorOptimizer` object :param project_perturbation: A function, which will be used to enforce some constraint. It should have the same signature as `_project_perturbation`. :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below `early_stop_loss_threshold`. Enabling this option can have several different effects: - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned. This increases the attack success rate, because without early stopping the optimizer can accidentally bounce back to a point where the attack fails. - Early stopping can make the attack run faster because it may run for fewer steps. - Early stopping can make the attack run slower because the loss must be calculated at each step. The loss is not calculated as part of the normal SPSA optimization procedure. For most reasonable choices of hyperparameters, early stopping makes the attack much faster because it decreases the number of steps dramatically. :param is_debug: A bool. If True, print debug info for attack progress. Returns: adversarial version of `input_image`, with L-infinity difference less than epsilon, which tries to minimize loss_fn. Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper function which you can use to write your own attack methods. The method uses a tf.while_loop to optimize a loss function in a single sess.run() call. """ assert num_steps is not None if is_debug: with tf.device("/cpu:0"): input_image = tf.Print( input_image, [], "Starting PGD attack with epsilon: %s" % epsilon) init_perturbation = tf.random_uniform( tf.shape(input_image), minval=tf.cast(-epsilon, input_image.dtype), maxval=tf.cast(epsilon, input_image.dtype), dtype=input_image.dtype) init_perturbation = project_perturbation(init_perturbation, epsilon, input_image, clip_min=clip_min, clip_max=clip_max) init_optim_state = optimizer.init_state([init_perturbation]) nest = tf.nest def loop_body(i, perturbation, flat_optim_state): """Update perturbation to input image.""" optim_state = nest.pack_sequence_as( structure=init_optim_state, flat_sequence=flat_optim_state) def wrapped_loss_fn(x): return loss_fn(input_image + x, label) new_perturbation_list, new_optim_state = optimizer.minimize( wrapped_loss_fn, [perturbation], optim_state) projected_perturbation = project_perturbation(new_perturbation_list[0], epsilon, input_image, clip_min=clip_min, clip_max=clip_max) # Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we must explicitly # check whether the value is None. early_stop = early_stop_loss_threshold is not None compute_loss = is_debug or early_stop # Don't waste time building the loss graph if we're not going to use it if compute_loss: # NOTE: this step is not actually redundant with the optimizer step. # SPSA calculates the loss at randomly perturbed points but doesn't calculate the loss at the current point. loss = reduce_mean(wrapped_loss_fn(projected_perturbation), axis=0) if is_debug: with tf.device("/cpu:0"): loss = tf.Print(loss, [loss], "Total batch loss") if early_stop: i = tf.cond(tf.less(loss, early_stop_loss_threshold), lambda: float(num_steps), lambda: i) return i + 1, projected_perturbation, nest.flatten(new_optim_state) def cond(i, *_): return tf.less(i, num_steps) flat_init_optim_state = nest.flatten(init_optim_state) _, final_perturbation, _ = tf.while_loop( cond, loop_body, loop_vars=(tf.constant(0.), init_perturbation, flat_init_optim_state), parallel_iterations=1, back_prop=False, maximum_iterations=num_steps) if project_perturbation is _project_perturbation: # TODO: this assert looks totally wrong. # Not bothering to fix it now because it's only an assert. # 1) Multiplying by 1.1 gives a huge margin of error. This should probably # take the difference and allow a tolerance of 1e-6 or something like # that. # 2) I think it should probably check the *absolute value* of # final_perturbation perturbation_max = epsilon * 1.1 check_diff = utils_tf.assert_less_equal( final_perturbation, tf.cast(perturbation_max, final_perturbation.dtype), message="final_perturbation must change no pixel by more than " "%s" % perturbation_max) else: # TODO: let caller pass in a check_diff function as well as # project_perturbation check_diff = tf.no_op() if clip_min is None or clip_max is None: raise NotImplementedError("This function only supports clipping for now") check_range = [utils_tf.assert_less_equal(input_image, tf.cast(clip_max, input_image.dtype)), utils_tf.assert_greater_equal(input_image, tf.cast(clip_min, input_image.dtype))] with tf.control_dependencies([check_diff] + check_range): adversarial_image = input_image + final_perturbation return tf.stop_gradient(adversarial_image)
================================================ FILE: docs/_modules/cleverhans/attacks/virtual_adversarial_method.html ================================================ cleverhans.attacks.virtual_adversarial_method — CleverHans documentation

Source code for cleverhans.attacks.virtual_adversarial_method

"""The VirtualAdversarialMethod attack

"""

import warnings

import tensorflow as tf

from cleverhans.attacks.attack import Attack
from cleverhans.model import Model, CallableModelWrapper
from cleverhans.model import wrapper_warning_logits
from cleverhans import utils_tf

tf_dtype = tf.as_dtype('float32')

[docs]class VirtualAdversarialMethod(Attack): """ This attack was originally proposed by Miyato et al. (2016) and was used for virtual adversarial training. Paper link: https://arxiv.org/abs/1507.00677 :param model: cleverhans.model.Model :param sess: optional tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor """ def __init__(self, model, sess=None, dtypestr='float32', **kwargs): """ Note: the model parameter should be an instance of the cleverhans.model.Model abstraction provided by CleverHans. """ if not isinstance(model, Model): wrapper_warning_logits() model = CallableModelWrapper(model, 'logits') super(VirtualAdversarialMethod, self).__init__(model, sess, dtypestr, **kwargs) self.feedable_kwargs = ('eps', 'xi', 'clip_min', 'clip_max') self.structural_kwargs = ['num_iterations']
[docs] def generate(self, x, **kwargs): """ Generate symbolic graph for adversarial examples and return. :param x: The model's symbolic inputs. :param kwargs: See `parse_params` """ # Parse and save attack-specific parameters assert self.parse_params(**kwargs) return vatm( self.model, x, self.model.get_logits(x), eps=self.eps, num_iterations=self.num_iterations, xi=self.xi, clip_min=self.clip_min, clip_max=self.clip_max)
[docs] def parse_params(self, eps=2.0, nb_iter=None, xi=1e-6, clip_min=None, clip_max=None, num_iterations=None, **kwargs): """ Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. Attack-specific parameters: :param eps: (optional float )the epsilon (input variation parameter) :param nb_iter: (optional) the number of iterations Defaults to 1 if not specified :param xi: (optional float) the finite difference parameter :param clip_min: (optional float) Minimum input component value :param clip_max: (optional float) Maximum input component value :param num_iterations: Deprecated alias for `nb_iter` """ # Save attack-specific parameters self.eps = eps if num_iterations is not None: warnings.warn("`num_iterations` is deprecated. Switch to `nb_iter`." " The old name will be removed on or after 2019-04-26.") # Note: when we remove the deprecated alias, we can put the default # value of 1 for nb_iter back in the method signature assert nb_iter is None nb_iter = num_iterations del num_iterations if nb_iter is None: nb_iter = 1 self.num_iterations = nb_iter self.xi = xi self.clip_min = clip_min self.clip_max = clip_max if len(kwargs.keys()) > 0: warnings.warn("kwargs is unused and will be removed on or after " "2019-04-26.") return True
[docs]def vatm(model, x, logits, eps, num_iterations=1, xi=1e-6, clip_min=None, clip_max=None, scope=None): """ Tensorflow implementation of the perturbation method used for virtual adversarial training: https://arxiv.org/abs/1507.00677 :param model: the model which returns the network unnormalized logits :param x: the input placeholder :param logits: the model's unnormalized output tensor (the input to the softmax layer) :param eps: the epsilon (input variation parameter) :param num_iterations: the number of iterations :param xi: the finite difference parameter :param clip_min: optional parameter that can be used to set a minimum value for components of the example returned :param clip_max: optional parameter that can be used to set a maximum value for components of the example returned :param seed: the seed for random generator :return: a tensor for the adversarial example """ with tf.name_scope(scope, "virtual_adversarial_perturbation"): d = tf.random_normal(tf.shape(x), dtype=tf_dtype) for _ in range(num_iterations): d = xi * utils_tf.l2_batch_normalize(d) logits_d = model.get_logits(x + d) kl = utils_tf.kl_with_logits(logits, logits_d) Hd = tf.gradients(kl, d)[0] d = tf.stop_gradient(Hd) d = eps * utils_tf.l2_batch_normalize(d) adv_x = x + d if (clip_min is not None) and (clip_max is not None): adv_x = tf.clip_by_value(adv_x, clip_min, clip_max) return adv_x
================================================ FILE: docs/_modules/cleverhans/compat.html ================================================ cleverhans.compat — CleverHans documentation

Source code for cleverhans.compat

"""
Wrapper functions for writing code that is compatible with many versions
of TensorFlow.
"""
import warnings
import tensorflow as tf
# The following 2 imports are not used in this module. They are imported so that users of cleverhans.compat can
# get access to device_lib, app, and flags. A pylint bug makes these imports cause errors when using python3+tf1.8.
# Doing the sanitized import here once makes it possible to do "from cleverhans.compat import flags" throughout the
# library without needing to repeat the pylint boilerplate.
from tensorflow.python.client import device_lib # pylint: disable=no-name-in-module,unused-import
from tensorflow.python.platform import app, flags # pylint: disable=no-name-in-module,unused-import

def _wrap(f):
  """
  Wraps a callable `f` in a function that warns that the function is deprecated.
  """
  def wrapper(*args, **kwargs):
    """
    Issues a deprecation warning and passes through the arguments.
    """
    warnings.warn(str(f) + " is deprecated. Switch to calling the equivalent function in tensorflow. "
                  " This function was originally needed as a compatibility layer for old versions of tensorflow, "
                  " but support for those versions has now been dropped.")
    return f(*args, **kwargs)
  return wrapper

reduce_sum = _wrap(tf.reduce_sum)
reduce_max = _wrap(tf.reduce_max)
reduce_min = _wrap(tf.reduce_min)
reduce_mean = _wrap(tf.reduce_mean)
reduce_prod = _wrap(tf.reduce_prod)
reduce_any = _wrap(tf.reduce_any)

def reduce_function(op_func, input_tensor, axis=None, keepdims=None,
                    name=None, reduction_indices=None):
  """
  This function used to be needed to support tf 1.4 and early, but support for tf 1.4 and earlier is now dropped.
  :param op_func: expects the function to handle eg: tf.reduce_sum.
  :param input_tensor: The tensor to reduce. Should have numeric type.
  :param axis: The dimensions to reduce. If None (the default),
          reduces all dimensions. Must be in the range
          [-rank(input_tensor), rank(input_tensor)).
  :param keepdims: If true, retains reduced dimensions with length 1.
  :param name: A name for the operation (optional).
  :param reduction_indices: The old (deprecated) name for axis.
  :return: outputs same value as op_func.
  """

  warnings.warn("`reduce_function` is deprecated and may be removed on or after 2019-09-08.")

  out = op_func(input_tensor, axis=axis, keepdims=keepdims, name=name, reduction_indices=reduction_indices)

  return out

[docs]def softmax_cross_entropy_with_logits(sentinel=None, labels=None, logits=None, dim=-1): """ Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle deprecated warning """ # Make sure that all arguments were passed as named arguments. if sentinel is not None: name = "softmax_cross_entropy_with_logits" raise ValueError("Only call `%s` with " "named arguments (labels=..., logits=..., ...)" % name) if labels is None or logits is None: raise ValueError("Both labels and logits must be provided.") try: f = tf.nn.softmax_cross_entropy_with_logits_v2 except AttributeError: raise RuntimeError("This version of TensorFlow is no longer supported. See cleverhans/README.md") labels = tf.stop_gradient(labels) loss = f(labels=labels, logits=logits, dim=dim) return loss
================================================ FILE: docs/_modules/cleverhans/model.html ================================================ cleverhans.model — CleverHans documentation

Source code for cleverhans.model

"""
The Model class and related functionality.
"""
from abc import ABCMeta
import warnings

import tensorflow as tf

from cleverhans import utils_tf


[docs]class Model(object): """ An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them. """ __metaclass__ = ABCMeta O_LOGITS, O_PROBS, O_FEATURES = 'logits probs features'.split() def __init__(self, scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False): """ Constructor. :param scope: str, the name of model. :param nb_classes: integer, the number of classes. :param hparams: dict, hyper-parameters for the model. :needs_dummy_fprop: bool, if True the model's parameters are not created until fprop is called. """ self.scope = scope or self.__class__.__name__ self.nb_classes = nb_classes self.hparams = hparams or {} self.needs_dummy_fprop = needs_dummy_fprop def __call__(self, *args, **kwargs): """ For compatibility with functions used as model definitions (taking an input tensor and returning the tensor giving the output of the model on that input). """ warnings.warn("Model.__call__ is deprecated. " "The call is ambiguous as to whether the output should " "be logits or probabilities, and getting the wrong one " "can cause serious problems. " "The output actually is probabilities, which are a very " "dangerous thing to use as part of any interface for " "cleverhans, because softmax probabilities are prone " "to gradient masking." "On or after 2019-04-24, this method will change to raise " "an exception explaining why Model.__call__ should not be " "used.") return self.get_probs(*args, **kwargs)
[docs] def get_logits(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the output logits (i.e., the values fed as inputs to the softmax layer). """ outputs = self.fprop(x, **kwargs) if self.O_LOGITS in outputs: return outputs[self.O_LOGITS] raise NotImplementedError(str(type(self)) + "must implement `get_logits`" " or must define a " + self.O_LOGITS + " output in `fprop`")
[docs] def get_predicted_class(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the predicted label """ return tf.argmax(self.get_logits(x, **kwargs), axis=1)
[docs] def get_probs(self, x, **kwargs): """ :param x: A symbolic representation (Tensor) of the network input :return: A symbolic representation (Tensor) of the output probabilities (i.e., the output values produced by the softmax layer). """ d = self.fprop(x, **kwargs) if self.O_PROBS in d: output = d[self.O_PROBS] min_prob = tf.reduce_min(output) max_prob = tf.reduce_max(output) asserts = [utils_tf.assert_greater_equal(min_prob, tf.cast(0., min_prob.dtype)), utils_tf.assert_less_equal(max_prob, tf.cast(1., min_prob.dtype))] with tf.control_dependencies(asserts): output = tf.identity(output) return output elif self.O_LOGITS in d: return tf.nn.softmax(logits=d[self.O_LOGITS]) else: raise ValueError('Cannot find probs or logits.')
[docs] def fprop(self, x, **kwargs): """ Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic representation of their output. """ raise NotImplementedError('`fprop` not implemented.')
[docs] def get_params(self): """ Provides access to the model's parameters. :return: A list of all Variables defining the model parameters. """ if hasattr(self, 'params'): return list(self.params) # Catch eager execution and assert function overload. try: if tf.executing_eagerly(): raise NotImplementedError("For Eager execution - get_params " "must be overridden.") except AttributeError: pass # For graph-based execution scope_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/") if len(scope_vars) == 0: self.make_params() scope_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + "/") assert len(scope_vars) > 0 # Make sure no parameters have been added or removed if hasattr(self, "num_params"): if self.num_params != len(scope_vars): print("Scope: ", self.scope) print("Expected " + str(self.num_params) + " variables") print("Got " + str(len(scope_vars))) for var in scope_vars: print("\t" + str(var)) assert False else: self.num_params = len(scope_vars) return scope_vars
[docs] def make_params(self): """ Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set `needs_dummy_fprop=True` in the constructor. """ if self.needs_dummy_fprop: if hasattr(self, "_dummy_input"): return self._dummy_input = self.make_input_placeholder() self.fprop(self._dummy_input)
[docs] def get_layer_names(self): """Return the list of exposed layers for this model.""" raise NotImplementedError
[docs] def get_layer(self, x, layer, **kwargs): """Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer `layer` """ return self.fprop(x, **kwargs)[layer]
[docs] def make_input_placeholder(self): """Create and return a placeholder representing an input to the model. This method should respect context managers (e.g. "with tf.device") and should not just return a reference to a single pre-created placeholder. """ raise NotImplementedError(str(type(self)) + " does not implement " "make_input_placeholder")
[docs] def make_label_placeholder(self): """Create and return a placeholder representing class labels. This method should respect context managers (e.g. "with tf.device") and should not just return a reference to a single pre-created placeholder. """ raise NotImplementedError(str(type(self)) + " does not implement " "make_label_placeholder")
def __hash__(self): return hash(id(self)) def __eq__(self, other): return self is other
[docs]class CallableModelWrapper(Model): """A wrapper that turns a callable into a valid Model""" def __init__(self, callable_fn, output_layer): """ Wrap a callable function that takes a tensor as input and returns a tensor as output with the given layer name. :param callable_fn: The callable function taking a tensor and returning a given layer as output. :param output_layer: A string of the output layer returned by the function. (Usually either "probs" or "logits".) """ super(CallableModelWrapper, self).__init__() self.output_layer = output_layer self.callable_fn = callable_fn
[docs] def fprop(self, x, **kwargs): output = self.callable_fn(x, **kwargs) # Do some sanity checking to reduce the chance that probs are used # as logits accidentally or vice versa if self.output_layer == 'probs': assert output.op.type == "Softmax" min_prob = tf.reduce_min(output) max_prob = tf.reduce_max(output) asserts = [utils_tf.assert_greater_equal(min_prob, tf.cast(0., min_prob.dtype)), utils_tf.assert_less_equal(max_prob, tf.cast(1., max_prob.dtype))] with tf.control_dependencies(asserts): output = tf.identity(output) elif self.output_layer == 'logits': assert output.op.type != 'Softmax' return {self.output_layer: output}
[docs]def wrapper_warning(): """ Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer="probs". Using "probs" as any part of the attack interface is dangerous. We can't just change output_layer to logits because: - that would be a silent interface change. We'd have no way of detecting code that still means to use probs. Note that we can't just check whether the final output op is a softmax---for example, Inception puts a reshape after the softmax. - automatically wrapping user-supplied callables with output_layer='logits' is even worse, see `wrapper_warning_logits` Note: this function will be removed at the same time as the code that calls it. """ warnings.warn("Passing a callable is deprecated, because using" " probabilities is dangerous. It has a high risk " " of causing gradient masking due to loss of precision " " in the softmax op. Passing a callable rather than a " " Model subclass will become an error on or after " " 2019-04-24.")
[docs]def wrapper_warning_logits(): """ Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer="logits". This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking. """ warnings.warn("Passing a callable is deprecated, because it runs the " "risk of accidentally using probabilities in the place " "of logits. Please switch to passing a Model subclass " "so that you clearly specify which values are the logits. " "Passing a callable rather than a Model subclass will become " "an error on or after 2019-04-24.")
[docs]class NoSuchLayerError(ValueError): """Raised when a layer that does not exist is requested."""
================================================ FILE: docs/_modules/cleverhans/utils_tf.html ================================================ cleverhans.utils_tf — CleverHans documentation

Source code for cleverhans.utils_tf

"""Utility functions for writing TensorFlow code"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import logging
import math
import os
import time
import warnings

import numpy as np
import six
from six.moves import xrange
import tensorflow as tf

from cleverhans.compat import device_lib
from cleverhans.compat import reduce_sum, reduce_mean
from cleverhans.compat import reduce_max
from cleverhans.compat import softmax_cross_entropy_with_logits
from cleverhans.utils import batch_indices, _ArgsWrapper, create_logger

_logger = create_logger("cleverhans.utils.tf")
_logger.setLevel(logging.INFO)


def model_loss(y, model, mean=True):
  """
  Define loss of TF graph
  :param y: correct labels
  :param model: output of the model
  :param mean: boolean indicating whether should return mean of loss
               or vector of losses for each input of the batch
  :return: return mean of loss if True, otherwise return vector with per
           sample loss
  """
  warnings.warn("This function is deprecated and will be removed on or after"
                " 2019-04-05. Switch to cleverhans.train.train.")
  op = model.op
  if op.type == "Softmax":
    logits, = op.inputs
  else:
    logits = model

  out = softmax_cross_entropy_with_logits(logits=logits, labels=y)

  if mean:
    out = reduce_mean(out)
  return out


def initialize_uninitialized_global_variables(sess):
  """
  Only initializes the variables of a TensorFlow session that were not
  already initialized.
  :param sess: the TensorFlow session
  :return:
  """
  # List all global variables
  global_vars = tf.global_variables()

  # Find initialized status for all variables
  is_var_init = [tf.is_variable_initialized(var) for var in global_vars]
  is_initialized = sess.run(is_var_init)

  # List all variables that were not initialized previously
  not_initialized_vars = [var for (var, init) in
                          zip(global_vars, is_initialized) if not init]

  # Initialize all uninitialized variables found, if any
  if len(not_initialized_vars):
    sess.run(tf.variables_initializer(not_initialized_vars))


def train(sess, loss, x, y, X_train, Y_train, save=False,
          init_all=False, evaluate=None, feed=None, args=None,
          rng=None, var_list=None, fprop_args=None, optimizer=None):
  """
  Train a TF graph.
  This function is deprecated. Prefer cleverhans.train.train when possible.
  cleverhans.train.train supports multiple GPUs but this function is still
  needed to support legacy models that do not support calling fprop more
  than once.

  :param sess: TF session to use when training the graph
  :param loss: tensor, the model training loss.
  :param x: input placeholder
  :param y: output placeholder (for labels)
  :param X_train: numpy array with training inputs
  :param Y_train: numpy array with training outputs
  :param save: boolean controlling the save operation
  :param init_all: (boolean) If set to true, all TF variables in the session
                   are (re)initialized, otherwise only previously
                   uninitialized variables are initialized before training.
  :param evaluate: function that is run after each training iteration
                   (typically to display the test/validation accuracy).
  :param feed: An optional dictionary that is appended to the feeding
               dictionary before the session runs. Can be used to feed
               the learning phase of a Keras model for instance.
  :param args: dict or argparse `Namespace` object.
               Should contain `nb_epochs`, `learning_rate`,
               `batch_size`
               If save is True, should also contain 'train_dir'
               and 'filename'
  :param rng: Instance of numpy.random.RandomState
  :param var_list: Optional list of parameters to train.
  :param fprop_args: dict, extra arguments to pass to fprop (loss and model).
  :param optimizer: Optimizer to be used for training
  :return: True if model trained
  """
  warnings.warn("This function is deprecated and will be removed on or after"
                " 2019-04-05. Switch to cleverhans.train.train.")

  args = _ArgsWrapper(args or {})
  fprop_args = fprop_args or {}

  # Check that necessary arguments were given (see doc above)
  assert args.nb_epochs, "Number of epochs was not given in args dict"
  if optimizer is None:
    assert args.learning_rate is not None, ("Learning rate was not given "
                                            "in args dict")
  assert args.batch_size, "Batch size was not given in args dict"

  if save:
    assert args.train_dir, "Directory for save was not given in args dict"
    assert args.filename, "Filename for save was not given in args dict"

  if rng is None:
    rng = np.random.RandomState()

  # Define optimizer
  loss_value = loss.fprop(x, y, **fprop_args)
  if optimizer is None:
    optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate)
  else:
    if not isinstance(optimizer, tf.train.Optimizer):
      raise ValueError("optimizer object must be from a child class of "
                       "tf.train.Optimizer")
  # Trigger update operations within the default graph (such as batch_norm).
  with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
    train_step = optimizer.minimize(loss_value, var_list=var_list)

  with sess.as_default():
    if hasattr(tf, "global_variables_initializer"):
      if init_all:
        tf.global_variables_initializer().run()
      else:
        initialize_uninitialized_global_variables(sess)
    else:
      warnings.warn("Update your copy of tensorflow; future versions of "
                    "CleverHans may drop support for this version.")
      sess.run(tf.initialize_all_variables())

    for epoch in xrange(args.nb_epochs):
      # Compute number of batches
      nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size))
      assert nb_batches * args.batch_size >= len(X_train)

      # Indices to shuffle training set
      index_shuf = list(range(len(X_train)))
      rng.shuffle(index_shuf)

      prev = time.time()
      for batch in range(nb_batches):

        # Compute batch start and end indices
        start, end = batch_indices(
            batch, len(X_train), args.batch_size)

        # Perform one training step
        feed_dict = {x: X_train[index_shuf[start:end]],
                     y: Y_train[index_shuf[start:end]]}
        if feed is not None:
          feed_dict.update(feed)
        train_step.run(feed_dict=feed_dict)
      assert end >= len(X_train)  # Check that all examples were used
      cur = time.time()
      _logger.info("Epoch " + str(epoch) + " took " +
                   str(cur - prev) + " seconds")
      if evaluate is not None:
        evaluate()

    if save:
      save_path = os.path.join(args.train_dir, args.filename)
      saver = tf.train.Saver()
      saver.save(sess, save_path)
      _logger.info("Completed model training and saved at: " +
                   str(save_path))
    else:
      _logger.info("Completed model training.")

  return True


def model_eval(sess, x, y, predictions, X_test=None, Y_test=None,
               feed=None, args=None):
  """
  Compute the accuracy of a TF model on some data
  :param sess: TF session to use
  :param x: input placeholder
  :param y: output placeholder (for labels)
  :param predictions: model output predictions
  :param X_test: numpy array with training inputs
  :param Y_test: numpy array with training outputs
  :param feed: An optional dictionary that is appended to the feeding
           dictionary before the session runs. Can be used to feed
           the learning phase of a Keras model for instance.
  :param args: dict or argparse `Namespace` object.
               Should contain `batch_size`
  :return: a float with the accuracy value
  """
  global _model_eval_cache
  args = _ArgsWrapper(args or {})

  assert args.batch_size, "Batch size was not given in args dict"
  if X_test is None or Y_test is None:
    raise ValueError("X_test argument and Y_test argument "
                     "must be supplied.")

  # Define accuracy symbolically
  key = (y, predictions)
  if key in _model_eval_cache:
    correct_preds = _model_eval_cache[key]
  else:
    correct_preds = tf.equal(tf.argmax(y, axis=-1),
                             tf.argmax(predictions, axis=-1))
    _model_eval_cache[key] = correct_preds

  # Init result var
  accuracy = 0.0

  with sess.as_default():
    # Compute number of batches
    nb_batches = int(math.ceil(float(len(X_test)) / args.batch_size))
    assert nb_batches * args.batch_size >= len(X_test)

    X_cur = np.zeros((args.batch_size,) + X_test.shape[1:],
                     dtype=X_test.dtype)
    Y_cur = np.zeros((args.batch_size,) + Y_test.shape[1:],
                     dtype=Y_test.dtype)
    for batch in range(nb_batches):
      if batch % 100 == 0 and batch > 0:
        _logger.debug("Batch " + str(batch))

      # Must not use the `batch_indices` function here, because it
      # repeats some examples.
      # It's acceptable to repeat during training, but not eval.
      start = batch * args.batch_size
      end = min(len(X_test), start + args.batch_size)

      # The last batch may be smaller than all others. This should not
      # affect the accuarcy disproportionately.
      cur_batch_size = end - start
      X_cur[:cur_batch_size] = X_test[start:end]
      Y_cur[:cur_batch_size] = Y_test[start:end]
      feed_dict = {x: X_cur, y: Y_cur}
      if feed is not None:
        feed_dict.update(feed)
      cur_corr_preds = correct_preds.eval(feed_dict=feed_dict)

      accuracy += cur_corr_preds[:cur_batch_size].sum()

    assert end >= len(X_test)

    # Divide by number of examples to get final value
    accuracy /= len(X_test)

  return accuracy

_model_eval_cache = {}


def tf_model_load(sess, file_path=None):
  """

  :param sess: the session object to restore
  :param file_path: path to the restored session, if None is
                    taken from FLAGS.train_dir and FLAGS.filename
  :return:
  """
  with sess.as_default():
    saver = tf.train.Saver()
    if file_path is None:
      error = 'file_path argument is missing.'
      raise ValueError(error)
    saver.restore(sess, file_path)

  return True


def batch_eval(*args, **kwargs):
  """
  Wrapper around deprecated function.
  """
  # Inside function to avoid circular import
  from cleverhans.evaluation import batch_eval as new_batch_eval
  warnings.warn("batch_eval has moved to cleverhans.evaluation. "
                "batch_eval will be removed from utils_tf on or after "
                "2019-03-09.")
  return new_batch_eval(*args, **kwargs)


def model_argmax(sess, x, predictions, samples, feed=None):
  """
  Helper function that computes the current class prediction
  :param sess: TF session
  :param x: the input placeholder
  :param predictions: the model's symbolic output
  :param samples: numpy array with input samples (dims must match x)
  :param feed: An optional dictionary that is appended to the feeding
           dictionary before the session runs. Can be used to feed
           the learning phase of a Keras model for instance.
  :return: the argmax output of predictions, i.e. the current predicted class
  """
  feed_dict = {x: samples}
  if feed is not None:
    feed_dict.update(feed)
  probabilities = sess.run(predictions, feed_dict)

  if samples.shape[0] == 1:
    return np.argmax(probabilities)
  else:
    return np.argmax(probabilities, axis=1)


def l2_batch_normalize(x, epsilon=1e-12, scope=None):
  """
  Helper function to normalize a batch of vectors.
  :param x: the input placeholder
  :param epsilon: stabilizes division
  :return: the batch of l2 normalized vector
  """
  with tf.name_scope(scope, "l2_batch_normalize") as name_scope:
    x_shape = tf.shape(x)
    x = tf.contrib.layers.flatten(x)
    x /= (epsilon + reduce_max(tf.abs(x), 1, keepdims=True))
    square_sum = reduce_sum(tf.square(x), 1, keepdims=True)
    x_inv_norm = tf.rsqrt(np.sqrt(epsilon) + square_sum)
    x_norm = tf.multiply(x, x_inv_norm)
    return tf.reshape(x_norm, x_shape, name_scope)


def kl_with_logits(p_logits, q_logits, scope=None,
                   loss_collection=tf.GraphKeys.REGULARIZATION_LOSSES):
  """Helper function to compute kl-divergence KL(p || q)
  """
  with tf.name_scope(scope, "kl_divergence") as name:
    p = tf.nn.softmax(p_logits)
    p_log = tf.nn.log_softmax(p_logits)
    q_log = tf.nn.log_softmax(q_logits)
    loss = reduce_mean(reduce_sum(p * (p_log - q_log), axis=1),
                       name=name)
    tf.losses.add_loss(loss, loss_collection)
    return loss


[docs]def clip_eta(eta, ord, eps): """ Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, bound of the perturbation. """ # Clipping perturbation eta to self.ord norm ball if ord not in [np.inf, 1, 2]: raise ValueError('ord must be np.inf, 1, or 2.') reduc_ind = list(xrange(1, len(eta.get_shape()))) avoid_zero_div = 1e-12 if ord == np.inf: eta = clip_by_value(eta, -eps, eps) elif ord == 1: # Implements a projection algorithm onto the l1-ball from # (Duchi et al. 2008) that runs in time O(d*log(d)) where d is the # input dimension. # Paper link (Duchi et al. 2008): https://dl.acm.org/citation.cfm?id=1390191 eps = tf.cast(eps, eta.dtype) dim = tf.reduce_prod(tf.shape(eta)[1:]) eta_flat = tf.reshape(eta, (-1, dim)) abs_eta = tf.abs(eta_flat) if 'sort' in dir(tf): mu = -tf.sort(-abs_eta, axis=-1) else: # `tf.sort` is only available in TF 1.13 onwards mu = tf.nn.top_k(abs_eta, k=dim, sorted=True)[0] cumsums = tf.cumsum(mu, axis=-1) js = tf.cast(tf.divide(1, tf.range(1, dim + 1)), eta.dtype) t = tf.cast(tf.greater(mu - js * (cumsums - eps), 0), eta.dtype) rho = tf.argmax(t * cumsums, axis=-1) rho_val = tf.reduce_max(t * cumsums, axis=-1) theta = tf.divide(rho_val - eps, tf.cast(1 + rho, eta.dtype)) eta_sgn = tf.sign(eta_flat) eta_proj = eta_sgn * tf.maximum(abs_eta - theta[:, tf.newaxis], 0) eta_proj = tf.reshape(eta_proj, tf.shape(eta)) norm = tf.reduce_sum(tf.abs(eta), reduc_ind) eta = tf.where(tf.greater(norm, eps), eta_proj, eta) elif ord == 2: # avoid_zero_div must go inside sqrt to avoid a divide by zero # in the gradient through this operation norm = tf.sqrt(tf.maximum(avoid_zero_div, reduce_sum(tf.square(eta), reduc_ind, keepdims=True))) # We must *clip* to within the norm ball, not *normalize* onto the # surface of the ball factor = tf.minimum(1., div(eps, norm)) eta = eta * factor return eta
def zero_out_clipped_grads(grad, x, clip_min, clip_max): """ Helper function to erase entries in the gradient where the update would be clipped. :param grad: The gradient :param x: The current input :param clip_min: Minimum input component value :param clip_max: Maximum input component value """ signed_grad = tf.sign(grad) # Find input components that lie at the boundary of the input range, and # where the gradient points in the wrong direction. clip_low = tf.logical_and(tf.less_equal(x, tf.cast(clip_min, x.dtype)), tf.less(signed_grad, 0)) clip_high = tf.logical_and(tf.greater_equal(x, tf.cast(clip_max, x.dtype)), tf.greater(signed_grad, 0)) clip = tf.logical_or(clip_low, clip_high) grad = tf.where(clip, mul(grad, 0), grad) return grad def random_exponential(shape, rate=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the exponential distribution, which is not included in core TensorFlow. """ return tf.random_gamma(shape, alpha=1, beta=1. / rate, dtype=dtype, seed=seed) def random_laplace(shape, loc=0.0, scale=1.0, dtype=tf.float32, seed=None): """ Helper function to sample from the Laplace distribution, which is not included in core TensorFlow. """ z1 = random_exponential(shape, loc, dtype=dtype, seed=seed) z2 = random_exponential(shape, scale, dtype=dtype, seed=seed) return z1 - z2 def random_lp_vector(shape, ord, eps, dtype=tf.float32, seed=None): """ Helper function to generate uniformly random vectors from a norm ball of radius epsilon. :param shape: Output shape of the random sample. The shape is expected to be of the form `(n, d1, d2, ..., dn)` where `n` is the number of i.i.d. samples that will be drawn from a norm ball of dimension `d1*d1*...*dn`. :param ord: Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2. :param eps: Epsilon, radius of the norm ball. """ if ord not in [np.inf, 1, 2]: raise ValueError('ord must be np.inf, 1, or 2.') if ord == np.inf: r = tf.random_uniform(shape, -eps, eps, dtype=dtype, seed=seed) else: # For ord=1 and ord=2, we use the generic technique from # (Calafiore et al. 1998) to sample uniformly from a norm ball. # Paper link (Calafiore et al. 1998): # https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&tag=1 # We first sample from the surface of the norm ball, and then scale by # a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable # and `d` is the dimension of the ball. In high dimensions, this is roughly # equivalent to sampling from the surface of the ball. dim = tf.reduce_prod(shape[1:]) if ord == 1: x = random_laplace((shape[0], dim), loc=1.0, scale=1.0, dtype=dtype, seed=seed) norm = tf.reduce_sum(tf.abs(x), axis=-1, keepdims=True) elif ord == 2: x = tf.random_normal((shape[0], dim), dtype=dtype, seed=seed) norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=-1, keepdims=True)) else: raise ValueError('ord must be np.inf, 1, or 2.') w = tf.pow(tf.random.uniform((shape[0], 1), dtype=dtype, seed=seed), 1.0 / tf.cast(dim, dtype)) r = eps * tf.reshape(w * x / norm, shape) return r def model_train(sess, x, y, predictions, X_train, Y_train, save=False, predictions_adv=None, init_all=True, evaluate=None, feed=None, args=None, rng=None, var_list=None): """ Train a TF graph :param sess: TF session to use when training the graph :param x: input placeholder :param y: output placeholder (for labels) :param predictions: model output predictions :param X_train: numpy array with training inputs :param Y_train: numpy array with training outputs :param save: boolean controlling the save operation :param predictions_adv: if set with the adversarial example tensor, will run adversarial training :param init_all: (boolean) If set to true, all TF variables in the session are (re)initialized, otherwise only previously uninitialized variables are initialized before training. :param evaluate: function that is run after each training iteration (typically to display the test/validation accuracy). :param feed: An optional dictionary that is appended to the feeding dictionary before the session runs. Can be used to feed the learning phase of a Keras model for instance. :param args: dict or argparse `Namespace` object. Should contain `nb_epochs`, `learning_rate`, `batch_size` If save is True, should also contain 'train_dir' and 'filename' :param rng: Instance of numpy.random.RandomState :param var_list: Optional list of parameters to train. :return: True if model trained """ warnings.warn("This function is deprecated and will be removed on or after" " 2019-04-05. Switch to cleverhans.train.train.") args = _ArgsWrapper(args or {}) # Check that necessary arguments were given (see doc above) assert args.nb_epochs, "Number of epochs was not given in args dict" assert args.learning_rate, "Learning rate was not given in args dict" assert args.batch_size, "Batch size was not given in args dict" if save: assert args.train_dir, "Directory for save was not given in args dict" assert args.filename, "Filename for save was not given in args dict" if rng is None: rng = np.random.RandomState() # Define loss loss = model_loss(y, predictions) if predictions_adv is not None: loss = (loss + model_loss(y, predictions_adv)) / 2 train_step = tf.train.AdamOptimizer(learning_rate=args.learning_rate) train_step = train_step.minimize(loss, var_list=var_list) with sess.as_default(): if hasattr(tf, "global_variables_initializer"): if init_all: tf.global_variables_initializer().run() else: initialize_uninitialized_global_variables(sess) else: warnings.warn("Update your copy of tensorflow; future versions of " "CleverHans may drop support for this version.") sess.run(tf.initialize_all_variables()) for epoch in xrange(args.nb_epochs): # Compute number of batches nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size)) assert nb_batches * args.batch_size >= len(X_train) # Indices to shuffle training set index_shuf = list(range(len(X_train))) rng.shuffle(index_shuf) prev = time.time() for batch in range(nb_batches): # Compute batch start and end indices start, end = batch_indices( batch, len(X_train), args.batch_size) # Perform one training step feed_dict = {x: X_train[index_shuf[start:end]], y: Y_train[index_shuf[start:end]]} if feed is not None: feed_dict.update(feed) train_step.run(feed_dict=feed_dict) assert end >= len(X_train) # Check that all examples were used cur = time.time() _logger.info("Epoch " + str(epoch) + " took " + str(cur - prev) + " seconds") if evaluate is not None: evaluate() if save: save_path = os.path.join(args.train_dir, args.filename) saver = tf.train.Saver() saver.save(sess, save_path) _logger.info("Completed model training and saved at: " + str(save_path)) else: _logger.info("Completed model training.") return True def infer_devices(devices=None): """ Returns the list of devices that multi-replica code should use. :param devices: list of string device names, e.g. ["/GPU:0"] If the user specifies this, `infer_devices` checks that it is valid, and then uses this user-specified list. If the user does not specify this, infer_devices uses: - All available GPUs, if there are any - CPU otherwise """ if devices is None: devices = get_available_gpus() if len(devices) == 0: warnings.warn("No GPUS, running on CPU") # Set device to empy string, tf will figure out whether to use # XLA or not, etc., automatically devices = [""] else: assert len(devices) > 0 for device in devices: assert isinstance(device, six.string_types), type(device) return devices def get_available_gpus(): """ Returns a list of string names of all available GPUs """ local_device_protos = device_lib.list_local_devices() return [x.name for x in local_device_protos if x.device_type == 'GPU'] def silence(): """ Silences tensorflaw's default printed messages """ os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' def clip_by_value(t, clip_value_min, clip_value_max, name=None): """ A wrapper for clip_by_value that casts the clipping range if needed. """ def cast_clip(clip): """ Cast clipping range argument if needed. """ if t.dtype in (tf.float32, tf.float64): if hasattr(clip, 'dtype'): # Convert to tf dtype in case this is a numpy dtype clip_dtype = tf.as_dtype(clip.dtype) if clip_dtype != t.dtype: return tf.cast(clip, t.dtype) return clip clip_value_min = cast_clip(clip_value_min) clip_value_max = cast_clip(clip_value_max) return tf.clip_by_value(t, clip_value_min, clip_value_max, name) def mul(a, b): """ A wrapper around tf multiplication that does more automatic casting of the input. """ def multiply(a, b): """Multiplication""" return a * b return op_with_scalar_cast(a, b, multiply) def div(a, b): """ A wrapper around tf division that does more automatic casting of the input. """ def divide(a, b): """Division""" return a / b return op_with_scalar_cast(a, b, divide) def op_with_scalar_cast(a, b, f): """ Builds the graph to compute f(a, b). If only one of the two arguments is a scalar and the operation would cause a type error without casting, casts the scalar to match the tensor. :param a: a tf-compatible array or scalar :param b: a tf-compatible array or scalar """ try: return f(a, b) except (TypeError, ValueError): pass def is_scalar(x): """Return True if `x` is a scalar""" if hasattr(x, "get_shape"): shape = x.get_shape() return shape.ndims == 0 if hasattr(x, "ndim"): return x.ndim == 0 assert isinstance(x, (int, float)) return True a_scalar = is_scalar(a) b_scalar = is_scalar(b) if a_scalar and b_scalar: raise TypeError("Trying to apply " + str(f) + " with mixed types") if a_scalar and not b_scalar: a = tf.cast(a, b.dtype) if b_scalar and not a_scalar: b = tf.cast(b, a.dtype) return f(a, b) def assert_less_equal(*args, **kwargs): """ Wrapper for tf.assert_less_equal Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_less_equal(*args, **kwargs) def assert_greater_equal(*args, **kwargs): """ Wrapper for tf.assert_greater_equal. Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_greater_equal(*args, **kwargs) def assert_equal(*args, **kwargs): """ Wrapper for tf.assert_equal. Overrides tf.device so that the assert always goes on CPU. The unwrapped version raises an exception if used with tf.device("/GPU:x"). """ with tf.device("/CPU:0"): return tf.assert_equal(*args, **kwargs) def jacobian_graph(predictions, x, nb_classes): """ Create the Jacobian graph to be ran later in a TF session :param predictions: the model's symbolic output (linear output, pre-softmax) :param x: the input placeholder :param nb_classes: the number of classes the model has :return: """ # This function will return a list of TF gradients list_derivatives = [] # Define the TF graph elements to compute our derivatives for each class for class_ind in xrange(nb_classes): derivatives, = tf.gradients(predictions[:, class_ind], x) list_derivatives.append(derivatives) return list_derivatives def jacobian_augmentation(sess, x, X_sub_prev, Y_sub, grads, lmbda, aug_batch_size=512, feed=None): """ Augment an adversary's substitute training set using the Jacobian of a substitute model to generate new synthetic inputs. See https://arxiv.org/abs/1602.02697 for more details. See cleverhans_tutorials/mnist_blackbox.py for example use case :param sess: TF session in which the substitute model is defined :param x: input TF placeholder for the substitute model :param X_sub_prev: substitute training data available to the adversary at the previous iteration :param Y_sub: substitute training labels available to the adversary at the previous iteration :param grads: Jacobian symbolic graph for the substitute (should be generated using utils_tf.jacobian_graph) :return: augmented substitute data (will need to be labeled by oracle) """ assert len(x.get_shape()) == len(np.shape(X_sub_prev)) assert len(grads) >= np.max(Y_sub) + 1 assert len(X_sub_prev) == len(Y_sub) aug_batch_size = min(aug_batch_size, X_sub_prev.shape[0]) # Prepare input_shape (outside loop) for feeding dictionary below input_shape = list(x.get_shape()) input_shape[0] = 1 # Create new numpy array for adversary training data # with twice as many components on the first dimension. X_sub = np.vstack([X_sub_prev, X_sub_prev]) num_samples = X_sub_prev.shape[0] # Creating and processing as batch for p_idxs in range(0, num_samples, aug_batch_size): X_batch = X_sub_prev[p_idxs:p_idxs + aug_batch_size, ...] feed_dict = {x: X_batch} if feed is not None: feed_dict.update(feed) # Compute sign matrix grad_val = sess.run([tf.sign(grads)], feed_dict=feed_dict)[0] # Create new synthetic point in adversary substitute training set for (indx, ind) in zip(range(p_idxs, p_idxs + X_batch.shape[0]), range(X_batch.shape[0])): X_sub[num_samples + indx] = ( X_batch[ind] + lmbda * grad_val[Y_sub[indx], ind, ...]) # Return augmented training data (needs to be labeled afterwards) return X_sub
================================================ FILE: docs/_modules/index.html ================================================ Overview: module code — CleverHans documentation ================================================ FILE: docs/_sources/README.md.txt ================================================ # Generate documentation To generate the documentation do: `make github` The documentation files will be copied to the `cleverhans/docs` directory. ### Preparation Please do: `pip install sphinx` Add a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees a `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file indicates that we are not using Jekyll as our static site generator in this repository. ### Enable GitHub Pages for the GitHub repository 1. Go to the repository on the GitHub website and make sure you are logged in. 2. Add a /docs directory to the master branch. Otherwise you do not get the master branch /docs folder for the Source option in the drop-down list. 3. Click the Settings tab. You first go to the Options section. 4. Scroll down to the GitHub Pages section and choose the drop-down list under Source. Note: Your choices will differ based on whether you’re in a User repo or an Org repository. 5. To keep source and output HTML separate, choose master branch /docs folder for Source. ### Build Sphinx locally and publish on GitHub Pages We keep the source docsource and output docs separate, but still are able to publish on GitHub Pages and preview builds locally. We have the following option in the Makefile: ``` github: @make html @cp -a _build/html/. ../docs ``` Thus, we can run `make github` from the `docsource` directory to generate a local preview and move the docs where GitHub wants to serve them from. ### Hacks If you cannot build the docs for attacks, uncomment `import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`. Otherwise: ```angular2html WARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised: cannot import name 'keras_tensor' ``` It is convenient to create a virtual environment to install all the specific libraries (e.g. virutalen cleverhans). ================================================ FILE: docs/_sources/index.md.txt ================================================ .. CleverHans documentation master file, created by sphinx-quickstart on Wed Sep 20 15:14:07 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. WARNING: This file has a markdown suffix, but is in fact .rst CleverHans Documentation ====================================== This documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans `_. To get started, we recommend reading the `github readme `_. Afterwards, you can learn more by looking at the following modules: .. toctree:: :maxdepth: 4 source/attacks source/model Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ================================================ FILE: docs/_sources/source/attacks.md.txt ================================================ `attacks` module -------------------------- .. automodule:: cleverhans.attacks :members: :imported-members: :undoc-members: :show-inheritance: ================================================ FILE: docs/_sources/source/devtools.md.txt ================================================ `devtools` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: docs/_sources/source/future.md.txt ================================================ `future` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: docs/_sources/source/model.md.txt ================================================ `model` module ------------------------ .. automodule:: cleverhans.model :members: :undoc-members: :show-inheritance: ================================================ FILE: docs/_static/alabaster.css ================================================ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: Georgia, serif; font-size: 17px; background-color: #fff; color: #000; margin: 0; padding: 0; } div.document { width: 940px; margin: 30px auto 0 auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 220px; } div.sphinxsidebar { width: 220px; font-size: 14px; line-height: 1.5; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #fff; color: #3E4349; padding: 0 30px 0 30px; } div.body > .section { text-align: left; } div.footer { width: 940px; margin: 20px auto 30px auto; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } p.caption { font-family: inherit; font-size: inherit; } div.relations { display: none; } div.sphinxsidebar a { color: #444; text-decoration: none; border-bottom: 1px dotted #999; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebarwrapper { padding: 18px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0; margin: -10px 0 0 0px; text-align: center; } div.sphinxsidebarwrapper h1.logo { margin-top: -10px; text-align: center; margin-bottom: 5px; text-align: left; } div.sphinxsidebarwrapper h1.logo-name { margin-top: 0px; } div.sphinxsidebarwrapper p.blurb { margin-top: 0; font-style: normal; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: Georgia, serif; color: #444; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar ul li.toctree-l1 > a { font-size: 120%; } div.sphinxsidebar ul li.toctree-l2 > a { font-size: 110%; } div.sphinxsidebar input { border: 1px solid #CCC; font-family: Georgia, serif; font-size: 1em; } div.sphinxsidebar hr { border: none; height: 1px; color: #AAA; background: #AAA; text-align: left; margin-left: 0; width: 50%; } div.sphinxsidebar .badge { border-bottom: none; } div.sphinxsidebar .badge:hover { border-bottom: none; } /* To address an issue with donation coming after search */ div.sphinxsidebar h3.donation { margin-top: 10px; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: Georgia, serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: #DDD; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #EAEAEA; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { margin: 20px 0px; padding: 10px 30px; background-color: #EEE; border: 1px solid #CCC; } div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { background-color: #FBFBFB; border-bottom: 1px solid #fafafa; } div.admonition p.admonition-title { font-family: Georgia, serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight { background-color: #fff; } dt:target, .highlight { background: #FAF3E8; } div.warning { background-color: #FCC; border: 1px solid #FAA; } div.danger { background-color: #FCC; border: 1px solid #FAA; -moz-box-shadow: 2px 2px 4px #D52C2C; -webkit-box-shadow: 2px 2px 4px #D52C2C; box-shadow: 2px 2px 4px #D52C2C; } div.error { background-color: #FCC; border: 1px solid #FAA; -moz-box-shadow: 2px 2px 4px #D52C2C; -webkit-box-shadow: 2px 2px 4px #D52C2C; box-shadow: 2px 2px 4px #D52C2C; } div.caution { background-color: #FCC; border: 1px solid #FAA; } div.attention { background-color: #FCC; border: 1px solid #FAA; } div.important { background-color: #EEE; border: 1px solid #CCC; } div.note { background-color: #EEE; border: 1px solid #CCC; } div.tip { background-color: #EEE; border: 1px solid #CCC; } div.hint { background-color: #EEE; border: 1px solid #CCC; } div.seealso { background-color: #EEE; border: 1px solid #CCC; } div.topic { background-color: #EEE; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt, code { font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } .hll { background-color: #FFC; margin: 0 -12px; padding: 0 12px; display: block; } img.screenshot { } tt.descname, tt.descclassname, code.descname, code.descclassname { font-size: 0.95em; } tt.descname, code.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #EEE; -webkit-box-shadow: 2px 2px 4px #EEE; box-shadow: 2px 2px 4px #EEE; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #EEE; -webkit-box-shadow: 2px 2px 4px #EEE; box-shadow: 2px 2px 4px #EEE; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #EEE; background: #FDFDFD; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.field-list p { margin-bottom: 0.8em; } /* Cloned from * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 */ .field-name { -moz-hyphens: manual; -ms-hyphens: manual; -webkit-hyphens: manual; hyphens: manual; } table.footnote td.label { width: .1px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } blockquote { margin: 0 0 0 30px; padding: 0; } ul, ol { /* Matches the 30px from the narrow-screen "li > ul" selector below */ margin: 10px 0 10px 30px; padding: 0; } pre { background: #EEE; padding: 7px 30px; margin: 15px 0px; line-height: 1.3em; } div.viewcode-block:target { background: #ffd; } dl pre, blockquote pre, li pre { margin-left: 0; padding-left: 30px; } tt, code { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, code.xref, a tt { background-color: #FBFBFB; border-bottom: 1px solid #fff; } a.reference { text-decoration: none; border-bottom: 1px dotted #004B6B; } /* Don't put an underline on images */ a.image-reference, a.image-reference:hover { border-bottom: none; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted #004B6B; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt, a:hover code { background: #EEE; } @media screen and (max-width: 870px) { div.sphinxsidebar { display: none; } div.document { width: 100%; } div.documentwrapper { margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0; } div.bodywrapper { margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; } ul { margin-left: 0; } li > ul { /* Matches the 30px from the "ul, ol" selector above */ margin-left: 30px; } .document { width: auto; } .footer { width: auto; } .bodywrapper { margin: 0; } .footer { width: auto; } .github { display: none; } } @media screen and (max-width: 875px) { body { margin: 0; padding: 20px 30px; } div.documentwrapper { float: none; background: #fff; } div.sphinxsidebar { display: block; float: none; width: 102.5%; margin: 50px -30px -20px -30px; padding: 10px 20px; background: #333; color: #FFF; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar h3 a { color: #fff; } div.sphinxsidebar a { color: #AAA; } div.sphinxsidebar p.logo { display: none; } div.document { width: 100%; margin: 0; } div.footer { display: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } .rtd_doc_footer { display: none; } .document { width: auto; } .footer { width: auto; } .footer { width: auto; } .github { display: none; } } /* misc. */ .revsys-inline { display: none!important; } /* Make nested-list/multi-paragraph items look better in Releases changelog * pages. Without this, docutils' magical list fuckery causes inconsistent * formatting between different release sub-lists. */ div#changelog > div.section > ul > li > p:only-child { margin-bottom: 0; } /* Hide fugly table cell borders in ..bibliography:: directive output */ table.docutils.citation, table.docutils.citation td, table.docutils.citation th { border: none; /* Below needed in some edge cases; if not applied, bottom shadows appear */ -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } /* relbar */ .related { line-height: 30px; width: 100%; font-size: 0.9rem; } .related.top { border-bottom: 1px solid #EEE; margin-bottom: 20px; } .related.bottom { border-top: 1px solid #EEE; } .related ul { padding: 0; margin: 0; list-style: none; } .related li { display: inline; } nav#rellinks { float: right; } nav#rellinks li+li:before { content: "|"; } nav#breadcrumbs li+li:before { content: "\00BB"; } /* Hide certain items when printing */ @media print { div.related { display: none; } } ================================================ FILE: docs/_static/basic.css ================================================ /* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } div.section::after { display: block; content: ''; clear: left; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 230px; margin-left: -100%; font-size: 90%; word-wrap: break-word; overflow-wrap : break-word; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox form.search { overflow: hidden; } div.sphinxsidebar #searchbox input[type="text"] { float: left; width: 80%; padding: 0.25em; box-sizing: border-box; } div.sphinxsidebar #searchbox input[type="submit"] { float: left; width: 20%; border-left: none; padding: 0.25em; box-sizing: border-box; } img { border: 0; max-width: 100%; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; margin-left: auto; margin-right: auto; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable ul { margin-top: 0; margin-bottom: 0; list-style-type: none; } table.indextable > tbody > tr > td > ul { padding-left: 0em; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- domain module index --------------------------------------------------- */ table.modindextable td { padding: 2px; border-collapse: collapse; } /* -- general body styles --------------------------------------------------- */ div.body { min-width: 450px; max-width: 800px; } div.body p, div.body dd, div.body li, div.body blockquote { -moz-hyphens: auto; -ms-hyphens: auto; -webkit-hyphens: auto; hyphens: auto; } a.headerlink { visibility: hidden; } a.brackets:before, span.brackets > a:before{ content: "["; } a.brackets:after, span.brackets > a:after { content: "]"; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink, caption:hover > a.headerlink, p.caption:hover > a.headerlink, div.code-block-caption:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } img.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-default { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px; background-color: #ffe; width: 40%; float: right; clear: right; overflow-x: auto; } p.sidebar-title { font-weight: bold; } div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- content of sidebars/topics/admonitions -------------------------------- */ div.sidebar > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; } div.sidebar::after, div.topic::after, div.admonition::after, blockquote::after { display: block; content: ''; clear: both; } /* -- tables ---------------------------------------------------------------- */ table.docutils { margin-top: 10px; margin-bottom: 10px; border: 0; border-collapse: collapse; } table.align-center { margin-left: auto; margin-right: auto; } table.align-default { margin-left: auto; margin-right: auto; } table caption span.caption-number { font-style: italic; } table caption span.caption-text { } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } th > :first-child, td > :first-child { margin-top: 0px; } th > :last-child, td > :last-child { margin-bottom: 0px; } /* -- figures --------------------------------------------------------------- */ div.figure { margin: 0.5em; padding: 0.5em; } div.figure p.caption { padding: 0.3em; } div.figure p.caption span.caption-number { font-style: italic; } div.figure p.caption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ table.field-list td, table.field-list th { border: 0 !important; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .field-name { -moz-hyphens: manual; -ms-hyphens: manual; -webkit-hyphens: manual; hyphens: manual; } /* -- hlist styles ---------------------------------------------------------- */ table.hlist { margin: 1em 0; } table.hlist td { vertical-align: top; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } :not(li) > ol > li:first-child > :first-child, :not(li) > ul > li:first-child > :first-child { margin-top: 0px; } :not(li) > ol > li:last-child > :last-child, :not(li) > ul > li:last-child > :last-child { margin-bottom: 0px; } ol.simple ol p, ol.simple ul p, ul.simple ol p, ul.simple ul p { margin-top: 0; } ol.simple > li:not(:first-child) > p, ul.simple > li:not(:first-child) > p { margin-top: 0; } ol.simple p, ul.simple p { margin-bottom: 0; } dl.footnote > dt, dl.citation > dt { float: left; margin-right: 0.5em; } dl.footnote > dd, dl.citation > dd { margin-bottom: 0em; } dl.footnote > dd:after, dl.citation > dd:after { content: ""; clear: both; } dl.field-list { display: grid; grid-template-columns: fit-content(30%) auto; } dl.field-list > dt { font-weight: bold; word-break: break-word; padding-left: 0.5em; padding-right: 5px; } dl.field-list > dt:after { content: ":"; } dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; margin-left: 0em; margin-bottom: 0em; } dl { margin-bottom: 15px; } dd > :first-child { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; } dt:target, span.highlighted { background-color: #fbe54e; } rect.highlighted { fill: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .optional { font-size: 1.3em; } .sig-paren { font-size: larger; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } .classifier:before { font-style: normal; margin: 0.5em; content: ":"; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } pre, div[class*="highlight-"] { clear: both; } span.pre { -moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; } div[class*="highlight-"] { margin: 1em 0; } td.linenos pre { border: 0; background-color: transparent; color: #aaa; } table.highlighttable { display: block; } table.highlighttable tbody { display: block; } table.highlighttable tr { display: flex; } table.highlighttable td { margin: 0; padding: 0; } table.highlighttable td.linenos { padding-right: 0.5em; } table.highlighttable td.code { flex: 1; overflow: hidden; } .highlight .hll { display: block; } div.highlight pre, table.highlighttable pre { margin: 0; } div.code-block-caption + div { margin-top: 0; } div.code-block-caption { margin-top: 1em; padding: 2px 5px; font-size: small; } div.code-block-caption code { background-color: transparent; } table.highlighttable td.linenos, span.linenos, div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ user-select: none; } div.code-block-caption span.caption-number { padding: 0.1em 0.3em; font-style: italic; } div.code-block-caption span.caption-text { } div.literal-block-wrapper { margin: 1em 0; } code.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } code.descclassname { background-color: transparent; } code.xref, a code { background-color: transparent; font-weight: bold; } h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } span.eqno a.headerlink { position: absolute; z-index: 1; } div.math:hover a.headerlink { visibility: visible; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } } ================================================ FILE: docs/_static/custom.css ================================================ /* This file intentionally left blank. */ ================================================ FILE: docs/_static/doctools.js ================================================ /* * doctools.js * ~~~~~~~~~~~ * * Sphinx JavaScript utilities for all documentation. * * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * select a different prefix for underscore */ $u = _.noConflict(); /** * make the code below compatible with browsers without * an installed firebug like debugger if (!window.console || !console.firebug) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; window.console = {}; for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {}; } */ /** * small helper function to urldecode strings */ jQuery.urldecode = function(x) { return decodeURIComponent(x).replace(/\+/g, ' '); }; /** * small helper function to urlencode strings */ jQuery.urlencode = encodeURIComponent; /** * This function returns the parsed url parameters of the * current request. Multiple values per key are supported, * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { if (typeof s === 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; for (var i = 0; i < parts.length; i++) { var tmp = parts[i].split('=', 2); var key = jQuery.urldecode(tmp[0]); var value = jQuery.urldecode(tmp[1]); if (key in result) result[key].push(value); else result[key] = [value]; } return result; }; /** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { function highlight(node, addItems) { if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className) && !jQuery(node.parentNode).hasClass("nohighlight")) { var span; var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); if (isInSVG) { span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); } else { span = document.createElement("span"); span.className = className; } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); var bbox = node.parentElement.getBBox(); rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); addItems.push({ "parent": node.parentNode, "target": rect}); } } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this, addItems); }); } } var addItems = []; var result = this.each(function() { highlight(this, addItems); }); for (var i = 0; i < addItems.length; ++i) { jQuery(addItems[i].parent).before(addItems[i].target); } return result; }; /* * backward compatibility for jQuery.browser * This will be supported until firefox bug is fixed. */ if (!jQuery.browser) { jQuery.uaMatch = function(ua) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; jQuery.browser = {}; jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; } /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { this.initOnKeyListeners(); } }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated === 'undefined') return string; return (typeof translated === 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated === 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); if (!body.length) { body = $('body'); } window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) === 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this === '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); }, initOnKeyListeners: function() { $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; // don't navigate when in search box, textarea, dropdown or button if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); if (prevHref) { window.location.href = prevHref; return false; } case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } } } }); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); ================================================ FILE: docs/_static/documentation_options.js ================================================ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false }; ================================================ FILE: docs/_static/jquery-3.5.1.js ================================================ /*! * jQuery JavaScript Library v3.5.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2020-05-04T22:49Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var getProto = Object.getPrototypeOf; var slice = arr.slice; var flat = arr.flat ? function( array ) { return arr.flat.call( array ); } : function( array ) { return arr.concat.apply( [], array ); }; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; var isWindow = function isWindow( obj ) { return obj != null && obj === obj.window; }; var document = window.document; var preservedScriptAttributes = { type: true, src: true, nonce: true, noModule: true }; function DOMEval( code, node, doc ) { doc = doc || document; var i, val, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { // Support: Firefox 64+, Edge 18+ // Some browsers don't support the "nonce" property on scripts. // On the other hand, just using `getAttribute` is not enough as // the `nonce` attribute is reset to an empty string whenever it // becomes browsing-context connected. // See https://github.com/whatwg/html/issues/2369 // See https://html.spec.whatwg.org/#nonce-attributes // The `node.getAttribute` check was added for the sake of // `jQuery.globalEval` so that it can fake a nonce-containing node // via an object. val = node[ i ] || node.getAttribute && node.getAttribute( i ); if ( val ) { script.setAttribute( i, val ); } } } doc.head.appendChild( script ).parentNode.removeChild( script ); } function toType( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.5.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, even: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return ( i + 1 ) % 2; } ) ); }, odd: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return i % 2; } ) ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { copy = options[ name ]; // Prevent Object.prototype pollution // Prevent never-ending loop if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { src = target[ name ]; // Ensure proper type for the source value if ( copyIsArray && !Array.isArray( src ) ) { clone = []; } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { clone = {}; } else { clone = src; } copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, // Evaluates a script in a provided context; falls back to the global one // if not specified. globalEval: function( code, options, doc ) { DOMEval( code, { nonce: options && options.nonce }, doc ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return flat( ret ); }, // A global GUID counter for objects guid: 1, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = toType( obj ); if ( isFunction( obj ) || isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.5 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * * Date: 2020-03-14 */ ( function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ( {} ).hasOwnProperty, arr = [], pop = arr.pop, pushNative = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[ i ] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] // or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; return nonHex ? // Strip the backslash prefix from a non-hex escape sequence nonHex : // Replace a hexadecimal escape sequence with the encoded Unicode code point // Support: IE <=11+ // For values outside the Basic Multilingual Plane (BMP), manually construct a // surrogate pair high < 0 ? String.fromCharCode( high + 0x10000 ) : String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( ( arr = slice.call( preferredDoc.childNodes ) ), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { pushNative.apply( target, slice.call( els ) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( ( target[ j++ ] = els[ i++ ] ) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { setDocument( context ); context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { // ID selector if ( ( m = match[ 1 ] ) ) { // Document context if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[ 2 ] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !nonnativeSelectorCache[ selector + " " ] && ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && // Support: IE 8 only // Exclude object elements ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { newSelector = selector; newContext = context; // qSA considers elements outside a scoping root when evaluating child or // descendant combinators, which is not what we want. // In such cases, we work around the behavior by prefixing every selector in the // list with an ID selector referencing the scope context. // The technique has to be used as well when a leading combinator is used // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. if ( newContext !== context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", ( nid = expando ) ); } } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + toSelector( groups[ i ] ); } newSelector = groups.join( "," ); } try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { nonnativeSelectorCache( selector, true ); } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return ( cache[ key + " " ] = value ); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement( "fieldset" ); try { return !!fn( el ); } catch ( e ) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split( "|" ), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[ i ] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( ( cur = cur.nextSibling ) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return ( name === "input" || name === "button" ) && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction( function( argument ) { argument = +argument; return markFunction( function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ ( j = matchIndexes[ i ] ) ] ) { seed[ j ] = !( matches[ j ] = seed[ j ] ); } } } ); } ); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { var namespace = elem.namespaceURI, docElem = ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes // https://bugs.jquery.com/ticket/4833 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9 - 11+, Edge 12 - 18+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( preferredDoc != document && ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, // Safari 4 - 5 only, Opera <=11.6 - 12.x only // IE/Edge & older browsers don't support the :scope pseudo-class. // Support: Safari 6.0 only // Safari 6.0 supports :scope but it's an alias of :root there. support.scope = assert( function( el ) { docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll( ":scope fieldset div" ).length; } ); /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert( function( el ) { el.className = "i"; return !el.getAttribute( "className" ); } ); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert( function( el ) { el.appendChild( document.createComment( "" ) ); return !el.getElementsByTagName( "*" ).length; } ); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert( function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; } ); // ID filter and find if ( support.getById ) { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" ); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( ( elem = elems[ i++ ] ) ) { node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find[ "TAG" ] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( ( elem = results[ i++ ] ) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert( function( el ) { var input; // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll( "[selected]" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push( "~=" ); } // Support: IE 11+, Edge 15 - 18+ // IE 11/Edge don't find elements on a `[name='']` query in some cases. // Adding a temporary attribute to the document before the selection works // around the issue. // Interestingly, IE 10 & older don't seem to have the issue. input = document.createElement( "input" ); input.setAttribute( "name", "" ); el.appendChild( input ); if ( !el.querySelectorAll( "[name='']" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll( ":checked" ).length ) { rbuggyQSA.push( ":checked" ); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push( ".#.+[+~]" ); } // Support: Firefox <=3.6 - 5 only // Old Firefox doesn't throw on a badly-escaped identifier. el.querySelectorAll( "\\\f" ); rbuggyQSA.push( "[\\r\\n\\f]" ); } ); assert( function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement( "input" ); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll( "[name=d]" ).length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: Opera 10 - 11 only // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll( "*,:x" ); rbuggyQSA.push( ",.*:" ); } ); } if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector ) ) ) ) { assert( function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); } ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 ) ); } : function( a, b ) { if ( b ) { while ( ( b = b.parentNode ) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { // Choose the first element that is related to our preferred document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( a == document || a.ownerDocument == preferredDoc && contains( preferredDoc, a ) ) { return -1; } // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( b == document || b.ownerDocument == preferredDoc && contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ return a == document ? -1 : b == document ? 1 : /* eslint-enable eqeqeq */ aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( ( cur = cur.parentNode ) ) { ap.unshift( cur ); } cur = b; while ( ( cur = cur.parentNode ) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[ i ] === bp[ i ] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[ i ], bp[ i ] ) : // Otherwise nodes in our document sort first // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ ap[ i ] == preferredDoc ? -1 : bp[ i ] == preferredDoc ? 1 : /* eslint-enable eqeqeq */ 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); if ( support.matchesSelector && documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { nonnativeSelectorCache( expr, true ); } } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( elem.ownerDocument || elem ) != document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return ( sel + "" ).replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( ( elem = results[ i++ ] ) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( ( node = elem[ i++ ] ) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ).replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[ 1 ] = match[ 1 ].toLowerCase(); if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); // other types prohibit arguments } else if ( match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { return null; } // Accept quoted arguments as-is if ( match[ 3 ] ) { match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) ( excess = tokenize( unquoted, true ) ) && // advance to the next closing parenthesis ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { // excess is a negative index match[ 0 ] = match[ 0 ].slice( 0, excess ); match[ 2 ] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || ( pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute( "class" ) || "" ); } ); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; /* eslint-disable max-len */ return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; /* eslint-enable max-len */ }; }, "CHILD": function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, _context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( ( node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start ( diff = nodeIndex = 0 ) || start.pop() ) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( ( node = ++nodeIndex && node && node[ dir ] || ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction( function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( ( elem = unmatched[ i ] ) ) { seed[ i ] = !( matches[ i ] = elem ); } } } ) : function( elem, _context, xml ) { input[ 0 ] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[ 0 ] = null; return !results.pop(); }; } ), "has": markFunction( function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; } ), "contains": markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; } ), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( ( elemLang = documentIsHTML ? elem.lang : elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); return false; }; } ), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && ( !document.hasFocus || document.hasFocus() ) && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return ( nodeName === "input" && !!elem.checked ) || ( nodeName === "option" && !!elem.selected ); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos[ "empty" ]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo( function() { return [ 0 ]; } ), "last": createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), "even": createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "odd": createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument > length ? length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; } ) } }; Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || ( match = rcomma.exec( soFar ) ) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[ 0 ].length ) || soFar; } groups.push( ( tokens = [] ) ); } matched = false; // Combinators if ( ( match = rcombinators.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space type: match[ 0 ].replace( rtrim, " " ) } ); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || ( match = preFilters[ type ]( match ) ) ) ) { matched = match.shift(); tokens.push( { value: matched, type: type, matches: match } ); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[ i ].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || ( outerCache[ elem.uniqueID ] = {} ); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( ( oldCache = uniqueCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return ( newCache[ 2 ] = oldCache[ 2 ] ); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[ i ]( elem, context, xml ) ) { return false; } } return true; } : matchers[ 0 ]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[ i ], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( ( elem = unmatched[ i ] ) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( ( elem = temp[ i ] ) ) { matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) ) { // Restore matcherIn since elem is not yet a final match temp.push( ( matcherIn[ i ] = elem ) ); } } postFinder( null, ( matcherOut = [] ), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } } ); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[ 0 ].type ], implicitRelative = leadingRelative || Expr.relative[ " " ], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; } else { matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[ j ].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens .slice( 0, i - 1 ) .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), len = elems.length; if ( outermost ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq outermostContext = context == document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( !context && elem.ownerDocument != document ) { setDocument( elem ); xml = !documentIsHTML; } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( ( elem = !matcher && elem ) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( ( matcher = setMatchers[ j++ ] ) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !( unmatched[ i ] || setMatched[ i ] ) ) { setMatched[ i ] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[ i ] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { context = ( Expr.find[ "ID" ]( token.matches[ 0 ] .replace( runescape, funescape ), context ) || [] )[ 0 ]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; // Abort if we hit a combinator if ( Expr.relative[ ( type = token.type ) ] ) { break; } if ( ( find = Expr.find[ type ] ) ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert( function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute( "href" ) === "#"; } ) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } } ); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert( function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; } ) ) { addHandle( "value", function( elem, _name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } } ); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert( function( el ) { return el.getAttribute( "disabled" ) == null; } ) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; } } ); } return Sizzle; } )( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Filtered directly for both simple and complex selectors return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, _i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, _i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, _i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( elem.contentDocument != null && // Support: IE 11+ // elements with no `data` attribute has an object // `contentDocument` with a `null` prototype. getProto( elem.contentDocument ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( _i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // rejected_handlers.disable // fulfilled_handlers.disable tuples[ 3 - i ][ 3 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock, // progress_handlers.lock tuples[ 0 ][ 3 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, _key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; // Matches dashed string for camelizing var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() function fcamelCase( _all, letter ) { return letter.toUpperCase(); } // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 // Microsoft forgot to hump their vendor prefix (#9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( camelCase ); } else { key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var documentElement = document.documentElement; var isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ); }, composed = { composed: true }; // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only // Check attachment across shadow DOM boundaries when possible (gh-3504) // Support: iOS 10.0-10.2 only // Early iOS 10 versions support `attachShadow` but not `getRootNode`, // leading to errors. We need to check for `getRootNode`. if ( documentElement.getRootNode ) { isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ) || elem.getRootNode( composed ) === elem.ownerDocument; }; } var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. isAttached( elem ) && jQuery.css( elem, "display" ) === "none"; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = elem.nodeType && ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Support: Firefox <=54 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) initial = initial / 2; // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; while ( maxIterations-- ) { // Evaluate and update our best guess (doubling guesses that zero out). // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { maxIterations = 0; } initialInUnit = initialInUnit / scale; } initialInUnit = initialInUnit * 2; jQuery.style( elem, prop, initialInUnit + unit ); // Make sure we update the tween properties later on valueParts = valueParts || []; } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // Support: IE <=9 only // IE <=9 replaces "; support.option = !!div.lastChild; } )(); // We have to close these tags to support XHTML (#13200) var wrapMap = { // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // Support: IE <=9 only if ( !support.option ) { wrapMap.optgroup = wrapMap.option = [ 1, "" ]; } function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } attached = isAttached( elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( attached ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 - 11+ // focus() and blur() are asynchronous, except when they are no-op. // So expect focus to be synchronous when the element is already active, // and blur to be synchronous when the element is not already active. // (focus and blur are always synchronous in other supported browsers, // this just defines when we can count on it). function expectSync( elem, type ) { return ( elem === safeActiveElement() ) === ( type === "focus" ); } // Support: IE <=9 only // Accessing document.activeElement can throw unexpectedly // https://bugs.jquery.com/ticket/13393 function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Only attach events to objects that accept data if ( !acceptData( elem ) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = Object.create( null ); } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( nativeEvent ), handlers = ( dataPriv.get( this, "events" ) || Object.create( null ) )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // If the event is namespaced, then each handler is only invoked if it is // specially universal or its namespaces are a superset of the event's. if ( !event.rnamespace || handleObj.namespace === false || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, click: { // Utilize native event to ensure correct state for checkable inputs setup: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Claim the first handler if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) leverageNative( el, "click", returnTrue ); } // Return false to allow normal processing in the caller return false; }, trigger: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Force setup before triggering a click if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { leverageNative( el, "click" ); } // Return non-false to allow normal event-path propagation return true; }, // For cross-browser consistency, suppress native .click() on links // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { var target = event.target; return rcheckableType.test( target.type ) && target.click && nodeName( target, "input" ) && dataPriv.get( target, "click" ) || nodeName( target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; // Ensure the presence of an event listener that handles manually-triggered // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. function leverageNative( el, type, expectSync ) { // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add if ( !expectSync ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } return; } // Register the controller as a special universal handler for all event namespaces dataPriv.set( el, type, false ); jQuery.event.add( el, type, { namespace: false, handler: function( event ) { var notAsync, result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event // Saved data should be false in such cases, but might be a leftover capture object // from an async native handler (gh-4350) if ( !saved.length ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array // will not be confused with a leftover capture object. saved = slice.call( arguments ); dataPriv.set( this, type, saved ); // Trigger the native event and capture its result // Support: IE <=9 - 11+ // focus() and blur() are asynchronous notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); if ( saved !== result || notAsync ) { dataPriv.set( this, type, false ); } else { result = {}; } if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); return result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate // (focus or blur), assume that the surrogate already propagated from triggering the // native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { event.stopPropagation(); } // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments } else if ( saved.length ) { // ...and capture the result dataPriv.set( this, type, { value: jQuery.event.trigger( // Support: IE <=9 - 11+ // Extend with the prototype to reset the above stopImmediatePropagation() jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), saved.slice( 1 ), this ) } ); // Abort handling of the native event event.stopImmediatePropagation(); } } } ); } jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, code: true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) leverageNative( this, type, expectSync ); // Return false to allow normal processing in the caller return false; }, trigger: function() { // Force setup before trigger leverageNative( this, type ); // Return non-false to allow normal event-path propagation return true; }, delegateType: delegateType }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.get( src ); events = pdataOld.events; if ( events ) { dataPriv.remove( dest, "handle events" ); for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = flat( args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl && !node.noModule ) { jQuery._evalUrl( node.src, { nonce: node.nonce || node.getAttribute( "nonce" ) }, doc ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && isAttached( node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html; }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = isAttached( elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; var swap = function( elem, options, callback ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.call( elem ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't div.style.right = "60%"; pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; // Support: IE 9 - 11 only // Detect misreporting of content dimensions for box-sizing:border-box elements boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) // Support: Chrome <=64 // Don't get tricked when zoom affects offsetWidth (gh-4029) div.style.position = "absolute"; scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } function roundPixelMeasures( measure ) { return Math.round( parseFloat( measure ) ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; jQuery.extend( support, { boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelBoxStyles: function() { computeStyleTests(); return pixelBoxStylesVal; }, pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; }, scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; }, // Support: IE 9 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { table = document.createElement( "table" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px"; tr.style.height = "1px"; trChild.style.height = "9px"; documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; documentElement.removeChild( table ); } return reliableTrDimensionsVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style, vendorProps = {}; // Return a vendor-prefixed property or undefined function vendorPropName( name ) { // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a potentially-mapped jQuery.cssProps or vendor prefixed property function finalPropName( name ) { var final = jQuery.cssProps[ name ] || vendorProps[ name ]; if ( final ) { return final; } if ( name in emptyStyle ) { return name; } return vendorProps[ name ] = vendorPropName( name ) || name; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }; function setPositiveNumber( _elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { return 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin if ( box === "margin" ) { delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" if ( !isBorderBox ) { // Add padding delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // For "border" or "margin", add border if ( box !== "padding" ) { delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // But still keep track of it otherwise } else { extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } // If we get here with a border-box (content + padding + border), we're seeking "content" or // "padding" or "margin" } else { // For "content", subtract padding if ( box === "content" ) { delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // For "content" or "padding", subtract border if ( box !== "margin" ) { delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } // Account for positive content-box scroll gutter when requested by providing computedVal if ( !isBorderBox && computedVal >= 0 ) { // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border // Assuming integer scroll gutter, subtract the rest and round down delta += Math.max( 0, Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - computedVal - delta - extra - 0.5 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter // Use an explicit zero to avoid NaN (gh-3964) ) ) || 0; } return delta; } function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). // Fake content-box until we know it's needed to know the true value. boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS( elem, dimension, styles ), offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { if ( !extra ) { return val; } val = "auto"; } // Support: IE 9 - 11 only // Use offsetWidth/offsetHeight for when box sizing is unreliable. // In those cases, the computed value can be trusted to be border-box. if ( ( !support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Interestingly, in some cases IE 9 doesn't suffer from this issue. !support.reliableTrDimensions() && nodeName( elem, "tr" ) || // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) val === "auto" || // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && // Make sure the element is visible & connected elem.getClientRects().length ) { isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // Where available, offsetWidth/offsetHeight approximate border box dimensions. // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the // retrieved value as a content box dimension. valueIsBorderBox = offsetProp in elem; if ( valueIsBorderBox ) { val = elem[ offsetProp ]; } } // Normalize "" and auto val = parseFloat( val ) || 0; // Adjust for the element's box model return ( val + boxModelAdjustment( elem, dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) val ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "gridArea": true, "gridColumn": true, "gridColumnEnd": true, "gridColumnStart": true, "gridRow": true, "gridRowEnd": true, "gridRowStart": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append // "px" to a few hardcoded values. if ( type === "number" && !isCustomProp ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( _i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), // Only read styles.position if the test has a chance to fail // to avoid forcing a reflow. scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra ? boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ) : 0; // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && scrollboxSizeBuggy ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY and Edge just mirrors // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = result.stop.bind( result ); } return result; } } jQuery.map( props, createTween, animation ); if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } function classesToArray( value ) { if ( Array.isArray( value ) ) { return value; } if ( typeof value === "string" ) { return value.match( rnothtmlwhite ) || []; } return []; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isValidValue = type === "string" || Array.isArray( value ); if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion support.focusin = "onfocusin" in window; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function( e ) { e.stopPropagation(); }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; if ( event.isPropagationStopped() ) { lastElement.addEventListener( type, stopPropagationCallback ); } elem[ type ](); if ( event.isPropagationStopped() ) { lastElement.removeEventListener( type, stopPropagationCallback ); } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { // Handle: regular nodes (via `this.ownerDocument`), window // (via `this.document`) & document (via `this`). var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = { guid: Date.now() }; var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; if ( a == null ) { return ""; } // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() + " " ] = ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) .concat( match[ 2 ] ); } } match = responseHeaders[ key.toLowerCase() + " " ]; } return match == null ? null : match.join( ", " ); }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available and should be processed, append data to url if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Use a noop converter for missing script if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { s.converters[ "text script" ] = function() {}; } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( _i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery.ajaxPrefilter( function( s ) { var i; for ( i in s.headers ) { if ( i.toLowerCase() === "content-type" ) { s.contentType = s.headers[ i ] || ""; } } } ); jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, // Only evaluate the response if it is successful (gh-4126) // dataFilter is not invoked for failure responses, so using it instead // of the default converter is kludgy but it works. converters: { "text script": function() {} }, dataFilter: function( response ) { jQuery.globalEval( response, options, doc ); } } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var htmlIsFunction = isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain or forced-by-attrs requests if ( s.crossDomain || s.scriptAttrs ) { var script, callback; return { send: function( _, complete ) { script = jQuery( "

Index

A | B | C | D | E | F | G | H | L | M | N | O | P | R | S | V | W | X

A

B

C

D

E

F

G

H

L

M

N

O

P

R

S

V

W

X

================================================ FILE: docs/index.html ================================================ CleverHans Documentation — CleverHans documentation

CleverHans Documentation

This documentation is auto-generated from the docstrings of modules of the current master branch of cleverhans.

To get started, we recommend reading the github readme. Afterwards, you can learn more by looking at the following modules:

Indices and tables

================================================ FILE: docs/py-modindex.html ================================================ Python Module Index — CleverHans documentation

Python Module Index

c
 
c
cleverhans
    cleverhans.attacks
    cleverhans.devtools
    cleverhans.model
================================================ FILE: docs/search.html ================================================ Search — CleverHans documentation

Search

Please activate JavaScript to enable the search functionality.

Searching for multiple words only shows matches that contain all words.

================================================ FILE: docs/searchindex.js ================================================ Search.setIndex({docnames:["README","index","source/attacks","source/devtools","source/future","source/model"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["README.md","index.md","source/attacks.md","source/devtools.md","source/future.md","source/model.md"],objects:{"cleverhans.attacks":{ABCMeta:[2,1,1,""],Attack:[2,1,1,""],BasicIterativeMethod:[2,1,1,""],BoundaryAttackPlusPlus:[2,3,1,""],CallableModelWrapper:[2,1,1,""],CarliniWagnerL2:[2,1,1,""],DeepFool:[2,1,1,""],ElasticNetMethod:[2,1,1,""],FastFeatureAdversaries:[2,1,1,""],FastGradientMethod:[2,1,1,""],HopSkipJumpAttack:[2,1,1,""],LBFGS:[2,1,1,""],MadryEtAl:[2,1,1,""],MaxConfidence:[2,1,1,""],Model:[2,1,1,""],MomentumIterativeMethod:[2,1,1,""],Noise:[2,1,1,""],ProjectedGradientDescent:[2,1,1,""],SPSA:[2,1,1,""],SaliencyMapMethod:[2,1,1,""],Semantic:[2,1,1,""],SparseL1Descent:[2,1,1,""],SpatialTransformationMethod:[2,1,1,""],VirtualAdversarialMethod:[2,1,1,""],clip_eta:[2,3,1,""],fgm:[2,3,1,""],optimize_linear:[2,3,1,""],projected_optimization:[2,3,1,""],reduce_max:[2,3,1,""],reduce_mean:[2,3,1,""],reduce_sum:[2,3,1,""],softmax_cross_entropy_with_logits:[2,3,1,""],vatm:[2,3,1,""],wrapper_warning:[2,3,1,""],wrapper_warning_logits:[2,3,1,""],xrange:[2,4,1,""]},"cleverhans.attacks.ABCMeta":{register:[2,2,1,""]},"cleverhans.attacks.Attack":{construct_graph:[2,2,1,""],construct_variables:[2,2,1,""],generate:[2,2,1,""],generate_np:[2,2,1,""],get_or_guess_labels:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.CallableModelWrapper":{fprop:[2,2,1,""]},"cleverhans.attacks.CarliniWagnerL2":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.DeepFool":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.ElasticNetMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.FastFeatureAdversaries":{attack_single_step:[2,2,1,""],generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.FastGradientMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.HopSkipJumpAttack":{generate:[2,2,1,""],generate_np:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.LBFGS":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.MaxConfidence":{attack:[2,2,1,""],attack_class:[2,2,1,""],generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.Model":{O_FEATURES:[2,4,1,""],O_LOGITS:[2,4,1,""],O_PROBS:[2,4,1,""],fprop:[2,2,1,""],get_layer:[2,2,1,""],get_layer_names:[2,2,1,""],get_logits:[2,2,1,""],get_params:[2,2,1,""],get_predicted_class:[2,2,1,""],get_probs:[2,2,1,""],make_input_placeholder:[2,2,1,""],make_label_placeholder:[2,2,1,""],make_params:[2,2,1,""]},"cleverhans.attacks.MomentumIterativeMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.Noise":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.ProjectedGradientDescent":{FGM_CLASS:[2,4,1,""],generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.SPSA":{DEFAULT_DELTA:[2,4,1,""],DEFAULT_LEARNING_RATE:[2,4,1,""],DEFAULT_SPSA_ITERS:[2,4,1,""],DEFAULT_SPSA_SAMPLES:[2,4,1,""],generate:[2,2,1,""],generate_np:[2,2,1,""]},"cleverhans.attacks.SaliencyMapMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.Semantic":{generate:[2,2,1,""]},"cleverhans.attacks.SparseL1Descent":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.SpatialTransformationMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.attacks.VirtualAdversarialMethod":{generate:[2,2,1,""],parse_params:[2,2,1,""]},"cleverhans.model":{CallableModelWrapper:[5,1,1,""],Model:[5,1,1,""],NoSuchLayerError:[5,5,1,""],wrapper_warning:[5,3,1,""],wrapper_warning_logits:[5,3,1,""]},"cleverhans.model.CallableModelWrapper":{fprop:[5,2,1,""]},"cleverhans.model.Model":{O_FEATURES:[5,4,1,""],O_LOGITS:[5,4,1,""],O_PROBS:[5,4,1,""],fprop:[5,2,1,""],get_layer:[5,2,1,""],get_layer_names:[5,2,1,""],get_logits:[5,2,1,""],get_params:[5,2,1,""],get_predicted_class:[5,2,1,""],get_probs:[5,2,1,""],make_input_placeholder:[5,2,1,""],make_label_placeholder:[5,2,1,""],make_params:[5,2,1,""]},cleverhans:{attacks:[2,0,0,"-"],devtools:[4,0,0,"-"],model:[5,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"],"5":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute","5":"py:exception"},terms:{"001":2,"00420":2,"005":2,"00677":2,"01236":2,"02144":2,"02533":2,"04114":2,"04599":2,"04644":2,"05122":2,"05666":2,"06081":2,"06083":2,"06857":2,"07528":2,"100":2,"1000":2,"10000":2,"128":2,"13000":2,"1312":2,"1412":2,"1507":2,"1511":2,"1607":2,"1608":2,"1611":2,"1703":2,"1706":2,"1709":2,"1710":2,"1802":2,"1904":2,"2014":2,"2016":2,"2017":2,"2018":2,"2019":2,"6199":2,"6572":2,"abstract":[2,5],"boolean":2,"case":2,"class":[2,5],"default":[2,5],"final":[2,5],"float":2,"function":[2,5],"import":[0,2],"int":2,"new":2,"public":2,"return":[2,5],"static":0,"super":2,"true":[2,5],"try":2,For:2,The:[0,2,5],Use:2,Used:[2,5],Using:[2,5],_build:0,_project_perturb:2,abc:2,abcmeta:2,abl:0,abort:2,abort_earli:2,abs:2,acceler:2,access:[2,5],accident:2,accord:2,act:2,action:2,actual:[2,5],adam:2,add:0,addit:2,adversari:2,after:[2,5],afterward:1,against:2,aim:2,algorithm:2,alia:2,all:[0,2,5],allow:2,alon:2,along:2,alreadi:2,also:[2,5],angl:2,angle_max:2,angle_min:2,angular2html:0,ani:[2,5],appli:2,approach:2,approxim:2,arg:2,arg_typ:2,argmax_:2,argument:2,around:2,arrai:2,arxiv:2,assert:2,assign:2,assum:2,attack:[0,1,5],attack_class:2,attack_single_step:2,attain:2,attribut:2,auto:1,autodoc:0,automag:[2,5],automat:[2,5],avoid:2,axi:2,back:2,ball:2,base:[0,2,5],base_attack:2,basic:2,basiciterativemethod:2,batch:2,batch_siz:2,becaus:[2,5],been:[2,5],befor:2,being:2,below:2,beta:2,better:2,between:2,binari:2,binary_search_step:2,black:2,black_border_s:2,boneh:2,bool:2,border:2,bounc:2,bound:2,boundari:2,boundaryattackplusplu:2,box:2,branch:[0,1],build:0,built:2,bundl:2,cach:2,calcul:2,call:[2,5],callabl:[2,5],callable_fn:[2,5],callablemodelwrapp:[2,5],can:[0,1,2,5],cannot:0,carlini:2,carliniwagnerl2:2,center:2,chang:[2,5],check:[2,5],chen:2,child:2,choic:[0,2],choos:[0,2],chosen:2,classif:2,classifi:2,cleverhan:[0,2,5],click:0,clip:2,clip_eta:2,clip_grad:2,clip_max:2,clip_min:2,clockwis:2,code:[2,5],combin:2,come:2,compar:2,competit:2,complement:2,compon:2,compos:2,comput:[2,5],computation:2,concept:2,concret:2,confid:2,configur:2,consid:2,consist:2,constant:2,constraint:2,construct:2,construct_graph:2,construct_vari:2,constructor:[2,5],contain:2,content:[2,5],context:[2,5],control:2,conveni:0,converg:2,convolut:2,coordin:2,copi:0,core:[2,5],correct:2,cost:2,counter:2,cover:2,craft:2,creat:[0,2,5],criterion:2,cross:[2,5],current:[1,2],danger:[2,5],data:2,debug:2,decai:2,decay_factor:2,decis:2,decision_rul:2,decor:2,decreas:2,deepfool:2,default_delta:2,default_learning_r:2,default_rand_init:2,default_spsa_it:2,default_spsa_sampl:2,defens:2,defin:[2,5],delta:2,depend:[2,5],deprec:[2,5],descend:2,descent:2,describ:2,design:2,desir:2,detail:2,detect:[2,5],devic:[2,5],dict:[2,5],dictionari:[2,5],differ:[0,2],differenti:2,dim:2,dimens:2,direct:2,directli:[2,5],directori:0,discret:2,distanc:2,distort:2,doc:0,docsourc:0,docstr:1,document:[0,2],doe:[2,5],domain:2,done:2,dong:2,dot:2,down:0,dramat:2,drop:0,dtype:2,dtypestr:2,dure:2,dx_max:2,dx_min:2,dy_max:2,dy_min:2,each:2,earli:2,early_stop_loss_threshold:2,effect:2,effici:2,either:2,elast:2,elasticnetmethod:2,element:2,enabl:[0,2],encod:2,end:2,enforc:2,entropi:[2,5],environ:0,eps:2,eps_it:2,epsilon:2,estim:2,eta:2,evalu:2,even:[2,5],everi:2,exampl:[2,5],except:[0,5],exist:5,expens:2,explain:2,expos:[2,5],express:2,extend:2,extra:[2,5],factor:2,fail:[0,2],failur:2,fals:[2,5],fast:2,fast_gradient_method:2,faster:2,fastfeatureadversari:2,fastgradientmethod:2,featur:[2,5],fed:[2,5],feedabl:2,few:2,fewer:2,fgm:2,fgm_class:2,file:0,find:2,finit:2,first:[0,2],fix:2,float32:2,folder:0,follow:[0,1,2],forum:2,forward:[2,5],found:2,fprop:[2,5],free:2,from:[0,1,2,5],full:2,g_feat:2,gamma:2,gener:[0,1,2],generate_np:2,geometr:2,geometric_progress:2,get:[0,1,2],get_lay:[2,5],get_layer_nam:[2,5],get_logit:[2,5],get_or_guess_label:2,get_param:[2,5],get_predicted_class:[2,5],get_prob:[2,5],github:[0,1],give:2,given:2,good:2,goodfellow:2,grad:2,grad_spars:2,gradient:[2,5],graph:2,greatli:2,grid:2,grid_search:2,guarante:2,guid:2,h1g0pia9tq:2,hack:0,half:2,handl:2,hard:2,has:[2,5],hash_kei:2,have:[0,2,5],help:2,helper:2,here:2,hidden:[2,5],high:2,higher:2,hold:2,hood:[2,5],hopskipjumpattack:2,hot:2,how:2,hparam:[2,5],html:0,http:2,hurt:2,hyperparamet:2,idea:2,identifi:2,ignor:2,imag:2,image_target:2,imagenet:2,implement:[2,5],importantli:2,improv:2,incept:[2,5],includ:2,incorrect:[2,5],increas:2,index:[0,1,2],indic:0,inf:2,infer:2,infin:2,info:2,initi:2,initial_const:2,initial_num_ev:2,input:[2,5],input_imag:2,insert:2,instal:0,instead:2,intend:2,intention:2,interfac:[2,5],intern:2,interv:2,introduc:2,invok:[2,5],is_debug:2,is_target:2,issu:[2,5],issubclass:2,iter:2,itself:2,jacobian:2,jekyl:0,jordan:2,just:[2,5],keep:[0,2],kei:2,kera:[2,5],keras_tensor:0,keyword:2,known:2,kurakin:2,kwarg:[2,5],label:[2,5],larg:2,larger:2,largest:2,later:[2,5],layer:[2,5],lbfg:2,leak:2,learn:[1,2],learning_r:2,least:2,leav:2,length:2,less:2,level:2,librari:0,like:2,linear:2,linf:2,link:2,list:[0,2,5],local:[0,2],log:0,logit:[2,5],look:1,loop:2,loss:[2,5],loss_fn:2,lower:2,made:2,madri:2,madryet:2,mai:[2,5],make:[0,2,5],make_input_placehold:[2,5],make_label_placehold:[2,5],make_param:[2,5],makefil:0,manag:[2,5],mani:2,map:[2,5],mask:[2,5],master:[0,1],max_it:2,max_iter:2,max_num_ev:2,max_val:2,maxconfid:2,maximum:2,mean:[2,5],measur:2,memori:2,metaclass:2,method:[2,5],mimic:2,minim:2,minimum:2,misclassif:2,mix:2,miyato:2,model:[1,2],moder:2,modifi:2,modul:[0,1],momentum:2,momentumiterativemethod:2,more:[1,2],most:2,move:[0,2],mro:2,much:2,multipl:[2,5],must:2,n_angl:2,n_dx:2,n_dy:2,n_sampl:2,name:[0,2,5],namespac:2,nb_candid:2,nb_class:[2,5],nb_iter:2,need:[2,5],needs_dummy_fprop:[2,5],neg:2,negat:2,neither:2,net:2,network:[2,5],neural:[2,5],nip:2,nois:2,nojekyl:0,non:2,none:[2,5],nor:2,norm:2,normal:2,nosuchlayererror:5,note:[0,2,5],num_iter:2,num_step:2,number:2,numer:2,numpi:2,o_featur:[2,5],o_logit:[2,5],o_prob:[2,5],object:[2,5],off:2,often:2,one:2,onli:2,openreview:2,oper:2,optim:2,optimal_perturb:2,optimize_linear:2,option:[0,2,5],ord:2,order:2,org:[0,2],orient:2,origin:2,other:2,otherwis:[0,2],our:[0,2],out:2,outperform:2,output:[0,2,5],output_lay:[2,5],over:2,overriden:2,overshoot:2,own:2,packag:[2,5],page:[0,1],paper:2,papernot:2,param:[2,5],paramet:[2,5],pars:2,parse_param:2,part:[2,5],particularli:2,pass:[2,5],pdf:2,percent:2,percentag:2,percentil:2,perform:2,perturb:2,pick:2,pip:0,pixel:2,place:[2,5],placehold:[2,5],pleas:0,point:2,posit:2,possibl:2,pre:[2,5],predict:[2,5],prepar:0,prevent:2,preview:0,previou:2,print:2,prob:[2,5],probabl:[2,5],procedur:2,process:2,produc:[2,5],progress:2,project:2,project_perturb:2,projected_gradient_desc:2,projected_optim:2,projectedgradientdesc:2,propag:[2,5],properti:2,propos:2,provid:[2,5],publish:0,purturb:2,put:[2,5],py_func:2,queri:2,radiu:2,rais:[0,5],rand_init:2,rand_init_ep:2,rand_minmax:2,random:2,rang:2,rate:2,rather:2,ratio:2,reach:2,read:[1,2],readm:1,realiz:[2,5],reason:2,recip:2,recommend:[1,2],reduce_max:2,reduce_mean:2,reduce_sum:2,refer:[2,5],region:2,regist:2,reject:2,rel:2,relat:5,remov:[2,5],repo:0,repositori:0,repres:[2,5],represent:[2,5],request:5,requir:2,reshap:[2,5],resolut:2,respect:[2,5],result:[2,5],retain:2,robust:2,root:0,rotat:2,run:[0,2],runtim:2,sabour:2,salienc:2,saliencymapmethod:2,same:[2,5],sampl:2,saniti:2,sanity_check:2,save:2,scalar:2,scale:2,scope:[2,5],scroll:0,search:[1,2],section:0,see:[0,2,5],seed:2,select:2,self:[2,5],semant:2,sentinel:2,separ:0,serv:0,sess:2,session:2,set:[0,2,5],sever:[2,5],shape:2,should:[2,5],show:2,side:2,sign:2,signatur:2,silent:[2,5],similar:2,simpl:2,simplifi:[2,5],simultan:2,singl:[2,5],site:0,size:2,slower:2,smaller:2,smooth:2,softmax:[2,5],softmax_cross_entropy_with_logit:2,softmax_cross_entropy_with_logits_v2:2,solv:2,some:2,soon:2,sourc:[0,2,5],space:2,spars:2,sparsel1desc:2,sparsiti:2,spatial:2,spatialtransformationmethod:2,special:2,specif:[0,2,5],specifi:2,speed:2,sphinx:0,spsa:[0,2],spsa_it:2,spsa_sampl:2,sqrt:2,start:[1,2],steepest:2,step:2,stepsiz:2,stepsize_search:2,still:[0,2,5],stop:2,store:2,str:[2,5],strang:2,stronger:2,strongli:2,structur:2,stuck:2,sub:2,subclass:2,success:2,suppli:[2,5],sure:0,symbol:[2,5],symbolic_impl:2,tab:0,take:2,target:2,target_i:2,tensor:[2,5],tensoradam:2,tensorflow:2,tensorflow_addon:0,tensoroptim:2,term:2,termin:2,test:2,tfa:0,than:2,thei:[2,5],them:[0,2,5],therefor:2,theta:2,thi:[0,1,2,5],those:2,three:2,threshold:2,through:2,thu:[0,2],time:[2,5],too:2,total:2,trade:2,tradeoff:2,train:2,tramer:2,transfer:2,transform:2,translat:2,treat:[2,5],tri:2,tricki:2,true_i:2,tune:2,turn:[2,5],type:2,typic:2,uesato:2,unabl:2,uncom:0,under:[0,2,5],underli:2,uniformli:2,uniqu:2,unit:2,univers:2,unless:2,unnorm:2,unrel:2,untarget:2,until:2,updat:2,usag:2,use:[2,5],used:2,useful:2,user:[0,2,5],uses:2,using:[0,2],valid:[2,5],valu:[2,5],valueerror:5,vanish:2,variabl:[2,5],variant:2,variat:2,vastli:2,vatm:2,vector:2,verbos:2,version:2,via:2,virtual:[0,2],virtualadversarialmethod:2,virutalen:0,wagner:2,wai:[2,5],wainwright:2,want:0,warn:[0,2,5],weak:2,websit:0,were:2,when:[0,2,5],where:[0,2],whether:[0,2,5],which:2,while_loop:2,white:2,without:2,won:2,work:2,wors:[2,5],would:[2,5],wrap:[2,5],wrapper:[2,5],wrapper_warn:[2,5],wrapper_warning_logit:[2,5],write:2,x_t:2,x_val:2,xrang:2,y_target:2,yield:2,you:[0,1,2],your:[0,2]},titles:["<no title>","CleverHans Documentation","attacks module","devtools module","future module","model module"],titleterms:{attack:2,cleverhan:1,devtool:3,document:1,futur:4,indic:1,model:5,modul:[2,3,4,5],tabl:1}}) ================================================ FILE: docs/source/attacks.html ================================================ attacks module — CleverHans documentation

attacks module

The Attack class, providing a universal abstract interface describing attacks, and many implementations of it.

class cleverhans.attacks.ABCMeta(name, bases, namespace, **kwargs)[source]

Bases: type

Metaclass for defining Abstract Base Classes (ABCs).

Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in class. You can also register unrelated concrete classes (even built-in classes) and unrelated ABCs as ‘virtual subclasses’ – these and their descendants will be considered subclasses of the registering ABC by the built-in issubclass() function, but the registering ABC won’t show up in their MRO (Method Resolution Order) nor will method implementations defined by the registering ABC be callable (not even via super()).

register(subclass)[source]

Register a virtual subclass of an ABC.

Returns the subclass, to allow usage as a class decorator.

class cleverhans.attacks.Attack(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: object

Abstract base class for all attack classes.

construct_graph(fixed, feedable, x_val, hash_key)[source]

Construct the graph required to run the attack through generate_np.

Parameters
  • fixed – Structural elements that require defining a new graph.

  • feedable – Arguments that can be fed to the same graph when they take different values.

  • x_val – symbolic adversarial example

  • hash_key – the key used to store this graph in our cache

construct_variables(kwargs)[source]

Construct the inputs to the attack graph to be used by generate_np.

Parameters

kwargs – Keyword arguments to generate_np.

Returns

Structural arguments Feedable arguments Output of arg_type describing feedable arguments A unique key

generate(x, **kwargs)[source]

Generate the attack’s symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator.

Parameters
  • x – The model’s symbolic inputs.

  • **kwargs

    optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names:

    clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified.

    If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input.

    For other concepts, it’s generally a good idea to read other classes and check for name consistency.

Returns

A symbolic representation of the adversarial examples.

generate_np(x_val, **kwargs)[source]

Generate adversarial examples and return them as a NumPy array. Sub-classes should not implement this method unless they must perform special handling of arguments.

Parameters
  • x_val – A NumPy array with the original inputs.

  • **kwargs

    optional parameters used by child classes.

Returns

A NumPy array holding the adversarial examples.

get_or_guess_labels(x, kwargs)[source]

Get the label to use in generating an adversarial example for x. The kwargs are fed directly from the kwargs of the attack. If ‘y’ is in kwargs, then assume it’s an untargeted attack and use that as the label. If ‘y_target’ is in kwargs and is not none, then assume it’s a targeted attack and use that as the label. Otherwise, use the model’s prediction as the label and perform an untargeted attack.

parse_params(params=None)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Parameters

params – a dictionary of attack-specific parameters

Returns

True when parsing was successful

class cleverhans.attacks.BasicIterativeMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent

The BasicIterativeMethod attack.

cleverhans.attacks.BoundaryAttackPlusPlus(model, sess, dtypestr='float32', **kwargs)[source]

A previous name used for HopSkipJumpAttack.

class cleverhans.attacks.CallableModelWrapper(callable_fn, output_layer)[source]

Bases: cleverhans.model.Model

A wrapper that turns a callable into a valid Model

fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

class cleverhans.attacks.CarliniWagnerL2(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack was originally proposed by Carlini and Wagner. It is an iterative attack that finds adversarial examples on many defenses that are robust to other attacks. Paper link: https://arxiv.org/abs/1608.04644

At a high level, this attack is an iterative attack using Adam and a specially-chosen loss function to find adversarial examples with lower distortion than other attacks. This comes at the cost of speed, as this attack is often much slower than others.

Parameters
  • model – cleverhans.model.Model

  • sess – tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors.

Parameters
  • x – A tensor with the inputs.

  • kwargs – See parse_params

parse_params(y=None, y_target=None, batch_size=1, confidence=0, learning_rate=0.005, binary_search_steps=5, max_iterations=1000, abort_early=True, initial_const=0.01, clip_min=0, clip_max=1)[source]
Parameters
  • y – (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns.

  • y_target – (optional) A tensor with the target labels for a targeted attack.

  • confidence – Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial.

  • batch_size – Number of attacks to run simultaneously.

  • learning_rate – The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge.

  • binary_search_steps – The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and confidence of the classification.

  • max_iterations – The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results.

  • abort_early – If true, allows early aborts if gradient descent is unable to make progress (i.e., gets stuck in a local minimum).

  • initial_const – The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.DeepFool(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

DeepFool is an untargeted & iterative attack which is based on an iterative linearization of the classifier. The implementation here is w.r.t. the L2 norm. Paper link: “https://arxiv.org/pdf/1511.04599.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(nb_candidate=10, overshoot=0.02, max_iter=50, clip_min=0.0, clip_max=1.0, **kwargs)[source]
Parameters
  • nb_candidate – The number of classes to test against, i.e., deepfool only consider nb_candidate classes when attacking(thus accelerate speed). The nb_candidate classes are chosen according to the prediction confidence during implementation.

  • overshoot – A termination criterion to prevent vanishing updates

  • max_iter – Maximum number of iteration for deepfool

  • clip_min – Minimum component value for clipping

  • clip_max – Maximum component value for clipping

class cleverhans.attacks.ElasticNetMethod(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack features L1-oriented adversarial examples and includes the C&W L2 attack as a special case (when beta is set to 0). Adversarial examples attain similar performance to those generated by the C&W L2 attack in the white-box case, and more importantly, have improved transferability properties and complement adversarial training. Paper link: https://arxiv.org/abs/1709.04114

Parameters
  • model – cleverhans.model.Model

  • sess – tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors.

Parameters
  • x – (required) A tensor with the inputs.

  • kwargs – See parse_params

parse_params(y=None, y_target=None, beta=0.01, decision_rule='EN', batch_size=1, confidence=0, learning_rate=0.01, binary_search_steps=9, max_iterations=1000, abort_early=False, initial_const=0.001, clip_min=0, clip_max=1)[source]
Parameters
  • y – (optional) A tensor with the true labels for an untargeted attack. If None (and y_target is None) then use the original labels the classifier assigns.

  • y_target – (optional) A tensor with the target labels for a targeted attack.

  • beta – Trades off L2 distortion with L1 distortion: higher produces examples with lower L1 distortion, at the cost of higher L2 (and typically Linf) distortion

  • decision_rule – EN or L1. Select final adversarial example from all successful examples based on the least elastic-net or L1 distortion criterion.

  • confidence – Confidence of adversarial examples: higher produces examples with larger l2 distortion, but more strongly classified as adversarial.

  • batch_size – Number of attacks to run simultaneously.

  • learning_rate – The learning rate for the attack algorithm. Smaller values produce better results but are slower to converge.

  • binary_search_steps – The number of times we perform binary search to find the optimal tradeoff- constant between norm of the perturbation and confidence of the classification. Set ‘initial_const’ to a large value and fix this param to 1 for speed.

  • max_iterations – The maximum number of iterations. Setting this to a larger value will produce lower distortion results. Using only a few iterations requires a larger learning rate, and will produce larger distortion results.

  • abort_early – If true, allows early abort when the total loss starts to increase (greatly speeds up attack, but hurts performance, particularly on ImageNet)

  • initial_const – The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and confidence of classification. If binary_search_steps is large, the initial constant is not important. A smaller value of this constant gives lower distortion results. For computational efficiency, fix binary_search_steps to 1 and set this param to a large value.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.FastFeatureAdversaries(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This is a fast implementation of “Feature Adversaries”, an attack against a target internal representation of a model. “Feature adversaries” were originally introduced in (Sabour et al. 2016), where the optimization was done using LBFGS. Paper link: https://arxiv.org/abs/1511.05122

This implementation is similar to “Basic Iterative Method” (Kurakin et al. 2016) but applied to the internal representations.

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

attack_single_step(x, eta, g_feat)[source]

TensorFlow implementation of the Fast Feature Gradient. This is a single step attack similar to Fast Gradient Method that attacks an internal representation.

Parameters
  • x – the input placeholder

  • eta – A tensor the same shape as x that holds the perturbation.

  • g_feat – model’s internal tensor for guide

Returns

a tensor for the adversarial example

generate(x, g, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • g – The target value of the symbolic representation

  • kwargs – See parse_params

parse_params(layer=None, eps=0.3, eps_iter=0.05, nb_iter=10, ord=inf, clip_min=None, clip_max=None, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • layer – (required str) name of the layer to target.

  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.FastGradientMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack was originally implemented by Goodfellow et al. (2014) with the infinity norm (and is known as the “Fast Gradient Sign Method”). This implementation extends the attack to other norms, and is therefore called the Fast Gradient Method. Paper link: https://arxiv.org/abs/1412.6572

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Returns the graph for Fast Gradient Method adversarial examples.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=0.3, ord=inf, loss_fn=<function softmax_cross_entropy_with_logits>, y=None, y_target=None, clip_min=None, clip_max=None, clip_grad=False, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) attack step size (input variation)

  • ord – (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.

  • loss_fn – Loss function that takes (labels, logits) as arguments and returns loss

  • y – (optional) A tensor with the true labels. Only provide this parameter if you’d like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the “label leaking” effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

  • sanity_checks – bool, if True, include asserts (Turn them off to use less runtime / memory or for unit tests that intentionally pass strange input)

class cleverhans.attacks.HopSkipJumpAttack(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright. It is a decision-based attack that requires access to output labels of a model alone. Paper link: https://arxiv.org/abs/1904.02144 At a high level, this attack is an iterative attack composed of three steps: Binary search to approach the boundary; gradient estimation; stepsize search. HopSkipJumpAttack requires fewer model queries than Boundary Attack which was based on rejective sampling. :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor. see parse_params for details.

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: A tensor with the inputs. :param kwargs: See parse_params

generate_np(x, **kwargs)[source]

Generate adversarial images in a for loop. :param y: An array of shape (n, nb_classes) for true labels. :param y_target: An array of shape (n, nb_classes) for target labels. Required for targeted attack. :param image_target: An array of shape (n, **image shape) for initial target images. Required for targeted attack.

See parse_params for other kwargs.

parse_params(y_target=None, image_target=None, initial_num_evals=100, max_num_evals=10000, stepsize_search='geometric_progression', num_iterations=64, gamma=1.0, constraint='l2', batch_size=128, verbose=True, clip_min=0, clip_max=1)[source]
Parameters
  • y – A tensor of shape (1, nb_classes) for true labels.

  • y_target – A tensor of shape (1, nb_classes) for target labels.

Required for targeted attack. :param image_target: A tensor of shape (1, **image shape) for initial target images. Required for targeted attack. :param initial_num_evals: initial number of evaluations for

gradient estimation.

Parameters
  • max_num_evals – maximum number of evaluations for gradient estimation.

  • stepsize_search

    How to search for stepsize; choices are ‘geometric_progression’, ‘grid_search’. ‘geometric progression’ initializes the stepsize

    by ||x_t - x||_p / sqrt(iteration), and keep decreasing by half until reaching the target side of the boundary. ‘grid_search’ chooses the optimal epsilon over a grid, in the scale of ||x_t - x||_p.

  • num_iterations – The number of iterations.

  • gamma – The binary search threshold theta is gamma / d^{3/2} for l2 attack and gamma / d^2 for linf attack.

  • constraint – The distance to optimize; choices are ‘l2’, ‘linf’.

  • batch_size – batch_size for model prediction.

  • verbose – (boolean) Whether distance at each step is printed.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.LBFGS(model, sess, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

LBFGS is the first adversarial attack for convolutional neural networks, and is a target & iterative attack. Paper link: “https://arxiv.org/pdf/1312.6199.pdf” :param model: cleverhans.model.Model :param sess: tf.Session :param dtypestr: dtype of the data :param kwargs: passed through to super constructor

generate(x, **kwargs)[source]

Return a tensor that constructs adversarial examples for the given input. Generate uses tf.py_func in order to operate over tensors. :param x: (required) A tensor with the inputs. :param kwargs: See parse_params

parse_params(y_target=None, batch_size=1, binary_search_steps=5, max_iterations=1000, initial_const=0.01, clip_min=0, clip_max=1)[source]
Parameters
  • y_target – (optional) A tensor with the one-hot target labels.

  • batch_size – The number of inputs to include in a batch and process simultaneously.

  • binary_search_steps – The number of times we perform binary search to find the optimal tradeoff- constant between norm of the purturbation and cross-entropy loss of classification.

  • max_iterations – The maximum number of iterations.

  • initial_const – The initial tradeoff-constant to use to tune the relative importance of size of the perturbation and cross-entropy loss of the classification.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.MadryEtAl(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent

The attack from Madry et al 2017

class cleverhans.attacks.MaxConfidence(model, sess=None, base_attacker=None)[source]

Bases: cleverhans.attacks.attack.Attack

The MaxConfidence attack.

An attack designed for use against models that use confidence thresholding as a defense. If the underlying optimizer is optimal, this attack procedure gives the optimal failure rate for every confidence threshold t > 0.5.

Publication: https://openreview.net/forum?id=H1g0piA9tQ

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.session.Session

  • base_attacker – cleverhans.attacks.Attack

attack(x, true_y)[source]

Runs the untargeted attack. :param x: The input :param true_y: The correct label for x. This attack aims to produce misclassification.

attack_class(x, target_y)[source]

Run the attack on a specific target class. :param x: tf Tensor. The input example. :param target_y: tf Tensor. The attacker’s desired target class. Returns:

A targeted adversarial example, intended to be classified as the target class.

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – Keyword arguments for the base attacker

parse_params(y=None, nb_classes=10, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Parameters

params – a dictionary of attack-specific parameters

Returns

True when parsing was successful

class cleverhans.attacks.Model(scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False)[source]

Bases: object

An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them.

O_FEATURES = 'features'
O_LOGITS = 'logits'
O_PROBS = 'probs'
fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

get_layer(x, layer, **kwargs)[source]

Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer layer

get_layer_names()[source]

Return the list of exposed layers for this model.

get_logits(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output logits

(i.e., the values fed as inputs to the softmax layer).

get_params()[source]

Provides access to the model’s parameters. :return: A list of all Variables defining the model parameters.

get_predicted_class(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the predicted label

get_probs(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output

probabilities (i.e., the output values produced by the softmax layer).

make_input_placeholder()[source]

Create and return a placeholder representing an input to the model.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_label_placeholder()[source]

Create and return a placeholder representing class labels.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_params()[source]

Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set needs_dummy_fprop=True in the constructor.

class cleverhans.attacks.MomentumIterativeMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

The Momentum Iterative Method (Dong et al. 2017). This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks and Targeted Adversarial Attacks. The original paper used hard labels for this attack; no label smoothing. Paper link: https://arxiv.org/pdf/1710.06081.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – Keyword arguments. See parse_params for documentation.

parse_params(eps=0.3, eps_iter=0.06, nb_iter=10, y=None, ord=inf, decay_factor=1.0, clip_min=None, clip_max=None, y_target=None, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • y – (optional) A tensor with the true labels.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2.

  • decay_factor – (optional) Decay factor for the momentum term.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.Noise(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

A weak attack that just picks a random point in the attacker’s action space. When combined with an attack bundling function, this can be used to implement random search.

References: https://arxiv.org/abs/1802.00420 recommends random search to help identify

gradient masking.

https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part

of an attack bundling recipe combining many different optimizers to yield a stronger optimizer.

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=0.3, ord=inf, clip_min=None, clip_max=None, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

class cleverhans.attacks.ProjectedGradientDescent(model, sess=None, dtypestr='float32', default_rand_init=True, **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This class implements either the Basic Iterative Method (Kurakin et al. 2016) when rand_init is set to 0. or the Madry et al. (2017) method when rand_minmax is larger than 0. Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • default_rand_init – whether to use random initialization by default

  • kwargs – passed through to super constructor

FGM_CLASS

alias of cleverhans.attacks.fast_gradient_method.FastGradientMethod

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=0.3, eps_iter=0.05, nb_iter=10, y=None, ord=inf, loss_fn=<function softmax_cross_entropy_with_logits>, clip_min=None, clip_max=None, y_target=None, rand_init=None, rand_init_eps=None, clip_grad=False, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • y – (optional) A tensor with the true labels.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • ord – (optional) Order of the norm (mimics Numpy). Possible values: np.inf, 1 or 2.

  • loss_fn – Loss function that takes (labels, logits) as arguments and returns loss

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • rand_init – (optional) Start the gradient descent from a point chosen uniformly at random in the norm ball of radius rand_init_eps

  • rand_init_eps – (optional float) size of the norm ball from which the initial starting point is chosen. Defaults to eps

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

  • sanity_checks

    bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the

    tests intentionally configure the attack strangely)

class cleverhans.attacks.SPSA(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable, or more generally, the gradients do not point in useful directions.

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

DEFAULT_DELTA = 0.01
DEFAULT_LEARNING_RATE = 0.01
DEFAULT_SPSA_ITERS = 1
DEFAULT_SPSA_SAMPLES = 128
generate(x, y=None, y_target=None, eps=None, clip_min=None, clip_max=None, nb_iter=None, is_targeted=None, early_stop_loss_threshold=None, learning_rate=0.01, delta=0.01, spsa_samples=128, batch_size=None, spsa_iters=1, is_debug=False, epsilon=None, num_steps=None)[source]

Generate symbolic graph for adversarial examples.

Parameters
  • x – The model’s symbolic inputs. Must be a batch of size 1.

  • y – A Tensor or None. The index of the correct label.

  • y_target – A Tensor or None. The index of the target label in a targeted attack.

  • eps – The size of the maximum perturbation, measured in the L-infinity norm.

  • clip_min – If specified, the minimum input value

  • clip_max – If specified, the maximum input value

  • nb_iter – The number of optimization steps.

  • early_stop_loss_threshold – A float or None. If specified, the attack will end as soon as the loss is below early_stop_loss_threshold.

  • learning_rate – Learning rate of ADAM optimizer.

  • delta – Perturbation size used for SPSA approximation.

  • spsa_samples – Number of inputs to evaluate at a single time. The true batch size (the number of evaluated inputs for each update) is spsa_samples * spsa_iters

  • batch_size – Deprecated param that is an alias for spsa_samples

  • spsa_iters – Number of model evaluations before performing an update, where each evaluation is on spsa_samples different inputs.

  • is_debug – If True, print the adversarial loss after each update.

  • epsilon – Deprecated alias for eps

  • num_steps – Deprecated alias for nb_iter.

  • is_targeted – Deprecated argument. Ignored.

generate_np(x_val, **kwargs)[source]

Generate adversarial examples and return them as a NumPy array. Sub-classes should not implement this method unless they must perform special handling of arguments.

Parameters
  • x_val – A NumPy array with the original inputs.

  • **kwargs

    optional parameters used by child classes.

Returns

A NumPy array holding the adversarial examples.

class cleverhans.attacks.SaliencyMapMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

The Jacobian-based Saliency Map Method (Papernot et al. 2016). Paper link: https://arxiv.org/pdf/1511.07528.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

Note

When not using symbolic implementation in generate, sess should be provided

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(theta=1.0, gamma=1.0, clip_min=0.0, clip_max=1.0, y_target=None, symbolic_impl=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • theta – (optional float) Perturbation introduced to modified components (can be positive or negative)

  • gamma – (optional float) Maximum percentage of perturbed features

  • clip_min – (optional float) Minimum component value for clipping

  • clip_max – (optional float) Maximum component value for clipping

  • y_target – (optional) Target tensor if the attack is targeted

class cleverhans.attacks.Semantic(model, center, max_val=1.0, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

Semantic adversarial examples

https://arxiv.org/abs/1703.06857

Note: data must either be centered (so that the negative image can be made by simple negation) or must be in the interval [-1, 1]

Parameters
  • model – cleverhans.model.Model

  • center – bool If True, assumes data has 0 mean so the negative image is just negation. If False, assumes data is in the interval [0, max_val]

  • max_val – float Maximum value allowed in the input data

  • sess – optional tf.Session

  • dtypestr – dtype of data

  • kwargs – passed through to the super constructor

generate(x, **kwargs)[source]

Generate the attack’s symbolic graph for adversarial examples. This method should be overriden in any child class that implements an attack that is expressable symbolically. Otherwise, it will wrap the numerical implementation as a symbolic operator.

Parameters
  • x – The model’s symbolic inputs.

  • **kwargs

    optional parameters used by child classes. Each child class defines additional parameters as needed. Child classes that use the following concepts should use the following names:

    clip_min: minimum feature value clip_max: maximum feature value eps: size of norm constraint on adversarial perturbation ord: order of norm constraint nb_iter: number of iterations eps_iter: size of norm constraint on iteration y_target: if specified, the attack is targeted. y: Do not specify if y_target is specified.

    If specified, the attack is untargeted, aims to make the output class not be y. If neither y_target nor y is specified, y is inferred by having the model classify the input.

    For other concepts, it’s generally a good idea to read other classes and check for name consistency.

Returns

A symbolic representation of the adversarial examples.

class cleverhans.attacks.SparseL1Descent(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This class implements a variant of Projected Gradient Descent for the l1-norm (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2 cases covered by the ProjectedGradientDescent class, because the steepest descent direction for the l1-norm is too sparse (it updates a single coordinate in the adversarial perturbation in each step). This attack has an additional parameter that controls the sparsity of the update step. For moderately sparse update steps, the attack vastly outperforms Projected Steepest Descent and is competitive with other attacks targeted at the l1-norm such as the ElasticNetMethod attack (which is much more computationally expensive). Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=10.0, eps_iter=1.0, nb_iter=20, y=None, clip_min=None, clip_max=None, y_target=None, rand_init=False, clip_grad=False, grad_sparsity=99, sanity_checks=True, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float) maximum distortion of adversarial example compared to original input

  • eps_iter – (optional float) step size for each attack iteration

  • nb_iter – (optional int) Number of attack iterations.

  • y – (optional) A tensor with the true labels.

  • y_target – (optional) A tensor with the labels to target. Leave y_target=None if y is also set. Labels should be one-hot-encoded.

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

:param grad_sparsity (optional) Relative sparsity of the gradient update

step, in percent. Only gradient values larger than this percentile are retained. This parameter can be a scalar, or a vector of the same length as the input batch dimension.

Parameters

sanity_checks

bool Insert tf asserts checking values (Some tests need to run with no sanity checks because the

tests intentionally configure the attack strangely)

class cleverhans.attacks.SpatialTransformationMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

Spatial transformation attack

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return. :param x: The model’s symbolic inputs. :param kwargs: See parse_params

parse_params(n_samples=None, dx_min=- 0.1, dx_max=0.1, n_dxs=2, dy_min=- 0.1, dy_max=0.1, n_dys=2, angle_min=- 30, angle_max=30, n_angles=6, black_border_size=0, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes. :param n_samples: (optional) The number of transformations sampled to

construct the attack. Set it to None to run full grid attack.

Parameters
  • dx_min – (optional float) Minimum translation ratio along x-axis.

  • dx_max – (optional float) Maximum translation ratio along x-axis.

  • n_dxs – (optional int) Number of discretized translation ratios along x-axis.

  • dy_min – (optional float) Minimum translation ratio along y-axis.

  • dy_max – (optional float) Maximum translation ratio along y-axis.

  • n_dys – (optional int) Number of discretized translation ratios along y-axis.

  • angle_min – (optional float) Largest counter-clockwise rotation angle.

  • angle_max – (optional float) Largest clockwise rotation angle.

  • n_angles – (optional int) Number of discretized angles.

  • black_border_size – (optional int) size of the black border in pixels.

class cleverhans.attacks.VirtualAdversarialMethod(model, sess=None, dtypestr='float32', **kwargs)[source]

Bases: cleverhans.attacks.attack.Attack

This attack was originally proposed by Miyato et al. (2016) and was used for virtual adversarial training. Paper link: https://arxiv.org/abs/1507.00677

Parameters
  • model – cleverhans.model.Model

  • sess – optional tf.Session

  • dtypestr – dtype of the data

  • kwargs – passed through to super constructor

generate(x, **kwargs)[source]

Generate symbolic graph for adversarial examples and return.

Parameters
  • x – The model’s symbolic inputs.

  • kwargs – See parse_params

parse_params(eps=2.0, nb_iter=None, xi=1e-06, clip_min=None, clip_max=None, num_iterations=None, **kwargs)[source]

Take in a dictionary of parameters and applies attack-specific checks before saving them as attributes.

Attack-specific parameters:

Parameters
  • eps – (optional float )the epsilon (input variation parameter)

  • nb_iter – (optional) the number of iterations Defaults to 1 if not specified

  • xi – (optional float) the finite difference parameter

  • clip_min – (optional float) Minimum input component value

  • clip_max – (optional float) Maximum input component value

  • num_iterations – Deprecated alias for nb_iter

cleverhans.attacks.clip_eta(eta, ord, eps)[source]

Helper function to clip the perturbation to epsilon norm ball. :param eta: A tensor with the current perturbation. :param ord: Order of the norm (mimics Numpy).

Possible values: np.inf, 1 or 2.

Parameters

eps – Epsilon, bound of the perturbation.

cleverhans.attacks.fgm(x, logits, y=None, eps=0.3, ord=inf, loss_fn=<function softmax_cross_entropy_with_logits>, clip_min=None, clip_max=None, clip_grad=False, targeted=False, sanity_checks=True)[source]

TensorFlow implementation of the Fast Gradient Method. :param x: the input placeholder :param logits: output of model.get_logits :param y: (optional) A placeholder for the true labels. If targeted

is true, then provide the target label. Otherwise, only provide this parameter if you’d like to use true labels when crafting adversarial samples. Otherwise, model predictions are used as labels to avoid the “label leaking” effect (explained in this paper: https://arxiv.org/abs/1611.01236). Default is None. Labels should be one-hot-encoded.

Parameters
  • eps – the epsilon (input variation parameter)

  • ord – (optional) Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.

  • loss_fn – Loss function that takes (labels, logits) as arguments and returns loss

  • clip_min – Minimum float value for adversarial example components

  • clip_max – Maximum float value for adversarial example components

  • clip_grad – (optional bool) Ignore gradient components at positions where the input is already at the boundary of the domain, and the update step will get clipped out.

  • targeted – Is the attack targeted or untargeted? Untargeted, the default, will try to make the label incorrect. Targeted will instead try to move in the direction of being more like y.

Returns

a tensor for the adversarial example

cleverhans.attacks.optimize_linear(grad, eps, ord=inf)[source]

Solves for the optimal input to a linear function under a norm constraint.

Optimal_perturbation = argmax_{eta, ||eta||_{ord} < eps} dot(eta, grad)

Parameters
  • grad – tf tensor containing a batch of gradients

  • eps – float scalar specifying size of constraint region

  • ord – int specifying order of norm

Returns

tf tensor containing optimal perturbation

cleverhans.attacks.projected_optimization(loss_fn, input_image, label, epsilon, num_steps, clip_min=None, clip_max=None, optimizer=<cleverhans.attacks.spsa.TensorAdam object>, project_perturbation=<function _project_perturbation>, early_stop_loss_threshold=None, is_debug=False)[source]

Generic projected optimization, generalized to work with approximate gradients. Used for e.g. the SPSA attack.

Args:
param loss_fn

A callable which takes input_image and label as arguments, and returns a batch of loss values. Same interface as TensorOptimizer.

param input_image

Tensor, a batch of images

param label

Tensor, a batch of labels

param epsilon

float, the L-infinity norm of the maximum allowable perturbation

param num_steps

int, the number of steps of gradient descent

param clip_min

float, minimum pixel value

param clip_max

float, maximum pixel value

param optimizer

A TensorOptimizer object

param project_perturbation

A function, which will be used to enforce some constraint. It should have the same signature as _project_perturbation.

param early_stop_loss_threshold

A float or None. If specified, the attack will end if the loss is below early_stop_loss_threshold.

Enabling this option can have several different effects:
  • Setting the threshold to 0. guarantees that if a successful attack is found, it is returned. This increases the attack success rate, because without early stopping the optimizer can accidentally bounce back to a point where the attack fails.

  • Early stopping can make the attack run faster because it may run for fewer steps.

  • Early stopping can make the attack run slower because the loss must be calculated at each step. The loss is not calculated as part of the normal SPSA optimization procedure. For most reasonable choices of hyperparameters, early stopping makes the attack much faster because it decreases the number of steps dramatically.

param is_debug

A bool. If True, print debug info for attack progress.

Returns:
adversarial version of input_image, with L-infinity difference less than

epsilon, which tries to minimize loss_fn.

Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper function which you can use to write your own attack methods. The method uses a tf.while_loop to optimize a loss function in a single sess.run() call.

cleverhans.attacks.reduce_max(*args, **kwargs)

Issues a deprecation warning and passes through the arguments.

cleverhans.attacks.reduce_mean(*args, **kwargs)

Issues a deprecation warning and passes through the arguments.

cleverhans.attacks.reduce_sum(*args, **kwargs)

Issues a deprecation warning and passes through the arguments.

cleverhans.attacks.softmax_cross_entropy_with_logits(sentinel=None, labels=None, logits=None, dim=- 1)[source]

Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle deprecated warning

cleverhans.attacks.vatm(model, x, logits, eps, num_iterations=1, xi=1e-06, clip_min=None, clip_max=None, scope=None)[source]

Tensorflow implementation of the perturbation method used for virtual adversarial training: https://arxiv.org/abs/1507.00677 :param model: the model which returns the network unnormalized logits :param x: the input placeholder :param logits: the model’s unnormalized output tensor (the input to

the softmax layer)

Parameters
  • eps – the epsilon (input variation parameter)

  • num_iterations – the number of iterations

  • xi – the finite difference parameter

  • clip_min – optional parameter that can be used to set a minimum value for components of the example returned

  • clip_max – optional parameter that can be used to set a maximum value for components of the example returned

  • seed – the seed for random generator

Returns

a tensor for the adversarial example

cleverhans.attacks.wrapper_warning()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”probs”. Using “probs” as any part of the attack interface is dangerous. We can’t just change output_layer to logits because: - that would be a silent interface change. We’d have no way of detecting

code that still means to use probs. Note that we can’t just check whether the final output op is a softmax—for example, Inception puts a reshape after the softmax.

  • automatically wrapping user-supplied callables with output_layer=’logits’ is even worse, see wrapper_warning_logits

Note: this function will be removed at the same time as the code that calls it.

cleverhans.attacks.wrapper_warning_logits()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”logits”. This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking.

cleverhans.attacks.xrange

alias of range

================================================ FILE: docs/source/devtools.html ================================================ devtools module — CleverHans documentation

devtools module

================================================ FILE: docs/source/future.html ================================================ future module — CleverHans documentation

future module

================================================ FILE: docs/source/model.html ================================================ model module — CleverHans documentation

model module

The Model class and related functionality.

class cleverhans.model.CallableModelWrapper(callable_fn, output_layer)[source]

Bases: cleverhans.model.Model

A wrapper that turns a callable into a valid Model

fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

class cleverhans.model.Model(scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False)[source]

Bases: object

An abstract interface for model wrappers that exposes model symbols needed for making an attack. This abstraction removes the dependency on any specific neural network package (e.g. Keras) from the core code of CleverHans. It can also simplify exposing the hidden features of a model when a specific package does not directly expose them.

O_FEATURES = 'features'
O_LOGITS = 'logits'
O_PROBS = 'probs'
fprop(x, **kwargs)[source]

Forward propagation to compute the model outputs. :param x: A symbolic representation of the network input :return: A dictionary mapping layer names to the symbolic

representation of their output.

get_layer(x, layer, **kwargs)[source]

Return a layer output. :param x: tensor, the input to the network. :param layer: str, the name of the layer to compute. :param **kwargs: dict, extra optional params to pass to self.fprop. :return: the content of layer layer

get_layer_names()[source]

Return the list of exposed layers for this model.

get_logits(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output logits

(i.e., the values fed as inputs to the softmax layer).

get_params()[source]

Provides access to the model’s parameters. :return: A list of all Variables defining the model parameters.

get_predicted_class(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the predicted label

get_probs(x, **kwargs)[source]
Parameters

x – A symbolic representation (Tensor) of the network input

Returns

A symbolic representation (Tensor) of the output

probabilities (i.e., the output values produced by the softmax layer).

make_input_placeholder()[source]

Create and return a placeholder representing an input to the model.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_label_placeholder()[source]

Create and return a placeholder representing class labels.

This method should respect context managers (e.g. “with tf.device”) and should not just return a reference to a single pre-created placeholder.

make_params()[source]

Create all Variables to be returned later by get_params. By default this is a no-op. Models that need their fprop to be called for their params to be created can set needs_dummy_fprop=True in the constructor.

exception cleverhans.model.NoSuchLayerError[source]

Bases: ValueError

Raised when a layer that does not exist is requested.

cleverhans.model.wrapper_warning()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”probs”. Using “probs” as any part of the attack interface is dangerous. We can’t just change output_layer to logits because: - that would be a silent interface change. We’d have no way of detecting

code that still means to use probs. Note that we can’t just check whether the final output op is a softmax—for example, Inception puts a reshape after the softmax.

  • automatically wrapping user-supplied callables with output_layer=’logits’ is even worse, see wrapper_warning_logits

Note: this function will be removed at the same time as the code that calls it.

cleverhans.model.wrapper_warning_logits()[source]

Issue a deprecation warning. Used in multiple places that implemented attacks by automatically wrapping a user-supplied callable with a CallableModelWrapper with output_layer=”logits”. This is dangerous because it is under-the-hood automagic that the user may not realize has been invoked for them. If they pass a callable that actually outputs probs, the probs will be treated as logits, resulting in an incorrect cross-entropy loss and severe gradient masking.

================================================ FILE: docsource/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = python -msphinx SPHINXPROJ = CleverHans SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) full-api: sphinx-apidoc --suffix .md -o source .. .PHONY: help Makefile # To keep the source and output separate, but still be able to both publish # on GitHub Pages and preview builds locally. github: @make html @cp -a _build/html/. ../docs # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docsource/README.md ================================================ # Generate documentation To generate the documentation do: `make github` The documentation files will be copied to the `cleverhans/docs` directory. ### Preparation Please do: `pip install sphinx` Add a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees a `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file indicates that we are not using Jekyll as our static site generator in this repository. ### Enable GitHub Pages for the GitHub repository 1. Go to the repository on the GitHub website and make sure you are logged in. 2. Add a /docs directory to the master branch. Otherwise you do not get the master branch /docs folder for the Source option in the drop-down list. 3. Click the Settings tab. You first go to the Options section. 4. Scroll down to the GitHub Pages section and choose the drop-down list under Source. Note: Your choices will differ based on whether you’re in a User repo or an Org repository. 5. To keep source and output HTML separate, choose master branch /docs folder for Source. ### Build Sphinx locally and publish on GitHub Pages We keep the source docsource and output docs separate, but still are able to publish on GitHub Pages and preview builds locally. We have the following option in the Makefile: ``` github: @make html @cp -a _build/html/. ../docs ``` Thus, we can run `make github` from the `docsource` directory to generate a local preview and move the docs where GitHub wants to serve them from. ### Hacks If you cannot build the docs for attacks, uncomment `import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`. Otherwise: ```angular2html WARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised: cannot import name 'keras_tensor' ``` It is convenient to create a virtual environment to install all the specific libraries (e.g. virutalen cleverhans). ================================================ FILE: docsource/_templates/layout.html ================================================ {% extends '!layout.html' %} {% block footer %} {% endblock %} ================================================ FILE: docsource/conf.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # # CleverHans documentation build configuration file, created by # sphinx-quickstart on Wed Sep 20 15:14:07 2017. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, as shown here. # import os import sys sys.path.insert(0, os.path.abspath("..")) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.mathjax", "sphinx.ext.viewcode", "sphinx.ext.githubpages", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = ".md" # The master toctree document. master_doc = "index" # General information about the project. project = "CleverHans" author = "Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. # version = '2.0.0' # The full version, including alpha/beta/rc tags. # release = '2.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Custom sidebar templates must be a dictionary that maps document names # to template names. # # This is required for the alabaster theme # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars html_sidebars = { "**": [ "about.html", "navigation.html", "relations.html", # needs 'show_related': True theme option to display "searchbox.html", "donate.html", ] } # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = "CleverHansdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ( master_doc, "CleverHans.tex", "CleverHans Documentation", "Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley", "manual", ), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "cleverhans", "CleverHans Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "CleverHans", "CleverHans Documentation", author, "CleverHans", "One line description of project.", "Miscellaneous", ), ] ================================================ FILE: docsource/docs_requirements.txt ================================================ tensorflow ================================================ FILE: docsource/index.md ================================================ .. CleverHans documentation master file, created by sphinx-quickstart on Wed Sep 20 15:14:07 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. WARNING: This file has a markdown suffix, but is in fact .rst CleverHans Documentation ====================================== This documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans `_. To get started, we recommend reading the `github readme `_. Afterwards, you can learn more by looking at the following modules: .. toctree:: :maxdepth: 4 source/attacks source/model Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ================================================ FILE: docsource/source/attacks.md ================================================ `attacks` module -------------------------- .. automodule:: cleverhans.attacks :members: :imported-members: :undoc-members: :show-inheritance: ================================================ FILE: docsource/source/devtools.md ================================================ `devtools` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: docsource/source/future.md ================================================ `future` module ------------------------ .. automodule:: cleverhans.devtools :members: :undoc-members: :show-inheritance: ================================================ FILE: docsource/source/model.md ================================================ `model` module ------------------------ .. automodule:: cleverhans.model :members: :undoc-members: :show-inheritance: ================================================ FILE: examples/README.md ================================================ # Examples ================================================ FILE: requirements/requirements-dev.txt ================================================ black>=20.8b1 flake8>=3.8.0 mypy>=0.790 mypy-extensions>=0.4.3 pytest>=6.2.0 pre-commit>=2.9.0 ================================================ FILE: requirements/requirements-gpu.txt ================================================ --find-links https://storage.googleapis.com/jax-releases/jax_releases.html jaxlib>=0.1.60+cuda101 ================================================ FILE: requirements/requirements-jax.txt ================================================ jax>=0.2.8 jaxlib>=0.1.60 ================================================ FILE: requirements/requirements-pytorch.txt ================================================ torch>=1.7.0 torchvision>=0.8.2 ================================================ FILE: requirements/requirements-tf2.txt ================================================ tensorflow>=2.3.0 tensorflow-datasets>=4.2.0 ================================================ FILE: requirements/requirements.txt ================================================ numpy>=1.19.0 scipy>=1.5.0 easydict>=1.9 absl-py>=0.10.0 requests>=2.25.0 ================================================ FILE: setup.py ================================================ from setuptools import find_packages from setuptools import setup setup( name="cleverhans", version="4.0.0", url="https://github.com/cleverhans-lab/cleverhans", license="MIT", install_requires=[ "nose", "pycodestyle", "scipy", "matplotlib", "mnist", "numpy", "tensorflow-probability", "joblib", "easydict", "absl-py", "six", ], extras_require={ "jax": ["jax>=0.2.9", "jaxlib"], "tf": ["tensorflow>=2.4.0", "tensorflow-probability", "tensorflow-datasets"], "pytorch": ["torch>=1.7.0", "torchvision>=0.8.0"], }, packages=find_packages(), ) ================================================ FILE: tutorials/README.md ================================================ # Tutorials This folder contains scripts demonstrating the features of CleverHans implemented in one of the three supported frameworks (JAX, PyTorch, and TF2). ================================================ FILE: tutorials/generic/README.md ================================================ # Tutorials for framework independent features This folder contains implementations of features that are implemented in a framework independent way (for example, it uses the numpy library only or can handle support for all major deep learning libraries). ================================================ FILE: tutorials/generic/__init__.py ================================================ ================================================ FILE: tutorials/jax/__init__.py ================================================ ================================================ FILE: tutorials/jax/datasets.py ================================================ # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Datasets used in examples.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import array import gzip import os from os import path import struct from six.moves.urllib.request import urlretrieve import numpy as np from cleverhans.jax.utils import one_hot, partial_flatten _DATA = "/tmp/jax_example_data/" def _download(url, filename): """Download a url to a file in the JAX data temp directory.""" if not path.exists(_DATA): os.makedirs(_DATA) out_file = path.join(_DATA, filename) if not path.isfile(out_file): urlretrieve(url, out_file) print("downloaded {} to {}".format(url, _DATA)) def mnist_raw(): """Download and parse the raw MNIST dataset.""" # CVDF mirror of http://yann.lecun.com/exdb/mnist/ base_url = "https://storage.googleapis.com/cvdf-datasets/mnist/" def parse_labels(filename): with gzip.open(filename, "rb") as fh: _ = struct.unpack(">II", fh.read(8)) return np.array(array.array("B", fh.read()), dtype=np.uint8) def parse_images(filename): with gzip.open(filename, "rb") as fh: _, num_data, rows, cols = struct.unpack(">IIII", fh.read(16)) return np.array(array.array("B", fh.read()), dtype=np.uint8).reshape( num_data, rows, cols ) for filename in [ "train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz", "t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz", ]: _download(base_url + filename, filename) train_images = parse_images(path.join(_DATA, "train-images-idx3-ubyte.gz")) train_labels = parse_labels(path.join(_DATA, "train-labels-idx1-ubyte.gz")) test_images = parse_images(path.join(_DATA, "t10k-images-idx3-ubyte.gz")) test_labels = parse_labels(path.join(_DATA, "t10k-labels-idx1-ubyte.gz")) return train_images, train_labels, test_images, test_labels def mnist(permute_train=False): """Download, parse and process MNIST data to unit scale and one-hot labels.""" train_images, train_labels, test_images, test_labels = mnist_raw() train_images = partial_flatten(train_images) / np.float32(255.0) test_images = partial_flatten(test_images) / np.float32(255.0) train_labels = one_hot(train_labels, 10) test_labels = one_hot(test_labels, 10) if permute_train: perm = np.random.RandomState(0).permutation(train_images.shape[0]) train_images = train_images[perm] train_labels = train_labels[perm] return train_images, train_labels, test_images, test_labels ================================================ FILE: tutorials/jax/mnist_tutorial.py ================================================ from absl import app, flags import datasets import itertools import time import jax.numpy as np import numpy.random as npr from jax import jit, grad, random from jax.experimental import optimizers from jax.experimental import stax from jax.experimental.stax import logsoftmax from cleverhans.jax.attacks.fast_gradient_method import fast_gradient_method from cleverhans.jax.attacks.projected_gradient_descent import projected_gradient_descent FLAGS = flags.FLAGS def main(_): rng = random.PRNGKey(0) # Load MNIST dataset train_images, train_labels, test_images, test_labels = datasets.mnist() batch_size = 128 batch_shape = (-1, 28, 28, 1) num_train = train_images.shape[0] num_complete_batches, leftover = divmod(num_train, batch_size) num_batches = num_complete_batches + bool(leftover) train_images = np.reshape(train_images, batch_shape) test_images = np.reshape(test_images, batch_shape) def data_stream(): rng = npr.RandomState(0) while True: perm = rng.permutation(num_train) for i in range(num_batches): batch_idx = perm[i * batch_size : (i + 1) * batch_size] yield train_images[batch_idx], train_labels[batch_idx] batches = data_stream() # Model, loss, and accuracy functions init_random_params, predict = stax.serial( stax.Conv(32, (8, 8), strides=(2, 2), padding="SAME"), stax.Relu, stax.Conv(128, (6, 6), strides=(2, 2), padding="VALID"), stax.Relu, stax.Conv(128, (5, 5), strides=(1, 1), padding="VALID"), stax.Flatten, stax.Dense(128), stax.Relu, stax.Dense(10), ) def loss(params, batch): inputs, targets = batch preds = predict(params, inputs) return -np.mean(logsoftmax(preds) * targets) def accuracy(params, batch): inputs, targets = batch target_class = np.argmax(targets, axis=1) predicted_class = np.argmax(predict(params, inputs), axis=1) return np.mean(predicted_class == target_class) # Instantiate an optimizer opt_init, opt_update, get_params = optimizers.adam(0.001) @jit def update(i, opt_state, batch): params = get_params(opt_state) return opt_update(i, grad(loss)(params, batch), opt_state) # Initialize model _, init_params = init_random_params(rng, batch_shape) opt_state = opt_init(init_params) itercount = itertools.count() # Training loop print("\nStarting training...") for epoch in range(FLAGS.nb_epochs): start_time = time.time() for _ in range(num_batches): opt_state = update(next(itercount), opt_state, next(batches)) epoch_time = time.time() - start_time # Evaluate model on clean data params = get_params(opt_state) train_acc = accuracy(params, (train_images, train_labels)) test_acc = accuracy(params, (test_images, test_labels)) # Evaluate model on adversarial data model_fn = lambda images: predict(params, images) test_images_fgm = fast_gradient_method(model_fn, test_images, FLAGS.eps, np.inf) test_images_pgd = projected_gradient_descent( model_fn, test_images, FLAGS.eps, 0.01, 40, np.inf ) test_acc_fgm = accuracy(params, (test_images_fgm, test_labels)) test_acc_pgd = accuracy(params, (test_images_pgd, test_labels)) print("Epoch {} in {:0.2f} sec".format(epoch, epoch_time)) print("Training set accuracy: {}".format(train_acc)) print("Test set accuracy on clean examples: {}".format(test_acc)) print("Test set accuracy on FGM adversarial examples: {}".format(test_acc_fgm)) print("Test set accuracy on PGD adversarial examples: {}".format(test_acc_pgd)) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", 8, "Number of epochs.") flags.DEFINE_float("eps", 0.3, "Total epsilon for FGM and PGD attacks.") app.run(main) ================================================ FILE: tutorials/tf2/__init__.py ================================================ ================================================ FILE: tutorials/tf2/cifar10_tutorial.py ================================================ import math import numpy as np import tensorflow as tf import tensorflow_datasets as tfds from absl import app, flags from easydict import EasyDict from tensorflow.keras import Model from tensorflow.keras.layers import AveragePooling2D, Conv2D from cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent from cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method FLAGS = flags.FLAGS class CNN(Model): def __init__(self, nb_filters=64): super(CNN, self).__init__() img_size = 32 log_resolution = int(round(math.log(img_size) / math.log(2))) conv_args = dict(activation=tf.nn.leaky_relu, kernel_size=3, padding="same") self.layers_obj = [] for scale in range(log_resolution - 2): conv1 = Conv2D(nb_filters << scale, **conv_args) conv2 = Conv2D(nb_filters << (scale + 1), **conv_args) pool = AveragePooling2D(pool_size=(2, 2), strides=(2, 2)) self.layers_obj.append(conv1) self.layers_obj.append(conv2) self.layers_obj.append(pool) conv = Conv2D(10, **conv_args) self.layers_obj.append(conv) def call(self, x): for layer in self.layers_obj: x = layer(x) return tf.reduce_mean(x, [1, 2]) def ld_cifar10(): """Load training and test data.""" def convert_types(image, label): image = tf.cast(image, tf.float32) image /= 127.5 image -= 1.0 return image, label dataset, info = tfds.load("cifar10", with_info=True, as_supervised=True) def augment_mirror(x): return tf.image.random_flip_left_right(x) def augment_shift(x, w=4): y = tf.pad(x, [[w] * 2, [w] * 2, [0] * 2], mode="REFLECT") return tf.image.random_crop(y, tf.shape(x)) cifar10_train, cifar10_test = dataset["train"], dataset["test"] # Augmentation helps a lot in CIFAR10 cifar10_train = cifar10_train.map( lambda x, y: (augment_mirror(augment_shift(x)), y) ) cifar10_train = cifar10_train.map(convert_types).shuffle(10000).batch(128) cifar10_test = cifar10_test.map(convert_types).batch(128) return EasyDict(train=cifar10_train, test=cifar10_test) def main(_): # Load training and test data data = ld_cifar10() model = CNN() loss_object = tf.losses.SparseCategoricalCrossentropy(from_logits=True) optimizer = tf.optimizers.Adam(learning_rate=0.001) # Metrics to track the different accuracies. train_loss = tf.metrics.Mean(name="train_loss") test_acc_clean = tf.metrics.SparseCategoricalAccuracy() test_acc_fgsm = tf.metrics.SparseCategoricalAccuracy() test_acc_pgd = tf.metrics.SparseCategoricalAccuracy() @tf.function def train_step(x, y): with tf.GradientTape() as tape: predictions = model(x) loss = loss_object(y, predictions) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) train_loss(loss) # Train model with adversarial training for epoch in range(FLAGS.nb_epochs): # keras like display of progress progress_bar_train = tf.keras.utils.Progbar(50000) for (x, y) in data.train: if FLAGS.adv_train: # Replace clean example with adversarial example for adversarial training x = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf) train_step(x, y) progress_bar_train.add(x.shape[0], values=[("loss", train_loss.result())]) # Evaluate on clean and adversarial data progress_bar_test = tf.keras.utils.Progbar(10000) for x, y in data.test: y_pred = model(x) test_acc_clean(y, y_pred) x_fgm = fast_gradient_method(model, x, FLAGS.eps, np.inf) y_pred_fgm = model(x_fgm) test_acc_fgsm(y, y_pred_fgm) x_pgd = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf) y_pred_pgd = model(x_pgd) test_acc_pgd(y, y_pred_pgd) progress_bar_test.add(x.shape[0]) print( "test acc on clean examples (%): {:.3f}".format(test_acc_clean.result() * 100) ) print( "test acc on FGM adversarial examples (%): {:.3f}".format( test_acc_fgsm.result() * 100 ) ) print( "test acc on PGD adversarial examples (%): {:.3f}".format( test_acc_pgd.result() * 100 ) ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", 8, "Number of epochs.") flags.DEFINE_float("eps", 0.05, "Total epsilon for FGM and PGD attacks.") flags.DEFINE_bool( "adv_train", False, "Use adversarial training (on PGD adversarial examples)." ) app.run(main) ================================================ FILE: tutorials/tf2/mnist_tutorial.py ================================================ import numpy as np import tensorflow as tf import tensorflow_datasets as tfds from absl import app, flags from easydict import EasyDict from tensorflow.keras import Model from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D from cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent from cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method FLAGS = flags.FLAGS class Net(Model): def __init__(self): super(Net, self).__init__() self.conv1 = Conv2D(64, 8, strides=(2, 2), activation="relu", padding="same") self.conv2 = Conv2D(128, 6, strides=(2, 2), activation="relu", padding="valid") self.conv3 = Conv2D(128, 5, strides=(1, 1), activation="relu", padding="valid") self.dropout = Dropout(0.25) self.flatten = Flatten() self.dense1 = Dense(128, activation="relu") self.dense2 = Dense(10) def call(self, x): x = self.conv1(x) x = self.conv2(x) x = self.conv3(x) x = self.dropout(x) x = self.flatten(x) x = self.dense1(x) return self.dense2(x) def ld_mnist(): """Load training and test data.""" def convert_types(image, label): image = tf.cast(image, tf.float32) image /= 255 return image, label dataset, info = tfds.load( "mnist", data_dir="gs://tfds-data/datasets", with_info=True, as_supervised=True ) mnist_train, mnist_test = dataset["train"], dataset["test"] mnist_train = mnist_train.map(convert_types).shuffle(10000).batch(128) mnist_test = mnist_test.map(convert_types).batch(128) return EasyDict(train=mnist_train, test=mnist_test) def main(_): # Load training and test data data = ld_mnist() model = Net() loss_object = tf.losses.SparseCategoricalCrossentropy(from_logits=True) optimizer = tf.optimizers.Adam(learning_rate=0.001) # Metrics to track the different accuracies. train_loss = tf.metrics.Mean(name="train_loss") test_acc_clean = tf.metrics.SparseCategoricalAccuracy() test_acc_fgsm = tf.metrics.SparseCategoricalAccuracy() test_acc_pgd = tf.metrics.SparseCategoricalAccuracy() @tf.function def train_step(x, y): with tf.GradientTape() as tape: predictions = model(x) loss = loss_object(y, predictions) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) train_loss(loss) # Train model with adversarial training for epoch in range(FLAGS.nb_epochs): # keras like display of progress progress_bar_train = tf.keras.utils.Progbar(60000) for (x, y) in data.train: if FLAGS.adv_train: # Replace clean example with adversarial example for adversarial training x = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf) train_step(x, y) progress_bar_train.add(x.shape[0], values=[("loss", train_loss.result())]) # Evaluate on clean and adversarial data progress_bar_test = tf.keras.utils.Progbar(10000) for x, y in data.test: y_pred = model(x) test_acc_clean(y, y_pred) x_fgm = fast_gradient_method(model, x, FLAGS.eps, np.inf) y_pred_fgm = model(x_fgm) test_acc_fgsm(y, y_pred_fgm) x_pgd = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf) y_pred_pgd = model(x_pgd) test_acc_pgd(y, y_pred_pgd) progress_bar_test.add(x.shape[0]) print( "test acc on clean examples (%): {:.3f}".format(test_acc_clean.result() * 100) ) print( "test acc on FGM adversarial examples (%): {:.3f}".format( test_acc_fgsm.result() * 100 ) ) print( "test acc on PGD adversarial examples (%): {:.3f}".format( test_acc_pgd.result() * 100 ) ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", 8, "Number of epochs.") flags.DEFINE_float("eps", 0.3, "Total epsilon for FGM and PGD attacks.") flags.DEFINE_bool( "adv_train", False, "Use adversarial training (on PGD adversarial examples)." ) app.run(main) ================================================ FILE: tutorials/torch/__init__.py ================================================ ================================================ FILE: tutorials/torch/cifar10_tutorial.py ================================================ from absl import app, flags from easydict import EasyDict import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import torchvision from cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method from cleverhans.torch.attacks.projected_gradient_descent import ( projected_gradient_descent, ) FLAGS = flags.FLAGS class CNN(torch.nn.Module): """Basic CNN architecture.""" def __init__(self, in_channels=1): super(CNN, self).__init__() self.conv1 = nn.Conv2d(in_channels, 64, 8, 1) self.conv2 = nn.Conv2d(64, 128, 6, 2) self.conv3 = nn.Conv2d(128, 128, 5, 2) self.fc = nn.Linear(128 * 3 * 3, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = x.view(-1, 128 * 3 * 3) x = self.fc(x) return x def ld_cifar10(): """Load training and test data.""" train_transforms = torchvision.transforms.Compose( [torchvision.transforms.ToTensor()] ) test_transforms = torchvision.transforms.Compose( [torchvision.transforms.ToTensor()] ) train_dataset = torchvision.datasets.CIFAR10( root="/tmp/data", train=True, transform=train_transforms, download=True ) test_dataset = torchvision.datasets.CIFAR10( root="/tmp/data", train=False, transform=test_transforms, download=True ) train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=128, shuffle=True, num_workers=2 ) test_loader = torch.utils.data.DataLoader( test_dataset, batch_size=128, shuffle=False, num_workers=2 ) return EasyDict(train=train_loader, test=test_loader) def main(_): # Load training and test data data = ld_cifar10() # Instantiate model, loss, and optimizer for training net = CNN(in_channels=3) device = "cuda" if torch.cuda.is_available() else "cpu" if device == "cuda": net = net.cuda() loss_fn = torch.nn.CrossEntropyLoss(reduction="mean") optimizer = torch.optim.Adam(net.parameters(), lr=1e-3) # Train vanilla model net.train() for epoch in range(1, FLAGS.nb_epochs + 1): train_loss = 0.0 for x, y in data.train: x, y = x.to(device), y.to(device) if FLAGS.adv_train: # Replace clean example with adversarial example for adversarial training x = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf) optimizer.zero_grad() loss = loss_fn(net(x), y) loss.backward() optimizer.step() train_loss += loss.item() print( "epoch: {}/{}, train loss: {:.3f}".format( epoch, FLAGS.nb_epochs, train_loss ) ) # Evaluate on clean and adversarial data net.eval() report = EasyDict(nb_test=0, correct=0, correct_fgm=0, correct_pgd=0) for x, y in data.test: x, y = x.to(device), y.to(device) x_fgm = fast_gradient_method(net, x, FLAGS.eps, np.inf) x_pgd = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf) _, y_pred = net(x).max(1) # model prediction on clean examples _, y_pred_fgm = net(x_fgm).max( 1 ) # model prediction on FGM adversarial examples _, y_pred_pgd = net(x_pgd).max( 1 ) # model prediction on PGD adversarial examples report.nb_test += y.size(0) report.correct += y_pred.eq(y).sum().item() report.correct_fgm += y_pred_fgm.eq(y).sum().item() report.correct_pgd += y_pred_pgd.eq(y).sum().item() print( "test acc on clean examples (%): {:.3f}".format( report.correct / report.nb_test * 100.0 ) ) print( "test acc on FGM adversarial examples (%): {:.3f}".format( report.correct_fgm / report.nb_test * 100.0 ) ) print( "test acc on PGD adversarial examples (%): {:.3f}".format( report.correct_pgd / report.nb_test * 100.0 ) ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", 8, "Number of epochs.") flags.DEFINE_float("eps", 0.3, "Total epsilon for FGM and PGD attacks.") flags.DEFINE_bool( "adv_train", False, "Use adversarial training (on PGD adversarial examples)." ) app.run(main) ================================================ FILE: tutorials/torch/datasets.py ================================================ from __future__ import absolute_import from __future__ import division from __future__ import print_function import array import gzip import os from os import path import struct from six.moves.urllib.request import urlretrieve import numpy as np import torch _DATA = "/tmp/data/" def _download(url, filename): """Download a url to a file in the JAX data temp directory.""" if not path.exists(_DATA): os.makedirs(_DATA) out_file = path.join(_DATA, filename) if not path.isfile(out_file): urlretrieve(url, out_file) print("downloaded {} to {}".format(url, _DATA)) def mnist_raw(root=_DATA): """Download and parse the raw MNIST dataset.""" # CVDF mirror of http://yann.lecun.com/exdb/mnist/ base_url = "https://storage.googleapis.com/cvdf-datasets/mnist/" def parse_labels(filename): with gzip.open(filename, "rb") as fh: _ = struct.unpack(">II", fh.read(8)) return np.array(array.array("B", fh.read()), dtype=np.uint8) def parse_images(filename): with gzip.open(filename, "rb") as fh: _, num_data, rows, cols = struct.unpack(">IIII", fh.read(16)) return np.array(array.array("B", fh.read()), dtype=np.uint8).reshape( num_data, rows, cols ) for filename in [ "train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz", "t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz", ]: _download(base_url + filename, filename) train_images = parse_images(path.join(root, "train-images-idx3-ubyte.gz")) train_labels = parse_labels(path.join(root, "train-labels-idx1-ubyte.gz")) test_images = parse_images(path.join(root, "t10k-images-idx3-ubyte.gz")) test_labels = parse_labels(path.join(root, "t10k-labels-idx1-ubyte.gz")) return train_images, train_labels, test_images, test_labels class MNISTDataset(torch.utils.data.Dataset): """MNIST Dataset.""" def __init__(self, root=_DATA, train=True, transform=None): train_images, train_labels, test_images, test_labels = mnist_raw(root=root) if train: self.images = train_images self.labels = torch.from_numpy(train_labels).long() else: self.images = test_images self.labels = torch.from_numpy(test_labels).long() self.transform = transform def __getitem__(self, index): x = self.images[index] y = self.labels[index] if self.transform: x = self.transform(x) return x, y def __len__(self): return len(self.images) ================================================ FILE: tutorials/torch/mnist_tutorial.py ================================================ from absl import app, flags from easydict import EasyDict import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import torchvision from datasets import MNISTDataset from cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method from cleverhans.torch.attacks.projected_gradient_descent import ( projected_gradient_descent, ) FLAGS = flags.FLAGS class CNN(torch.nn.Module): """Basic CNN architecture.""" def __init__(self, in_channels=1): super(CNN, self).__init__() self.conv1 = nn.Conv2d( in_channels, 64, 8, 1 ) # (batch_size, 3, 28, 28) --> (batch_size, 64, 21, 21) self.conv2 = nn.Conv2d( 64, 128, 6, 2 ) # (batch_size, 64, 21, 21) --> (batch_size, 128, 8, 8) self.conv3 = nn.Conv2d( 128, 128, 5, 1 ) # (batch_size, 128, 8, 8) --> (batch_size, 128, 4, 4) self.fc1 = nn.Linear( 128 * 4 * 4, 128 ) # (batch_size, 128, 4, 4) --> (batch_size, 2048) self.fc2 = nn.Linear(128, 10) # (batch_size, 128) --> (batch_size, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = x.view(-1, 128 * 4 * 4) x = self.fc1(x) x = self.fc2(x) return x class PyNet(nn.Module): """CNN architecture. This is the same MNIST model from pytorch/examples/mnist repository""" def __init__(self, in_channels=1): super(PyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) self.dropout1 = nn.Dropout(0.25) self.dropout2 = nn.Dropout(0.5) self.fc1 = nn.Linear(9216, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.conv2(x) x = F.relu(x) x = F.max_pool2d(x, 2) x = self.dropout1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) output = F.log_softmax(x, dim=1) return output def ld_mnist(): """Load training and test data.""" train_transforms = torchvision.transforms.Compose( [torchvision.transforms.ToTensor()] ) test_transforms = torchvision.transforms.Compose( [torchvision.transforms.ToTensor()] ) # Load MNIST dataset train_dataset = MNISTDataset(root="/tmp/data", transform=train_transforms) test_dataset = MNISTDataset( root="/tmp/data", train=False, transform=test_transforms ) train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=128, shuffle=True, num_workers=2 ) test_loader = torch.utils.data.DataLoader( test_dataset, batch_size=128, shuffle=False, num_workers=2 ) return EasyDict(train=train_loader, test=test_loader) def main(_): # Load training and test data data = ld_mnist() # Instantiate model, loss, and optimizer for training if FLAGS.model == "cnn": net = CNN(in_channels=1) elif FLAGS.model == "pynet": net = PyNet(in_channels=1) else: raise NotImplementedError device = "cuda" if torch.cuda.is_available() else "cpu" if device == "cuda": net = net.cuda() loss_fn = torch.nn.CrossEntropyLoss(reduction="mean") optimizer = torch.optim.Adam(net.parameters(), lr=1e-3) # Train vanilla model net.train() for epoch in range(1, FLAGS.nb_epochs + 1): train_loss = 0.0 for x, y in data.train: x, y = x.to(device), y.to(device) if FLAGS.adv_train: # Replace clean example with adversarial example for adversarial training x = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf) optimizer.zero_grad() loss = loss_fn(net(x), y) loss.backward() optimizer.step() train_loss += loss.item() print( "epoch: {}/{}, train loss: {:.3f}".format( epoch, FLAGS.nb_epochs, train_loss ) ) # Evaluate on clean and adversarial data net.eval() report = EasyDict(nb_test=0, correct=0, correct_fgm=0, correct_pgd=0) for x, y in data.test: x, y = x.to(device), y.to(device) x_fgm = fast_gradient_method(net, x, FLAGS.eps, np.inf) x_pgd = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf) _, y_pred = net(x).max(1) # model prediction on clean examples _, y_pred_fgm = net(x_fgm).max( 1 ) # model prediction on FGM adversarial examples _, y_pred_pgd = net(x_pgd).max( 1 ) # model prediction on PGD adversarial examples report.nb_test += y.size(0) report.correct += y_pred.eq(y).sum().item() report.correct_fgm += y_pred_fgm.eq(y).sum().item() report.correct_pgd += y_pred_pgd.eq(y).sum().item() print( "test acc on clean examples (%): {:.3f}".format( report.correct / report.nb_test * 100.0 ) ) print( "test acc on FGM adversarial examples (%): {:.3f}".format( report.correct_fgm / report.nb_test * 100.0 ) ) print( "test acc on PGD adversarial examples (%): {:.3f}".format( report.correct_pgd / report.nb_test * 100.0 ) ) if __name__ == "__main__": flags.DEFINE_integer("nb_epochs", 8, "Number of epochs.") flags.DEFINE_float("eps", 0.3, "Total epsilon for FGM and PGD attacks.") flags.DEFINE_bool( "adv_train", False, "Use adversarial training (on PGD adversarial examples)." ) flags.DEFINE_enum("model", "cnn", ["cnn", "pynet"], "Choose model type.") app.run(main)