<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="280dp"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_title_fingerprint"
        android:layout_width="240dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="20dp"
        android:textAllCaps="true"
        android:textSize="20sp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/tv_content_fingerprint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="16dp"
        android:layout_marginRight="20dp"
        android:layout_below="@id/tv_title_fingerprint"
        android:textSize="16sp"/>

    <com.mattprecious.swirl.SwirlView
        android:id="@+id/swirlview_fingerprint"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="16dp"
        android:layout_marginRight="20dp"
        android:layout_below="@id/tv_content_fingerprint"/>

    <TextView
        android:id="@+id/tv_fingerprint_state"
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="20dp"
        android:layout_marginRight="20dp"
        android:layout_toEndOf="@id/swirlview_fingerprint"
        android:layout_toRightOf="@id/swirlview_fingerprint"
        android:layout_below="@id/tv_content_fingerprint"
        android:gravity="center_vertical"
        android:textColor="@color/black_26p"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        android:layout_below="@id/swirlview_fingerprint"
        android:gravity="end"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_cancel_as_bt_fingerprint"
            android:layout_width="wrap_content"
            android:layout_height="36dp"
            android:paddingLeft="12dp"
            android:paddingTop="8dp"
            android:paddingRight="12dp"
            android:paddingBottom="8dp"
            android:background="@drawable/selectable_item_background"
            android:textColor="@color/black_26p"
            android:textAllCaps="true"
            android:text="@string/cancel"/>

        <TextView
            android:id="@+id/tv_second_as_bt_fingerprint"
            android:layout_width="wrap_content"
            android:layout_height="36dp"
            android:paddingLeft="12dp"
            android:paddingTop="8dp"
            android:paddingRight="12dp"
            android:paddingBottom="8dp"
            android:textStyle="bold"
            android:text="@string/confirm"
            android:textAllCaps="true"
            android:background="@drawable/selectable_item_background"/>

    </LinearLayout>

</RelativeLayout>


<?xml version="1.0" encoding="UTF-8"?>

<resources>
    <string name="title_schedule">Programmation</string>
    <string name="title_home">Accueil</string>
    <string name="title_map">Plan</string>
    <string name="title_explore_io">Explorer la conférence I/O</string>
    <string name="title_info">Informations</string>
    <string name="filters">Filtres</string>
    <string name="category_heading_tracks">Thèmes</string>
    <string name="category_heading_types">Types</string>
    <string name="reset">Réinitialiser</string>
    <plurals name="filter_event_count">
        <item quantity="one">%1$d événement</item>
        <item quantity="other">%1$d événements</item>
    </plurals>
    <string name="starred_and_reserved">Vos événements favoris et réservés</string>
    <string name="starred_and_reserved_short">Vos événements</string>
    <string name="search_schedule_hint">Rechercher dans le programme</string>
    <string name="search_schedule_no_results">Aucun résultat</string>
    <string name="agenda">Planning</string>
    <string name="event_starred">Événement ajouté à vos favoris</string>
    <string name="event_unstarred">Événement supprimé de vos favoris</string>
    <string name="event_star_error">Erreur lors de l\'ajout de l\'événement aux favoris</string>
    <string name="reservation_error">Erreur lors de la modification de la réservation. Attendez que les demandes précédentes se terminent ou réessayez plus tard.</string>
    <string name="reservation_request_succeeded">Réservation demandée.</string>
    <string name="reservation_cancel_succeeded">Réservation annulée : "%s".</string>
    <string name="reservation_new">Votre place a été réservée pour "%s".</string>
    <string name="reservation_replaced">Événement remplacé.</string>
    <string name="waitlist_new">Vous avez été mis sur liste d\'attente.</string>
    <string name="waitlist_cancel_succeeded">Retiré de la liste d\'attente.</string>
    <string name="got_it">OK</string>
    <string name="dont_show">Ne pas afficher</string>
    <string name="reservation_denied_cutoff">Réservation refusée : l\'heure de début est trop proche.</string>
    <string name="reservation_denied_clash">Réservation refusée : conflit avec une autre réservation.</string>
    <string name="reservation_denied_unknown">Réservation refusée : erreur inconnue.</string>
    <string name="cancellation_denied_cutoff">Annulation refusée : l\'heure de début est trop proche.</string>
    <string name="cancellation_denied_unknown">Annulation refusée : erreur inconnue.</string>
    <string name="schedule_filters_empty">Aucun événement trouvé.</string>
    <string name="reservation_reservable">Réserver la place</string>
    <string name="reservation_reserved">Réservé</string>
    <string name="reservation_waitlisted">Sur liste d\'attente</string>
    <string name="reservation_waitlist_available">Rejoindre la liste d\'attente</string>
    <string name="reservation_disabled">Réservations indisponibles</string>
    <string name="reservation_pending">Réservation en attente</string>
    <string name="schedule_hint_title">Personnaliser votre programme</string>
    <string name="schedule_hint_star_event">Ajouter à vos événements favoris</string>
    <string name="schedule_hint_reserve_session_seat">Réserver une place pour cette session</string>
    <string name="rate_session">Noter la séance</string>
    <string name="menu_item_session_location">Lieu de la séance</string>
    <string name="menu_item_session_star">Ajouter la session aux favoris</string>
    <string name="menu_item_calendar">Ajouter à l\'agenda</string>
    <string name="speaker_delimiter">,</string>
    <string name="session_detail_speakers_header">Intervenants</string>
    <string name="session_detail_related_header">Événements associés</string>
    <string name="feedback_submit">Envoyer</string>
    <string name="feedback_thank_you">Merci de vos commentaires.</string>
    <string name="feedback_q1_text">Qu\'avez-vous pensé de la qualité globale de la session ?</string>
    <string name="feedback_q2_text">Comment décririez-vous les contenus de la session par rapport à vos attentes/la description de la session ?</string>
    <string name="feedback_q3_text">La session était-elle pertinente par rapport à vos projets ?</string>
    <string name="feedback_q4_text">La session était-elle pertinente par rapport à vos projets ?</string>
    <string name="feedback_q1_label_start">Médiocre</string>
    <string name="feedback_q2_label_start">Médiocres</string>
    <string name="feedback_q3_label_start">Médiocres</string>
    <string name="feedback_q4_label_start">Pas vraiment pertinente</string>
    <string name="feedback_q1_label_end">Exceptionnels</string>
    <string name="feedback_q2_label_end">Exceptionnels</string>
    <string name="feedback_q3_label_end">Très pertinente</string>
    <string name="feedback_q4_label_end">Très pertinente</string>
    <string name="a11y_show_navigation">Afficher le menu de navigation</string>
    <string name="a11y_collapse_filters_sheet">Réduire le panneau des filtres</string>
    <string name="a11y_clear_tag_filters">Effacer les filtres</string>
    <string name="a11y_filter_applied">Le filtre %1s a été appliqué</string>
    <string name="a11y_filter_not_applied">Le filtre %1s n\'a pas été appliqué</string>
    <string name="a11y_reservation_available">Réserver l\'événement</string>
    <string name="a11y_reservation_reserved">Événement réservé</string>
    <string name="a11y_reservation_disabled">Réservation indisponible</string>
    <string name="a11y_reservation_wait_list_available">Rejoindre la liste d\'attente de l\'événement</string>
    <string name="a11y_reservation_wait_listed">Sur la liste d\'attente de l\'événement</string>
    <string name="a11y_reservation_pending">Réservation en attente</string>
    <string name="a11y_starred">Événement ajouté aux favoris</string>
    <string name="a11y_unstarred">Événement non ajouté aux favoris</string>
    <string name="a11y_star">Ajouter aux favoris</string>
    <string name="a11y_play">Voir la vidéo</string>
    <string name="a11y_select_map_mode">Sélectionner le mode Plan</string>
    <string name="a11y_search_schedule">Rechercher dans le programme</string>
    <string name="welcome">Bienvenue</string>
    <string name="a11y_signed_in_content_description">Connecté en tant que %s.</string>
    <string name="a11y_signed_out_content_description">Appuyez ici pour vous connecter.</string>
    <string name="dialog_sign_in_content">Connectez-vous pour enregistrer des événements, réserver des places et noter des sessions (auxquelles vous avez participé). Les actions seront synchronisées entre votre compte, l\'application et le site.</string>
    <string name="sign_in">Se connecter</string>
    <string name="firebase_auth_no_network_connection">Aucune connexion Internet</string>
    <string name="firebase_auth_unknown_error">Erreur inconnue</string>
    <string name="dialog_sign_out_content">L\'ensemble des événements enregistrés, des places réservées et des notes des sessions (auxquelles vous avez participé) restent synchronisés avec votre compte.</string>
    <string name="sign_out">Déconnexion</string>
    <string name="manage_google_account">Gérer votre compte Google</string>
    <string name="remove_reservation_title">Supprimer la réservation ?</string>
    <string name="remove_reservation_content">Vous êtes sur le point de renoncer à votre place pour "%1$s". Si vous décidez de vous y rendre quand même sans réservation, toutes les sessions disposent de places disponibles selon la règle du "premier arrivé, premier servi".</string>
    <string name="cancel">Annuler</string>
    <string name="remove">Supprimer</string>
    <string name="swap_reservation_title">Échanger la réservation ?</string>
    <string name="swap_reservation_content">Vous disposez déjà d\'une réservation/place sur liste d\'attente pour "%1$s". Une seule réservation par créneau horaire est autorisée. Voulez-vous l\'échanger contre "%2$s" ?</string>
    <string name="swap">Échanger</string>
    <string name="notifications_preference_dialog_title">Notifications I/O</string>
    <string name="notifications_preference_dialog_content">Souhaitez-vous recevoir des notifications sur I/O ? Nous vous enverrons des informations sur les heures de début des sessions, les animations après-événement, les enregistrements de session, etc. Vous pouvez modifier ce paramètre depuis "Infos > Paramètres" à tout moment.</string>
    <string name="no">Non</string>
    <string name="yes">Oui</string>
    <string name="feed_not_available">Aucune annonce trouvée.</string>
    <string name="feed_loading_error">Impossible de charger le flux. Réessayez plus tard.</string>
    <string name="feed_announcement_title">Annonces</string>
    <string name="feed_upcoming_events">Événements à venir</string>
    <string name="feed_saved_events">Événements enregistrés</string>
    <string name="feed_no_saved_events">Aucun événement enregistré</string>
    <string name="feed_view_all_events">Afficher tous les événements</string>
    <string name="feed_view_your_schedule">Consulter votre planning</string>
    <string name="feed_watch_live_stream">Regarder en direct</string>
    <plurals name="duration_days">
        <item quantity="one">%s jour</item>
        <item quantity="other">%s jours</item>
    </plurals>
    <plurals name="duration_hours">
        <item quantity="one">%s heure</item>
        <item quantity="other">%s heures</item>
    </plurals>
    <plurals name="duration_minutes">
        <item quantity="one">%s minute</item>
        <item quantity="other">%s minutes</item>
    </plurals>
    <plurals name="duration_seconds">
        <item quantity="one">%s seconde</item>
        <item quantity="other">%s secondes</item>
    </plurals>
    <string name="menu_item_share_session">Partager la séance</string>
    <string name="share_text_session_detail">Voir « %1$s » à #io19 %2$s</string>
    <string name="intent_chooser_session_detail">Partage</string>
    <string name="map_variant_after_dark">After Dark</string>
    <string name="map_variant_concert">Concert</string>
    <string name="map_variant_daytime">Journée</string>
    <string name="enable_my_location">Activer la localisation</string>
    <string name="my_location_rationale">L\'application doit disposer de l\'autorisation d\'accéder à votre position pour afficher celle-ci sur la carte.</string>
    <string name="onboarding_get_started">Commencer</string>
    <string name="onboarding_welcome_to_google_i_o">Bienvenue dans Google I/O</string>
    <string name="onboarding_date_location">Du 7 au 9 mai 2019\nMountain View, Californie</string>
    <string name="onboarding_label_days">J</string>
    <string name="onboarding_label_hours">H</string>
    <string name="onboarding_label_mins">M</string>
    <string name="onboarding_label_seconds">S</string>
    <string name="onboarding_welcome_google_io_pre">Google I/O approche à grands pas</string>
    <string name="onboarding_welcome_google_io_during">Google I/O</string>
    <string name="onboarding_welcome_google_io_post">Regardez un résumé de la conférence I/O 2019 et recherchez le hashtag #io19 sur les réseaux sociaux</string>
    <string name="onboarding_signin">Connectez-vous pour recevoir les notifications relatives à la conférence I/O. En tant que participant, vous pourrez également réserver vos places aux sessions.</string>
    <plurals name="session_starting_in">
        <item quantity="one">Début de la session dans %1$s minute</item>
        <item quantity="other">Début de la session dans %1$s minutes</item>
    </plurals>
    <string name="expanded">Élément développé</string>
    <string name="collapsed">Élément réduit</string>
    <string name="event_title">Événement</string>
    <string name="travel_title">Voyage</string>
    <string name="faq_title">FAQ</string>
    <string name="settings_title">Paramètres</string>
    <string name="about_title">À propos</string>
    <string name="travel_what_to_bring_title">Ce que vous devez emmener à l\'événement</string>
    <string name="travel_hotels_title">Hôtels</string>
    <string name="travel_getting_to_mountain_view_title">Se rendre à Mountain View</string>
    <string name="travel_getting_to_shoreline_title">Se rendre à Mountain View</string>
    <string name="travel_shuttle_service_title">Service de navette</string>
    <string name="travel_off_site_parking_title">Parking hors site</string>
    <string name="travel_for_public_transportation_title">Transports en commun</string>
    <string name="travel_biking_title">Vélo</string>
    <string name="travel_ridesharing_title">Partage de taxi</string>
    <string name="travel_airport_transfers_title">Transferts vers l\'aéroport</string>
    <string name="travel_what_to_bring_description">Google I/O est un festival en plein air. Cette particularité, qui fait tout le charme d\'I/O, implique toutefois une légère organisation au préalable. Même si les sessions se tiendront dans des tentes climatisées, nous vous recommandons d\'apporter de l\'écran solaire, des lunettes de soleil, ainsi qu\'un vêtement chaud à porter en soirée lorsque les températures deviennent plus fraîches. I/O est un événement décontracté. Choisissez donc votre tenue en conséquence.</string>
    <string name="travel_hotels_description">Nous avons réservé des groupes de chambres dans de nombreux hôtels locaux. La liste des hôtels et chambres disponibles sera mise à jour régulièrement. Utilisez le plan ci-dessous pour trouver l\'hôtel qui vous convient le mieux. Plan des hôtels</string>
    <string name="travel_getting_to_mountain_view_description">Voici les trois principaux aéroports de la baie de San Francisco proposant des vols internationaux :
 Aéroport international de San Francisco (SFO) ~39 kilomètres

 Aéroport international d\'Oakland (OAK) ~52 kilomètres

 Aéroport international de San Jose (SJC) ~20 kilomètres</string>
    <string name="travel_getting_to_shoreline_description">Afin de réduire à la fois le risque d\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un "événement sans parking*". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\'événement sans avoir besoin de véhicule.

