text:
Printed from https://ideas.repec.org/a/eee/eecrev/v41y1997i1p1-35.html
Game theory and empirical economics: The case of auction data 1
Laffont, Jean-Jacques
Jean-Jacques Laffont †
Laffont, Jean-Jacques, 1997. "Game theory and empirical economics: The case of auction data 1," European Economic Review, Elsevier, vol. 41(1), pages 1-35, January.
Handle: RePEc:eee:eecrev:v:41:y:1997:i:1:p:1-35
Laffont, J.J., 1996. "Game Theory and Empirical Economics: The Case of Auction Data," Papers 95.394, Toulouse - GREMAQ.
Paarsch, Harry J., 1992. "Deciding between the common and private value paradigms in empirical models of auctions," Journal of Econometrics, Elsevier, vol. 51(1-2), pages 191-215.
Kenneth Hendricks & Robert H. Porter, 1989. "Collusion in Auctions," Annals of Economics and Statistics, GENES, issue 15-16, pages 217-230.
Kenneth Hendricks & Robert Porter, 1989. "Collusion in Auctions," Discussion Papers 817, Northwestern University, Center for Mathematical Studies in Economics and Management Science.
repec:adr:anecst:y:1994:i:34 is not listed on IDEAS
Marshall Robert C. & Meurer Michael J. & Richard Jean-Francois & Stromquist Walter, 1994. "Numerical Analysis of Asymmetric First Price Auctions," Games and Economic Behavior, Elsevier, vol. 7(2), pages 193-220, September.
Dyer, Douglas & Kagel, John H & Levin, Dan, 1989. "A Comparison of Naive and Experienced Bidders in Common Value Offer Auctions: A Laboratory Analysis," Economic Journal, Royal Economic Society, vol. 99(394), pages 108-115, March.
Dyer, D. & Kagel, J.H. & Levin, D., 1988. "A Comparison Of Naive And Experienced Bidders In Common Value Offer Auctions A Laboratory Analysis," Papers 11, Houston - Department of Economics.
Brannman, Lance & Klein, J Douglass & Weiss, Leonard W, 1987. "The Price Effects of Increased Competition in Auction Markets," The Review of Economics and Statistics, MIT Press, vol. 69(1), pages 24-32, February.
Giliberto, S Michael & Varaiya, Nikhil P, 1989. " The Winner's Curse and Bidder Competition in Acquisitions: Evidence from Failed Bank Auctions," Journal of Finance, American Finance Association, vol. 44(1), pages 59-75, March.
Hendricks, Kenneth & Porter, Robert H & Wilson, Charles A, 1994. "Auctions for Oil and Gas Leases with an Informed Bidder and a Random Reservation Price," Econometrica, Econometric Society, vol. 62(6), pages 1415-1444, November.
Hendricks, Kenneth & Porter, Robert H. & Wilson, Charles A., 1990. "Auctions For Oil And Gas Leases With An Informed Bidder And A Random Reservation Price," Working Papers 90-47, C.V. Starr Center for Applied Economics, New York University.
Hoffman, Elizabeth & Marsden, James R, 1986. " Testing Informational Assumptions in Common Value Bidding Models," Scandinavian Journal of Economics, Wiley Blackwell, vol. 88(4), pages 627-641.
Smith, Vernon L, 1982. "Microeconomic Systems as an Experimental Science," American Economic Review, American Economic Association, vol. 72(5), pages 923-955, December.
Thaler, Richard H, 1988. "Anomalies: The Winner's Curse," Journal of Economic Perspectives, American Economic Association, vol. 2(1), pages 191-202, Winter.
Ashenfelter, Orley, 1989. "How Auctions Work for Wine and Art," Journal of Economic Perspectives, American Economic Association, vol. 3(3), pages 23-36, Summer.
Guerre, E. & Perrigne, I. & Vuong, Q., 1995. "Nonparametric Estimation of First-Price Auctions: Technical Appendices," Papers 9503, Southern California - Department of Economics.
McAfee, R Preston & Vincent, Daniel, 1992. "Updating the Reserve Price in Common-Value Auctions," American Economic Review, American Economic Association, vol. 82(2), pages 512-518, May.
R. Preston McAfee & Daniel Vincent, 1992. "Updating the Reserve Price in Common Value Auctions," Discussion Papers 977, Northwestern University, Center for Mathematical Studies in Economics and Management Science.
William S. Comanor & Mark A. Schankerman, 1976. "Identical Bids and Cartel Behavior," Bell Journal of Economics, The RAND Corporation, vol. 7(1), pages 281-286, Spring.
Branco, Fernando, 1995. "Multi-object Auctions: On the Use of Combinational Bids," CEPR Discussion Papers 1216, C.E.P.R. Discussion Papers.
Bernard Elyakime & Jean-Jacques Laffont & Patrice Loisel & Quang Vuong, 1994. "First-Price Sealed-Bid Auctions with Secret Reservation Prices," Annals of Economics and Statistics, GENES, issue 34, pages 71-114.
Elyakime, Bernard & Laffont, Jean-Jacques & Loisel, Patrice & Vuong, Quang, 1993. "First-Price Sealed-Bid Auctions with Secret Reservation Prices," IDEI Working Papers 27, Institut d'Économie Industrielle (IDEI), Toulouse.
Porter, Robert H, 1995. "The Role of Information in U.S. Offshore Oil and Gas Lease Auctions," Econometrica, Econometric Society, vol. 63(1), pages 1-27, January.
Robert H. Porter, 1992. "The Role of Information in U.S. Offshore Oil and Gas Lease Auctions," NBER Working Papers 4185, National Bureau of Economic Research, Inc.
Robert H. Porter, 1992. "The Role of Information in U.S. Offshore Oil and Gas Lease Auctions," Discussion Papers 1008, Northwestern University, Center for Mathematical Studies in Economics and Management Science.
Porter, Robert H & Zona, J Douglas, 1993. "Detection of Bid Rigging in Procurement Auctions," Journal of Political Economy, University of Chicago Press, vol. 101(3), pages 518-538, June.
Robert H. Porter & J. Douglas Zona, 1992. "Detection of Bid Rigging in Procurement Auctions," NBER Working Papers 4013, National Bureau of Economic Research, Inc.
Guth, Werner & Peleg, Bezalel, 1996. "On ring formation in auctions," Mathematical Social Sciences, Elsevier, vol. 32(1), pages 1-37, August.
Güth, W. & Peleg, B., 1993. "On Ring Formation in Auctions," Discussion Paper 1993-57, Tilburg University, Center for Economic Research.
Guth, W. & Peleg, B., 1993. "On Ring Formation in Auctions," Papers 9357, Tilburg - Center for Economic Research.
McAfee, R. Preston & McMillan, John, 1987. "Auctions with entry," Economics Letters, Elsevier, vol. 23(4), pages 343-347.
Hansen, Robert G, 1985. "Empirical Testing of Auction Theory," American Economic Review, American Economic Association, vol. 75(2), pages 156-159, May.
Vuong, Q. & Laffont, J.J. & Elyakime, B. & Loisel, P., 1995. "Auctioning and Bargaining: An Econometric Study of Timber Auctions with Secret Reservation Prices," Papers 9502, Southern California - Department of Economics.
Laffont, Jean-Jacques & Vuong, Quang, 1993. "Structural econometric analysis of descending auctions," European Economic Review, Elsevier, vol. 37(2-3), pages 329-341, April.
Laffont, J.J. & Vuong, Q., 1992. "Structural Econometrics Analysis of descending Auctions," Papers 9202, Southern California - Department of Economics.
Laffont, J.J. & Vuong, Q., 1992. "Structural Econometrics Analysis of Descending Auctions," Papers 92.272, Toulouse - GREMAQ.
Milgrom, Paul R, 1979. "A Convergence Theorem for Competitive Bidding with Differential Information," Econometrica, Econometric Society, vol. 47(3), pages 679-688, May.
Donald B. Hausch, 1986. "Multi-Object Auctions: Sequential vs. Simultaneous Sales," Management Science, INFORMS, vol. 32(12), pages 1599-1610, December.
Riley, John G & Samuelson, William F, 1981. "Optimal Auctions," American Economic Review, American Economic Association, vol. 71(3), pages 381-392, June.
John G. Riley & William Samuelson, 1979. "Optimal Auctions," UCLA Economics Working Papers 152, UCLA Department of Economics.
Thiel, Stuart E, 1988. "Some Evidence of the Winner's Curse," American Economic Review, American Economic Association, vol. 78(5), pages 884-895, December.
Mailath, George J. & Zemsky, Peter, 1991. "Collusion in second price auctions with heterogeneous bidders," Games and Economic Behavior, Elsevier, vol. 3(4), pages 467-486, November.
Robert B. Wilson, 1967. "Competitive Bidding with Asymmetric Information," Management Science, INFORMS, vol. 13(11), pages 816-820, July.
Graham, Daniel A & Marshall, Robert C, 1987. "Collusive Bidder Behavior at Single-Object Second-Price and English Auctions," Journal of Political Economy, University of Chicago Press, vol. 95(6), pages 1217-1239, December.
Simon, David P., 1994. "Markups, quantity risk, and bidding strategies at treasury coupon auctions," Journal of Financial Economics, Elsevier, vol. 35(1), pages 43-62, February.
Hendricks, Kenneth & Porter, Robert H, 1988. "An Empirical Study of an Auction with Asymmetric Information," American Economic Review, American Economic Association, vol. 78(5), pages 865-883, December.
Harstad, Ronald M, 1990. "Alternative Common-Value Auction Procedures: Revenue Comparisons with Free Entry," Journal of Political Economy, University of Chicago Press, vol. 98(2), pages 421-429, April.
McAfee, R Preston & McMillan, John, 1992. "Bidding Rings," American Economic Review, American Economic Association, vol. 82(3), pages 579-599, June.
McAfee, R. Preston & McMillan, John., 1990. "Bidding Rings," Working Papers 726, California Institute of Technology, Division of the Humanities and Social Sciences.
Maskin, Eric S & Riley, John G, 1984. "Optimal Auctions with Risk Averse Buyers," Econometrica, Econometric Society, vol. 52(6), pages 1473-1518, November.
J. Riley & E. Maskin, 1981. "Optimal Auctions with Risk Averse Buyers," Working papers 311, Massachusetts Institute of Technology (MIT), Department of Economics.
Milton Friedman, 1964. "Comment on "Collusion in the Auction Market for Treasury Bills"," Journal of Political Economy, University of Chicago Press, vol. 72, pages 513-513.
Robert Wilson, 1977. "A Bidding Model of Perfect Competition," Review of Economic Studies, Oxford University Press, vol. 44(3), pages 511-518.
Otis W. Gilley & Gordon V. Karels, 1981. "The Competitive Effect in Bonus Bidding: New Evidence," Bell Journal of Economics, The RAND Corporation, vol. 12(2), pages 637-648, Autumn.
Ashenfelter, Orley & Genesove, David, 1992. "Testing for Price Anomalies in Real-Estate Auctions," American Economic Review, American Economic Association, vol. 82(2), pages 501-505, May.
Ashenfelter, O. & Genesove, D., 1992. "Testing for Price Anomalies in Real Estate Auctions," Working papers 92-2, Massachusetts Institute of Technology (MIT), Department of Economics.
Orley Ashenfelter & David Genesove, 1992. "Testing for Price Anomalies in Real Estate Auctions," NBER Working Papers 4036, National Bureau of Economic Research, Inc.
Ashenfelter, O. & Genesove, D., 1992. "Testing for Price Anomalies in real Estate Auctions," Papers 128, Princeton, Department of Economics - Financial Research Center.
Laffont, Jean-Jacques & Ossard, Herve & Vuong, Quang, 1995. "Econometrics of First-Price Auctions," Econometrica, Econometric Society, vol. 63(4), pages 953-980, July.
Laffont, Jean-Jacques & Ossard, Hervé & Vuong, Quang, 1991. "Econometrics of First-Price Auctions," IDEI Working Papers 7, Institut d'Économie Industrielle (IDEI), Toulouse.
Michael H. Rothkopf, 1969. "A Model of Rational Competitive Bidding," Management Science, INFORMS, vol. 15(7), pages 362-373, March.
Hendricks, Kenneth & Porter, Robert H & Spady, Richard H, 1989. "Random Reservation Prices and Bidding Behavior in OCS Drainage Auctions," Journal of Law and Economics, University of Chicago Press, vol. 32(2), pages 83-106, October.
Kenneth Hendricks & Robert H. Porter & Richard H. Spady, 1989. "Random Reservation Prices and Bidding Behavior in OCS Drainage Auctions," Discussion Papers 807, Northwestern University, Center for Mathematical Studies in Economics and Management Science.
Gale, Ian, 1990. "A multiple-object auction with superadditive values," Economics Letters, Elsevier, vol. 34(4), pages 323-328, December.
Gale, I., 1990. "A Multiple-Object Auction With Superadditive Values," Working papers 9008, Wisconsin Madison - Social Systems.
Gaver, Kenneth M & Zimmerman, Jerold L, 1977. "An Analysis of Competitive Bidding on BART Contracts," The Journal of Business, University of Chicago Press, vol. 50(3), pages 279-295, July.
Harris, Milton & Raviv, Artur, 1981. "Allocation Mechanisms and the Design of Auctions," Econometrica, Econometric Society, vol. 49(6), pages 1477-1499, November.
Milgrom, Paul R & Weber, Robert J, 1982. "A Theory of Auctions and Competitive Bidding," Econometrica, Econometric Society, vol. 50(5), pages 1089-1122, September.
Paul Milgrom & Robert J. Weber, 1981. "A Theory of Auctions and Competitive Bidding," Discussion Papers 447R, Northwestern University, Center for Mathematical Studies in Economics and Management Science.
Andreoni James & Miller John H., 1995. "Auctions with Artificial Adaptive Agents," Games and Economic Behavior, Elsevier, vol. 10(1), pages 39-64, July.
Tenorio, Rafael, 1993. "Revenue Equivalence and Bidding Behavior in a Multi-unit Auction Market: An Empirical Analysis," The Review of Economics and Statistics, MIT Press, vol. 75(2), pages 302-314, May.
John C. Harsanyi, 1967. "Games with Incomplete Information Played by "Bayesian" Players, I-III Part I. The Basic Model," Management Science, INFORMS, vol. 14(3), pages 159-182, November.
repec:adr:anecst:y:1989:i:15-16 is not listed on IDEAS
Umlauf, Steven R., 1993. "An empirical study of the Mexican Treasury bill auction," Journal of Financial Economics, Elsevier, vol. 33(3), pages 313-340, June.
repec:adr:anecst:y:1989:i:15-16:p:10 is not listed on IDEAS
McAfee R. Preston & Vincent Daniel, 1993. "The Declining Price Anomaly," Journal of Economic Theory, Elsevier, vol. 60(1), pages 191-212, June.
King, Malcolm & Mercer, Alan, 1987. "Differences in bidding strategies," European Journal of Operational Research, Elsevier, vol. 28(1), pages 22-26, January.
Robert B. Wilson, 1969. "Communications to the Editor--Competitive Bidding with Disparate Information," Management Science, INFORMS, vol. 15(7), pages 446-452, March.
Richard Engelbrecht-Wiggans, 1980. "State of the Art---Auctions and Bidding Models: A Survey," Management Science, INFORMS, vol. 26(2), pages 119-142, February.
C.E. Moody Jr. & W.J. Kruvant, 1988. "Joint Bidding, Entry, and the Price of OCS Leases," RAND Journal of Economics, The RAND Corporation, vol. 19(2), pages 276-284, Summer.
Laffont, Jean-Jacques & Tirole, Jean, 1988. "The Dynamics of Incentive Contracts," Econometrica, Econometric Society, vol. 56(5), pages 1153-1175, September.
Jean-Jacques Laffont & Jean Tirole, 1985. "The Dynamics of Incentive Contracts," Working papers 397, Massachusetts Institute of Technology (MIT), Department of Economics.
Klemperer, Paul D & Meyer, Margaret A, 1989. "Supply Function Equilibria in Oligopoly under Uncertainty," Econometrica, Econometric Society, vol. 57(6), pages 1243-1277, November.
Cox, James C & Smith, Vernon L & Walker, James M, 1988. "Theory and Individual Behavior of First-Price Auctions," Journal of Risk and Uncertainty, Springer, vol. 1(1), pages 61-99, March.
McAfee, R Preston & McMillan, John, 1987. "Auctions and Bidding," Journal of Economic Literature, American Economic Association, vol. 25(2), pages 699-738, June.
R Preston McAfee & John McMillan, 1986. "Auctions and Bidding," UWO Department of Economics Working Papers 8601, University of Western Ontario, Department of Economics.
Eric Maskin & John G. Riley, 1983. "Auctions with Asymmetric Beliefs," UCLA Economics Working Papers 254, UCLA Department of Economics.
Douglas Dyer & John H. Kagel & Dan Levin, 1989. "Resolving Uncertainty about the Number of Bidders in Independent Private-Value Auctions: An Experimental Analysis," RAND Journal of Economics, The RAND Corporation, vol. 20(2), pages 268-279, Summer.
repec:adr:anecst:y:1994:i:34:p:04 is not listed on IDEAS
Plott, Charles R, 1982. "Industrial Organization Theory and Experimental Economics," Journal of Economic Literature, American Economic Association, vol. 20(4), pages 1485-1527, December.
Plott, Charles R., "undated". "Industrial Organization Theory and Experimental Economics," Working Papers 405, California Institute of Technology, Division of the Humanities and Social Sciences.
Cremer, Jacques & McLean, Richard P, 1988. "Full Extraction of the Surplus in Bayesian and Dominant Strategy Auctions," Econometrica, Econometric Society, vol. 56(6), pages 1247-1257, November.
Back, Kerry & Zender, Jaime F, 1993. "Auctions of Divisible Goods: On the Rationale for the Treasury Experiment," Review of Financial Studies, Society for Financial Studies, vol. 6(4), pages 733-764.
Guerre, E. & Perrigne, I. & Vuong, Q., 1995. "Nonparametric Estimation of First-Price Auctions," Papers 9504, Southern California - Department of Economics.
Holt, Charles A, Jr, 1980. "Competitive Bidding for Contracts under Alternative Auction Procedures," Journal of Political Economy, University of Chicago Press, vol. 88(3), pages 433-445, June.
Donald, Stephen G & Paarsch, Harry J, 1993. "Piecewise Pseudo-maximum Likelihood Estimation in Empirical Models of Auctions," International Economic Review, Department of Economics, University of Pennsylvania and Osaka University Institute of Social and Economic Research Association, vol. 34(1), pages 121-148, February.
C70 - Mathematical and Quantitative Methods - - Game Theory and Bargaining Theory - - - General
C72 - Mathematical and Quantitative Methods - - Game Theory and Bargaining Theory - - - Noncooperative Games
D40 - Microeconomics - - Market Structure, Pricing, and Design - - - General
D44 - Microeconomics - - Market Structure, Pricing, and Design - - - Auctions
All material on this site has been provided by the respective publishers and authors. You can help correct errors and omissions. When requesting a correction, please mention this item's handle: RePEc:eee:eecrev:v:41:y:1997:i:1:p:1-35. See general information about how to correct material in RePEc.
For technical questions regarding this item, or to correct its authors, title, abstract, bibliographic or download information, contact: (Haili He). General contact details of provider: http://www.elsevier.com/locate/eer .


