36:
123:). In the same way that the RAM is used by sequential-algorithm designers to model algorithmic performance (such as time complexity), the PRAM is used by parallel-algorithm designers to model parallel algorithmic performance (such as time complexity, where the number of processors assumed is typically also stated). Similar to the way in which the RAM model neglects practical issues, such as access time to cache memory versus main memory, the PRAM model neglects such issues as
1942:
223:
These kinds of algorithms are useful for understanding the exploitation of concurrency, dividing the original problem into similar sub-problems and solving them in parallel. The introduction of the formal 'P-RAM' model in Wyllie's 1979 thesis had the aim of quantifying analysis of parallel algorithms
255:
However, the test for practical relevance of PRAM (or RAM) algorithms depends on whether their cost model provides an effective abstraction of some computer; the structure of that computer can be quite different than the abstract model. The knowledge of the layers of software and hardware that need
228:. The analysis focused on a MIMD model of programming using a CREW model but showed that many variants, including implementing a CRCW model and implementing on an SIMD machine, were possible with only constant overhead.
288:
code which finds the maximum value in the array in only 2 clock cycles. It compares all the combinations of the elements in the array at the first clock, and merges the result at the second clock. It uses CRCW memory;
244:(DRAM) because DRAM does not allow concurrent access to a single bank (not even different addresses in the bank); but they can be implemented in hardware or read/write to the internal
297:
are written concurrently. The concurrency causes no conflicts because the algorithm guarantees that the same value is written to the same memory. This code can be run on
131:, but provides any (problem-size-dependent) number of processors. Algorithm cost, for instance, is estimated using two parameters O(time) and O(time Ă— processor_number).
139:
Read/write conflicts, commonly termed interlocking in accessing the same shared memory location simultaneously are resolved by one of the following strategies:
1268:
276:
demonstrated that PRAM algorithms as-is can achieve competitive performance even without any additional effort to cast them as multi-threaded programs on XMT.
160:
Here, E and C stand for 'exclusive' and 'concurrent' respectively. The read causes no discrepancies while the concurrent write is further defined as:
1073:, Class notes of courses on parallel algorithms taught since 1992 at the University of Maryland, College Park, Tel Aviv University and the Technion
17:
1358:
1210:
1972:
186:
1339:
970:
914:
1379:
1606:
1629:
1518:
843:
124:
1374:
1624:
1601:
1117:
1054:
1025:
79:
57:
1134:
Ghanim, Fady; Vishkin, Uzi; Barua, Rajeev (2018), "Easy PRAM-based High-performance
Parallel Programming with ICE",
50:
1203:
863:
152:
Concurrent read concurrent write (CRCW)—multiple processors can read and write. A CRCW PRAM is sometimes called a
146:
Concurrent read exclusive write (CREW)—multiple processors can read a memory cell but only one can write at a time
1596:
1411:
143:
Exclusive read exclusive write (EREW)—every memory cell can be read or written to by only one processor at a time
1180:. This prototype seeks to put many parallel processors and the fabric for inter-connecting them on a single chip
1967:
1703:
1617:
1566:
984:
1100:
Caragea, George
Constantin; Vishkin, Uzi (2011), "Brief announcement: Better speedups for parallel max-flow",
1927:
1761:
1612:
1299:
298:
249:
196:
Several simplifying assumptions are made while considering the development of algorithms for PRAM. They are:
241:
1946:
1892:
1352:
1196:
833:
245:
1871:
1666:
1551:
1513:
1363:
1253:
853:
149:
Exclusive read concurrent write (ERCW)—mostly never considered because it mostly doesn't add more power
109:
1065:
931:
1887:
1866:
1811:
1698:
1688:
1661:
1523:
996:
Eppstein, David; Galil, Zvi (1988), "Parallel algorithmic techniques for combinatorial computation",
272:
can provide strong speedups relative to the fastest serial program for the same problem. The article
1841:
1467:
1406:
1319:
1172:
261:
44:
1902:
1897:
1756:
1347:
237:
1641:
1573:
1477:
1369:
1324:
1102:
Proceedings of the 23rd ACM symposium on
Parallelism in algorithms and architectures - SPAA '11
61:
1177:
1733:
1693:
1646:
1636:
1431:
1294:
1233:
848:
116:
1673:
1561:
1556:
1546:
1533:
1329:
269:
120:
8:
1836:
1791:
1591:
1457:
838:
209:
1009:
1861:
1710:
1683:
1508:
1472:
1462:
1421:
1263:
1243:
1238:
1219:
1123:
1078:
Vishkin, Uzi (2011), "Using simple abstraction to reinvent computing for parallelism",
115:. As its name indicates, the PRAM is intended as the parallel-computing analogy to the
947:
1907:
1583:
1541:
1436:
1113:
1050:
1021:
951:
910:
1917:
1716:
1651:
1498:
1314:
1309:
1304:
1273:
1153:
1143:
1127:
1105:
1087:
1067:
Thinking in
Parallel: Some Basic Data-Parallel Algorithms and Techniques, 104 pages
1040:, University of California, Berkeley, Department of EECS, Tech. Rep. UCB/CSD-88-408
1005:
943:
900:
892:
112:
93:
1781:
1721:
1656:
1503:
1493:
1426:
1416:
1258:
1248:
1912:
1728:
1385:
1278:
889:
Proceedings of the tenth annual ACM symposium on Theory of computing - STOC '78
884:
225:
1148:
1961:
1801:
1678:
955:
285:
128:
1109:
1092:
1035:
891:. New York, NY, USA: Association for Computing Machinery. pp. 114–118.
896:
256:
to be inserted is beyond the scope of this article. But, articles such as
1922:
1183:
1158:
1796:
1771:
1188:
905:
1846:
1826:
1751:
1044:
1851:
1831:
1806:
1441:
260:
demonstrate how a PRAM-like abstraction can be supported by the
215:
The programs written on these machines are, in general, of type
1821:
1816:
974:. SIAM Journal on Computing, vol. 18, no. 3, pp. 625-638, 1989.
236:
PRAM algorithms cannot be parallelized with the combination of
206:
There is no limit on the amount of shared memory in the system.
203:
Any memory location is uniformly accessible from any processor.
200:
There is no limit on the number of processors in the machine.
1856:
1786:
1776:
987:, PhD Thesis, Dept. of Computer Science, Cornell University
858:
216:
1037:
A Survey of
Parallel Algorithms for Shared-Memory Machines
169:—all processors write the same value; otherwise is illegal
1766:
1743:
930:
MacKenzie, Philip D.; Ramachandran, Vijaya (1998-04-06).
175:—only one arbitrary attempt is successful, others retire
1136:
IEEE Transactions on
Parallel and Distributed Systems
1045:
Keller, Jörg; Christoph Keßler; Jesper Träff (2001).
929:
27:
Abstract computer for designing parallel algorithms
1133:
273:
1959:
1033:
1178:University Of Maryland's PRAM-On-Chip prototype
1034:Karp, Richard M.; Ramachandran, Vijaya (1988),
252:(FPGA), it can be done using a CRCW algorithm.
1184:XMTC: PRAM-like Programming - Software release
1099:
265:
1204:
995:
883:Fortune, Steven; Wyllie, James (1978-05-01).
882:
181:—processor rank indicates who gets to write
1211:
1197:
268:demonstrate that a PRAM algorithm for the
1157:
1147:
1091:
904:
80:Learn how and when to remove this message
43:This article includes a list of general
1077:
1063:
985:The Complexity of Parallel Computations
885:"Parallelism in random access machines"
257:
190:operation like SUM, Logical AND or MAX.
134:
14:
1960:
1218:
1018:An Introduction to Parallel Algorithms
971:Expressibility and parallel complexity
932:"ERCW PRAMs and optical communication"
1192:
1173:Saarland University's prototype PRAM
1015:
264:(XMT) paradigm and articles such as
29:
1010:10.1146/annurev.cs.03.060188.001313
24:
844:Lock-free and wait-free algorithms
274:Ghanim, Vishkin & Barua (2018)
49:it lacks sufficient corresponding
25:
1984:
1166:
231:
1941:
1940:
864:Parallel external memory (Model)
154:concurrent random-access machine
34:
18:Concurrent random access machine
1973:Analysis of parallel algorithms
1412:Analysis of parallel algorithms
279:
119:(RAM) (not to be confused with
977:
962:
923:
876:
98:parallel random-access machine
13:
1:
1359:Simultaneous and heterogenous
948:10.1016/S0304-3975(97)00199-0
869:
250:field-programmable gate array
1947:Category: Parallel computing
936:Theoretical Computer Science
266:Caragea & Vishkin (2011)
242:dynamic random-access memory
7:
834:Analysis of PRAM algorithms
827:
246:static random-access memory
10:
1989:
1254:High-performance computing
1047:Practical PRAM Programming
854:Parallel programming model
224:in a way analogous to the
1936:
1888:Automatic parallelization
1880:
1742:
1582:
1532:
1524:Application checkpointing
1486:
1450:
1394:
1338:
1287:
1226:
1149:10.1109/TPDS.2017.2754376
1080:Communications of the ACM
303:
262:explicit multi-threading
1903:Embarrassingly parallel
1898:Deterministic algorithm
1110:10.1145/1989493.1989511
1093:10.1145/1866739.1866757
1049:. John Wiley and Sons.
998:Annu. Rev. Comput. Sci.
64:more precise citations.
1618:Associative processing
1574:Non-blocking algorithm
1380:Clustered multi-thread
284:This is an example of
1968:Models of computation
1734:Hardware acceleration
1647:Superscalar processor
1637:Dataflow architecture
1234:Distributed computing
1064:Vishkin, Uzi (2009),
1016:JaJa, Joseph (1992),
897:10.1145/800133.804339
849:Random-access machine
117:random-access machine
1613:Pipelined processing
1562:Explicit parallelism
1557:Implicit parallelism
1547:Dataflow programming
270:maximum flow problem
135:Read/write conflicts
121:random-access memory
1837:Parallel Extensions
1642:Pipelined processor
248:(SRAM) blocks of a
210:Resource contention
1711:Massively parallel
1689:distributed shared
1509:Cache invalidation
1473:Instruction window
1264:Manycore processor
1244:Massively parallel
1239:Parallel computing
1220:Parallel computing
1020:, Addison-Wesley,
1955:
1954:
1908:Parallel slowdown
1542:Stream processing
1432:Karp–Flatt metric
983:Wyllie, James C.
916:978-1-4503-7437-8
90:
89:
82:
16:(Redirected from
1980:
1944:
1943:
1918:Software lockout
1717:Computer cluster
1652:Vector processor
1607:Array processing
1592:Flynn's taxonomy
1499:Memory coherence
1274:Computer network
1213:
1206:
1199:
1190:
1189:
1162:
1161:
1151:
1130:
1096:
1095:
1074:
1072:
1060:
1041:
1030:
1012:
988:
981:
975:
966:
960:
959:
927:
921:
920:
908:
880:
839:Flynn's taxonomy
823:
820:
817:
814:
811:
808:
805:
802:
799:
796:
793:
790:
787:
784:
781:
778:
775:
772:
769:
766:
763:
760:
757:
754:
751:
748:
745:
742:
739:
736:
733:
730:
727:
724:
721:
718:
715:
712:
709:
706:
703:
700:
697:
694:
691:
688:
685:
682:
679:
676:
673:
670:
667:
664:
661:
658:
655:
652:
649:
646:
643:
640:
637:
634:
631:
628:
625:
622:
619:
616:
613:
610:
607:
604:
601:
598:
595:
592:
589:
586:
583:
580:
577:
574:
571:
568:
565:
562:
559:
556:
553:
550:
547:
544:
541:
538:
535:
532:
529:
526:
523:
520:
517:
514:
511:
508:
505:
502:
499:
496:
493:
490:
487:
484:
481:
478:
475:
472:
469:
466:
463:
460:
457:
454:
451:
448:
445:
442:
439:
436:
433:
430:
427:
424:
421:
418:
415:
412:
409:
406:
403:
400:
397:
394:
391:
388:
385:
382:
379:
376:
373:
370:
367:
364:
361:
358:
355:
352:
349:
346:
343:
340:
337:
334:
331:
328:
325:
322:
319:
316:
313:
310:
307:
296:
295:maxNo <= data
292:
184:Another kind of
113:abstract machine
94:computer science
85:
78:
74:
71:
65:
60:this article by
51:inline citations
38:
37:
30:
21:
1988:
1987:
1983:
1982:
1981:
1979:
1978:
1977:
1958:
1957:
1956:
1951:
1932:
1876:
1782:Coarray Fortran
1738:
1722:Beowulf cluster
1578:
1528:
1519:Synchronization
1504:Cache coherence
1494:Multiprocessing
1482:
1446:
1427:Cost efficiency
1422:Gustafson's law
1390:
1334:
1283:
1259:Multiprocessing
1249:Cloud computing
1222:
1217:
1169:
1120:
1104:, p. 131,
1070:
1057:
1028:
992:
991:
982:
978:
968:Neil Immerman,
967:
963:
928:
924:
917:
881:
877:
872:
830:
825:
824:
821:
818:
815:
812:
809:
806:
803:
800:
797:
794:
791:
788:
785:
782:
779:
776:
773:
770:
767:
764:
761:
758:
755:
752:
749:
746:
743:
740:
737:
734:
731:
728:
725:
722:
719:
716:
713:
710:
707:
704:
701:
698:
695:
692:
689:
686:
683:
680:
677:
674:
671:
668:
665:
662:
659:
656:
653:
650:
647:
644:
641:
638:
635:
632:
629:
626:
623:
620:
617:
614:
611:
608:
605:
602:
599:
596:
593:
590:
587:
584:
581:
578:
575:
572:
569:
566:
563:
560:
557:
554:
551:
548:
545:
542:
539:
536:
533:
530:
527:
524:
521:
518:
515:
512:
509:
506:
503:
500:
497:
494:
491:
488:
485:
482:
479:
476:
473:
470:
467:
464:
461:
458:
455:
452:
449:
446:
443:
440:
437:
434:
431:
428:
425:
422:
419:
416:
413:
410:
407:
404:
401:
398:
395:
392:
389:
386:
383:
380:
377:
374:
371:
368:
365:
362:
359:
356:
353:
350:
347:
344:
341:
338:
335:
332:
329:
326:
323:
320:
317:
314:
311:
308:
305:
294:
290:
282:
234:
187:array reduction
137:
125:synchronization
86:
75:
69:
66:
56:Please help to
55:
39:
35:
28:
23:
22:
15:
12:
11:
5:
1986:
1976:
1975:
1970:
1953:
1952:
1950:
1949:
1937:
1934:
1933:
1931:
1930:
1925:
1920:
1915:
1913:Race condition
1910:
1905:
1900:
1895:
1890:
1884:
1882:
1878:
1877:
1875:
1874:
1869:
1864:
1859:
1854:
1849:
1844:
1839:
1834:
1829:
1824:
1819:
1814:
1809:
1804:
1799:
1794:
1789:
1784:
1779:
1774:
1769:
1764:
1759:
1754:
1748:
1746:
1740:
1739:
1737:
1736:
1731:
1726:
1725:
1724:
1714:
1708:
1707:
1706:
1701:
1696:
1691:
1686:
1681:
1671:
1670:
1669:
1664:
1657:Multiprocessor
1654:
1649:
1644:
1639:
1634:
1633:
1632:
1627:
1622:
1621:
1620:
1615:
1610:
1599:
1588:
1586:
1580:
1579:
1577:
1576:
1571:
1570:
1569:
1564:
1559:
1549:
1544:
1538:
1536:
1530:
1529:
1527:
1526:
1521:
1516:
1511:
1506:
1501:
1496:
1490:
1488:
1484:
1483:
1481:
1480:
1475:
1470:
1465:
1460:
1454:
1452:
1448:
1447:
1445:
1444:
1439:
1434:
1429:
1424:
1419:
1414:
1409:
1404:
1398:
1396:
1392:
1391:
1389:
1388:
1386:Hardware scout
1383:
1377:
1372:
1367:
1361:
1356:
1350:
1344:
1342:
1340:Multithreading
1336:
1335:
1333:
1332:
1327:
1322:
1317:
1312:
1307:
1302:
1297:
1291:
1289:
1285:
1284:
1282:
1281:
1279:Systolic array
1276:
1271:
1266:
1261:
1256:
1251:
1246:
1241:
1236:
1230:
1228:
1224:
1223:
1216:
1215:
1208:
1201:
1193:
1187:
1186:
1181:
1175:
1168:
1167:External links
1165:
1164:
1163:
1142:(2): 377–390,
1131:
1118:
1097:
1075:
1061:
1055:
1042:
1031:
1026:
1013:
990:
989:
976:
961:
942:(1): 153–180.
922:
915:
874:
873:
871:
868:
867:
866:
861:
856:
851:
846:
841:
836:
829:
826:
304:
281:
278:
258:Vishkin (2011)
233:
232:Implementation
230:
226:Turing Machine
221:
220:
213:
207:
204:
201:
194:
193:
192:
191:
182:
176:
170:
158:
157:
150:
147:
144:
136:
133:
88:
87:
42:
40:
33:
26:
9:
6:
4:
3:
2:
1985:
1974:
1971:
1969:
1966:
1965:
1963:
1948:
1939:
1938:
1935:
1929:
1926:
1924:
1921:
1919:
1916:
1914:
1911:
1909:
1906:
1904:
1901:
1899:
1896:
1894:
1891:
1889:
1886:
1885:
1883:
1879:
1873:
1870:
1868:
1865:
1863:
1860:
1858:
1855:
1853:
1850:
1848:
1845:
1843:
1840:
1838:
1835:
1833:
1830:
1828:
1825:
1823:
1820:
1818:
1815:
1813:
1810:
1808:
1805:
1803:
1802:Global Arrays
1800:
1798:
1795:
1793:
1790:
1788:
1785:
1783:
1780:
1778:
1775:
1773:
1770:
1768:
1765:
1763:
1760:
1758:
1755:
1753:
1750:
1749:
1747:
1745:
1741:
1735:
1732:
1730:
1729:Grid computer
1727:
1723:
1720:
1719:
1718:
1715:
1712:
1709:
1705:
1702:
1700:
1697:
1695:
1692:
1690:
1687:
1685:
1682:
1680:
1677:
1676:
1675:
1672:
1668:
1665:
1663:
1660:
1659:
1658:
1655:
1653:
1650:
1648:
1645:
1643:
1640:
1638:
1635:
1631:
1628:
1626:
1623:
1619:
1616:
1614:
1611:
1608:
1605:
1604:
1603:
1600:
1598:
1595:
1594:
1593:
1590:
1589:
1587:
1585:
1581:
1575:
1572:
1568:
1565:
1563:
1560:
1558:
1555:
1554:
1553:
1550:
1548:
1545:
1543:
1540:
1539:
1537:
1535:
1531:
1525:
1522:
1520:
1517:
1515:
1512:
1510:
1507:
1505:
1502:
1500:
1497:
1495:
1492:
1491:
1489:
1485:
1479:
1476:
1474:
1471:
1469:
1466:
1464:
1461:
1459:
1456:
1455:
1453:
1449:
1443:
1440:
1438:
1435:
1433:
1430:
1428:
1425:
1423:
1420:
1418:
1415:
1413:
1410:
1408:
1405:
1403:
1400:
1399:
1397:
1393:
1387:
1384:
1381:
1378:
1376:
1373:
1371:
1368:
1365:
1362:
1360:
1357:
1354:
1351:
1349:
1346:
1345:
1343:
1341:
1337:
1331:
1328:
1326:
1323:
1321:
1318:
1316:
1313:
1311:
1308:
1306:
1303:
1301:
1298:
1296:
1293:
1292:
1290:
1286:
1280:
1277:
1275:
1272:
1270:
1267:
1265:
1262:
1260:
1257:
1255:
1252:
1250:
1247:
1245:
1242:
1240:
1237:
1235:
1232:
1231:
1229:
1225:
1221:
1214:
1209:
1207:
1202:
1200:
1195:
1194:
1191:
1185:
1182:
1179:
1176:
1174:
1171:
1170:
1160:
1155:
1150:
1145:
1141:
1137:
1132:
1129:
1125:
1121:
1119:9781450307437
1115:
1111:
1107:
1103:
1098:
1094:
1089:
1085:
1081:
1076:
1069:
1068:
1062:
1058:
1056:0-471-35351-5
1052:
1048:
1043:
1039:
1038:
1032:
1029:
1027:0-201-54856-9
1023:
1019:
1014:
1011:
1007:
1003:
999:
994:
993:
986:
980:
973:
972:
965:
957:
953:
949:
945:
941:
937:
933:
926:
918:
912:
907:
902:
898:
894:
890:
886:
879:
875:
865:
862:
860:
857:
855:
852:
850:
847:
845:
842:
840:
837:
835:
832:
831:
302:
300:
287:
286:SystemVerilog
277:
275:
271:
267:
263:
259:
253:
251:
247:
243:
239:
229:
227:
218:
214:
211:
208:
205:
202:
199:
198:
197:
189:
188:
183:
180:
177:
174:
171:
168:
165:
164:
163:
162:
161:
155:
151:
148:
145:
142:
141:
140:
132:
130:
129:communication
126:
122:
118:
114:
111:
110:shared-memory
107:
103:
99:
95:
84:
81:
73:
63:
59:
53:
52:
46:
41:
32:
31:
19:
1487:Coordination
1417:Amdahl's law
1401:
1353:Simultaneous
1139:
1135:
1101:
1083:
1079:
1066:
1046:
1036:
1017:
1001:
997:
979:
969:
964:
939:
935:
925:
888:
878:
283:
280:Example code
254:
235:
222:
195:
185:
178:
172:
166:
159:
153:
138:
105:
102:parallel RAM
101:
97:
91:
76:
67:
48:
1923:Scalability
1684:distributed
1567:Concurrency
1534:Programming
1375:Cooperative
1364:Speculative
1300:Instruction
1004:: 233–283,
62:introducing
1962:Categories
1928:Starvation
1667:asymmetric
1402:PRAM model
1370:Preemptive
1159:1903/18521
870:References
301:hardware.
212:is absent.
45:references
1662:symmetric
1407:PEM model
1086:: 75–85,
956:0304-3975
906:1813/7454
822:endmodule
447:always_ff
315:parameter
291:m <= 1
173:Arbitrary
70:July 2016
1893:Deadlock
1881:Problems
1847:pthreads
1827:OpenHMPP
1752:Ateji PX
1713:computer
1584:Hardware
1451:Elements
1437:Slowdown
1348:Temporal
1330:Pipeline
828:See also
576:COMPARE:
179:Priority
1852:RaftLib
1832:OpenACC
1807:GPUOpen
1797:C++ AMP
1772:Charm++
1514:Barrier
1458:Process
1442:Speedup
1227:General
1128:5511743
813:endcase
549:COMPARE
462:negedge
453:posedge
390:COMPARE
378:typedef
309:FindMax
108:) is a
58:improve
1945:
1822:OpenCL
1817:OpenMP
1762:Chapel
1679:shared
1674:Memory
1609:(SIMT)
1552:Models
1463:Thread
1395:Theory
1366:(SpMT)
1320:Memory
1305:Thread
1288:Levels
1126:
1116:
1053:
1024:
954:
913:
717:MERGE:
483:resetN
465:resetN
366:output
348:resetN
306:module
167:Common
47:, but
1792:Dryad
1757:Boost
1478:Array
1468:Fiber
1382:(CMT)
1355:(SMT)
1269:GPGPU
1124:S2CID
1071:(PDF)
801:<=
798:state
786:<=
783:maxNo
762:begin
720:begin
708:MERGE
705:<=
702:state
687:<=
663:begin
621:begin
579:begin
570:state
561:begin
546:<=
543:state
534:<=
489:begin
471:begin
456:clock
417:state
414:State
408:State
396:MERGE
372:maxNo
354:input
342:clock
336:input
1857:ROCm
1787:CUDA
1777:Cilk
1744:APIs
1704:COMA
1699:NUMA
1630:MIMD
1625:MISD
1602:SIMD
1597:SISD
1325:Loop
1315:Data
1310:Task
1114:ISBN
1051:ISBN
1022:ISBN
952:ISSN
911:ISBN
859:XMTC
804:DONE
789:data
744:<
678:data
675:<
672:data
645:<
603:<
564:case
558:else
513:<
402:DONE
381:enum
360:data
299:FPGA
293:and
240:and
217:SIMD
127:and
106:PRAM
96:, a
1872:ZPL
1867:TBB
1862:UPC
1842:PVM
1812:MPI
1767:HPX
1694:UMA
1295:Bit
1154:hdl
1144:doi
1106:doi
1088:doi
1006:doi
944:doi
940:196
901:hdl
893:doi
819:end
816:end
810:end
795:end
747:len
723:for
714:end
699:end
696:end
648:len
624:for
606:len
582:for
555:end
516:len
492:for
432:int
423:bit
384:bit
369:bit
357:bit
339:bit
321:len
318:int
238:CPU
104:or
92:In
1964::
1152:,
1140:29
1138:,
1122:,
1112:,
1084:54
1082:,
1000:,
950:.
938:.
934:.
909:.
899:.
887:.
774:==
765:if
756:++
666:if
657:++
615:++
525:++
474:if
450:@(
375:);
312:#(
1212:e
1205:t
1198:v
1156::
1146::
1108::
1090::
1059:.
1008::
1002:3
958:.
946::
919:.
903::
895::
807:;
792:;
780:)
777:0
771:m
768:(
759:)
753:i
750:;
741:i
738:;
735:0
732:=
729:i
726:(
711:;
693:;
690:1
684:m
681:)
669:(
660:)
654:j
651:;
642:j
639:;
636:0
633:=
630:j
627:(
618:)
612:i
609:;
600:i
597:;
594:0
591:=
588:i
585:(
573:)
567:(
552:;
540:;
537:0
531:m
528:)
522:i
519:;
510:i
507:;
504:0
501:=
498:i
495:(
486:)
480:!
477:(
468:)
459:,
444:;
441:j
438:,
435:i
429:;
426:m
420:;
411:;
405:}
399:,
393:,
387:{
363:,
351:,
345:,
333:(
330:)
327:8
324:=
219:.
156:.
100:(
83:)
77:(
72:)
68:(
54:.
20:)
Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.