Nous vous communiquerons des informations complémentaires à ce sujet à l\'approche de l\'événement.

*Des places de parking pour handicapés seront disponibles.</string>
    <string name="travel_shuttle_service_description">Afin de réduire à la fois le risque d\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un "événement sans parking*". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\'événement sans avoir besoin de véhicule.

Nous vous communiquerons des informations complémentaires à ce sujet à l\'approche de l\'événement.

*Des places de parking pour handicapés seront disponibles.</string>
    <string name="travel_off_site_parking_description">Parking hors site gratuit au stade Avaya. Des navettes seront proposées entre le stade Avaya et Google I/O.

 Si vous avez des besoins d\'assistance spécifiques, veuillez l\'indiquer sur le formulaire d\'inscription. L\'équipe responsable de l\'organisation vous contactera directement.</string>
    <string name="travel_for_public_transportation_description">Au moment de votre pré-inscription, vous pourrez collecter des cartes de transport en commun prépayées. Vous pouvez vous rendre à proximité du site avec les transports en commun suivants :

 Caltrain : Réseau de trains régionaux

 VTA : Train léger desservant South Bay

 BART : Bay Area Rapid Transit

 AMTRAK : Réseau de trains régionaux

 Les transports en commun ne permettent pas de se rendre directement à la conférence Google I/O. Des informations supplémentaires seront bientôt disponibles concernant les lieux desservis par les navettes de Google I/O.</string>
    <string name="travel_biking_description">Un parking à vélos gratuit sera disponible au Shoreline Amphitheatre dans le parking A. L\'association Silicon Valley Bicycle Coalition proposera chaque jour un service de stationnement surveillé pour votre vélo de 7h jusqu\'à la fin de l\'événement.

 Utilisez Google Maps pour connaître les meilleurs itinéraires pour vélos et trouver votre route. Deux pistes cyclables, le Stevens Creek Trail et le Permanente Creek Trail, permettent de se rendre facilement au Shoreline Amphitheatre.</string>
    <string name="travel_ridesharing_description">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>
    <string name="travel_airport_transfers_description">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>
    <string name="faq_when_and_where_title">Où et quand aura lieu l\'édition 2019 de la conférence Google I/O ?</string>
    <string name="faq_how_can_i_stay_informed_title">Comment puis-je me tenir informé des dernières actualités relatives à Google I/O ?</string>
    <string name="faq_will_the_sessions_be_english_title">Toutes les sessions seront-elles en anglais ?</string>
    <string name="faq_can_i_reserve_sessions_ahead_of_time_title">Puis-je réserver des sessions avant la conférence ?</string>
    <string name="faq_best_way_to_get_to_shoreline_title">Quel est le meilleur moyen de se rendre au Shoreline Amphitheatre ?</string>
    <string name="faq_where_and_when_can_i_pick_up_badge_title">Où et quand puis-je récupérer mon badge ?</string>
    <string name="faq_want_a_front_row_seat_at_keynote_title">J\'aimerais vraiment être assis au premier rang lors de la présentation. Que me conseillez-vous ?</string>
    <string name="faq_what_should_i_wear_title">Quel est le code vestimentaire ?</string>
    <string name="faq_onsite_food_options_title">J\'aime grignoter. Que pourrai-je manger sur le site ?</string>
    <string name="faq_if_i_lose_something_onsite_title">Si je perds un objet sur le site, où pourrai-je le retrouver ?</string>
    <string name="faq_after_dark_program_title">Les programmes After Dark ont l\'air intéressants ! Devrais-je y participer ?</string>
    <string name="faq_accessibility_needs_title">J\'ai des besoins spéciaux en termes d\'accessibilité. Pouvez-vous y répondre ?</string>
    <string name="faq_support_for_expectant_mothers_parents_title">Quelles mesures prenez-vous pour aider les femmes enceintes et les parents qui assistent à I/O ?</string>
    <string name="faq_community_guidelines_and_policy_title">Règlement de la communauté et politique anti-harcèlement de Google</string>
    <string name="faq_sessions_be_live_streamed_question_title">Les sessions seront-elles retransmises en direct ? Que faire si je ne peux pas suivre l\'événement en temps réel ?</string>
    <string name="faq_want_to_celebrate_i_o_title">J\'aimerais célébrer I/O avec ma communauté.  Auriez-vous une suggestion ?</string>
    <string name="faq_when_and_where_description">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le site Web de l\'édition 2019 de Google I/O et le blog Google Developers. Suivez-nous également sur Twitter et Facebook. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\'édition 2019 de Google I/O sur les réseaux sociaux à l\'aide du hashtag officiel #io19. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\'ils puissent préparer leur arrivée.</string>
    <string name="faq_how_can_i_stay_informed_description">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le site Web de l\'édition 2019 de Google I/O et le blog Google Developers. Suivez-nous également sur Twitter et Facebook. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\'édition 2019 de Google I/O sur les réseaux sociaux à l\'aide du hashtag officiel #io19. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\'ils puissent préparer leur arrivée.</string>
    <string name="faq_will_the_sessions_be_english_description">Oui. Notre audience mondiale pourra ainsi suivre la conférence.</string>
    <string name="faq_can_i_reserve_sessions_ahead_of_time_description">Dès le mois d\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du "premier arrivé, premier servi"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du "premier arrivé, premier servi".</string>
    <string name="faq_best_way_to_get_to_shoreline_description">Consultez la section Déplacements pour obtenir des conseils relatifs aux transports, y compris des informations sur les navettes, des itinéraires routiers et cyclables, des conseils de covoiturage, et bien plus encore !</string>
    <string name="faq_where_and_when_can_i_pick_up_badge_description">Pour accélérer le processus d\'enregistrement, nous débuterons la distribution des badges le lundi 6 mai au Shoreline Amphitheatre. Avant de vous donner votre badge Google I/O, nous devrons procéder aux opérations suivantes :
 - Vérifier votre pièce d\'identité avec photo : nous acceptons les permis officiels, les passeports et d\'autres pièces d\'identité. Si vous ne disposez pas d\'une pièce d\'identité conforme, vous ne recevrez pas votre badge et vous ne pourrez pas assister à l\'événement. Le nom indiqué sur votre pièce d\'identité doit être identique à celui de votre profil d\'enregistrement. Si vous êtes un universitaire, n\'oubliez pas d\'apporter la preuve que vous pouvez participer à cet événement.
 - Scanner le code QR d\'enregistrement que vous avez reçu par e-mail : vous n\'avez pas besoin d\'imprimer l\'e-mail. Nous pouvons scanner votre code directement sur votre téléphone ! #savetheenvironment