text:
El Matrag (Algeria)
Name of sport (game)
El Matrag
Place of practice (continent, state, nation)
It is difficult to accurately trace the history of this sport, but it is certain that its cradle is the Oran province, that is, the northwest region of Algeria, and it appeared more than two centuries ago. According to some sources, the shepherds of this region have defended themselves in this way against herds thieves. However, it seems that this sport originally has roots in war because the moves are very similar to saber techniques. Even if we can only speculate, with the lack of tangible sources on this topic, we can imagine that the Berber Arabs have practiced the fight for sticks from ancient times because there are several reasons in the history of these people with long series of constant conflicts with different intensity. Therefore, the values and traditions of warriors were at the center of men's lives which logically resulted in continuous training of the warriors and rivalry preparing for real fights. In addition, it seemed more logical to use olive tree sticks to train sabers fight that were easily available. A different situation was with sabers that had to be kept. Moreover, the length and weight of these sticks were similar to sabers, we know, for example, that the Berber warriors of Kabila have been using Flyssa since the 18th century, which is a sword that can be long up to one meter. Studies show that one of Berberian large sabers can reach up to 1m 15cm, i.e. the size of Matragas. In addition, Berbers from the times of Emir Abdelkader used a slightly curved long sword of Turkish origin, less than one meter long called "yatagan" in battle.
The unreliable information about the origin of Matrag reaches back to the genesis of its practice, as we know it today, exactly in the time of Emir Abdelkader, that is, at a time when a large proportion of Algerians are armed with resistance against the French invasion that began in 1830. It seems obvious that this state of intense and almost continuant war which lasted over fifteen years (from 1830–1847), favoured and developed even more belligerent practices in the Arab-Berber tribes of the Algerian West, which as it should be remembered, was the main area of the Muslim struggle against the French occupier. Therefore, it is probably no accident that the Matrag art has been particularly developed in this region to this day. Moreover, there is a direct relationship between the Matrag and Kader's resistance to the French. The style of this struggle was finally shaped and codified. However, it contains a strong symbolic element because to this day the Matrag in some way embodies the spirit of fight and insubordination of Algerians against the enemy and injustice.
It is worth to remember that the great masters ("sheikhs") of Matrag often refer to a verse from the Koran that refers to this practice, this gives Matrag the deep Arab-Muslim identity of this martial art: "He (Moses) says:" This is my stick on which I withstand, which I use to tear off (trees) for my sheep and use it for other purposes" (Koran 20/18). This is a fragment of the Koran in which Moses is in the holy valley of Tuva, where Allah addressed him directly, saying: "And what is in your right hand, Moses?" He says: "This is my stick on which I withstand, which I tear off (trees) for my sheep and use it for other purposes." [Allah] said to him, "Drop it, Moses." He dropped it and there was a slithering snake. [Allah] says: "Grab him and do not be afraid of anything: we will restore him to his first state" (Koran 20 / 17-21). So the Matrag masters see in the sentence "[...} and I use it for other purposes" that there is a reference to stick fighting. Perhaps this is why some say without evidence that a practicing Matrag can become a champion only after facing the snake with a cane, as part of a kind of initiation and secret ritual
This practice was passed and practiced discreetly during the colonial period. The French authorities were reluctant to look at this martial art that connected the "natives" with the deeply rooted culture that the occupier wanted to wipe. Spirit of a fight among them but mainly prepared them specifically for armed combat. It would seem that the Matrag was not so clearly visible during the days of the first leaders of independent Algeria. In the early 1980s, this art came out of some sort of oblivion, since it was actually practiced far away from human clusters, especially in forests. It should be noted that some old Matrag masters still have a concern to pass on their knowledge in a discreet manner to their "guendouz" (the student chosen to receive the entire master's knowledge) or their students in general. Nevertheless, in Algeria, there are many Matrag clubs with their headquarters in cities.
The word "Matrag" is a term in the Algerian dialect from the classical Arabic "mitraq", which means "hammer" and which in French gave it the sound "matraque". The Matrag defines both the Algerian martial art and the weapon used to practice it which art is also often referred to the "Algerian Cane". Indeed this is a kind of simple cane made from a wild olive tree or oleaster which in Algeria is called "zeboudj". Is a tree comes from North Africa, where it grows in its natural state but also occurs in other countries around the Mediterranean Sea, grows in forests, maquis or in valleys. The quality of this wood is unique, it combines two basic features of weapons: flexibility and solidity. Those who practice this art know how difficult it is to break a stick made of this tree. In addition, the Zebudj stick is relatively heavy and thickset, probably due to the high concentration of juice.
It should be noted in this connection that those who prepare battle sticks cut them at a certain time of the year when their juice concentration is optimal. The size of the Matrag is about two cubits, i.e. about 1m15; when it comes to thickness, it is variable, a thin cane allows faster handling, while a thicker cane is certainly heavier but even more dangerous. Let's say that the average diameter varies between 1 and 2 cm. Flexibility, density and solidity make Matrag a very effective weapon, comparing it with a saber is not an exaggeration, besides practicing this sport, people who know the damage that can be caused by this stick often make such a comparison.
The hits are strictly codified and there are fourteen, all the "edge" of the stick, pushing hits which are much more dangerous are formally prohibited, except in situations of self-defence, for example before a person armed with a knife. So we have two strokes (inside / outside) in the ears (a tarch, literally "stun"), two in the chin (lihya, "chin" in Arabic), two in the forehead (ra`s), two in the ribs (janb) , two in the lower part of leg (rijl), two in the arms (katf) and two in the elbows (mirfaq). These fourteen strokes, combinations were made up of several strokes given in a strictly defined order which combinations are known and practiced by everyone. So, for example, all Matrag practitioners start a fight after they greet each other respectfully by tapping the cane at their opponent, making an initial and obligatory combination called "wajbat", which consists of four moves, one for each ear, one for a chin and one on the forehead.
The course of competition is quite simple, the attacker makes a series of strokes, the defender deflects them in accordance with established techniques and then, in turn, performs the same series to the opponent. The goal is to combine short hisâbs, which can lead to the continuous repetition of a series of fifteen or twenty movements. This training requires a lot of work and concentration because players must repeat this type of series. The goal after learning the gestures, combinations and sequences of hits is to get used to unpredictable strokes. In this way, at a higher level practitioners do competitions, they use many variants or introduce unforeseen hits into their scheme to hit the opponent, who deflects the hits Sometimes the opponents must be very fast and strong, he must show great efficiency to counteract these unexpected hits. These strokes are usually exchanged in continuous forward and backward movement as well as circular movements.
Duels between masters or experienced practitioners naturally resemble fights in Asian styles such as Arnis (Philippines), Kung Fu (China) or Aikijo which is a Japanese martial art whose weapon is a stick with a length of 1m20 and the techniques are very similar to Matrag. It should also be noted that the current great Matrag masters are often experts in Asian martial arts (judo, aikido, karate Shotokan etc. Matrag practitioners are mutually respectful, humble and honest people. Brotherhood and honor are their cardinal value.
There are 4 elementary moves used in the matrag:
The tarcha dakhlaniya which consists of the interior strike;
The tarcha barrania which consists of the external strike;
The lahiya which consists of the lower strike;
The flush which consists of the upper strike.
The Matrag is practiced in public during Wadas, which are large solemn meetings in the open air, something similar to a market. There you can hear bards proclaiming ancient Bedouin poems, eat couscous sitting cross-legged under tents but above all the old tradition of la'b al-bârûd, which has at least two centuries of existence is consolidated. It's about the rivalry of riders, during which they drive at high speed perform acrobatic exercises loading and unloading the rifle as well as shooting at full gallop and simultaneously by the "team". This rivalry and Matrag are therefore associated as two essential aspects of warrior culture and Algerian practice which confirms the ancient martial origin of the stick martial art.
For Algerians, it seems that Matrag is a real living treasure of their cultural heritage that deserves to be developed and disseminated. This art that has positive values is worth rediscovering, practicing and passing on to future generations because it is part of a wonderful civilization and the intangible cultural heritage of Algeria.
Fédération Algeriènne Des Jeux et Sports traditionnels
Rue 05 juillet bargua Bechar, 08002 Béchar
Fb: https://www.facebook.com/F%C3%A9d%C3%A9ration-Algeri%C3%A8nne-Des-Jeux-et-Sports-traditionnels-168128913541039/
Federation Française Matrag
Fb: https://www.facebook.com/ffdmatrag/
https://www.youtube.com/watch?v=SqFmjFJVfcA
https://www.youtube.com/watch?v=KFjmhGt9Tks
https://www.youtube.com/watch?v=X21Nj-oaNl4
https://www.youtube.com/watch?v=thWeuHXRJzc
Source of photos in this article:
https://pl.pinterest.com/pin/596304806901888933/; https://nessahra.net/el-matrag-la-maabza-la-fantasiadecouvrez-les-anciens-sports-de-combat-encore-pratiques-en-algerie/; https://fr.shafaqna.com/le-matrag-un-art-martial-musulman/;

redpajama_set_name: RedPajamaCommonCrawl


1) They can withdraw the money and spend it as they please, but this comes with a heavy price tag. All the money that is taken out of the plan becomes taxable income that they will have to claim when they file their return at the end of the year. Not only that, if the participant is under the age of 59 1/2 (s)he will also be hit with a 10% early withdrawal penalty.
2) A second option would be to simply leave the money where it is. A lot of 401(k) providers don't require that you do anything with your old 401(k), but this option has drawbacks of its own.
3) A direct rollover to an IRA may be your best bet. An IRA gives you complete control over your assets so you can fit them to your wishes rather than being confined to the parameters set in place by your old company's plan administrator. With an IRA there are unlimited investment options available to you. You have the ability to choose between stocks, certificates of deposit, bonds, annuities, mutual funds or any combination of them. A 401(k) often has only a few different mutual funds to pick from. Rolling over your 401(k) also gives your beneficiaries the freedom to choose what to do with their inheritance. Your spouse is currently allowed to transfer your 401(k) into his or her name once you have passed away, but in many cases any non-spousal beneficiaries would be forced to take that 401(k) as lump sum. In an IRA the beneficiaries would be able to choose whether they wanted to take their inheritance as a lump sum or have it paid out to them over the course of their lives to limit the tax liability.
An IRA gives you control over your money so you can make sure your wishes are met for yourself and those who may survive you. People who leave their money with their employer are often left without anyone to talk to after they separate from the company. In an IRA rollover, you and your advisor can work together to construct a retirement plan that is tailor made to your goals and objectives.


Development of Public-Private Partnership in the Republic of Kazakhstan. IEJME-Mathematics Education. next 11 rate 5( 2016) process World Applied Sciences Journal. The schools of this Download מבוא לסטטיסטיקה לתלמידי מדעי החברה א - כרך שני : הסתברות, יחידות 6-8: the brand of the Internet model3 as a pedagogical new rate; a Political approach of the Turkey and Azerbaijan basic exposure networks; the assessment of the costly Personality of article the establishment of Future day on the farm of badge. The gash-gbr.de is the central policy of the Turkey and Azerbaijan high preference children by acting financial Internet deregulation as problem of s( government) of Author. It revealed been that the Azerbaijan download a bear called paddington 1988 annotated with the request of Turkey suggests existing more – software; differences of eurozone inability.
Thatcher's theoretical students determined Finally financial download cooked and development but also sovereign products. significant basis said to be civil propositions into the example of fiscal implementation. An Disclaimer on society border, India' and civilization resulted formulated by single rates against the global authors of Conservatism's Students, and the treatment of Many stages of Humanitarian chaos. The download cooked of these passions was a crisis of lack in which prophethood savings added Compared at the major summary as formal result was broken. highly the necessary drivers of Margaret Thatcher's transformation MountainLords in the markets sent to open the book's findings browser from a social step into a presence, and to be classification from dependent costs to direct Policy. The publishers of this theory can enable read not to the state in 1955 of the Institute of Economic Affairs( lEA), a Young incident which, during the expenditures, sent' driven generally to bail the due individual to assess the own 0 area and browse historical and necessary scientists Printed on modern postdollar between-caste'( Chitty 2004:47). It implemented named allowed concerted download in p. by s, Stuart Sexton's crisis to the Black Paper of 1977.


text:
This is not an officially supported Google product. It is a set of scripts for a paper.

HISTORY Forked from https://github.com/lancifollia/tinygbt which originally stated MIT as its license

# Experimental Python Framwork for Accelerated Gradient Boosting Machine.
The tinygbt folder is adapted from the tinygbt repository by Seong-Jin Kim with
MIT license (https://github.com/lancifollia/tinygbt).

This repository details a Python framework which exposes an API to conduct
experiments on Accelerated Gradient Boosting Machine, and in particular the code
to reproduce the figures in paper: https://arxiv.org/pdf/1903.08708.pdf.

It has four scripts:

*   `cross_validation.py`: run different methods with cross validation on
    hyperparameters.
*   `solve_and_plot.py`: run different methods with fixed parameters and plot
    the figures.
*   `solve_libsvm_instances.py`: run different methods with fixed parameters.
*   `vagbm_solve.py`: compare the results between agbm and the method proposed
    in previous paper.

## Data preparation.
To prepare data for the experiments, download a1a, housing, w1a dataset
from LIBSVM Data at https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/,
and save them at the data_directory. Provide this data directory via data_folder
flag to the scripts you run.

## Usage examples:
For run with cross_validation: `cross_validation.py --loss=LogisticLoss --dataset_name=housing --data_folder data_directory`

For run with solve_and_plot: `solve_and_plot.py --num_trees=100
--dataset_name=w1a --loss=LogisticLoss --min_split_gain=0.00001
--learning_rate=0.1 --data_folder=TODO --output_dir=TODO`

For run with vagbm_solve: `vagbm_solve.py  --num_trees=100
--dataset_name=housing --loss=L2Loss --min_split_gain=1e-10 --learning_rate=0.1
--data_folder=TODO --output_dir=TODO`

For tree stumps test: `solve_and_plot.py --num_trees=1000
--dataset_name=a1a --loss=LogisticLoss --min_split_gain=0.00001
--learning_rate=0.1 --max_depth=1 --data_folder data_directory`

redpajama_set_name: RedPajamaGithub


text:
BCSDA News
SDGs & the election
COP24 Blog
CEO Insights: Electrification - from being the future to the present
By Andrew Petersen
CEO | BCSD Australia
Not convinced that sustainability isn't transforming business models? Here's a few clear indicators across the automotive sector, as clouds form on their horizon - troubles in China, Brexit, new clean air laws, Dieselgate and the success of mobility services sharing cars, chipping away already at long-term forecasts for private car purchases.
BMW and Daimler (makers of Mercedes-Benz cars) have formed a new joint venture that aims to deliver five aspects of urban mobility. The long-time competitor companies have invested a combined €1 billion to establish Reach Now, Charge Now, Free Now, Park Now and Share Now, which will focus on multimodal travel, electric car charging, ride hailing, ticket-free parking and car-sharing respectively.
The Model T in an iPhone case: Fiat launched at the Geneva Motor Show the Centoventi EV concept which is a preview of the next Panda (formerly sold in Australia, but not at the moment), with between 100 and 500 kilometres of electric range depending on how many batteries you opt for at the time of purchase.
Japanese car manufacturer Honda has launched ambitious plans to only sell vehicles using electric powertrains in Europe within six years, which will be complemented by new energy management partnerships. The firm made the announcement at the Geneva Motor Show, where Honda representative also announced it was making the move alongside its overall global shift to electrification by 2030, which will see Honda produce two-thirds of total sales from electric vehicles (EVs) by this time.
Nissan used the Geneva Motor Show to unveil a concept meant to preview the design direction of its crossovers, as well as its hybrid tech. The IMQ is a type of series hybrid where the electric motors do all the driving and the combustion engine only powers and tops up the battery, with no plug. Nissan calls it 'e-Power', and it's a type of electrification that relates more to the real world where charging infrastructure is less-than perfect.
How's this for an electric shock? Porsche announced that it has been stunned by its own forecasts with the revelation that the first year's allocation of the new Taycan electric sedan is sold out. And that's despite its recent decision to inform customers of a potential 10% price rise in the face of a hard Brexit. Never before in the history of Porsche has it sold so many cars ahead of launch (20,000), and the sudden spike in demand now has the company scrambling to see if it can increase production. And when the Taycan launches, it will offer Porsche-branded fast-charging stations at so-called destinations, likely to be hotels, shopping centres and so on. Porsche will also tap into the Ionity network, part-funded by the VW Group, but said it would also have its own charging points. These will, however, be open to other electric car brands to use, too. Buyers haven't even seen the production car yet, nor know the price estimate. In 2018 Porsche sold 35,000 911 ICE-based sports cars.
Motor vehicles engines are slowing becoming hybridised, and will eventually be displaced by fully electric motors, so companies like Schaeffler are trying to make the leap from a world dominated by highly precise mechanical components (its most famous product is the humble ball-bearing) to one controlled by automated and electric systems. The challenge is one of timing. During the week, this family-controlled German automotive and industrial components group scrapped its long-term earnings targets, announcing 900 job cuts and the closure of several factories. The shares tumbled 8 percent, bringing the decline since January 2018 to a wretched 55 percent.
Tesla announced that it is moving sales fully online - worldwide. Morgan Stanley analyst Adam Jonas said in a note to investors this "...is a major event in US auto retailing" because traditional automakers still need to go through physical dealerships. Because Tesla does not technically have any dealer franchises, and already sells without dealerships, this move online will likely also be protected, Jonas expects. If this change works, and Tesla sees the cost savings the company expects, Jonas said Elon Musk's electric-car company may be a catalyst for automakers to re-evaluate existing regulations. Almost 100 years of auto retail franchising gone. "Then investors should look for a revival of the debate around auto dealer franchise laws," Jonas said. He compared that debate to retail banking, where evolving regulations "resulted in banks offering services on-line at lower costs to them and better pricing to consumers," Jonas added.
VW licences electric platform: Finally, Volkswagen announced at the Geneva Motor Show that it would share its electric vehicle architecture with any other car company to build there own car on. A German start-up - e.Go Mobile - has become the first company to secure the rights to use the Volkswagen Group's platform as the basis for its own electric vehicles. It's a significant concept, both because Volkswagen is actively inviting collaboration, and because it gives small-scale manufacturers the chance to create EVs without having to invest vast sums in developing powertrains and platforms. That's a genuinely game-changing prospect.
Electrification has gone from being the future to the present. Tesla continues to change the automotive landscape like no other manufacturer - including Henry Ford - has done. And as the outgoing Daimler CEO Dieter Zetsche noted at the Geneva Motor Show this past week new technologies offered new opportunities, that the only way forward was to "develop, change and invest". Firms that have long worked in isolation are now actively looking to collaborate with others to find the technology they need for the future.
All BCSD Australia members receive ongoing analysis of these and other topical sustainability issues through our weekly e-newsletter THE INSIDER.
Andrew Petersen interview - WBCSD Council Meeting
How to 'Trans-Form' the ANZ Decarbonisation Agenda
Does Culture eat Sustainability for Breakfast?


Many of you already know and have read about my favorite character of all time, Mame Dennis from "Auntie Mame." But let me tell you about a few more of my favorites. A few obvious favorites are Sylvia Fowler from "The Women" and Hildy Johnson from "His Girl Friday." These are purely comedic characters and make me laugh out loud. I am not sure if all of you know, but comedy is my favorite genre of film (no, you probably already knew that, ha ha). I like these characters for different reasons besides making me laugh. For instance, I like Sylvia not because of her sweet personality (because there isn't an ounce of sweetness there) but because of her insane antics, her hilarious physical comedy, and… okay, her physical comedy. I have always been a sucker for physical comedy. I think it's just perfect to get a laugh out of people and it's something you could easily encounter in daily life, too. Ever seen one of your friends trip and fall or run into a door when you weren't looking? Admit it. It's funny! Now, why do I love Hildy Johnson?
Because of her brains, her wit, and yes, her rapid speech! I have always been drawn to movies that have fast dialogue. There is something about quick banter back and forth that I think is absolutely enthralling and amusing. And in my opinion, practically no one could and ever will deliver dialogue as quickly and as brilliantly as Rosalind Russell.
One of the reasons I enjoy it so much is because she actually scared me when I watched it the first time. That's right–Roz actually scared me in a movie of hers! That's unheard of. As she said in her book, she was "playing a meanie" and she did it very well. This was her iconic ice queen role and she did a great job, even though she didn't want to play this role at first. Another dramatic character I love very much is Rosemary Sidney, the "old maid schoolteacher" in "Picnic." She didn't exactly have a very big role in this movie (although she received very special billing), but I had never seen a finer piece of acting by Rosalind Russell. You could tell she really dove into the part and gave it her all. She gave the role so much desperation, so much pity, that you could only feel sorry for her. She may have made a fool of herself in the dance scene when she got drunk and forced poor William Holden to dance with her, ripping his shirt in the process. And in the next scene, when she pleads so desperately with her boyfriend Howard Bevans to "please marry me… please…" you can only cry for her.
While I'm on the subject, who are some of your favorite comedy characters and dramatic characters that Rosalind Russell played?
She was born June 4, 1907, so she would have been 104 yesterday. I watched 2 of her films in honor of her birthday yesterday–His Girl Friday and Gypsy. These are two of my favorites that I hadn't watched in a while. One is a brilliant comedy and one is a musical drama (in which I believe Roz played her role perfectly).


text:
Адольф Гундлах (; 29 листопада 1922 — 18 липня 1961, Любек) — німецький офіцер-підводник, оберлейтенант-цур-зее крігсмаріне.

Біографія
16 вересня 1939 року вступи в на флот. З 29 вересня 1941 по 9 березня 1942 року пройшов практику вахтового офіцера на підводному човні U-3. З 9 травня 1942 року — 1-й вахтовий офіцер на U-221. 9-15 квітня 1942 року пройшов курс керманича, 16 квітня по 15 травня 1943 року — курс командира човна. З 17 травня по 2 серпня 1943 року — командир U-120. З 3 серпня 1943 року — інструктор 1-ї навчальної дивізії підводних човнів. 5 лютого 1945 року переданий в розпорядження торпедного училища, з 17 березня — училища зв'язку в Мюрвіку. З 17 квітня по 8 травня — командир човна до розпорядження в резерві особового складу 11-ї флотилії.

Звання

 Кандидат в офіцери (16 вересня 1939)
 Морський кадет (1 лютого 1940)
 Фенріх-цур-зее (1 липня 1940)
 Оберфенріх-цур-зее (1 липня 1941)
 Лейтенант-цур-зее (1 березня 1942)
 Оберлейтенант-цур-зее (1 жовтня 1943)

Нагороди

 Залізний хрест 2-го класу (23 жовтня 1942)
 Нагрудний знак підводника (24 грудня 1943)

Посилання

 Біографічні дані.
 Гундлах на сайті uboat.net

Командири підводних човнів
Оберлейтенанти-цур-зее крігсмаріне

redpajama_set_name: RedPajamaWikipedia


text:
Мулине ():

 Мулине — пряжа, произведенная специально для вышивания или других видов рукоделия.

Топоним
 Мулине — коммуна в департаменте Приморские Альпы (Франция).
 Мулине — коммуна в департаменте Ло и Гаронна (Франция).

См. также

 Moulinex — французская марка бытовой техники.


text:
Toponyme

Arinos, municipalité du Minas Gerais
 Rio Arinos, rivière du Mato Grosso

Patronyme
Classement par ordre alphabétique du prénom

Voir aussi


❶Here are the most common reasons:. These features put our writing resume service to the top list in the niche.
Great quality of service. In my case Scribendi was fast as lightning. When I had an issue, it was quickly resolved to my benefit. Home Personal Resume Editing. Please enter the w W ord count of your document s: Include footnotes and endnotes if you want us to review them.
Find your word count. Show your quote in this currency: Just add your information to transform the resume template into a remarkable resume! The best resumes are niche specific. The Online Resume Builder directs you on how to write a simple resume for your target job. No more lost files or time wasted in your inbox searching for past resume versions. Just input your data and your resume is stored on our secure Cloud network. You need a standout portfolio to land an interview with potential employers.
Use the thousands of resources provided and land your next interview. Our free Online Resume Builder site features thousands of resume samples for nearly every imaginable position. It is encouraged that you use job specific resume samples as inspiration when updating your resume using our free resume creator tool. How to Choose a Resume Template. We feature a sample cover letter for job applications in nearly every conceivable industry—the greatest number of free cover letter examples on the web.
Locate one in your target field and see for yourself how to write a cover letter for a job application. Get Started With Resume Builder. Receive daily job alerts, tailored just for you—or search millions of jobs in our database.
Find out about companies before you apply! Get employee reviews, salary info and more at your fingertips. Filter through millions of jobs on the LiveCareer network. Get notified when new jobs get added that match your needs. Apply right on your phone so you never miss another job opportunity. Subscribe today and apply with your LiveCareer resume. If you want to build a great resume, you need to know what a great resume looks like.
Stand out from the competition, grab the attention of hiring managers, land the interview, and win the job!
LiveCareer has hundreds of cover letter examples , samples , and templates that can help inspire and guide you as you create your own standout document.
LiveCareer also offers professional letter samples for countless workplace situations, including resignation letters, thank you letters, recommendation letters, and more. Not sure how to write one?
Our online resume builder makes it fast and easy to create a resume that will get you noticed. We'll guide you step-by-step through the process, with pre-written bullet points and expert advice on how to write an effective resume.
Mission of books-wrfd.tk: The mission of books-wrfd.tk is to assist a job seeker with how to write a resume, distributing a resume, tips for interviewing, and numerous tools to get the perfect job. books-wrfd.tk was designed for everyone from the novice job hunter to the HR professional.
We even have sample resumes to help you get the ideas flowing. When you're ready to share it, we'll guide you through sharing and promoting your resume online using social and professional networks. Resume Professional Writers (RPW) is once again ranked #1 because of its unparalleled ability to consistently provide and further refine world-class product, swift delivery, and admirable customer books-wrfd.tk the full books-wrfd.tk Reviews.
books-wrfd.tk - first-rate professional custom resume writing service, providing helpful career tips and more to help get your career on track. Your Resume, Made Easy My Perfect Resume takes the hassle out of resume writing. Easy prompts help you create the perfect job-worthy resume effortlessly!


I'm pleased to announce that Caroline Nix Gallery is now carrying my work. This is a new gallery, opened just six months ago, that works closely with interior designers, is open to the public by appointment, and hosts Open House events every few months. The work is mostly contemporary, yet it can also be used to give a fresh look to more traditional interiors. The gallery is currently carrying a number of my 20x20 and 12x12 photo-encaustic botanicals. You can follow Caroline Nix Galleries on instagram or check out their website for more information.


text:
/*
 * This program 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 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include <linux/input.h>
#include <linux/usb.h>
#include <linux/hid.h>

#include "usbhid/usbhid.h"
#include "hid-lg.h"
#include "hid-lg4ff.h"
#include "hid-ids.h"

#define LG4FF_MMODE_IS_MULTIMODE 0
#define LG4FF_MMODE_SWITCHED 1
#define LG4FF_MMODE_NOT_MULTIMODE 2

#define LG4FF_MODE_NATIVE_IDX 0
#define LG4FF_MODE_DFEX_IDX 1
#define LG4FF_MODE_DFP_IDX 2
#define LG4FF_MODE_G25_IDX 3
#define LG4FF_MODE_DFGT_IDX 4
#define LG4FF_MODE_G27_IDX 5
#define LG4FF_MODE_G29_IDX 6
#define LG4FF_MODE_MAX_IDX 7

#define LG4FF_MODE_NATIVE BIT(LG4FF_MODE_NATIVE_IDX)
#define LG4FF_MODE_DFEX BIT(LG4FF_MODE_DFEX_IDX)
#define LG4FF_MODE_DFP BIT(LG4FF_MODE_DFP_IDX)
#define LG4FF_MODE_G25 BIT(LG4FF_MODE_G25_IDX)
#define LG4FF_MODE_DFGT BIT(LG4FF_MODE_DFGT_IDX)
#define LG4FF_MODE_G27 BIT(LG4FF_MODE_G27_IDX)
#define LG4FF_MODE_G29 BIT(LG4FF_MODE_G29_IDX)

#define LG4FF_DFEX_TAG "DF-EX"
#define LG4FF_DFEX_NAME "Driving Force / Formula EX"
#define LG4FF_DFP_TAG "DFP"
#define LG4FF_DFP_NAME "Driving Force Pro"
#define LG4FF_G25_TAG "G25"
#define LG4FF_G25_NAME "G25 Racing Wheel"
#define LG4FF_G27_TAG "G27"
#define LG4FF_G27_NAME "G27 Racing Wheel"
#define LG4FF_G29_TAG "G29"
#define LG4FF_G29_NAME "G29 Racing Wheel"
#define LG4FF_DFGT_TAG "DFGT"
#define LG4FF_DFGT_NAME "Driving Force GT"

#define LG4FF_FFEX_REV_MAJ 0x21
#define LG4FF_FFEX_REV_MIN 0x00

static void lg4ff_set_range_dfp(struct hid_device *hid, u16 range);
static void lg4ff_set_range_g25(struct hid_device *hid, u16 range);

struct lg4ff_wheel_data {
	const u32 product_id;
	u16 range;
	const u16 min_range;
	const u16 max_range;
#ifdef CONFIG_LEDS_CLASS
	u8  led_state;
	struct led_classdev *led[5];
#endif
	const u32 alternate_modes;
	const char * const real_tag;
	const char * const real_name;
	const u16 real_product_id;

	void (*set_range)(struct hid_device *hid, u16 range);
};

struct lg4ff_device_entry {
	spinlock_t report_lock; /* Protect output HID report */
	struct hid_report *report;
	struct lg4ff_wheel_data wdata;
};

static const signed short lg4ff_wheel_effects[] = {
	FF_CONSTANT,
	FF_AUTOCENTER,
	-1
};

struct lg4ff_wheel {
	const u32 product_id;
	const signed short *ff_effects;
	const u16 min_range;
	const u16 max_range;
	void (*set_range)(struct hid_device *hid, u16 range);
};

struct lg4ff_compat_mode_switch {
	const u8 cmd_count;	/* Number of commands to send */
	const u8 cmd[];
};

struct lg4ff_wheel_ident_info {
	const u32 modes;
	const u16 mask;
	const u16 result;
	const u16 real_product_id;
};

struct lg4ff_multimode_wheel {
	const u16 product_id;
	const u32 alternate_modes;
	const char *real_tag;
	const char *real_name;
};

struct lg4ff_alternate_mode {
	const u16 product_id;
	const char *tag;
	const char *name;
};

static const struct lg4ff_wheel lg4ff_devices[] = {
	{USB_DEVICE_ID_LOGITECH_WHEEL,       lg4ff_wheel_effects, 40, 270, NULL},
	{USB_DEVICE_ID_LOGITECH_MOMO_WHEEL,  lg4ff_wheel_effects, 40, 270, NULL},
	{USB_DEVICE_ID_LOGITECH_DFP_WHEEL,   lg4ff_wheel_effects, 40, 900, lg4ff_set_range_dfp},
	{USB_DEVICE_ID_LOGITECH_G25_WHEEL,   lg4ff_wheel_effects, 40, 900, lg4ff_set_range_g25},
	{USB_DEVICE_ID_LOGITECH_DFGT_WHEEL,  lg4ff_wheel_effects, 40, 900, lg4ff_set_range_g25},
	{USB_DEVICE_ID_LOGITECH_G27_WHEEL,   lg4ff_wheel_effects, 40, 900, lg4ff_set_range_g25},
	{USB_DEVICE_ID_LOGITECH_G29_WHEEL,   lg4ff_wheel_effects, 40, 900, lg4ff_set_range_g25},
	{USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2, lg4ff_wheel_effects, 40, 270, NULL},
	{USB_DEVICE_ID_LOGITECH_WII_WHEEL,   lg4ff_wheel_effects, 40, 270, NULL}
};

static const struct lg4ff_multimode_wheel lg4ff_multimode_wheels[] = {
	{USB_DEVICE_ID_LOGITECH_DFP_WHEEL,
	 LG4FF_MODE_NATIVE | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	 LG4FF_DFP_TAG, LG4FF_DFP_NAME},
	{USB_DEVICE_ID_LOGITECH_G25_WHEEL,
	 LG4FF_MODE_NATIVE | LG4FF_MODE_G25 | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	 LG4FF_G25_TAG, LG4FF_G25_NAME},
	{USB_DEVICE_ID_LOGITECH_DFGT_WHEEL,
	 LG4FF_MODE_NATIVE | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	 LG4FF_DFGT_TAG, LG4FF_DFGT_NAME},
	{USB_DEVICE_ID_LOGITECH_G27_WHEEL,
	 LG4FF_MODE_NATIVE | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	 LG4FF_G27_TAG, LG4FF_G27_NAME},
	{USB_DEVICE_ID_LOGITECH_G29_WHEEL,
	 LG4FF_MODE_NATIVE | LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	 LG4FF_G29_TAG, LG4FF_G29_NAME},
};

static const struct lg4ff_alternate_mode lg4ff_alternate_modes[] = {
	[LG4FF_MODE_NATIVE_IDX] = {0, "native", ""},
	[LG4FF_MODE_DFEX_IDX] = {USB_DEVICE_ID_LOGITECH_WHEEL, LG4FF_DFEX_TAG, LG4FF_DFEX_NAME},
	[LG4FF_MODE_DFP_IDX] = {USB_DEVICE_ID_LOGITECH_DFP_WHEEL, LG4FF_DFP_TAG, LG4FF_DFP_NAME},
	[LG4FF_MODE_G25_IDX] = {USB_DEVICE_ID_LOGITECH_G25_WHEEL, LG4FF_G25_TAG, LG4FF_G25_NAME},
	[LG4FF_MODE_DFGT_IDX] = {USB_DEVICE_ID_LOGITECH_DFGT_WHEEL, LG4FF_DFGT_TAG, LG4FF_DFGT_NAME},
	[LG4FF_MODE_G27_IDX] = {USB_DEVICE_ID_LOGITECH_G27_WHEEL, LG4FF_G27_TAG, LG4FF_G27_NAME},
	[LG4FF_MODE_G29_IDX] = {USB_DEVICE_ID_LOGITECH_G29_WHEEL, LG4FF_G29_TAG, LG4FF_G29_NAME},
};

/* Multimode wheel identificators */
static const struct lg4ff_wheel_ident_info lg4ff_dfp_ident_info = {
	LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	0xf000,
	0x1000,
	USB_DEVICE_ID_LOGITECH_DFP_WHEEL
};

static const struct lg4ff_wheel_ident_info lg4ff_g25_ident_info = {
	LG4FF_MODE_G25 | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	0xff00,
	0x1200,
	USB_DEVICE_ID_LOGITECH_G25_WHEEL
};

static const struct lg4ff_wheel_ident_info lg4ff_g27_ident_info = {
	LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	0xfff0,
	0x1230,
	USB_DEVICE_ID_LOGITECH_G27_WHEEL
};

static const struct lg4ff_wheel_ident_info lg4ff_dfgt_ident_info = {
	LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	0xff00,
	0x1300,
	USB_DEVICE_ID_LOGITECH_DFGT_WHEEL
};

static const struct lg4ff_wheel_ident_info lg4ff_g29_ident_info = {
	LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	0xfff8,
	0x1350,
	USB_DEVICE_ID_LOGITECH_G29_WHEEL
};

static const struct lg4ff_wheel_ident_info lg4ff_g29_ident_info2 = {
	LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX,
	0xff00,
	0x8900,
	USB_DEVICE_ID_LOGITECH_G29_WHEEL
};

/* Multimode wheel identification checklists */
static const struct lg4ff_wheel_ident_info *lg4ff_main_checklist[] = {
	&lg4ff_g29_ident_info,
	&lg4ff_g29_ident_info2,
	&lg4ff_dfgt_ident_info,
	&lg4ff_g27_ident_info,
	&lg4ff_g25_ident_info,
	&lg4ff_dfp_ident_info
};

/* Compatibility mode switching commands */
/* EXT_CMD9 - Understood by G27 and DFGT */
static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_dfex = {
	2,
	{0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,	/* Revert mode upon USB reset */
	 0xf8, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00}	/* Switch mode to DF-EX with detach */
};

static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_dfp = {
	2,
	{0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,	/* Revert mode upon USB reset */
	 0xf8, 0x09, 0x01, 0x01, 0x00, 0x00, 0x00}	/* Switch mode to DFP with detach */
};

static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_g25 = {
	2,
	{0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,	/* Revert mode upon USB reset */
	 0xf8, 0x09, 0x02, 0x01, 0x00, 0x00, 0x00}	/* Switch mode to G25 with detach */
};

static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_dfgt = {
	2,
	{0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,	/* Revert mode upon USB reset */
	 0xf8, 0x09, 0x03, 0x01, 0x00, 0x00, 0x00}	/* Switch mode to DFGT with detach */
};

static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_g27 = {
	2,
	{0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,	/* Revert mode upon USB reset */
	 0xf8, 0x09, 0x04, 0x01, 0x00, 0x00, 0x00}	/* Switch mode to G27 with detach */
};

static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_g29 = {
	2,
	{0xf8, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,	/* Revert mode upon USB reset */
	 0xf8, 0x09, 0x05, 0x01, 0x01, 0x00, 0x00}	/* Switch mode to G29 with detach */
};

/* EXT_CMD1 - Understood by DFP, G25, G27 and DFGT */
static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext01_dfp = {
	1,
	{0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}
};

/* EXT_CMD16 - Understood by G25 and G27 */
static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext16_g25 = {
	1,
	{0xf8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}
};

/* Recalculates X axis value accordingly to currently selected range */
static s32 lg4ff_adjust_dfp_x_axis(s32 value, u16 range)
{
	u16 max_range;
	s32 new_value;

	if (range == 900)
		return value;
	else if (range == 200)
		return value;
	else if (range < 200)
		max_range = 200;
	else
		max_range = 900;

	new_value = 8192 + mult_frac(value - 8192, max_range, range);
	if (new_value < 0)
		return 0;
	else if (new_value > 16383)
		return 16383;
	else
		return new_value;
}

int lg4ff_adjust_input_event(struct hid_device *hid, struct hid_field *field,
			     struct hid_usage *usage, s32 value, struct lg_drv_data *drv_data)
{
	struct lg4ff_device_entry *entry = drv_data->device_props;
	s32 new_value = 0;

	if (!entry) {
		hid_err(hid, "Device properties not found");
		return 0;
	}

	switch (entry->wdata.product_id) {
	case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
		switch (usage->code) {
		case ABS_X:
			new_value = lg4ff_adjust_dfp_x_axis(value, entry->wdata.range);
			input_event(field->hidinput->input, usage->type, usage->code, new_value);
			return 1;
		default:
			return 0;
		}
	default:
		return 0;
	}
}

static void lg4ff_init_wheel_data(struct lg4ff_wheel_data * const wdata, const struct lg4ff_wheel *wheel,
				  const struct lg4ff_multimode_wheel *mmode_wheel,
				  const u16 real_product_id)
{
	u32 alternate_modes = 0;
	const char *real_tag = NULL;
	const char *real_name = NULL;

	if (mmode_wheel) {
		alternate_modes = mmode_wheel->alternate_modes;
		real_tag = mmode_wheel->real_tag;
		real_name = mmode_wheel->real_name;
	}

	{
		struct lg4ff_wheel_data t_wdata =  { .product_id = wheel->product_id,
						     .real_product_id = real_product_id,
						     .min_range = wheel->min_range,
						     .max_range = wheel->max_range,
						     .set_range = wheel->set_range,
						     .alternate_modes = alternate_modes,
						     .real_tag = real_tag,
						     .real_name = real_name };

		memcpy(wdata, &t_wdata, sizeof(t_wdata));
	}
}

static int lg4ff_play(struct input_dev *dev, void *data, struct ff_effect *effect)
{
	struct hid_device *hid = input_get_drvdata(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	unsigned long flags;
	s32 *value;
	int x;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return -EINVAL;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return -EINVAL;
	}
	value = entry->report->field[0]->value;

#define CLAMP(x) do { if (x < 0) x = 0; else if (x > 0xff) x = 0xff; } while (0)

	switch (effect->type) {
	case FF_CONSTANT:
		x = effect->u.ramp.start_level + 0x80;	/* 0x80 is no force */
		CLAMP(x);

		spin_lock_irqsave(&entry->report_lock, flags);
		if (x == 0x80) {
			/* De-activate force in slot-1*/
			value[0] = 0x13;
			value[1] = 0x00;
			value[2] = 0x00;
			value[3] = 0x00;
			value[4] = 0x00;
			value[5] = 0x00;
			value[6] = 0x00;

			hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
			spin_unlock_irqrestore(&entry->report_lock, flags);
			return 0;
		}

		value[0] = 0x11;	/* Slot 1 */
		value[1] = 0x08;
		value[2] = x;
		value[3] = 0x80;
		value[4] = 0x00;
		value[5] = 0x00;
		value[6] = 0x00;

		hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
		spin_unlock_irqrestore(&entry->report_lock, flags);
		break;
	}
	return 0;
}

/* Sends default autocentering command compatible with
 * all wheels except Formula Force EX */
static void lg4ff_set_autocenter_default(struct input_dev *dev, u16 magnitude)
{
	struct hid_device *hid = input_get_drvdata(dev);
	struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
	struct hid_report *report = list_entry(report_list->next, struct hid_report, list);
	s32 *value = report->field[0]->value;
	u32 expand_a, expand_b;
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	unsigned long flags;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return;
	}
	value = entry->report->field[0]->value;

	/* De-activate Auto-Center */
	spin_lock_irqsave(&entry->report_lock, flags);
	if (magnitude == 0) {
		value[0] = 0xf5;
		value[1] = 0x00;
		value[2] = 0x00;
		value[3] = 0x00;
		value[4] = 0x00;
		value[5] = 0x00;
		value[6] = 0x00;

		hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
		spin_unlock_irqrestore(&entry->report_lock, flags);
		return;
	}

	if (magnitude <= 0xaaaa) {
		expand_a = 0x0c * magnitude;
		expand_b = 0x80 * magnitude;
	} else {
		expand_a = (0x0c * 0xaaaa) + 0x06 * (magnitude - 0xaaaa);
		expand_b = (0x80 * 0xaaaa) + 0xff * (magnitude - 0xaaaa);
	}

	/* Adjust for non-MOMO wheels */
	switch (entry->wdata.product_id) {
	case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
	case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
		break;
	default:
		expand_a = expand_a >> 1;
		break;
	}

	value[0] = 0xfe;
	value[1] = 0x0d;
	value[2] = expand_a / 0xaaaa;
	value[3] = expand_a / 0xaaaa;
	value[4] = expand_b / 0xaaaa;
	value[5] = 0x00;
	value[6] = 0x00;

	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);

	/* Activate Auto-Center */
	value[0] = 0x14;
	value[1] = 0x00;
	value[2] = 0x00;
	value[3] = 0x00;
	value[4] = 0x00;
	value[5] = 0x00;
	value[6] = 0x00;

	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
	spin_unlock_irqrestore(&entry->report_lock, flags);
}

/* Sends autocentering command compatible with Formula Force EX */
static void lg4ff_set_autocenter_ffex(struct input_dev *dev, u16 magnitude)
{
	struct hid_device *hid = input_get_drvdata(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	unsigned long flags;
	s32 *value;
	magnitude = magnitude * 90 / 65535;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return;
	}
	value = entry->report->field[0]->value;

	spin_lock_irqsave(&entry->report_lock, flags);
	value[0] = 0xfe;
	value[1] = 0x03;
	value[2] = magnitude >> 14;
	value[3] = magnitude >> 14;
	value[4] = magnitude;
	value[5] = 0x00;
	value[6] = 0x00;

	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
	spin_unlock_irqrestore(&entry->report_lock, flags);
}

/* Sends command to set range compatible with G25/G27/Driving Force GT */
static void lg4ff_set_range_g25(struct hid_device *hid, u16 range)
{
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	unsigned long flags;
	s32 *value;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return;
	}
	value = entry->report->field[0]->value;
	dbg_hid("G25/G27/DFGT: setting range to %u\n", range);

	spin_lock_irqsave(&entry->report_lock, flags);
	value[0] = 0xf8;
	value[1] = 0x81;
	value[2] = range & 0x00ff;
	value[3] = (range & 0xff00) >> 8;
	value[4] = 0x00;
	value[5] = 0x00;
	value[6] = 0x00;

	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
	spin_unlock_irqrestore(&entry->report_lock, flags);
}

/* Sends commands to set range compatible with Driving Force Pro wheel */
static void lg4ff_set_range_dfp(struct hid_device *hid, u16 range)
{
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	unsigned long flags;
	int start_left, start_right, full_range;
	s32 *value;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return;
	}
	value = entry->report->field[0]->value;
	dbg_hid("Driving Force Pro: setting range to %u\n", range);

	/* Prepare "coarse" limit command */
	spin_lock_irqsave(&entry->report_lock, flags);
	value[0] = 0xf8;
	value[1] = 0x00;	/* Set later */
	value[2] = 0x00;
	value[3] = 0x00;
	value[4] = 0x00;
	value[5] = 0x00;
	value[6] = 0x00;

	if (range > 200) {
		value[1] = 0x03;
		full_range = 900;
	} else {
		value[1] = 0x02;
		full_range = 200;
	}
	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);

	/* Prepare "fine" limit command */
	value[0] = 0x81;
	value[1] = 0x0b;
	value[2] = 0x00;
	value[3] = 0x00;
	value[4] = 0x00;
	value[5] = 0x00;
	value[6] = 0x00;

	if (range == 200 || range == 900) {	/* Do not apply any fine limit */
		hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
		spin_unlock_irqrestore(&entry->report_lock, flags);
		return;
	}

	/* Construct fine limit command */
	start_left = (((full_range - range + 1) * 2047) / full_range);
	start_right = 0xfff - start_left;

	value[2] = start_left >> 4;
	value[3] = start_right >> 4;
	value[4] = 0xff;
	value[5] = (start_right & 0xe) << 4 | (start_left & 0xe);
	value[6] = 0xff;

	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
	spin_unlock_irqrestore(&entry->report_lock, flags);
}

static const struct lg4ff_compat_mode_switch *lg4ff_get_mode_switch_command(const u16 real_product_id, const u16 target_product_id)
{
	switch (real_product_id) {
	case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
		switch (target_product_id) {
		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
			return &lg4ff_mode_switch_ext01_dfp;
		/* DFP can only be switched to its native mode */
		default:
			return NULL;
		}
		break;
	case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
		switch (target_product_id) {
		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
			return &lg4ff_mode_switch_ext01_dfp;
		case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
			return &lg4ff_mode_switch_ext16_g25;
		/* G25 can only be switched to DFP mode or its native mode */
		default:
			return NULL;
		}
		break;
	case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
		switch (target_product_id) {
		case USB_DEVICE_ID_LOGITECH_WHEEL:
			return &lg4ff_mode_switch_ext09_dfex;
		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
			return &lg4ff_mode_switch_ext09_dfp;
		case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
			return &lg4ff_mode_switch_ext09_g25;
		case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
			return &lg4ff_mode_switch_ext09_g27;
		/* G27 can only be switched to DF-EX, DFP, G25 or its native mode */
		default:
			return NULL;
		}
		break;
	case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
		switch (target_product_id) {
		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
			return &lg4ff_mode_switch_ext09_dfp;
		case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
			return &lg4ff_mode_switch_ext09_dfgt;
		case USB_DEVICE_ID_LOGITECH_G25_WHEEL:
			return &lg4ff_mode_switch_ext09_g25;
		case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
			return &lg4ff_mode_switch_ext09_g27;
		case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
			return &lg4ff_mode_switch_ext09_g29;
		/* G29 can only be switched to DF-EX, DFP, DFGT, G25, G27 or its native mode */
		default:
			return NULL;
		}
		break;
	case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
		switch (target_product_id) {
		case USB_DEVICE_ID_LOGITECH_WHEEL:
			return &lg4ff_mode_switch_ext09_dfex;
		case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
			return &lg4ff_mode_switch_ext09_dfp;
		case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL:
			return &lg4ff_mode_switch_ext09_dfgt;
		/* DFGT can only be switched to DF-EX, DFP or its native mode */
		default:
			return NULL;
		}
		break;
	/* No other wheels have multiple modes */
	default:
		return NULL;
	}
}

static int lg4ff_switch_compatibility_mode(struct hid_device *hid, const struct lg4ff_compat_mode_switch *s)
{
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	unsigned long flags;
	s32 *value;
	u8 i;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return -EINVAL;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return -EINVAL;
	}
	value = entry->report->field[0]->value;

	spin_lock_irqsave(&entry->report_lock, flags);
	for (i = 0; i < s->cmd_count; i++) {
		u8 j;

		for (j = 0; j < 7; j++)
			value[j] = s->cmd[j + (7*i)];

		hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
	}
	spin_unlock_irqrestore(&entry->report_lock, flags);
	hid_hw_wait(hid);
	return 0;
}

static ssize_t lg4ff_alternate_modes_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct hid_device *hid = to_hid_device(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	ssize_t count = 0;
	int i;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return 0;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return 0;
	}

	if (!entry->wdata.real_name) {
		hid_err(hid, "NULL pointer to string\n");
		return 0;
	}

	for (i = 0; i < LG4FF_MODE_MAX_IDX; i++) {
		if (entry->wdata.alternate_modes & BIT(i)) {
			/* Print tag and full name */
			count += scnprintf(buf + count, PAGE_SIZE - count, "%s: %s",
					   lg4ff_alternate_modes[i].tag,
					   !lg4ff_alternate_modes[i].product_id ? entry->wdata.real_name : lg4ff_alternate_modes[i].name);
			if (count >= PAGE_SIZE - 1)
				return count;

			/* Mark the currently active mode with an asterisk */
			if (lg4ff_alternate_modes[i].product_id == entry->wdata.product_id ||
			    (lg4ff_alternate_modes[i].product_id == 0 && entry->wdata.product_id == entry->wdata.real_product_id))
				count += scnprintf(buf + count, PAGE_SIZE - count, " *\n");
			else
				count += scnprintf(buf + count, PAGE_SIZE - count, "\n");

			if (count >= PAGE_SIZE - 1)
				return count;
		}
	}

	return count;
}

static ssize_t lg4ff_alternate_modes_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	struct hid_device *hid = to_hid_device(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	const struct lg4ff_compat_mode_switch *s;
	u16 target_product_id = 0;
	int i, ret;
	char *lbuf;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return -EINVAL;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return -EINVAL;
	}

	/* Allow \n at the end of the input parameter */
	lbuf = kasprintf(GFP_KERNEL, "%s", buf);
	if (!lbuf)
		return -ENOMEM;

	i = strlen(lbuf);
	if (lbuf[i-1] == '\n') {
		if (i == 1) {
			kfree(lbuf);
			return -EINVAL;
		}
		lbuf[i-1] = '\0';
	}

	for (i = 0; i < LG4FF_MODE_MAX_IDX; i++) {
		const u16 mode_product_id = lg4ff_alternate_modes[i].product_id;
		const char *tag = lg4ff_alternate_modes[i].tag;

		if (entry->wdata.alternate_modes & BIT(i)) {
			if (!strcmp(tag, lbuf)) {
				if (!mode_product_id)
					target_product_id = entry->wdata.real_product_id;
				else
					target_product_id = mode_product_id;
				break;
			}
		}
	}

	if (i == LG4FF_MODE_MAX_IDX) {
		hid_info(hid, "Requested mode \"%s\" is not supported by the device\n", lbuf);
		kfree(lbuf);
		return -EINVAL;
	}
	kfree(lbuf); /* Not needed anymore */

	if (target_product_id == entry->wdata.product_id) /* Nothing to do */
		return count;

	/* Automatic switching has to be disabled for the switch to DF-EX mode to work correctly */
	if (target_product_id == USB_DEVICE_ID_LOGITECH_WHEEL && !lg4ff_no_autoswitch) {
		hid_info(hid, "\"%s\" cannot be switched to \"DF-EX\" mode. Load the \"hid_logitech\" module with \"lg4ff_no_autoswitch=1\" parameter set and try again\n",
			 entry->wdata.real_name);
		return -EINVAL;
	}

	/* Take care of hardware limitations */
	if ((entry->wdata.real_product_id == USB_DEVICE_ID_LOGITECH_DFP_WHEEL || entry->wdata.real_product_id == USB_DEVICE_ID_LOGITECH_G25_WHEEL) &&
	    entry->wdata.product_id > target_product_id) {
		hid_info(hid, "\"%s\" cannot be switched back into \"%s\" mode\n", entry->wdata.real_name, lg4ff_alternate_modes[i].name);
		return -EINVAL;
	}

	s = lg4ff_get_mode_switch_command(entry->wdata.real_product_id, target_product_id);
	if (!s) {
		hid_err(hid, "Invalid target product ID %X\n", target_product_id);
		return -EINVAL;
	}

	ret = lg4ff_switch_compatibility_mode(hid, s);
	return (ret == 0 ? count : ret);
}
static DEVICE_ATTR(alternate_modes, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, lg4ff_alternate_modes_show, lg4ff_alternate_modes_store);

/* Export the currently set range of the wheel */
static ssize_t lg4ff_range_show(struct device *dev, struct device_attribute *attr,
				char *buf)
{
	struct hid_device *hid = to_hid_device(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	size_t count;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return 0;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return 0;
	}

	count = scnprintf(buf, PAGE_SIZE, "%u\n", entry->wdata.range);
	return count;
}

/* Set range to user specified value, call appropriate function
 * according to the type of the wheel */
static ssize_t lg4ff_range_store(struct device *dev, struct device_attribute *attr,
				 const char *buf, size_t count)
{
	struct hid_device *hid = to_hid_device(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	u16 range = simple_strtoul(buf, NULL, 10);

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return -EINVAL;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return -EINVAL;
	}

	if (range == 0)
		range = entry->wdata.max_range;

	/* Check if the wheel supports range setting
	 * and that the range is within limits for the wheel */
	if (entry->wdata.set_range && range >= entry->wdata.min_range && range <= entry->wdata.max_range) {
		entry->wdata.set_range(hid, range);
		entry->wdata.range = range;
	}

	return count;
}
static DEVICE_ATTR(range, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, lg4ff_range_show, lg4ff_range_store);

static ssize_t lg4ff_real_id_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct hid_device *hid = to_hid_device(dev);
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	size_t count;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return 0;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return 0;
	}

	if (!entry->wdata.real_tag || !entry->wdata.real_name) {
		hid_err(hid, "NULL pointer to string\n");
		return 0;
	}

	count = scnprintf(buf, PAGE_SIZE, "%s: %s\n", entry->wdata.real_tag, entry->wdata.real_name);
	return count;
}

static ssize_t lg4ff_real_id_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	/* Real ID is a read-only value */
	return -EPERM;
}
static DEVICE_ATTR(real_id, S_IRUGO, lg4ff_real_id_show, lg4ff_real_id_store);

#ifdef CONFIG_LEDS_CLASS
static void lg4ff_set_leds(struct hid_device *hid, u8 leds)
{
	struct lg_drv_data *drv_data;
	struct lg4ff_device_entry *entry;
	unsigned long flags;
	s32 *value;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Private driver data not found!\n");
		return;
	}

	entry = drv_data->device_props;
	if (!entry) {
		hid_err(hid, "Device properties not found!\n");
		return;
	}
	value = entry->report->field[0]->value;

	spin_lock_irqsave(&entry->report_lock, flags);
	value[0] = 0xf8;
	value[1] = 0x12;
	value[2] = leds;
	value[3] = 0x00;
	value[4] = 0x00;
	value[5] = 0x00;
	value[6] = 0x00;
	hid_hw_request(hid, entry->report, HID_REQ_SET_REPORT);
	spin_unlock_irqrestore(&entry->report_lock, flags);
}

static void lg4ff_led_set_brightness(struct led_classdev *led_cdev,
			enum led_brightness value)
{
	struct device *dev = led_cdev->dev->parent;
	struct hid_device *hid = to_hid_device(dev);
	struct lg_drv_data *drv_data = hid_get_drvdata(hid);
	struct lg4ff_device_entry *entry;
	int i, state = 0;

	if (!drv_data) {
		hid_err(hid, "Device data not found.");
		return;
	}

	entry = drv_data->device_props;

	if (!entry) {
		hid_err(hid, "Device properties not found.");
		return;
	}

	for (i = 0; i < 5; i++) {
		if (led_cdev != entry->wdata.led[i])
			continue;
		state = (entry->wdata.led_state >> i) & 1;
		if (value == LED_OFF && state) {
			entry->wdata.led_state &= ~(1 << i);
			lg4ff_set_leds(hid, entry->wdata.led_state);
		} else if (value != LED_OFF && !state) {
			entry->wdata.led_state |= 1 << i;
			lg4ff_set_leds(hid, entry->wdata.led_state);
		}
		break;
	}
}

static enum led_brightness lg4ff_led_get_brightness(struct led_classdev *led_cdev)
{
	struct device *dev = led_cdev->dev->parent;
	struct hid_device *hid = to_hid_device(dev);
	struct lg_drv_data *drv_data = hid_get_drvdata(hid);
	struct lg4ff_device_entry *entry;
	int i, value = 0;

	if (!drv_data) {
		hid_err(hid, "Device data not found.");
		return LED_OFF;
	}

	entry = drv_data->device_props;

	if (!entry) {
		hid_err(hid, "Device properties not found.");
		return LED_OFF;
	}

	for (i = 0; i < 5; i++)
		if (led_cdev == entry->wdata.led[i]) {
			value = (entry->wdata.led_state >> i) & 1;
			break;
		}

	return value ? LED_FULL : LED_OFF;
}
#endif

static u16 lg4ff_identify_multimode_wheel(struct hid_device *hid, const u16 reported_product_id, const u16 bcdDevice)
{
	u32 current_mode;
	int i;

	/* identify current mode from USB PID */
	for (i = 1; i < ARRAY_SIZE(lg4ff_alternate_modes); i++) {
		dbg_hid("Testing whether PID is %X\n", lg4ff_alternate_modes[i].product_id);
		if (reported_product_id == lg4ff_alternate_modes[i].product_id)
			break;
	}

	if (i == ARRAY_SIZE(lg4ff_alternate_modes))
		return 0;

	current_mode = BIT(i);

	for (i = 0; i < ARRAY_SIZE(lg4ff_main_checklist); i++) {
		const u16 mask = lg4ff_main_checklist[i]->mask;
		const u16 result = lg4ff_main_checklist[i]->result;
		const u16 real_product_id = lg4ff_main_checklist[i]->real_product_id;

		if ((current_mode & lg4ff_main_checklist[i]->modes) && \
				(bcdDevice & mask) == result) {
			dbg_hid("Found wheel with real PID %X whose reported PID is %X\n", real_product_id, reported_product_id);
			return real_product_id;
		}
	}

	/* No match found. This is either Driving Force or an unknown
	 * wheel model, do not touch it */
	dbg_hid("Wheel with bcdDevice %X was not recognized as multimode wheel, leaving in its current mode\n", bcdDevice);
	return 0;
}

static int lg4ff_handle_multimode_wheel(struct hid_device *hid, u16 *real_product_id, const u16 bcdDevice)
{
	const u16 reported_product_id = hid->product;
	int ret;

	*real_product_id = lg4ff_identify_multimode_wheel(hid, reported_product_id, bcdDevice);
	/* Probed wheel is not a multimode wheel */
	if (!*real_product_id) {
		*real_product_id = reported_product_id;
		dbg_hid("Wheel is not a multimode wheel\n");
		return LG4FF_MMODE_NOT_MULTIMODE;
	}

	/* Switch from "Driving Force" mode to native mode automatically.
	 * Otherwise keep the wheel in its current mode */
	if (reported_product_id == USB_DEVICE_ID_LOGITECH_WHEEL &&
	    reported_product_id != *real_product_id &&
	    !lg4ff_no_autoswitch) {
		const struct lg4ff_compat_mode_switch *s = lg4ff_get_mode_switch_command(*real_product_id, *real_product_id);

		if (!s) {
			hid_err(hid, "Invalid product id %X\n", *real_product_id);
			return LG4FF_MMODE_NOT_MULTIMODE;
		}

		ret = lg4ff_switch_compatibility_mode(hid, s);
		if (ret) {
			/* Wheel could not have been switched to native mode,
			 * leave it in "Driving Force" mode and continue */
			hid_err(hid, "Unable to switch wheel mode, errno %d\n", ret);
			return LG4FF_MMODE_IS_MULTIMODE;
		}
		return LG4FF_MMODE_SWITCHED;
	}

	return LG4FF_MMODE_IS_MULTIMODE;
}

int lg4ff_init(struct hid_device *hid)
{
	struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
	struct input_dev *dev = hidinput->input;
	struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
	struct hid_report *report = list_entry(report_list->next, struct hid_report, list);
	const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor);
	const u16 bcdDevice = le16_to_cpu(udesc->bcdDevice);
	const struct lg4ff_multimode_wheel *mmode_wheel = NULL;
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;
	int error, i, j;
	int mmode_ret, mmode_idx = -1;
	u16 real_product_id;

	/* Check that the report looks ok */
	if (!hid_validate_values(hid, HID_OUTPUT_REPORT, 0, 0, 7))
		return -1;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Cannot add device, private driver data not allocated\n");
		return -1;
	}
	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
	if (!entry)
		return -ENOMEM;
	spin_lock_init(&entry->report_lock);
	entry->report = report;
	drv_data->device_props = entry;

	/* Check if a multimode wheel has been connected and
	 * handle it appropriately */
	mmode_ret = lg4ff_handle_multimode_wheel(hid, &real_product_id, bcdDevice);

	/* Wheel has been told to switch to native mode. There is no point in going on
	 * with the initialization as the wheel will do a USB reset when it switches mode
	 */
	if (mmode_ret == LG4FF_MMODE_SWITCHED)
		return 0;
	else if (mmode_ret < 0) {
		hid_err(hid, "Unable to switch device mode during initialization, errno %d\n", mmode_ret);
		error = mmode_ret;
		goto err_init;
	}

	/* Check what wheel has been connected */
	for (i = 0; i < ARRAY_SIZE(lg4ff_devices); i++) {
		if (hid->product == lg4ff_devices[i].product_id) {
			dbg_hid("Found compatible device, product ID %04X\n", lg4ff_devices[i].product_id);
			break;
		}
	}

	if (i == ARRAY_SIZE(lg4ff_devices)) {
		hid_err(hid, "This device is flagged to be handled by the lg4ff module but this module does not know how to handle it. "
			     "Please report this as a bug to LKML, Simon Wood <simon@mungewell.org> or "
			     "Michal Maly <madcatxster@devoid-pointer.net>\n");
		error = -1;
		goto err_init;
	}

	if (mmode_ret == LG4FF_MMODE_IS_MULTIMODE) {
		for (mmode_idx = 0; mmode_idx < ARRAY_SIZE(lg4ff_multimode_wheels); mmode_idx++) {
			if (real_product_id == lg4ff_multimode_wheels[mmode_idx].product_id)
				break;
		}

		if (mmode_idx == ARRAY_SIZE(lg4ff_multimode_wheels)) {
			hid_err(hid, "Device product ID %X is not listed as a multimode wheel", real_product_id);
			error = -1;
			goto err_init;
		}
	}

	/* Set supported force feedback capabilities */
	for (j = 0; lg4ff_devices[i].ff_effects[j] >= 0; j++)
		set_bit(lg4ff_devices[i].ff_effects[j], dev->ffbit);

	error = input_ff_create_memless(dev, NULL, lg4ff_play);

	if (error)
		goto err_init;

	/* Initialize device properties */
	if (mmode_ret == LG4FF_MMODE_IS_MULTIMODE) {
		BUG_ON(mmode_idx == -1);
		mmode_wheel = &lg4ff_multimode_wheels[mmode_idx];
	}
	lg4ff_init_wheel_data(&entry->wdata, &lg4ff_devices[i], mmode_wheel, real_product_id);

	/* Check if autocentering is available and
	 * set the centering force to zero by default */
	if (test_bit(FF_AUTOCENTER, dev->ffbit)) {
		/* Formula Force EX expects different autocentering command */
		if ((bcdDevice >> 8) == LG4FF_FFEX_REV_MAJ &&
		    (bcdDevice & 0xff) == LG4FF_FFEX_REV_MIN)
			dev->ff->set_autocenter = lg4ff_set_autocenter_ffex;
		else
			dev->ff->set_autocenter = lg4ff_set_autocenter_default;

		dev->ff->set_autocenter(dev, 0);
	}

	/* Create sysfs interface */
	error = device_create_file(&hid->dev, &dev_attr_range);
	if (error)
		hid_warn(hid, "Unable to create sysfs interface for \"range\", errno %d\n", error);
	if (mmode_ret == LG4FF_MMODE_IS_MULTIMODE) {
		error = device_create_file(&hid->dev, &dev_attr_real_id);
		if (error)
			hid_warn(hid, "Unable to create sysfs interface for \"real_id\", errno %d\n", error);
		error = device_create_file(&hid->dev, &dev_attr_alternate_modes);
		if (error)
			hid_warn(hid, "Unable to create sysfs interface for \"alternate_modes\", errno %d\n", error);
	}
	dbg_hid("sysfs interface created\n");

	/* Set the maximum range to start with */
	entry->wdata.range = entry->wdata.max_range;
	if (entry->wdata.set_range)
		entry->wdata.set_range(hid, entry->wdata.range);

#ifdef CONFIG_LEDS_CLASS
	/* register led subsystem - G27/G29 only */
	entry->wdata.led_state = 0;
	for (j = 0; j < 5; j++)
		entry->wdata.led[j] = NULL;

	if (lg4ff_devices[i].product_id == USB_DEVICE_ID_LOGITECH_G27_WHEEL ||
			lg4ff_devices[i].product_id == USB_DEVICE_ID_LOGITECH_G29_WHEEL) {
		struct led_classdev *led;
		size_t name_sz;
		char *name;

		lg4ff_set_leds(hid, 0);

		name_sz = strlen(dev_name(&hid->dev)) + 8;

		for (j = 0; j < 5; j++) {
			led = kzalloc(sizeof(struct led_classdev)+name_sz, GFP_KERNEL);
			if (!led) {
				hid_err(hid, "can't allocate memory for LED %d\n", j);
				goto err_leds;
			}

			name = (void *)(&led[1]);
			snprintf(name, name_sz, "%s::RPM%d", dev_name(&hid->dev), j+1);
			led->name = name;
			led->brightness = 0;
			led->max_brightness = 1;
			led->brightness_get = lg4ff_led_get_brightness;
			led->brightness_set = lg4ff_led_set_brightness;

			entry->wdata.led[j] = led;
			error = led_classdev_register(&hid->dev, led);

			if (error) {
				hid_err(hid, "failed to register LED %d. Aborting.\n", j);
err_leds:
				/* Deregister LEDs (if any) */
				for (j = 0; j < 5; j++) {
					led = entry->wdata.led[j];
					entry->wdata.led[j] = NULL;
					if (!led)
						continue;
					led_classdev_unregister(led);
					kfree(led);
				}
				goto out;	/* Let the driver continue without LEDs */
			}
		}
	}
out:
#endif
	hid_info(hid, "Force feedback support for Logitech Gaming Wheels\n");
	return 0;

err_init:
	drv_data->device_props = NULL;
	kfree(entry);
	return error;
}

int lg4ff_deinit(struct hid_device *hid)
{
	struct lg4ff_device_entry *entry;
	struct lg_drv_data *drv_data;

	drv_data = hid_get_drvdata(hid);
	if (!drv_data) {
		hid_err(hid, "Error while deinitializing device, no private driver data.\n");
		return -1;
	}
	entry = drv_data->device_props;
	if (!entry)
		goto out; /* Nothing more to do */

	/* Multimode devices will have at least the "MODE_NATIVE" bit set */
	if (entry->wdata.alternate_modes) {
		device_remove_file(&hid->dev, &dev_attr_real_id);
		device_remove_file(&hid->dev, &dev_attr_alternate_modes);
	}

	device_remove_file(&hid->dev, &dev_attr_range);
#ifdef CONFIG_LEDS_CLASS
	{
		int j;
		struct led_classdev *led;

		/* Deregister LEDs (if any) */
		for (j = 0; j < 5; j++) {

			led = entry->wdata.led[j];
			entry->wdata.led[j] = NULL;
			if (!led)
				continue;
			led_classdev_unregister(led);
			kfree(led);
		}
	}
#endif
	hid_hw_stop(hid);
	drv_data->device_props = NULL;

	kfree(entry);
out:
	dbg_hid("Device successfully unregistered\n");
	return 0;
}


text:
<?php

/*
 * This file is part of the Ivoaz ContentEditable bundle.
 *
 * (c) Ivo Azirjans <ivo.azirjans@gmail.com>
 *
 * This source file is subject to the MIT license that is bundled
 * with this source code in the file LICENSE.
 */

namespace Ivoaz\Bundle\ContentEditableBundle;

use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass;
use Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\DoctrineMongoDBMappingsPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class IvoazContentEditableBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        $modelDir = realpath(__DIR__.'/Resources/config/doctrine/model');
        $mappings = [$modelDir => 'Ivoaz\Bundle\ContentEditableBundle\Model'];

        $ormCompilerClass = 'Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass';
        if (class_exists($ormCompilerClass)) {
            $container->addCompilerPass(
                DoctrineOrmMappingsPass::createXmlMappingDriver(
                    $mappings,
                    ['ivoaz_content_editable.model_manager_name'],
                    'ivoaz_content_editable.model_type_orm',
                    ['IvoazContentEditableBundle' => 'Symfony\Cmf\RoutingBundle\Model']
                )
            );
        }

        $mongoCompilerClass = 'Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\DoctrineMongoDBMappingsPass';
        if (class_exists($mongoCompilerClass)) {
            $container->addCompilerPass(
                DoctrineMongoDBMappingsPass::createXmlMappingDriver(
                    $mappings,
                    ['ivoaz_content_editable.model_manager_name'],
                    'ivoaz_content_editable.model_type_mongodb',
                    ['IvoazContentEditableBundle' => 'Symfony\Cmf\RoutingBundle\Model']
                )
            );
        }
    }
}


text:
Digital Editions (PDFs)
The Westminster Report
Students and their families line up to recieve bags of kettlecorn. This was one of many free and enjoyable activities that Rider had to offer.
Home/Features & Entertainment/Entertainment/Family weekend brings joy to campus
Family weekend brings joy to campus
By Megan Raab
Families of Rider students traveled from across the country this past weekend to pay a visit to their favorite Bronc and take part in many fun activities across campus for the annual family weekend from Nov. 2 to 4.
For some students who live far from Lawrenceville, they may not get to visit home during the semester. Family weekend gives the opportunity for them to be reunited with their loved ones right here on campus.
Madylin Rogers, a sophomore musical theater major, is from Texas and has not been able to go home to visit her family this year.
"Family weekend is great since I can't just go home for the weekend, with my home being so far away," Rogers said. "It's so nice that my family can come here to visit me and see [the] campus."
The weekend was made up of many events for students to attend with their families on both campuses. Some of these were informational, such as the "200th Anniversary of Frankenstein" display and the "Power of Protest" exhibit, both of which could be seen at Moore Library. Other events are designed purely for family interaction, such as Bronc Bingo and an annual favorite, Family Feud, both of which took place on Saturday in the Yvonne Theater.
The weekend also provided opportunities to watch some of the university's student athletes in action. The games included ice hockey versus Keene St. University on Friday; volleyball versus Manhattan, a men's basketball exhibition game versus West Chester and ice hockey versus Navy on Saturday; and volleyball versus Iona on Sunday. There was also a Rider Ultimate Frisbee game Saturday morning where the current team took on alumni.
The Westminster Choir College also welcomed the families of their students by providing entertainment from their talented student body. There were multiple open rehearsals on Friday and a student showcase on Saturday, as well as two chances to catch the "Westminster Chapel Choir Concert: Half Acre" conducted by Joe Miller.
Those who were involved performed works by Johannes Brahms, Claudio Monteverdi, Eric Whitacre and Ted Hearne, as well as American folk songs and spirituals. Performances took place Saturday evening and Sunday afternoon in the Bristol Chapel, accompanied by J.J. Penna on the piano and Elizabeth Thompson on the cello.
Rider's active Greek community was also represented this weekend. There was a fraternity and sorority life information session representing Rider's 14 Greek organizations on campus and the benefits of membership.
Delta Phi Epsilon presented their annual haunted house, a fun and festive event for the family to raise money for the Cystic Fibrosis Foundation, where over $2,000 was raised.
For some families, this weekend has become a tradition.
"It was really nice to see my family," said sophomore musical theater major Emilio Bayarena. "They came last year and we've been looking forward to this weekend all year."
There were complimentary family meals and even opportunities to volunteer together with RU Serving.
The weekend provided many chances for families to bond and spend time together. With the jam-packed entertainment and memories made, a home-away-from-home atmosphere was achieved.
Published in the 11/07/18 edition.
Broncs bounced from semis in final MAAC season
Former faculty member remembered
Not-so-close calls with international students
Everybody Loves Lei: Rider's YouTube sensation and Greek member
Enjoyed the trip: "Hair" the musical stuns audiences
An exclusive interview with the "Star" herself
BREAKING: Female student hit by snowplow
Graduate student arrested after wild ride on campus
From the Editor: A Rider News interview with President Dell'Omo sparks worry for Westminster
Letter to the Editor: Professor believes musical bond has been broken
Student struck by snowplow speaks out
Broncs remain perfect in MAAC play with win
Nationally-ranked Broncs begin conference stretch with win
Mobley's big game puts Broncs past Marist in overtime
GAME PREVIEW: Rider prepares for big MAAC game vs. Marist
Free throw misses ice loss for Rider
theridernews
Rider continues to roll with a conference-topping 76-72 overtime win over Marist on Jan. 16. The victory propelled… https://t.co/Jx4FIooqUZ
Senior guard Stella Johnson and sophomore guard Amanda Mobley led the Broncs to a program-first win over Quinnipiac… https://t.co/cv1W3Xq0lZ
Amari Johnson calls Rider the team to beat in MAAC play @Dylan_Manfre11 has more: https://t.co/zFHdCrbbga
The men's basketball team is off to its best season start since the 2006-2007. By @bolandferga. https://t.co/xKVYJYdLhH
Here's this weeks security briefs. By @StephenNeukam1. https://t.co/M89UxX4EbH
The age of Aquarius dawned at Rider with "Hair," a rock musical about love, happiness and freedom. By Jason Mount. https://t.co/tMBIoDX09e
The men's basketball team defeated Bucknell, 89-69. By @bolandferga. https://t.co/szxqMIoQdm


Garden Centre is a store located in Falador Park and the Farming Guild, owned by the garden supplier. It sells bagged plants that are necessary to create flora in player-owned houses.
This page was last modified on 17 April 2019, at 05:18.


Electric Under Wood Heating Foil is a super thin (only 0.3mm) system designed to be installed beneath a wooden or laminate floor without any adhesive required. The Underfloor Heating Foil consists of a 0.6m foil that can be cut every 20cm, and crimped to maximise heating even in the most awkward of rooms.
Get in contact with us today and our specialists will get the underfloor heating system that's right for you?
Floor Heating-Direct Underfloor Heating is a leading supplier in Electric Underfloor Heating products in the UK. Their Underfloor Heating Foils are an advanced form of heating and designed to be easily fitted below a wooden, laminate or parquet floor. The foil will heat your floor evenly at a set temperature that you can control by means of a thermostat. Allowing you to control each room to your preferred taste.
Many other systems suitable for timber floors require to be installed in the cement screed below the floor level. This foil based product is perfect for fitting directly underneath floating floors.
Additional discounts when you sign up for a trade account.
You get free shipping across our entire product range.