Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: lib/runtime/dart/collection.js

Issue 1042003002: fix list literal initialization call fix typeof calls for primitive JS types add dart/collection.js… (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 var collection; 1 var collection;
2 (function(exports) { 2 (function(exports) {
3 'use strict'; 3 'use strict';
4 let _source = Symbol('_source'); 4 let _source = Symbol('_source');
5 let UnmodifiableListView$ = dart.generic(function(E) { 5 let UnmodifiableListView$ = dart.generic(function(E) {
6 class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) { 6 class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
7 UnmodifiableListView(source) { 7 UnmodifiableListView(source) {
8 this[_source] = source; 8 this[_source] = source;
9 super.UnmodifiableListBase(); 9 super.UnmodifiableListBase();
10 } 10 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 this.remove(element); 107 this.remove(element);
108 } 108 }
109 retainAll(elements) { 109 retainAll(elements) {
110 let toRemove = this.toSet(); 110 let toRemove = this.toSet();
111 for (let o of elements) { 111 for (let o of elements) {
112 toRemove.remove(o); 112 toRemove.remove(o);
113 } 113 }
114 this.removeAll(toRemove); 114 this.removeAll(toRemove);
115 } 115 }
116 removeWhere(test) { 116 removeWhere(test) {
117 let toRemove = new List.from([]); 117 let toRemove = new core.List.from([]);
118 for (let element of this) { 118 for (let element of this) {
119 if (test(element)) 119 if (test(element))
120 toRemove.add(element); 120 toRemove.add(element);
121 } 121 }
122 this.removeAll(toRemove); 122 this.removeAll(toRemove);
123 } 123 }
124 retainWhere(test) { 124 retainWhere(test) {
125 let toRemove = new List.from([]); 125 let toRemove = new core.List.from([]);
126 for (let element of this) { 126 for (let element of this) {
127 if (!dart.notNull(test(element))) 127 if (!dart.notNull(test(element)))
128 toRemove.add(element); 128 toRemove.add(element);
129 } 129 }
130 this.removeAll(toRemove); 130 this.removeAll(toRemove);
131 } 131 }
132 containsAll(other) { 132 containsAll(other) {
133 for (let o of other) { 133 for (let o of other) {
134 if (!dart.notNull(this.contains(o))) 134 if (!dart.notNull(this.contains(o)))
135 return false; 135 return false;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 } 311 }
312 result = element; 312 result = element;
313 foundMatching = true; 313 foundMatching = true;
314 } 314 }
315 } 315 }
316 if (foundMatching) 316 if (foundMatching)
317 return result; 317 return result;
318 throw _internal.IterableElementError.noElement(); 318 throw _internal.IterableElementError.noElement();
319 } 319 }
320 elementAt(index) { 320 elementAt(index) {
321 if (!(typeof index == number)) 321 if (!(typeof index == 'number'))
322 throw new core.ArgumentError.notNull("index"); 322 throw new core.ArgumentError.notNull("index");
323 core.RangeError.checkNotNegative(index, "index"); 323 core.RangeError.checkNotNegative(index, "index");
324 let elementIndex = 0; 324 let elementIndex = 0;
325 for (let element of this) { 325 for (let element of this) {
326 if (index === elementIndex) 326 if (index === elementIndex)
327 return element; 327 return element;
328 elementIndex = dart.notNull(elementIndex) + 1; 328 elementIndex = dart.notNull(elementIndex) + 1;
329 } 329 }
330 throw new core.RangeError.index(index, this, "index", null, elementIndex ); 330 throw new core.RangeError.index(index, this, "index", null, elementIndex );
331 } 331 }
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 } 585 }
586 result = element; 586 result = element;
587 foundMatching = true; 587 foundMatching = true;
588 } 588 }
589 } 589 }
590 if (foundMatching) 590 if (foundMatching)
591 return result; 591 return result;
592 throw _internal.IterableElementError.noElement(); 592 throw _internal.IterableElementError.noElement();
593 } 593 }
594 elementAt(index) { 594 elementAt(index) {
595 if (!(typeof index == number)) 595 if (!(typeof index == 'number'))
596 throw new core.ArgumentError.notNull("index"); 596 throw new core.ArgumentError.notNull("index");
597 core.RangeError.checkNotNegative(index, "index"); 597 core.RangeError.checkNotNegative(index, "index");
598 let elementIndex = 0; 598 let elementIndex = 0;
599 for (let element of this) { 599 for (let element of this) {
600 if (index === elementIndex) 600 if (index === elementIndex)
601 return element; 601 return element;
602 elementIndex = dart.notNull(elementIndex) + 1; 602 elementIndex = dart.notNull(elementIndex) + 1;
603 } 603 }
604 throw new core.RangeError.index(index, this, "index", null, elementIndex ); 604 throw new core.RangeError.index(index, this, "index", null, elementIndex );
605 } 605 }
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 } 784 }
785 result = element; 785 result = element;
786 foundMatching = true; 786 foundMatching = true;
787 } 787 }
788 } 788 }
789 if (foundMatching) 789 if (foundMatching)
790 return result; 790 return result;
791 throw _internal.IterableElementError.noElement(); 791 throw _internal.IterableElementError.noElement();
792 } 792 }
793 elementAt(index) { 793 elementAt(index) {
794 if (!(typeof index == number)) 794 if (!(typeof index == 'number'))
795 throw new core.ArgumentError.notNull("index"); 795 throw new core.ArgumentError.notNull("index");
796 core.RangeError.checkNotNegative(index, "index"); 796 core.RangeError.checkNotNegative(index, "index");
797 let elementIndex = 0; 797 let elementIndex = 0;
798 for (let element of this) { 798 for (let element of this) {
799 if (index === elementIndex) 799 if (index === elementIndex)
800 return element; 800 return element;
801 elementIndex = dart.notNull(elementIndex) + 1; 801 elementIndex = dart.notNull(elementIndex) + 1;
802 } 802 }
803 throw new core.RangeError.index(index, this, "index", null, elementIndex ); 803 throw new core.RangeError.index(index, this, "index", null, elementIndex );
804 } 804 }
805 toString() { 805 toString() {
806 return iterableToShortString(this, '(', ')'); 806 return iterableToShortString(this, '(', ')');
807 } 807 }
808 static iterableToShortString(iterable, leftDelimiter, rightDelimiter) { 808 static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
809 if (leftDelimiter === void 0) 809 if (leftDelimiter === void 0)
810 leftDelimiter = '('; 810 leftDelimiter = '(';
811 if (rightDelimiter === void 0) 811 if (rightDelimiter === void 0)
812 rightDelimiter = ')'; 812 rightDelimiter = ')';
813 if (_isToStringVisiting(iterable)) { 813 if (_isToStringVisiting(iterable)) {
814 if (dart.notNull(dart.equals(leftDelimiter, "(")) && dart.notNull(dart .equals(rightDelimiter, ")"))) { 814 if (dart.notNull(dart.equals(leftDelimiter, "(")) && dart.notNull(dart .equals(rightDelimiter, ")"))) {
815 return "(...)"; 815 return "(...)";
816 } 816 }
817 return `${leftDelimiter}...${rightDelimiter}`; 817 return `${leftDelimiter}...${rightDelimiter}`;
818 } 818 }
819 let parts = new List.from([]); 819 let parts = new core.List.from([]);
820 _toStringVisiting.add(iterable); 820 _toStringVisiting.add(iterable);
821 try { 821 try {
822 _iterablePartsToStrings(iterable, parts); 822 _iterablePartsToStrings(iterable, parts);
823 } finally { 823 } finally {
824 dart.assert(core.identical(_toStringVisiting.last, iterable)); 824 dart.assert(core.identical(_toStringVisiting.last, iterable));
825 _toStringVisiting.removeLast(); 825 _toStringVisiting.removeLast();
826 } 826 }
827 return ((_) => { 827 return ((_) => {
828 _.writeAll(parts, ", "); 828 _.writeAll(parts, ", ");
829 _.write(rightDelimiter); 829 _.write(rightDelimiter);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 } 930 }
931 if (elision !== null) { 931 if (elision !== null) {
932 parts.add(elision); 932 parts.add(elision);
933 } 933 }
934 parts.add(penultimateString); 934 parts.add(penultimateString);
935 parts.add(ultimateString); 935 parts.add(ultimateString);
936 } 936 }
937 } 937 }
938 dart.defineLazyProperties(IterableBase, { 938 dart.defineLazyProperties(IterableBase, {
939 get _toStringVisiting() { 939 get _toStringVisiting() {
940 return new List.from([]); 940 return new core.List.from([]);
941 } 941 }
942 }); 942 });
943 return IterableBase; 943 return IterableBase;
944 }); 944 });
945 let IterableBase = IterableBase$(dart.dynamic); 945 let IterableBase = IterableBase$(dart.dynamic);
946 let _iterator = Symbol('_iterator'); 946 let _iterator = Symbol('_iterator');
947 let _state = Symbol('_state'); 947 let _state = Symbol('_state');
948 let _move = Symbol('_move'); 948 let _move = Symbol('_move');
949 let HasNextIterator$ = dart.generic(function(E) { 949 let HasNextIterator$ = dart.generic(function(E) {
950 class HasNextIterator extends core.Object { 950 class HasNextIterator extends core.Object {
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 } 1490 }
1491 return false; 1491 return false;
1492 } 1492 }
1493 removeWhere(test) { 1493 removeWhere(test) {
1494 _filter(this, test, false); 1494 _filter(this, test, false);
1495 } 1495 }
1496 retainWhere(test) { 1496 retainWhere(test) {
1497 _filter(this, test, true); 1497 _filter(this, test, true);
1498 } 1498 }
1499 static [_filter$](source, test, retainMatching) { 1499 static [_filter$](source, test, retainMatching) {
1500 let retained = new List.from([]); 1500 let retained = new core.List.from([]);
1501 let length = source.length; 1501 let length = source.length;
1502 for (let i = 0; dart.notNull(i) < dart.notNull(length); i = dart.notNull (i) + 1) { 1502 for (let i = 0; dart.notNull(i) < dart.notNull(length); i = dart.notNull (i) + 1) {
1503 let element = source.get(i); 1503 let element = source.get(i);
1504 if (dart.dinvokef(test, element) === retainMatching) { 1504 if (dart.dinvokef(test, element) === retainMatching) {
1505 retained.add(element); 1505 retained.add(element);
1506 } 1506 }
1507 if (length !== source.length) { 1507 if (length !== source.length) {
1508 throw new core.ConcurrentModificationError(source); 1508 throw new core.ConcurrentModificationError(source);
1509 } 1509 }
1510 } 1510 }
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1673 } 1673 }
1674 } 1674 }
1675 return -1; 1675 return -1;
1676 } 1676 }
1677 insert(index, element) { 1677 insert(index, element) {
1678 core.RangeError.checkValueInInterval(index, 0, this.length, "index"); 1678 core.RangeError.checkValueInInterval(index, 0, this.length, "index");
1679 if (index === this.length) { 1679 if (index === this.length) {
1680 this.add(element); 1680 this.add(element);
1681 return; 1681 return;
1682 } 1682 }
1683 if (!(typeof index == number)) 1683 if (!(typeof index == 'number'))
1684 throw new core.ArgumentError(index); 1684 throw new core.ArgumentError(index);
1685 this.length = dart.notNull(this.length) + 1; 1685 this.length = dart.notNull(this.length) + 1;
1686 this.setRange(dart.notNull(index) + 1, this.length, this, index); 1686 this.setRange(dart.notNull(index) + 1, this.length, this, index);
1687 this.set(index, element); 1687 this.set(index, element);
1688 } 1688 }
1689 removeAt(index) { 1689 removeAt(index) {
1690 let result = this.get(index); 1690 let result = this.get(index);
1691 this.setRange(index, dart.notNull(this.length) - 1, this, dart.notNull(i ndex) + 1); 1691 this.setRange(index, dart.notNull(this.length) - 1, this, dart.notNull(i ndex) + 1);
1692 this.length = dart.notNull(this.length) - 1; 1692 this.length = dart.notNull(this.length) - 1;
1693 return result; 1693 return result;
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after
2972 let SplayTreeMap = SplayTreeMap$(dart.dynamic, dart.dynamic); 2972 let SplayTreeMap = SplayTreeMap$(dart.dynamic, dart.dynamic);
2973 let _workList = Symbol('_workList'); 2973 let _workList = Symbol('_workList');
2974 let _tree = Symbol('_tree'); 2974 let _tree = Symbol('_tree');
2975 let _currentNode = Symbol('_currentNode'); 2975 let _currentNode = Symbol('_currentNode');
2976 let _findLeftMostDescendent = Symbol('_findLeftMostDescendent'); 2976 let _findLeftMostDescendent = Symbol('_findLeftMostDescendent');
2977 let _getValue = Symbol('_getValue'); 2977 let _getValue = Symbol('_getValue');
2978 let _rebuildWorkList = Symbol('_rebuildWorkList'); 2978 let _rebuildWorkList = Symbol('_rebuildWorkList');
2979 let _SplayTreeIterator$ = dart.generic(function(T) { 2979 let _SplayTreeIterator$ = dart.generic(function(T) {
2980 class _SplayTreeIterator extends core.Object { 2980 class _SplayTreeIterator extends core.Object {
2981 _SplayTreeIterator(tree) { 2981 _SplayTreeIterator(tree) {
2982 this[_workList] = new List.from([]); 2982 this[_workList] = new core.List$(_SplayTreeNode).from([]);
2983 this[_tree] = tree; 2983 this[_tree] = tree;
2984 this[_modificationCount] = tree[_modificationCount]; 2984 this[_modificationCount] = tree[_modificationCount];
2985 this[_splayCount] = tree[_splayCount]; 2985 this[_splayCount] = tree[_splayCount];
2986 this[_currentNode] = null; 2986 this[_currentNode] = null;
2987 this[_findLeftMostDescendent](tree[_root]); 2987 this[_findLeftMostDescendent](tree[_root]);
2988 } 2988 }
2989 _SplayTreeIterator$startAt(tree, startKey) { 2989 _SplayTreeIterator$startAt(tree, startKey) {
2990 this[_workList] = new List.from([]); 2990 this[_workList] = new core.List$(_SplayTreeNode).from([]);
2991 this[_tree] = tree; 2991 this[_tree] = tree;
2992 this[_modificationCount] = tree[_modificationCount]; 2992 this[_modificationCount] = tree[_modificationCount];
2993 this[_splayCount] = null; 2993 this[_splayCount] = null;
2994 this[_currentNode] = null; 2994 this[_currentNode] = null;
2995 if (tree[_root] === null) 2995 if (tree[_root] === null)
2996 return; 2996 return;
2997 let compare = tree._splay(startKey); 2997 let compare = tree._splay(startKey);
2998 this[_splayCount] = tree[_splayCount]; 2998 this[_splayCount] = tree[_splayCount];
2999 if (dart.notNull(compare) < 0) { 2999 if (dart.notNull(compare) < 0) {
3000 this[_findLeftMostDescendent](tree[_root].right); 3000 this[_findLeftMostDescendent](tree[_root].right);
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
3512 let value = dart.as(_getTableEntry(table, key), V); 3512 let value = dart.as(_getTableEntry(table, key), V);
3513 _deleteTableEntry(table, key); 3513 _deleteTableEntry(table, key);
3514 this[_length] = dart.notNull(this[_length]) - 1; 3514 this[_length] = dart.notNull(this[_length]) - 1;
3515 this[_keys] = null; 3515 this[_keys] = null;
3516 return value; 3516 return value;
3517 } else { 3517 } else {
3518 return null; 3518 return null;
3519 } 3519 }
3520 } 3520 }
3521 static [_isStringKey$](key) { 3521 static [_isStringKey$](key) {
3522 return dart.notNull(typeof key == string) && dart.notNull(!dart.equals(k ey, '__proto__')); 3522 return dart.notNull(typeof key == 'string') && dart.notNull(!dart.equals (key, '__proto__'));
3523 } 3523 }
3524 static [_isNumericKey$](key) { 3524 static [_isNumericKey$](key) {
3525 return dart.notNull(dart.is(key, core.num)) && (key & 0x3ffffff) === key ; 3525 return dart.notNull(dart.is(key, core.num)) && (key & 0x3ffffff) === key ;
3526 } 3526 }
3527 [_computeHashCode](key) { 3527 [_computeHashCode](key) {
3528 return dart.dload(key, 'hashCode') & 0x3ffffff; 3528 return dart.dload(key, 'hashCode') & 0x3ffffff;
3529 } 3529 }
3530 static [_hasTableEntry$](table, key) { 3530 static [_hasTableEntry$](table, key) {
3531 let entry = table[key]; 3531 let entry = table[key];
3532 return entry !== null; 3532 return entry !== null;
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
3917 if (next === null) { 3917 if (next === null) {
3918 dart.assert(dart.equals(cell, this[_last])); 3918 dart.assert(dart.equals(cell, this[_last]));
3919 this[_last] = previous; 3919 this[_last] = previous;
3920 } else { 3920 } else {
3921 next[_previous] = previous; 3921 next[_previous] = previous;
3922 } 3922 }
3923 this[_length] = dart.notNull(this[_length]) - 1; 3923 this[_length] = dart.notNull(this[_length]) - 1;
3924 this[_modified](); 3924 this[_modified]();
3925 } 3925 }
3926 static [_isStringKey$](key) { 3926 static [_isStringKey$](key) {
3927 return dart.notNull(typeof key == string) && dart.notNull(!dart.equals(k ey, '__proto__')); 3927 return dart.notNull(typeof key == 'string') && dart.notNull(!dart.equals (key, '__proto__'));
3928 } 3928 }
3929 static [_isNumericKey$](key) { 3929 static [_isNumericKey$](key) {
3930 return dart.notNull(dart.is(key, core.num)) && (key & 0x3ffffff) === key ; 3930 return dart.notNull(dart.is(key, core.num)) && (key & 0x3ffffff) === key ;
3931 } 3931 }
3932 [_computeHashCode](key) { 3932 [_computeHashCode](key) {
3933 return dart.dload(key, 'hashCode') & 0x3ffffff; 3933 return dart.dload(key, 'hashCode') & 0x3ffffff;
3934 } 3934 }
3935 static [_getTableEntry$](table, key) { 3935 static [_getTableEntry$](table, key) {
3936 return table[key]; 3936 return table[key];
3937 } 3937 }
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
4290 if (dart.notNull(table !== null) && dart.notNull(_hasTableEntry(table, e lement))) { 4290 if (dart.notNull(table !== null) && dart.notNull(_hasTableEntry(table, e lement))) {
4291 _deleteTableEntry(table, element); 4291 _deleteTableEntry(table, element);
4292 this[_length] = dart.notNull(this[_length]) - 1; 4292 this[_length] = dart.notNull(this[_length]) - 1;
4293 this[_elements] = null; 4293 this[_elements] = null;
4294 return true; 4294 return true;
4295 } else { 4295 } else {
4296 return false; 4296 return false;
4297 } 4297 }
4298 } 4298 }
4299 static [_isStringElement$](element) { 4299 static [_isStringElement$](element) {
4300 return dart.notNull(typeof element == string) && dart.notNull(!dart.equa ls(element, '__proto__')); 4300 return dart.notNull(typeof element == 'string') && dart.notNull(!dart.eq uals(element, '__proto__'));
4301 } 4301 }
4302 static [_isNumericElement$](element) { 4302 static [_isNumericElement$](element) {
4303 return dart.notNull(dart.is(element, core.num)) && (element & 0x3ffffff) === element; 4303 return dart.notNull(dart.is(element, core.num)) && (element & 0x3ffffff) === element;
4304 } 4304 }
4305 [_computeHashCode](element) { 4305 [_computeHashCode](element) {
4306 return dart.dload(element, 'hashCode') & 0x3ffffff; 4306 return dart.dload(element, 'hashCode') & 0x3ffffff;
4307 } 4307 }
4308 static [_hasTableEntry$](table, key) { 4308 static [_hasTableEntry$](table, key) {
4309 let entry = table[key]; 4309 let entry = table[key];
4310 return entry !== null; 4310 return entry !== null;
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
4660 if (next === null) { 4660 if (next === null) {
4661 dart.assert(dart.equals(cell, this[_last])); 4661 dart.assert(dart.equals(cell, this[_last]));
4662 this[_last] = previous; 4662 this[_last] = previous;
4663 } else { 4663 } else {
4664 next[_previous] = previous; 4664 next[_previous] = previous;
4665 } 4665 }
4666 this[_length] = dart.notNull(this[_length]) - 1; 4666 this[_length] = dart.notNull(this[_length]) - 1;
4667 this[_modified](); 4667 this[_modified]();
4668 } 4668 }
4669 static [_isStringElement$](element) { 4669 static [_isStringElement$](element) {
4670 return dart.notNull(typeof element == string) && dart.notNull(!dart.equa ls(element, '__proto__')); 4670 return dart.notNull(typeof element == 'string') && dart.notNull(!dart.eq uals(element, '__proto__'));
4671 } 4671 }
4672 static [_isNumericElement$](element) { 4672 static [_isNumericElement$](element) {
4673 return dart.notNull(dart.is(element, core.num)) && (element & 0x3ffffff) === element; 4673 return dart.notNull(dart.is(element, core.num)) && (element & 0x3ffffff) === element;
4674 } 4674 }
4675 [_computeHashCode](element) { 4675 [_computeHashCode](element) {
4676 return dart.dload(element, 'hashCode') & 0x3ffffff; 4676 return dart.dload(element, 'hashCode') & 0x3ffffff;
4677 } 4677 }
4678 static [_getTableEntry$](table, key) { 4678 static [_getTableEntry$](table, key) {
4679 return table[key]; 4679 return table[key];
4680 } 4680 }
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
4888 exports.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable; 4888 exports.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable;
4889 exports.LinkedHashMapKeyIterable$ = LinkedHashMapKeyIterable$; 4889 exports.LinkedHashMapKeyIterable$ = LinkedHashMapKeyIterable$;
4890 exports.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator; 4890 exports.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator;
4891 exports.LinkedHashMapKeyIterator$ = LinkedHashMapKeyIterator$; 4891 exports.LinkedHashMapKeyIterator$ = LinkedHashMapKeyIterator$;
4892 exports.HashSetIterator = HashSetIterator; 4892 exports.HashSetIterator = HashSetIterator;
4893 exports.HashSetIterator$ = HashSetIterator$; 4893 exports.HashSetIterator$ = HashSetIterator$;
4894 exports.LinkedHashSetCell = LinkedHashSetCell; 4894 exports.LinkedHashSetCell = LinkedHashSetCell;
4895 exports.LinkedHashSetIterator = LinkedHashSetIterator; 4895 exports.LinkedHashSetIterator = LinkedHashSetIterator;
4896 exports.LinkedHashSetIterator$ = LinkedHashSetIterator$; 4896 exports.LinkedHashSetIterator$ = LinkedHashSetIterator$;
4897 })(collection || (collection = {})); 4897 })(collection || (collection = {}));
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698