Veuillez noter que vous n\'avez pas le droit de donner ou fournir de quelque manière que ce soit votre badge à une tierce personne, ni de le partager avec elle. Les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence. Vous devez porter votre badge pour accéder à Google I/O, y compris aux sessions, aux espaces Sandbox et aux événements After Hours. Si un agent de la sécurité vous le demande, nous vous prions de bien vouloir présenter ou fournir une autre pièce d\'identité. Les badges Google I/O peuvent comporter votre nom, le nom de votre entreprise ou organisation (si vous l\'avez fourni) et votre photo.</string>
    <string name="faq_want_a_front_row_seat_at_keynote_description">Tous les participants pourront assister aux présentations. Toutefois, les places seront attribuées selon le principe du "premier arrivé, premier servi" lors de la distribution des badges qui commencera à 7h le 6 mai. Alors, veillez à ne pas arriver trop tard !</string>
    <string name="faq_what_should_i_wear_description">La conférence pour les développeurs Google I/O a lieu en extérieur. Vous pouvez donc porter des vêtements confortables et décontractés. Nous n\'imposons pas de code vestimentaire. La région de la baie de San Francisco peut connaître des températures très élevées pendant la journée et plus fraîches le soir. Tenez compte de ces informations lors de la préparation de votre valise.</string>
    <string name="faq_onsite_food_options_description">Bonne nouvelle, nous aussi nous aimons manger !  Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>
    <string name="faq_if_i_lose_something_onsite_description">Nous avons tout prévu ! Un service des objets trouvés sera disponible au bureau d\'information de la conférence pendant toute la durée de l\'événement. Tout objet trouvé dans la nuit sera remis au service de sécurité de la conférence. Remarque : les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence.</string>
    <string name="faq_after_dark_program_description">Ces deux soirées ne sont à manquer sous aucun prétexte ! Musique et jeux seront organisés le 8 mai pour tous les participants, et un concert exclusif aura lieu le 9 mai au Shoreline Amphitheatre. Nourriture et boissons seront également disponibles à chacune de ces soirées (les boissons alcoolisées sont réservées au personnes âgées de 21 ans et plus). Les deux événements After Hours se tiendront au Shoreline Amphitheatre. Vous devrez présenter votre badge à l\'entrée.</string>
    <string name="faq_accessibility_needs_description">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.
 Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\'inscription seront disponibles devant les salons d\'allaitement, qui pourront être utilisés selon le principe du "premier arrivé, premier servi". Veuillez vous renseigner auprès du bureau d\'information pour en savoir plus.

 Les parents qui expriment un besoin de garde d\'enfant dans leur formulaire d\'inscription à l\'événement pourront bénéficier d\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du "premier arrivé, premier servi". Notre offre de remboursement des frais de garde d\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\'administrer les remboursements de frais de garde d\'enfant pour nous.</string>
    <string name="faq_support_for_expectant_mothers_parent_description">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.
 Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\'inscription seront disponibles devant les salons d\'allaitement, qui pourront être utilisés selon le principe du "premier arrivé, premier servi". Veuillez vous renseigner auprès du bureau d\'information pour en savoir plus.

 Les parents qui expriment un besoin de garde d\'enfant dans leur formulaire d\'inscription à l\'événement pourront bénéficier d\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du "premier arrivé, premier servi". Notre offre de remboursement des frais de garde d\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\'administrer les remboursements de frais de garde d\'enfant pour nous.</string>
    <string name="faq_community_guidelines_and_policy_description">Google s\'engage à offrir à tous les participants une expérience inclusive ne laissant aucune place au harcèlement, indépendamment de leur identité et expression de genre, orientation sexuelle, handicap, neurodiversité, apparence physique, corpulence, ethnicité, nationalité, race, âge, religion, ou de toute autre catégorie protégée. À des fins d\'inclusion supplémentaires, des toilettes neutres seront disponibles partout sur le site.

 Nous ne tolérons aucune forme de harcèlement à l\'encontre des participants à l\'événement.
 Google considère toute violation à son règlement comme extrêmement sérieuse et y réagira en conséquence. Pour en savoir plus sur le règlement de la communauté et la politique anti-harcèlement de Google, veuillez consulter cette page.</string>
    <string name="faq_sessions_be_live_streamed_question_description">Les deux présentations ainsi que l\'ensemble des sessions seront diffusées en direct sur la page d\'accueil du site Web de l\'événement pendant les trois jours. Si vous n\'êtes pas disponible ou si le décalage horaire est trop important, sachez que vous pourrez visionner ultérieurement les enregistrements de sessions sur la chaîne YouTube Google Developers.</string>
    <string name="faq_want_to_celebrate_i_o_description">Oui. Chaque année, les développeurs du monde entier organisent leurs propres événements Google I/O Extended. Durant ces événements, la conférence est diffusée en direct et des sessions spéciales sont organisées, telles que des hackathons, des ateliers de programmation, des démonstrations, et bien plus encore.
 Si vous souhaitez être l\'hôte d\'un événement I/O Extended cette année, voici les démarches que vous devez suivre pour commencer :

 Consultez le Guide de l\'organisateur pour obtenir des conseils et suggestions vous aidant à créer un événement réussi.

 Enregistrez votre événement public sur le site Web I/O pour une meilleure visibilité.

 Utilisez le hashtag officiel #io19extended dans toutes vos publications sur les réseaux sociaux en lien avec I/O Extended pour que votre événement soit plus facilement trouvable.

 Remarque : En tant qu\'hôte d\'un événement I/O Extended, vous pouvez demander à ce que vos données à caractère personnel et/ou les informations de votre événement soient effacées au terme de celui-ci en envoyant un e-mail à io19@google.com.
 Si vous souhaitez simplement assister à un événement I/O Extended, consultez notre plan pour en trouver un près de chez vous et répondez à l\'invitation !
 Pour toute question sur le programme I/O Extended, contactez-nous à l\'adresse io19extended\-external@google.com.</string>
    <string name="view_sessions_text">Afficher les sessions</string>
    <string name="wifi_install_success">Réseau Wi-Fi enregistré</string>
    <string name="wifi_install_clipboard_message">Impossible d\'enregistrer le réseau Wi-Fi.\nMot de passe copié dans le presse-papiers.</string>
    <string name="event_sessions_title">Sessions</string>
    <string name="event_sandbox_title">Bac à sable</string>
    <string name="event_codelabs_title">Ateliers de programmation</string>
    <string name="event_officehours_title">Permanences et avis sur les applications</string>
    <string name="event_afterhours_title">Après-événement</string>
    <string name="event_meals_title">Repas</string>
    <string name="event_sessions_description">Dès le mois d\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du "premier arrivé, premier servi"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du "premier arrivé, premier servi".</string>
    <string name="event_sandbox_description">Espaces dédiés permettant de découvrir, de tester et d\'apprendre à utiliser nos derniers produits et plates-formes grâce à des démonstrations interactives, des installations physiques, etc.</string>
    <string name="event_codelabs_description">Nos kiosques de programmation vous permettent d\'acquérir une expérience pratique. Vous y trouverez tout le nécessaire pour découvrir les technologies les plus récentes et performantes de Google grâce à des didacticiels d\'autoformation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Le personnel de Google sera à votre disposition pour vous donner des conseils utiles et vous guider si vous êtes bloqué.</string>
    <string name="event_officehours_description">Les permanences vous donnent l\'occasion de rencontrer individuellement des experts de Google pour poser toutes vos questions techniques. Quant aux avis sur les applications, ils vous permettent de recevoir des conseils et des astuces sur vos projets d\'applications spécifiques.</string>
    <string name="event_afterhours_description">Une fois les sessions terminées, restez dans les parages pour profiter de deux soirées avec repas, boissons et bons moments en perspective. Lors de la première, les participants se réuniront au niveau de l\'espace de bac à sable et, lors de la seconde, un concert sera donné en exclusivité dans l\'Amphitheatre.</string>
    <string name="event_meals_description">Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>
    <string name="wifi_header">Wi-Fi</string>
    <string name="related_apps_header">Applications associées</string>
    <string name="event_types_header">Types d\'événement</string>
    <string name="settings_time_zone_label">Événements dans le fuseau horaire du Pacifique (UTC-8)</string>
    <string name="settings_enable_notifications">Activer les notifications</string>
    <string name="settings_send_anonymous_usage_statistics">Envoyer des statistiques d\'utilisation anonymes</string>
    <string name="settings_tos">Conditions d\'utilisation</string>
    <string name="settings_privacy_policy">Règles de confidentialité</string>
    <string name="settings_oss_licenses">Licences Open Source</string>
    <string name="settings_theme_title">Sélectionner un thème</string>
    <string name="settings_theme_system">Paramètres par défaut</string>
    <string name="settings_theme_light">Clair</string>
    <string name="settings_theme_dark">Foncé</string>
    <string name="settings_theme_battery">Défini par l\'économiseur de batterie</string>
    <string name="built_with_material_components">Créée avec Material Components.</string>
    <string name="wifi_network_and_password">Réseau : %1$s\nMot de passe : %2$s</string>
    <string name="join_network">Rejoindre le réseau</string>
    <string name="assistant_app_description">Dites "Ok Google, parle à Google I/O 19" !</string>
    <string name="assistant_app_description2">Dites "Ok Google, parle à Google I/O 19" !</string>
    <string name="speaker_link_website">Site Web</string>
    <string name="speaker_link_twitter">Twitter</string>
    <string name="speaker_link_github">GitHub</string>
    <string name="speaker_link_linkedin">LinkedIn</string>
    <string name="speaker_events_subhead">Événements</string>
    <string name="no_network_connection">Aucune connexion Internet.</string>
    <string name="navigate_up">Remonter</string>
    <string name="no_network_description">Pour utiliser Explore I/O, procédez comme suit :\n\n - Désactivez le mode Avion.\n\n - Activez un réseau de données mobiles ou Wi-Fi.\n\n - Vérifiez le signal aux alentours.</string>
    <string name="phone_does_not_support_arcore_title">Votre téléphone n\'est pas compatible avec ARCore</string>
    <string name="phone_does_not_support_arcore_message">Essayez avec un autre appareil, ou empruntez celui d\'un ami</string>
    <string name="codelabs_information">Découvrez les technologies les plus récentes et performantes de Google grâce à des tutoriels d\'autoformation accessibles dans nos kiosques de programmation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Les kiosques sont ouverts tous les jours, sauf pendant la première présentation.</string>
    <string name="codelabs_building">Bâtiment accueillant les ateliers de programmation</string>
    <string name="codelabs_website">Site Web Codelabs</string>
    <string name="codelab_duration">Durée : %1$d min</string>
    <string name="start_codelab">Démarrer l\'atelier de programmation</string>
</resources>


/*
 * Copyright 2019 Red Hat, Inc. and/or its affiliates.
 *
 * 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.
 */

package org.drools.modelcompiler.util.lambdareplace;

import java.util.List;

import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.stmt.ReturnStmt;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.type.Type;

import static com.github.javaparser.StaticJavaParser.parseClassOrInterfaceType;
import static com.github.javaparser.StaticJavaParser.parseType;
import static org.drools.modelcompiler.util.StringUtil.md5Hash;

public class MaterializedLambdaExtractor extends MaterializedLambda {

    private final static String CLASS_NAME_PREFIX = "LambdaExtractor";
    private String returnType;

    MaterializedLambdaExtractor(String packageName, String ruleClassName, String returnType) {
        super(packageName, ruleClassName);
        this.returnType = returnType;
    }

    @Override
    void createMethodDeclaration(EnumDeclaration classDeclaration) {
        MethodDeclaration methodDeclaration = classDeclaration.addMethod("apply", Modifier.Keyword.PUBLIC);
        methodDeclaration.addAnnotation("Override");
        methodDeclaration.setType(returnTypeJP());

        setMethodParameter(methodDeclaration);

        ExpressionStmt clone = (ExpressionStmt) lambdaExpr.getBody().clone();
        methodDeclaration.setBody(new BlockStmt(NodeList.nodeList(new ReturnStmt(clone.getExpression()))));
    }

    private Type returnTypeJP() {
        return parseType(returnType);
    }

    @Override
    protected NodeList<ClassOrInterfaceType> createImplementedType() {
        ClassOrInterfaceType functionType = functionType();

        List<Type> typeArguments = lambdaParametersToType();
        NodeList<Type> implementedGenericType = NodeList.nodeList(typeArguments);
        implementedGenericType.add(returnTypeJP());
        functionType.setTypeArguments(implementedGenericType);
        return NodeList.nodeList(functionType);
    }

    @Override
    String getPrefix() {
        return CLASS_NAME_PREFIX;
    }

    @Override
    protected ClassOrInterfaceType functionType() {
        String type = "Function" + lambdaParameters.size();
        return parseClassOrInterfaceType("org.drools.model.functions." + type);
    }
}


<?php
/**
 * System messages translation for CodeIgniter(tm)
 *
 * @author	CodeIgniter community
 * @copyright	Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
 * @license	http://opensource.org/licenses/MIT	MIT License
 * @link	https://codeigniter.com
 */
defined('BASEPATH') OR exit('No direct script access allowed');

$lang['db_invalid_connection_str'] = 'Não foi possível determinar as configurações do banco de dados baseado na string de conexão que você submeteu.';
$lang['db_unable_to_connect'] = 'Não foi possível conectar com seu banco de dados usando as configurações fornecidas.';
$lang['db_unable_to_select'] = 'Não foi possível selecionar o banco de dados especificado: %s';
$lang['db_unable_to_create'] = 'Não foi possível criar o banco de dados especificado: %s';
$lang['db_invalid_query'] = 'A consulta(query) que você submeteu não é válida.';
$lang['db_must_set_table'] = 'Você deve configurar a tabela em seu banco de dados para ser usada com sua consulta(query).';
$lang['db_must_use_set'] = 'Você deve usar o método "set" para atualizar um registro.';
$lang['db_must_use_index'] = 'Você deve especificar um índice(index) para corresponder com as suas atualizações em lote.';
$lang['db_batch_missing_index'] = 'Uma ou mais linhas enviadas para atualização em lote está faltando o índice(index) especificado.';
$lang['db_must_use_where'] = 'Atualizações(Updates) não são permitidas a menos que exista a clausula "where".';
$lang['db_del_must_use_where'] = 'Exclusões(Deletes) não são permitidos a menos que exista a clausula "where" ou "like".';
$lang['db_field_param_missing'] = 'Para buscar campos requer o nome da tabela como um parâmetro.';
$lang['db_unsupported_function'] = 'Esta funcionalidade não está disponível para o banco de dados que você está usando.';
$lang['db_transaction_failure'] = 'Falha na Transação: Rollback executado.';
$lang['db_unable_to_drop'] = 'Não foi possível deletar(drop) o banco de dados especificado.';
$lang['db_unsupported_feature'] = 'Funcionalidade não suportada no banco de dados que você está usando.';
$lang['db_unsupported_compression'] = 'O formato de compressão de arquivo que você escolheu não é suportado pelo seu servidor.';
$lang['db_filepath_error'] = 'Não foi possível escrever os dados para o arquivo que você enviou.';
$lang['db_invalid_cache_path'] = 'O caminho do cache(cache path) que você enviou não é válido ou gravável.';
$lang['db_table_name_required'] = 'O nome da tabela é obrigatório para esta operação.';
$lang['db_column_name_required'] = 'O nome da coluna é obrigatório para esta operação.';
$lang['db_column_definition_required'] = 'A definição da coluna é obrigatória para esta operação.';
$lang['db_unable_to_set_charset'] = 'Não é possível configurar o character set da conexão cliente: %s';
$lang['db_error_heading'] = 'Um erro no Banco de Dados aconteceu';


{{- if .Values.server.enabled -}}
{{- if .Values.server.ingress.enabled -}}
{{- $releaseName := .Release.Name -}}
{{- $serviceName := include "prometheus.server.fullname" . }}
{{- $servicePort := .Values.server.service.servicePort -}}
{{- $extraPaths := .Values.server.ingress.extraPaths -}}
{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }}
apiVersion: networking.k8s.io/v1beta1
{{ else }}
apiVersion: extensions/v1beta1
{{ end -}}
kind: Ingress
metadata:
{{- if .Values.server.ingress.annotations }}
  annotations:
{{ toYaml .Values.server.ingress.annotations | indent 4 }}
{{- end }}
  labels:
    {{- include "prometheus.server.labels" . | nindent 4 }}
{{- range $key, $value := .Values.server.ingress.extraLabels }}
    {{ $key }}: {{ $value }}
{{- end }}
  name: {{ template "prometheus.server.fullname" . }}
spec:
  rules:
  {{- range .Values.server.ingress.hosts }}
    {{- $url := splitList "/" . }}
    - host: {{ first $url }}
      http:
        paths:
{{ if $extraPaths }}
{{ toYaml $extraPaths | indent 10 }}
{{- end }}
          - path: /{{ rest $url | join "/" }}
            backend:
              serviceName: {{ $serviceName }}
              servicePort: {{ $servicePort }}
  {{- end -}}
{{- if .Values.server.ingress.tls }}
  tls:
{{ toYaml .Values.server.ingress.tls | indent 4 }}
  {{- end -}}
{{- end -}}
{{- end -}}


// Copyright 2020 Phyronnaz

#pragma once

#include "CoreMinimal.h"
#include "VoxelTexture.h"
#include "VoxelWorldGenerators/VoxelWorldGeneratorPicker.h"
#include "VoxelTools/Tools/VoxelToolBase.h"
#include "VoxelSurfaceTool.generated.h"

class UTexture2D;

UENUM(BlueprintType)
enum class EVoxelSurfaceToolMaskType : uint8
{
	Texture,
	WorldGenerator
};

USTRUCT(BlueprintType)
struct FVoxelSurfaceToolMask
{
	GENERATED_BODY()

	UPROPERTY(Category = "Mask", EditAnywhere, BlueprintReadWrite)
	EVoxelSurfaceToolMaskType Type = EVoxelSurfaceToolMaskType::Texture;

public:
	UPROPERTY(Category = "Mask|Texture", EditAnywhere, BlueprintReadWrite)
	UTexture2D* Texture = nullptr;

	UPROPERTY(Category = "Mask|Texture", EditAnywhere, BlueprintReadWrite)
	EVoxelRGBA Channel = EVoxelRGBA::R;

public:
	UPROPERTY(Category = "Mask|Generator", EditAnywhere, BlueprintReadWrite)
	FVoxelWorldGeneratorPicker WorldGenerator;

	UPROPERTY(Category = "Mask|Generator", EditAnywhere, BlueprintReadWrite, AdvancedDisplay)
	TArray<FName> SeedsToRandomize = { "Seed" };

	UPROPERTY(Category = "Mask|Generator", EditAnywhere, BlueprintReadWrite)
	bool bScaleWithBrushSize = true;

	UPROPERTY(Category = "Mask|Generator", VisibleAnywhere, BlueprintReadOnly, AdvancedDisplay, Transient)
	UTexture2D* WorldGeneratorDebugTexture = nullptr;

public:
	UPROPERTY(Category = "Mask", EditAnywhere, BlueprintReadWrite, meta = (UIMin = 0.01, UIMax = 10))
	float Scale = 1;

	// ScaleY/ScaleX. MaskScale = ScaleX
	UPROPERTY(Category = "Mask", EditAnywhere, BlueprintReadWrite, AdvancedDisplay, meta = (UIMin = 0, UIMax = 10))
	float Ratio = 1;

public:
	bool HasSameGeneratorSettings(const FVoxelSurfaceToolMask& Other) const
	{
		return
			WorldGenerator.GetObject() == Other.WorldGenerator.GetObject() &&
			SeedsToRandomize == Other.SeedsToRandomize &&
			bScaleWithBrushSize == Other.bScaleWithBrushSize &&
			Scale == Other.Scale &&
			Ratio == Other.Ratio;
	}
};

UCLASS()
class VOXEL_API UVoxelSurfaceTool : public UVoxelToolBase
{
	GENERATED_BODY()

public:
	UPROPERTY(Category = "Tool Preview Settings", EditAnywhere, BlueprintReadWrite, meta = (HideInPanel))
	UMaterialInterface* ToolMaterial = nullptr;

public:
	UPROPERTY(Category = "Sculpt Settings", EditAnywhere, BlueprintReadWrite)
	bool bSculpt = true;

	// Relative to brush size
	UPROPERTY(Category = "Sculpt Settings", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bSculpt", UIMin = "0", UIMax = "1"))
	float SculptStrength = 0.5f;

	// If true, will propagate materials so that the surface stays correctly painted.
	// Disabled in 2D mode or if Paint is enabled
	UPROPERTY(Category = "Sculpt Settings", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "!bPaint && !b2DBrush"))
	bool bPropagateMaterials = true;

public:
	UPROPERTY(Category = "Paint Settings", EditAnywhere, BlueprintReadWrite)
	bool bPaint = false;

	UPROPERTY(Category = "Paint Settings", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bPaint", UIMin = "0", UIMax = "1"))
	float PaintStrength = 0.5f;

public:
	// Will only affect the topmost voxels
	UPROPERTY(Category = "Tool Settings", EditAnywhere, BlueprintReadWrite, meta = (DisplayName = "2D Brush"))
	bool b2DBrush = false;

	// If true, sculpt/paint strength will be modulated by the distance the mouse travels
	UPROPERTY(Category = "Tool Settings", EditAnywhere, BlueprintReadWrite)
	bool bMovementAffectsStrength = false;

	// Relative to the radius
	UPROPERTY(Category = "Tool Settings", EditAnywhere, BlueprintReadWrite, meta = (UIMin=0, UIMax=1))
	float Stride = 0.f;

	UPROPERTY(Category = "Tool Settings", EditAnywhere, BlueprintReadWrite, meta = (InlineEditConditionToggle))
	bool bAlignToMovement = true;

	// If false, align the tool to the mouse movement
	UPROPERTY(Category = "Tool Settings", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "!bAlignToMovement"))
	FRotator FixedDirection = FRotator::ZeroRotator;

	// If true, strength will be modulated by the time since the last edit so that the results don't depend on the framerate
	// Automatically turned off if Stride > 0, or if paint strength = 1
	UPROPERTY(Category = "Tool Settings", EditAnywhere, BlueprintReadWrite, AdvancedDisplay)
	bool bModulateStrengthByDeltaTime = true;

public:
	UPROPERTY(Category = "Falloff", EditAnywhere, BlueprintReadWrite)
	bool bEnableFalloff = true;

	UPROPERTY(Category = "Falloff", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bEnableFalloff"))
	EVoxelFalloff FalloffType = EVoxelFalloff::Smooth;

	UPROPERTY(Category = "Falloff", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bEnableFalloff", UIMin = "0", UIMax = "1"))
	float Falloff = 0.5;

public:
	UPROPERTY(Category = "Mask", EditAnywhere, BlueprintReadWrite)
	bool bUseMask = false;

	UPROPERTY(Category = "Mask", EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "bUseMask"))
	FVoxelSurfaceToolMask Mask;

public:
	UVoxelSurfaceTool();

	//~ Begin UVoxelToolBase Interface
	virtual void GetToolConfig(FVoxelToolBaseConfig& OutConfig) const override;
	virtual void Tick() override;
	virtual void UpdateRender(UMaterialInstanceDynamic* OverlayMaterialInstance, UMaterialInstanceDynamic* MeshMaterialInstance) override;
	virtual FVoxelIntBoxWithValidity DoEdit() override;
	//~ End UVoxelToolBase Interface

private:
	struct FMaskWorldGeneratorCache
	{
		FVoxelSurfaceToolMask CachedConfig;
		float BrushSize = 0.f; // Needed for bScaleWithBrushSize

		TMap<FName, int32> Seeds;

		TVoxelTexture<float> VoxelTexture;
	};
	FMaskWorldGeneratorCache MaskWorldGeneratorCache;

	UPROPERTY(Transient)
	UTexture2D* MaskWorldGeneratorCache_RenderTexture = nullptr;

	bool ShouldUseMask() const;

	void GetStrengths(float& OutSignedSculptStrength, float& OutSignedPaintStrength) const;
};


//
//  AppDelegate.h
//  AFSoundManager-Demo
//
//  Created by Alvaro Franco on 4/16/14.
//  Copyright (c) 2014 AlvaroFranco. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end


/*!
 * Waves v0.7.1
 * http://fian.my.id/Waves
 *
 * Copyright 2014 Alfiana E. Sibuea and other contributors
 * Released under the MIT license
 * https://github.com/fians/Waves/blob/master/LICENSE
 */

;(function(window, factory) {
    'use strict';

    // AMD. Register as an anonymous module.  Wrap in function so we have access
    // to root via `this`.
    if (typeof define === 'function' && define.amd) {
        define([], function() {
            return factory.apply(window);
        });
    }

    // Node. Does not work with strict CommonJS, but only CommonJS-like
    // environments that support module.exports, like Node.
    else if (typeof exports === 'object') {
        module.exports = factory.call(window);
    }

    // Browser globals.
    else {
        window.Waves = factory.call(window);
    }
})(typeof global === 'object' ? global : this, function() {
    'use strict';

    var Waves            = Waves || {};
    var $$               = document.querySelectorAll.bind(document);
    var toString         = Object.prototype.toString;
    var isTouchAvailable = 'ontouchstart' in window;

    // Find exact position of element
    function isWindow(obj) {
        return obj !== null && obj === obj.window;
    }

    function getWindow(elem) {
        return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
    }

    function isObject(value) {
        var type = typeof value;
        return type === 'function' || type === 'object' && !!value;
    }

    function isDOMNode(obj) {
        return isObject(obj) && obj.nodeType > 0;
    }

    function getWavesElements(nodes) {
        var stringRepr = toString.call(nodes);

        if (stringRepr === '[object String]') {
            return $$(nodes);
        } else if (isObject(nodes) && /^\[object (HTMLCollection|NodeList|Object)\]$/.test(stringRepr) && nodes.hasOwnProperty('length')) {
            return nodes;
        } else if (isDOMNode(nodes)) {
            return [nodes];
        }

        return [];
    }

    function offset(elem) {
        var docElem, win,
            box = { top: 0, left: 0 },
            doc = elem && elem.ownerDocument;

        docElem = doc.documentElement;

        if (typeof elem.getBoundingClientRect !== typeof undefined) {
            box = elem.getBoundingClientRect();
        }
        win = getWindow(doc);
        return {
            top: box.top + win.pageYOffset - docElem.clientTop,
            left: box.left + win.pageXOffset - docElem.clientLeft
        };
    }

    function convertStyle(styleObj) {
        var style = '';

        for (var prop in styleObj) {
            if (styleObj.hasOwnProperty(prop)) {
                style += (prop + ':' + styleObj[prop] + ';');
            }
        }

        return style;
    }

    var Effect = {

        // Effect duration
        duration: 750,

        // Effect delay (check for scroll before showing effect)
        delay: 200,

        show: function(e, element, velocity) {

            // Disable right click
            if (e.button === 2) {
                return false;
            }

            element = element || this;

            // Create ripple
            var ripple = document.createElement('div');
            ripple.className = 'waves-ripple waves-rippling';
            element.appendChild(ripple);

            // Get click coordinate and element witdh
            var pos       = offset(element);
            var relativeY = (e.pageY - pos.top);
            var relativeX = (e.pageX - pos.left);
            var scale     = 'scale(' + ((element.clientWidth / 100) * 3) + ')';
            var translate = 'translate(0,0)';

            if (velocity) {
                translate = 'translate(' + (velocity.x) + 'px, ' + (velocity.y) + 'px)';
            }

            // Support for touch devices
            if ('touches' in e && e.touches.length) {
                relativeY = (e.touches[0].pageY - pos.top);
                relativeX = (e.touches[0].pageX - pos.left);
            }

            // Attach data to element
            ripple.setAttribute('data-hold', Date.now());
            ripple.setAttribute('data-x', relativeX);
            ripple.setAttribute('data-y', relativeY);
            ripple.setAttribute('data-scale', scale);
            ripple.setAttribute('data-translate', translate);

            // Set ripple position
            var rippleStyle = {
                top: relativeY + 'px',
                left: relativeX + 'px'
            };

            ripple.classList.add('waves-notransition');
            ripple.setAttribute('style', convertStyle(rippleStyle));
            ripple.classList.remove('waves-notransition');

            // Scale the ripple
            rippleStyle['-webkit-transform'] = scale + ' ' + translate;
            rippleStyle['-moz-transform'] = scale + ' ' + translate;
            rippleStyle['-ms-transform'] = scale + ' ' + translate;
            rippleStyle['-o-transform'] = scale + ' ' + translate;
            rippleStyle.transform = scale + ' ' + translate;
            rippleStyle.opacity = '1';

            var duration = e.type === 'mousemove' ? 2500 : Effect.duration;
            rippleStyle['-webkit-transition-duration'] = duration + 'ms';
            rippleStyle['-moz-transition-duration']    = duration + 'ms';
            rippleStyle['-o-transition-duration']      = duration + 'ms';
            rippleStyle['transition-duration']         = duration + 'ms';

            ripple.setAttribute('style', convertStyle(rippleStyle));
        },

        hide: function(e, element) {
            element = element || this;

            var ripples = element.getElementsByClassName('waves-rippling');

            for (var i = 0, len = ripples.length; i < len; i++) {
                removeRipple(e, element, ripples[i]);
            }
        },

        // Little hack to make <input> can perform waves effect
        wrapInput: function(elements) {

            for (var i = 0, len = elements.length; i < len; i++) {

                var element = elements[i];

                if (element.tagName.toLowerCase() === 'input') {

                    var parent = element.parentNode;

                    // If input already have parent just pass through
                    if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {
                        continue;
                    }

                    // Put element class and style to the specified parent
                    var wrapper       = document.createElement('i');
                    wrapper.className = element.className + ' waves-input-wrapper';
                    element.className = 'waves-button-input';

                    // Put element as child
                    parent.replaceChild(wrapper, element);
                    wrapper.appendChild(element);

                    // Apply element color and background color to wrapper
                    var elementStyle    = window.getComputedStyle(element, null);
                    var color           = elementStyle.color;
                    var backgroundColor = elementStyle.backgroundColor;

                    wrapper.setAttribute('style', 'color:' + color + ';background:' + backgroundColor);
                    element.setAttribute('style', 'background-color:rgba(0,0,0,0);');
                }
            }
        }
    };

    /**
     * Hide the effect and remove the ripple. Must be
     * a separate function to pass the JSLint...
     */
    function removeRipple(e, el, ripple) {

        // Check if the ripple still exist
        if (!ripple) {
            return;
        }

        ripple.classList.remove('waves-rippling');

        var relativeX = ripple.getAttribute('data-x');
        var relativeY = ripple.getAttribute('data-y');
        var scale     = ripple.getAttribute('data-scale');
        var translate = ripple.getAttribute('data-translate');

        // Get delay beetween mousedown and mouse leave
        var diff = Date.now() - Number(ripple.getAttribute('data-hold'));
        var delay = 350 - diff;

        if (delay < 0) {
            delay = 0;
        }

        if (e.type === 'mousemove') {
            delay = 150;
        }

        // Fade out ripple after delay
        var duration = e.type === 'mousemove' ? 2500 : Effect.duration;

        setTimeout(function() {

            var style = {
                top: relativeY + 'px',
                left: relativeX + 'px',
                opacity: '0',

                // Duration
                '-webkit-transition-duration': duration + 'ms',
                '-moz-transition-duration': duration + 'ms',
                '-o-transition-duration': duration + 'ms',
                'transition-duration': duration + 'ms',
                '-webkit-transform': scale + ' ' + translate,
                '-moz-transform': scale + ' ' + translate,
                '-ms-transform': scale + ' ' + translate,
                '-o-transform': scale + ' ' + translate,
                'transform': scale + ' ' + translate
            };

            ripple.setAttribute('style', convertStyle(style));

            setTimeout(function() {
                try {
                    el.removeChild(ripple);
                } catch (e) {
                    return false;
                }
            }, duration);

        }, delay);
    }

    /**
     * Disable mousedown event for 500ms during and after touch
     */
    var TouchHandler = {

        /* uses an integer rather than bool so there's no issues with
         * needing to clear timeouts if another touch event occurred
         * within the 500ms. Cannot mouseup between touchstart and
         * touchend, nor in the 500ms after touchend. */
        touches: 0,

        allowEvent: function(e) {

            var allow = true;

            if (/^(mousedown|mousemove)$/.test(e.type) && TouchHandler.touches) {
                allow = false;
            }

            return allow;
        },
        registerEvent: function(e) {
            var eType = e.type;

            if (eType === 'touchstart') {

                TouchHandler.touches += 1; // push

            } else if (/^(touchend|touchcancel)$/.test(eType)) {

                setTimeout(function() {
                    if (TouchHandler.touches) {
                        TouchHandler.touches -= 1; // pop after 500ms
                    }
                }, 500);

            }
        }
    };

    /**
     * Delegated click handler for .waves-effect element.
     * returns null when .waves-effect element not in "click tree"
     */
    function getWavesEffectElement(e) {

        if (TouchHandler.allowEvent(e) === false) {
            return null;
        }

        var element = null;
        var target = e.target || e.srcElement;

        while (target.parentElement !== null) {
            if (target.classList.contains('waves-effect') && (!(target instanceof SVGElement))) {
                element = target;
                break;
            }
            target = target.parentElement;
        }

        return element;
    }

    /**
     * Bubble the click and show effect if .waves-effect elem was found
     */
    function showEffect(e) {

        TouchHandler.registerEvent(e);

        var element = getWavesEffectElement(e);

        if (element !== null) {

            if (e.type === 'touchstart' && Effect.delay) {

                var hidden = false;

                var timer = setTimeout(function () {
                    timer = null;
                    Effect.show(e, element);
                }, Effect.delay);

                var hideEffect = function(hideEvent) {

                    // if touch hasn't moved, and effect not yet started: start effect now
                    if (timer) {
                        clearTimeout(timer);
                        timer = null;
                        Effect.show(e, element);
                    }
                    if (!hidden) {
                        hidden = true;
                        Effect.hide(hideEvent, element);
                    }
                };

                var touchMove = function(moveEvent) {
                    if (timer) {
                        clearTimeout(timer);
                        timer = null;
                    }
                    hideEffect(moveEvent);
                };

                element.addEventListener('touchmove', touchMove, false);
                element.addEventListener('touchend', hideEffect, false);
                element.addEventListener('touchcancel', hideEffect, false);

            } else {

                Effect.show(e, element);

                if (isTouchAvailable) {
                    element.addEventListener('touchend', Effect.hide, false);
                    element.addEventListener('touchcancel', Effect.hide, false);
                }

                element.addEventListener('mouseup', Effect.hide, false);
                element.addEventListener('mouseleave', Effect.hide, false);
            }
        }
    }

    Waves.init = function(options) {
        var body = document.body;

        options = options || {};

        if ('duration' in options) {
            Effect.duration = options.duration;
        }

        if ('delay' in options) {
            Effect.delay = options.delay;
        }

        //Wrap input inside <i> tag
        Effect.wrapInput($$('.waves-effect'));

        if (isTouchAvailable) {
            body.addEventListener('touchstart', showEffect, false);
            body.addEventListener('touchcancel', TouchHandler.registerEvent, false);
            body.addEventListener('touchend', TouchHandler.registerEvent, false);
        }

        body.addEventListener('mousedown', showEffect, false);
    };

    /**
     * Attach Waves to dynamically loaded inputs, or add .waves-effect and other
     * waves classes to a set of elements. Set drag to true if the ripple mouseover
     * or skimming effect should be applied to the elements.
     */
    Waves.attach = function(elements, classes) {
        elements = getWavesElements(elements);

        if (toString.call(classes) === '[object Array]') {
            classes = classes.join(' ');
        }

        classes = classes ? ' ' + classes : '';

        var element;
        for (var i = 0, len = elements.length; i < len; i++) {
            element = elements[i];

            if (element.tagName.toLowerCase() === 'input') {
                Effect.wrapInput([element]);
                element = element.parentElement;
            }

            element.className += ' waves-effect' + classes;
        }
    };

    /**
     * Cause a ripple to appear in an element via code.
     */
    Waves.ripple = function(elements, options) {
        elements = getWavesElements(elements);
        var elementsLen = elements.length;

        options          = options || {};
        options.wait     = options.wait || 0;
        options.position = options.position || null; // default = centre of element

        if (elementsLen) {
            var element, pos, off, centre = {}, i = 0;
            var mousedown = {
                type: 'mousedown',
                button: 1
            };
            var hideRipple = function(mouseup, element) {
                return function() {
                    Effect.hide(mouseup, element);
                };
            };

            for (; i < elementsLen; i++) {
                element = elements[i];
                pos = options.position || {
                    x: element.clientWidth / 2,
                    y: element.clientHeight / 2
                };

                off      = offset(element);
                centre.x = off.left + pos.x;
                centre.y = off.top + pos.y;

                mousedown.pageX = centre.x;
                mousedown.pageY = centre.y;

                Effect.show(mousedown, element);

                if (options.wait >= 0 && options.wait !== null) {
                    var mouseup = {
                        type: 'mouseup',
                        button: 1
                    };

                    setTimeout(hideRipple(mouseup, element), options.wait);
                }
            }
        }
    };

    /**
     * Remove all ripples from an element.
     */
    Waves.calm = function(elements) {
        elements = getWavesElements(elements);
        var mouseup = {
            type: 'mouseup',
            button: 1
        };

        for (var i = 0, len = elements.length; i < len; i++) {
            Effect.hide(mouseup, elements[i]);
        }
    };

    /**
     * Deprecated API fallback
     */
    Waves.displayEffect = function(options) {
        console.error('Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect');
        Waves.init(options);
    };

    return Waves;
});


/*
 * Copyright (C) 2012 Facebook, Inc.
 *
 * 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.
 */
package com.facebook.util.function;

import com.facebook.util.ExtRunnable;
import java.util.Objects;
import java.util.function.Consumer;

public interface ExtConsumer<T, E extends Throwable> {
  void accept(T t) throws E;

  default ExtConsumer<T, E> andThen(ExtConsumer<? super T, E> after) {
    Objects.requireNonNull(after);
    return (t) -> {
      accept(t);
      after.accept(t);
    };
  }

  static <T> Consumer<T> quiet(ExtConsumer<T, ?> consumer) {
    return (t) -> ExtRunnable.quiet(() -> consumer.accept(t)).run();
  }
}


// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.content.browser.androidoverlay;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.os.IBinder;
import android.view.Gravity;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.Window;
import android.view.WindowManager;

import org.chromium.gfx.mojom.Rect;
import org.chromium.media.mojom.AndroidOverlayConfig;

/**
 * Core class for control of a single Dialog-based AndroidOverlay instance.  Everything runs on the
 * overlay thread, which is not the Browser UI thread.
 *
 * Note that this does not implement AndroidOverlay; we assume that, and the associated thread-
 * hopping, is handled elsewhere (DialogOverlayImpl).
 */
class DialogOverlayCore {
    private static final String TAG = "DSCore";

    // Host interface, since we're on the wrong thread to talk to mojo, or anything else, really.
    public interface Host {
        // Notify the host that we have a surface.
        void onSurfaceReady(Surface surface);

        // Notify the host that we have failed to get a surface or the surface was destroyed.
        void onOverlayDestroyed();

        // Wait until the host has been told to clean up.  We are allowed to let surfaceDestroyed
        // proceed once this happens.
        void waitForCleanup();
    }

    private Host mHost;

    // When initialized via Init, we'll create mDialog.  We'll clear it when we send
    // onOverlayDestroyed to the host.  In general, when this is null, either we haven't been
    // initialized yet, or we've been torn down.  It shouldn't be the case that anything calls
    // methods after construction but before |initialize()|, though.
    private Dialog mDialog;

    private Callbacks mDialogCallbacks;

    // Most recent layout parameters.
    private WindowManager.LayoutParams mLayoutParams;

    /**
     * Construction may be called from a random thread, for simplicity.  Call initialize from the
     * proper thread before doing anything else.
     */
    public DialogOverlayCore() {}

    /**
     * Finish init on the proper thread.  We'll use this thread for the Dialog Looper thread.
     * @param dialog the dialog, which uses our current thread as the UI thread.
     * @param config initial config.
     * @param host host interface, for sending messages that (probably) need to thread hop.
     */
    public void initialize(Context context, AndroidOverlayConfig config, Host host) {
        mHost = host;

        mDialog = new Dialog(context, android.R.style.Theme_NoDisplay);
        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mDialog.setCancelable(false);

        mLayoutParams = createLayoutParams(config.secure);
        copyRectToLayoutParams(config.rect);
    }

    /**
     * Release the underlying surface, and generally clean up, in response to
     * the client releasing the AndroidOverlay.
     */
    public void release() {
        // If we've not released the dialog yet, then do so.
        if (mDialog != null) {
            if (mDialog.isShowing()) mDialog.dismiss();
            mDialog = null;
            mDialogCallbacks = null;
        }

        mLayoutParams.token = null;

        // We don't bother to notify |mHost| that we've been destroyed; it told us.
        mHost = null;
    }

    private void copyRectToLayoutParams(final Rect rect) {
        // TODO(liberato): adjust for CompositorView screen location here if we want to support
        // non-full screen use cases.
        mLayoutParams.x = rect.x;
        mLayoutParams.y = rect.y;
        mLayoutParams.width = rect.width;
        mLayoutParams.height = rect.height;
    }

    /**
     * Layout the AndroidOverlay.  If we don't have a token, then we ignore it, since a well-behaved
     * client shouldn't call us before getting the surface anyway.
     */
    public void layoutSurface(final Rect rect) {
        if (mDialog == null || mLayoutParams.token == null) return;

        copyRectToLayoutParams(rect);
        mDialog.getWindow().setAttributes(mLayoutParams);
    }

    /**
     * Callbacks for finding out about the Dialog's Surface.
     * These happen on the looper thread.
     */
    private class Callbacks implements SurfaceHolder.Callback2 {
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // Make sure that we haven't torn down the dialog yet.
            if (mDialog == null) return;

            if (mHost != null) mHost.onSurfaceReady(holder.getSurface());
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mDialog == null || mHost == null) return;

            // Notify the host that we've been destroyed, and wait for it to clean up.
            mHost.onOverlayDestroyed();
            mHost.waitForCleanup();
            mHost = null;
        }

        @Override
        public void surfaceRedrawNeeded(SurfaceHolder holder) {}
    }

    public void onWindowToken(IBinder token) {
        if (mDialog == null || mHost == null) return;

        if (token == null || (mLayoutParams.token != null && token != mLayoutParams.token)) {
            // We've lost the token, if we had one, or we got a new one.
            // Notify the client.
            mHost.onOverlayDestroyed();
            mHost = null;
            if (mDialog.isShowing()) mDialog.dismiss();
            return;
        }

        if (mLayoutParams.token == token) {
            // Same token, do nothing.
            return;
        }

        // We have a token, so layout the dialog.
        mLayoutParams.token = token;
        mDialog.getWindow().setAttributes(mLayoutParams);
        mDialogCallbacks = new Callbacks();
        mDialog.getWindow().takeSurface(mDialogCallbacks);
        mDialog.show();

        // We don't notify the client here.  We'll wait until the Android Surface is created.
    }

    @SuppressLint("RtlHardcoded")
    private WindowManager.LayoutParams createLayoutParams(boolean secure) {
        // Rather than using getAttributes, we just create them from scratch.
        // The default dialog attributes aren't what we want.
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();

        // NOTE: we really do want LEFT here, since we're dealing in compositor
        // coordinates.  Those are always from the left.
        layoutParams.gravity = Gravity.TOP | Gravity.LEFT;

        // Use a media surface, which is what SurfaceView uses by default.  For
        // debugging overlay drawing, consider using TYPE_APPLICATION_PANEL to
        // move the dialog over the CompositorView.
        layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;

        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;

        if (secure) {
            layoutParams.flags |= WindowManager.LayoutParams.FLAG_SECURE;
        }

        // Don't set FLAG_SCALED.  in addition to not being sure what it does
        // (SV uses it), it also causes a crash in WindowManager when we hide
        // (not dismiss), navigate, and/or exit the app without hide/dismiss.
        // There's a missing null check in WindowManagerService.java@3170
        // on M MR2.  To repro, change dimiss() to hide(), bring up a SV, and
        // navigate away or press home.

        // Turn off the position animation, so that it doesn't animate from one
        // position to the next.  Ignore errors.
        // 0x40 is PRIVATE_FLAG_NO_MOVE_ANIMATION.
        try {
            int currentFlags =
                    (Integer) layoutParams.getClass().getField("privateFlags").get(layoutParams);
            layoutParams.getClass()
                    .getField("privateFlags")
                    .set(layoutParams, currentFlags | 0x00000040);
            // It would be nice to just catch Exception, but findbugs doesn't
            // allow it.  If we cannot set the flag, then that's okay too.
        } catch (NoSuchFieldException e) {
        } catch (NullPointerException e) {
        } catch (SecurityException e) {
        } catch (IllegalAccessException e) {
        } catch (IllegalArgumentException e) {
        } catch (ExceptionInInitializerError e) {
        }

        return layoutParams;
    }

    /**
     * Package-private to retrieve our current dialog for tests.
     */
    Dialog getDialog() {
        return mDialog;
    }
}


package de.kp.spark.elastic.specs
/* Copyright (c) 2014 Dr. Krusche & Partner PartG
*
* This file is part of the Spark-ELASTIC project
* (https://github.com/skrusche63/spark-elastic).
*
* Spark-ELASTIC is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* Spark-ELASTIC is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with
* Spark-ELASTIC.
*
* If not, see <http://www.gnu.org/licenses/>.
*/

import scala.xml._
import scala.collection.mutable.HashMap

object PageViewSpec {

  private val spec = new FieldSpec("pageview.xml")
  private val fields = HashMap.empty[String,(String,String)]

  load()

  private def load() {

    for (field <- spec.root \ "field") {

      val _name  = (field \ "@name").toString
      val _type  = (field \ "@type").toString

      val _mapping = field.text
      fields += _name -> (_mapping,_type)

    }

  }

  def get = fields.toMap

}


defmodule Hexpm.Repository.Repositories do
  use Hexpm.Context

  def all_public() do
    [Repository.hexpm()]
  end

  def get(name, preload \\ []) do
    Repo.get_by(Repository, name: name)
    |> Repo.preload(preload)
  end
end


/**
 * Module exports.
 */

module.exports = deprecate;

/**
 * Mark that a method should not be used.
 * Returns a modified function which warns once by default.
 *
 * If `localStorage.noDeprecation = true` is set, then it is a no-op.
 *
 * If `localStorage.throwDeprecation = true` is set, then deprecated functions
 * will throw an Error when invoked.
 *
 * If `localStorage.traceDeprecation = true` is set, then deprecated functions
 * will invoke `console.trace()` instead of `console.error()`.
 *
 * @param {Function} fn - the function to deprecate
 * @param {String} msg - the string to print to the console when `fn` is invoked
 * @returns {Function} a new "deprecated" version of `fn`
 * @api public
 */

function deprecate (fn, msg) {
  if (config('noDeprecation')) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (config('throwDeprecation')) {
        throw new Error(msg);
      } else if (config('traceDeprecation')) {
        console.trace(msg);
      } else {
        console.warn(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
}

/**
 * Checks `localStorage` for boolean values for the given `name`.
 *
 * @param {String} name
 * @returns {Boolean}
 * @api private
 */

function config (name) {
  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  try {
    if (!global.localStorage) return false;
  } catch (_) {
    return false;
  }
  var val = global.localStorage[name];
  if (null == val) return false;
  return String(val).toLowerCase() === 'true';
}


package ber

import "io"

func readByte(reader io.Reader) (byte, error) {
	bytes := make([]byte, 1, 1)
	_, err := io.ReadFull(reader, bytes)
	if err != nil {
		if err == io.EOF {
			return 0, io.ErrUnexpectedEOF
		}
		return 0, err
	}
	return bytes[0], nil
}

func isEOCPacket(p *Packet) bool {
	return p != nil &&
		p.Tag == TagEOC &&
		p.ClassType == ClassUniversal &&
		p.TagType == TypePrimitive &&
		len(p.ByteValue) == 0 &&
		len(p.Children) == 0
}